Repository: splunk/addonfactory-ucc-generator (language: python)

Issue:
fix(a11y): associate labels with inputs
## The problem
We use SUI components but a lot of wrappers for it. These wrappers don't pass all required props to the target component including id attribute. This causes lack of connection between `label`'s `for` attribute and `input`s `id`.
Instead the `id` is set on the wrapper:
<img width="540" alt="Screenshot 2024-02-06 at 15 15 14" src="https://github.com/splunk/addonfactory-ucc-generator/assets/142901247/ce7c4990-a627-4614-8632-4a7f80480cc8">

## The solution
Pass id from wrapper to input.

## References
- https://splunk.atlassian.net/browse/ADDON-68266
- closes #936


Discussion / hints:

Fix patch:
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 000000000..302566e1d
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,1 @@
+ui/**/*.png filter=lfs diff=lfs merge=lfs -text
diff --git a/.github/workflows/build-ui.yml b/.github/workflows/build-ui.yml
index ac90009a8..a8d6a9113 100644
--- a/.github/workflows/build-ui.yml
+++ b/.github/workflows/build-ui.yml
@@ -26,8 +26,6 @@ jobs:
         run: yarn run lint
       - name: Unit test
         run: yarn run test
-      - name: Validate storybook build
-        run: yarn run build-storybook
       - name: Build UCC UI
         run: yarn run build
       - name: List deps into dependencies.txt
diff --git a/.github/workflows/storybook-visual.yml b/.github/workflows/storybook-visual.yml
new file mode 100644
index 000000000..eb650b3fb
--- /dev/null
+++ b/.github/workflows/storybook-visual.yml
@@ -0,0 +1,59 @@
+name: "Storybook Visual"
+on:
+  workflow_call:
+    inputs:
+      node-version:
+        required: true
+        type: string
+
+jobs:
+  update-screenshots:
+    defaults:
+      run:
+        working-directory: ui
+        shell: bash
+    runs-on: ubuntu-latest
+    env:
+      isPR: ${{ github.event.pull_request.base.ref == 'develop' || github.event.pull_request.base.ref == 'main' }}
+    steps:
+      - uses: actions/checkout@v4
+        with:
+          lfs: true
+          ref: ${{ github.event.pull_request.head.ref }}
+      - uses: actions/setup-node@v4
+        with:
+          node-version: ${{ inputs.node-version }}
+      - name: install deps
+        uses: ./.github/actions/cached-ui-deps
+        with:
+          node-version: ${{ inputs.node-version }}
+      - name: Install Playwright
+        run: yarn playwright install
+      - name: Build Storybook
+        run: yarn build-storybook --quiet
+      - name: Serve Storybook and update screenshots
+        run: |
+          npx concurrently --kill-others --success first -n "SB,TEST" \
+            "npx http-server storybook-static --port 6006 --silent" \
+            "npx wait-on tcp:6006 && yarn test-storybook ${{ env.isPR && '-u' || ''}}"
+      - name: Import GPG key
+        if: ${{ env.isPR }}
+        uses: crazy-max/ghaction-import-gpg@v6
+        with:
+          git_committer_name: ${{ secrets.SA_GH_USER_NAME }}
+          git_committer_email: ${{ secrets.SA_GH_USER_EMAIL }}
+          gpg_private_key: ${{ secrets.SA_GPG_PRIVATE_KEY }}
+          passphrase: ${{ secrets.SA_GPG_PASSPHRASE }}
+          git_user_signingkey: true
+          git_commit_gpgsign: true
+      - name: Push updated screenshots
+        if: ${{ env.isPR }}
+        run: |
+          git add \*.png
+          git diff --staged --exit-code || (git commit -S -m "update screenshots" && git push)
+      - uses: actions/upload-artifact@v4
+        name: "Upload test report"
+        if: ${{ failure() }}
+        with:
+          name: storybook-tests-report
+          path: ui/test-reports/
diff --git a/.licenserc.yaml b/.licenserc.yaml
index cfa884b20..d521ef800 100644
--- a/.licenserc.yaml
+++ b/.licenserc.yaml
@@ -40,6 +40,7 @@ header:
     - "**/*.jsx"
     - "**/*.ts"
     - "**/*.tsx"
+    - "**/*.png"
     - "ui/.husky/pre-commit"
     - "example/**"
     - "splunk_add_on_ucc_framework/commands/init_template/**"
diff --git a/docs/configurations.md b/docs/configurations/index.md
similarity index 87%
rename from docs/configurations.md
rename to docs/configurations/index.md
index b5f9e4cd2..6a96ed430 100644
--- a/docs/configurations.md
+++ b/docs/configurations/index.md
@@ -5,16 +5,16 @@ proxy configuration and logging level configuration.
 ### Configuration Properties
 
 | Property                                                          | Type   | Description                                             |
-| ----------------------------------------------------------------- | ------ | ------------------------------------------------------- |
+|-------------------------------------------------------------------| ------ | ------------------------------------------------------- |
 | title<span class="required-asterisk">\*</span>                    | string | -                                                       |
 | description                                                       | string | To provide a brief summary of an configuration page.    |
-| [subDescription](./advanced/sub_description)                     | object | To provide broader description of an configuration page |
+| [subDescription](../advanced/sub_description)                     | object | To provide broader description of an configuration page |
 | [tabs](#tabs-properties)<span class="required-asterisk">\*</span> | array  | To specify a list of tab.                               |
 
 ### Tabs properties
 
 | Property                                                     | Type   | Description                                                                                                                                                                                        |
-| ------------------------------------------------------------ | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+|--------------------------------------------------------------| ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
 | name<span class="required-asterisk">\*</span>                | string | To define the particular tab name.                                                                                                                                                                 |
 | title<span class="required-asterisk">\*</span>               | string | To show the title of the tab.                                                                                                                                                                      |
 | [entity](../entity)<span class="required-asterisk">\*</span> | array  | A list of fields and their properties.                                                                                                                                                             |
@@ -22,7 +22,7 @@ proxy configuration and logging level configuration.
 | style                                                        | string | By specifying this property in the global config file, the forms can either be opened as a new page or in a dialog. <br>Supported values are "page" or "dialog". <br> Default value is **dialog**. |
 | options                                                      | object | This property allows you to enable the [saveValidator](../advanced/save_validator) feature.                                                                                                        |
 | hook                                                         | object | It is used to add custom behaviour to forms. Visit the [Custom Hook](../custom_ui_extensions/custom_hook) page to learn more.                                                                      |
-| [warning](./advanced/custom_warning.md)                      | object | It is used to add custom warning message for each of modes ('create', 'edit', 'config', 'clone'), message is displayed on form                                                                     |
+| [warning](../advanced/custom_warning.md)                     | object | It is used to add custom warning message for each of modes ('create', 'edit', 'config', 'clone'), message is displayed on form                                                                     |
 | conf                                                         | string | TBD                                                                                                                                                                                                |
 | restHandlerName                                              | string | TBD                                                                                                                                                                                                |
 | restHandlerModule                                            | string | TBD                                                                                                                                                                                                |
@@ -54,12 +54,17 @@ proxy configuration and logging level configuration.
 }
 ```
 
+Note: The example above creates a Configuration page with two **empty** tabs: Account and Proxy.
+Specify your properties in `"table"` and `"entity"`.
+
 ### Output
 
 This is how table looks in the UI:
 
-![image](images/configuration/configuration_with_table_output.png)
+![image](../images/configuration/configuration_with_table_output.png)
 
 This is how form looks in the UI:
 
-![image](images/configuration/configuration_without_table_output.png)
+![image](../images/configuration/configuration_without_table_output.png)
+
+More information about how to set Proxy tab, can be found [here](./proxy.md).
diff --git a/docs/configurations/proxy.md b/docs/configurations/proxy.md
new file mode 100644
index 000000000..db3746d51
--- /dev/null
+++ b/docs/configurations/proxy.md
@@ -0,0 +1,119 @@
+There are fields that need to be specified in order to enable proxy.
+
+### Fields
+
+| Field Name     | Description                                                        |
+|----------------|--------------------------------------------------------------------|
+| proxy_enabled  | Whether proxy should be enabled.                                   |
+| proxy_type     | Proxy type. Available values: http, http_no_tunnel, socks4, socks5 |
+| proxy_url      | Host                                                               |
+| proxy_port     | Port                                                               |
+| proxy_username | Username used to access the proxy server                           |
+| proxy_password | Password assigned for that username                                |
+| proxy_rdns     | Whether reverse DNS resolution should be used                      |
+
+### Example Tab
+
+```json
+{
+    "name": "proxy",
+    "title": "Proxy",
+    "entity": [
+        {
+            "type": "checkbox",
+            "label": "Enable",
+            "field": "proxy_enabled"
+        },
+        {
+            "type": "singleSelect",
+            "label": "Proxy Type",
+            "options": {
+                "disableSearch": true,
+                "autoCompleteFields": [
+                    {
+                        "value": "http",
+                        "label": "http"
+                    },
+                    {
+                        "value": "socks4",
+                        "label": "socks4"
+                    },
+                    {
+                        "value": "socks5",
+                        "label": "socks5"
+                    }
+                ]
+            },
+            "defaultValue": "http",
+            "field": "proxy_type"
+        },
+        {
+            "type": "text",
+            "label": "Host",
+            "validators": [
+                {
+                    "type": "string",
+                    "errorMsg": "Max host length is 4096",
+                    "minLength": 0,
+                    "maxLength": 4096
+                }
+            ],
+            "field": "proxy_url"
+        },
+        {
+            "type": "text",
+            "label": "Port",
+            "validators": [
+                {
+                    "type": "number",
+                    "range": [
+                        1,
+                        65535
+                    ]
+                }
+            ],
+            "field": "proxy_port"
+        },
+        {
+            "type": "text",
+            "label": "Username",
+            "validators": [
+                {
+                    "type": "string",
+                    "errorMsg": "Max length of username is 50",
+                    "minLength": 0,
+                    "maxLength": 50
+                }
+            ],
+            "field": "proxy_username"
+        },
+        {
+            "type": "text",
+            "label": "Password",
+            "validators": [
+                {
+                    "type": "string",
+                    "errorMsg": "Max length of password is 8192",
+                    "minLength": 0,
+                    "maxLength": 8192
+                }
+            ],
+            "encrypted": true,
+            "field": "proxy_password"
+        },
+        {
+            "type": "checkbox",
+            "label": "Reverse DNS resolution",
+            "field": "proxy_rdns"
+        }
+    ],
+    "options": {
+        "saveValidator": "function(formData) { if(!formData.proxy_enabled || formData.proxy_enabled === '0') {return true; } if(!formData.proxy_url) { return 'Proxy Host can not be empty'; } if(!formData.proxy_port) { return 'Proxy Port can not be empty'; } return true; }"
+    }
+}
+```
+
+The example above creates the following form:
+
+![image](../images/configuration/configuration_without_table_output.png)
+
diff --git a/docs/contributing.md b/docs/contributing.md
index 7d0f7b389..3ffaf54c7 100644
--- a/docs/contributing.md
+++ b/docs/contributing.md
@@ -2,17 +2,36 @@
 
 ## Development flow
 
-* Default development branch is `develop`. Please use it when creating PRs with your features, fixes, documentation updates etc. PRs to `develop` branch should be merged using squash option in GitHub.
-* When the release time comes (should be handled by UCC team) - create a PR from `develop` to `main`
-    * make sure that CI is passing and wait for the review from the team
-    * PR should be merged using merge commit option in GitHub
-    * release will be made automatically (both GitHub and PyPI) and bot will push a commit to `main` with all necessary changes (i.e. [like this](https://github.com/splunk/addonfactory-ucc-generator/commit/0c5e6802e1e52c37bf7131baf1b8264e5db30545))
-    * after release is done - you need to backport bot's changes to the `develop` branch (i.e. [#974](https://github.com/splunk/addonfactory-ucc-generator/pull/974))
-* If release did not go well and a quick bug fix needs to be released (should be handled by UCC team)
-    * create a PR to `main` branch with a fix (with tests reproducing and then fixing the issue)
-    * make sure that CI is passing and wait for the review from the team
-    * PR should be merged using merge commit option in GitHub
-    * bug fix PR needs to be backported back to `develop` branch
+The instructions below utilize the [GitHub CLI tool](https://cli.github.com/), which you can install via HomeBrew:
+```bash
+brew install gh
+gh auth login
+```
+
+* The default development branch is `develop`. Use this branch for creating pull requests (PRs) for your features, fixes, documentation updates, etc. PRs to the `develop` branch should be merged using the squash option on GitHub.
+* When it's time for a release (handled by the UCC team), create a PR from `develop` to `main` using the following commands:
+```bash
+gh pr create --title "chore: merge develop into main" --body "" --head develop --base main
+# set automerge with merge commit to avoid accidentally squashing PR
+gh pr merge develop --auto --merge
+```
+
+* Ensure CI passes and await team review.
+* PR should be merged using **merge commit** option in GitHub (already included in the command)
+* Releases are made automatically (both on GitHub and PyPI), and a bot will push a commit to `main` with all necessary changes  (i.e. [like this](https://github.com/splunk/addonfactory-ucc-generator/commit/0c5e6802e1e52c37bf7131baf1b8264e5db30545))
+* After the release, backport the bot's changes to the `develop` branch (i.e. [#974](https://github.com/splunk/addonfactory-ucc-generator/pull/974)):
+
+```bash
+gh pr create --title "chore: merge main into develop" --body "" --head main --base develop
+# set automerge with merge commit to avoid accidentally squashing PR
+gh pr merge main --auto --merge
+```
+
+* If a release encounters issues requiring a quick bug fix (handled by the UCC team):
+  * Create a PR to the main branch with the fix, including tests that reproduce and then fix the issue.
+  * Ensure CI passes and await team review.
+  * Merge the PR using the merge commit option on GitHub.
+  * Backport the bug fix PR to the develop branch.
 
 ## Build and Test
 
diff --git a/docs/entity/index.md b/docs/entity/index.md
index 5dbddbb17..63b9e55a1 100644
--- a/docs/entity/index.md
+++ b/docs/entity/index.md
@@ -16,6 +16,7 @@ title: Entity
 | required                                                      | boolean                   | To specify whether the field is required or not.                                                                                 | false         |
 | encrypted                                                     | boolean                   | To encrypt that particular field.                                                                                                | false         |
 | [validators](./validators)                                    | array                     | It is used to validate the values of fields using various validators.                                                            | -             |
+| [modifyFieldsOnValue](./modifyFieldsOnValue)                  | array                     | It is used to speficy values and parameters that will influence visually other entities.                                          | -             |
 
 > [!WARNING]  
 > [Placeholder](https://splunkui.splunkeng.com/Packages/react-ui/Text?section=develop) attribute is deprecated and will be removed in the next major version. Instead, we recommend to use "help" attribute.
diff --git a/docs/entity/modifyFieldsOnValue.md b/docs/entity/modifyFieldsOnValue.md
new file mode 100644
index 000000000..0aef91230
--- /dev/null
+++ b/docs/entity/modifyFieldsOnValue.md
@@ -0,0 +1,170 @@
+This feature allows to specify conditions to modify other fields based on current field value change.
+
+### Modification Object Properties
+
+| Property                                            | Type   | Description                                                                                                         |
+| --------------------------------------------------- | ------ | ------------------------------------------------------------------------------------------------------------------- |
+| fieldValue<span class="required-asterisk">\*</span> | string | Value that will trigger the update, put `[[any_other_value]]` to trigger update for any other values than specified |
+| mode                                                | string | Mode that adds possibility to use modification only on certain mode                                                 |
+| fieldsToModify                                      | array  | List of fields modifications that will be applied after com ponent value will match                                 |
+
+### fieldsToModify Properties
+
+| Property                                         | Type                      | Description                                                  |
+| ------------------------------------------------ | ------------------------- | ------------------------------------------------------------ |
+| fieldId<span class="required-asterisk">\*</span> | string                    | Used to identify field that modifications will be applied to |
+| display                                          | boolean                   | Declares display property of target component                |
+| value                                            | string, number or boolean | Declares current value of target component                   |
+| disabled                                         | boolean                   | Declares if component should be disabled (enable = false)    |
+| help                                             | string                    | Declares help text                                           |
+| label                                            | string                    | Declares label text                                          |
+| markdownMessage                                  | object                    | Declares markdown message to display                         |
+
+### markdownMessage Properties
+
+| Property                                              | Type   | Description                                                                      |
+| ----------------------------------------------------- | ------ | -------------------------------------------------------------------------------- |
+| markdownType<span class="required-asterisk">\*</span> | string | Declare type of markdown. Accepts: "text", "hybrid", "link"                      |
+| text<span class="required-asterisk">\*</span>         | string | Used for all types to declare message content                                    |
+| color                                                 | string | Used for "text" type to specify color of displayied text. Accepts all CSS colors |
+| token                                                 | string | Used for "hybrid" type to declare string that will be swapped into link          |
+| linkText                                              | string | Used for "hybrid" type to declare string that will put in place of token         |
+| link                                                  | string | Used for "hybrid" and "link" types to declare url that will use for redirection  |
+
+### Usage
+
+```json
+{
+    "type": "checkbox",
+    "label": "Example Checkbox",
+    "field": "account_checkbox",
+    "help": "This is an example checkbox for the account entity",
+    "modifyFieldsOnValue": [
+        {
+            "fieldValue": 1,
+            "fieldsToModify": [
+                {
+                    "fieldId": "account_radio",
+                    "disabled": false
+                },
+                {
+                    "fieldId": "endpoint",
+                    "display": true
+                }
+            ]
+        },
+        {
+            "fieldValue": 0,
+            "mode": "edit",
+            "fieldsToModify": [
+                {
+                    "fieldId": "account_radio",
+                    "disabled": true
+                },
+                {
+                    "fieldId": "endpoint",
+                    "display": false
+                }
+            ]
+        }
+    ]
+},
+```
+
+```json
+{
+    "label": "Username",
+    "type": "text",
+    "help": "Enter the username for this account.",
+    "field": "username",
+    "modifyFieldsOnValue": [
+        {
+            "fieldValue": "[[any_other_value]]",
+            "fieldsToModify": [
+                {
+                    "fieldId": "some_other_field",
+                    "disabled": false,
+                    "display": true,
+                    "label": "New label for other values",
+                    "value": "New value for other values",
+                    "help": "New help for other values",
+                    "markdownMessage": {
+                        "markdownType": "text",
+                        "text": "New markdown message for other values",
+                        "color": "red"
+                    }
+                }
+            ]
+        },
+        {
+            "fieldValue": "a",
+            "fieldsToModify": [
+                {
+                    "fieldId": "some_other_field",
+                    "display": true,
+                    "disabled": true,
+                    "label": "New label for value 'a' as username",
+                    "value": "New value for value 'a' as username",
+                    "help": "New help for value 'a' as username",
+                    "markdownMessage": {
+                        "markdownType": "link",
+                        "text": "New markdown message for value 'a' as username",
+                        "link": "https://splunk.github.io/addonfactory-ucc-generator/"
+                    }
+                }
+            ]
+        },
+        {
+            "fieldValue": "aa",
+            "fieldsToModify": [
+                {
+                    "fieldId": "some_other_field",
+                    "disabled": false,
+                    "display": false,
+                    "label": "New label for value 'aa' as username",
+                    "value":"New value for value 'aa' as username",
+                    "help": "New help for value 'aa' as username",
+                }
+            ]
+        },
+        {
+            "fieldValue": "aaa",
+            "fieldsToModify": [
+                {
+                    "fieldId": "some_other_field",
+                    "disabled": true,
+                    "display": true,
+                    "label": "New label for value 'aaa' as username",
+                    "value": "New value for value 'aaa' as username",
+                    "help":  "New help for value 'aaa' as username",
+                    "markdownMessage": {
+                        "markdownType": "hybrid",
+                        "text": "New markdown message token 'aaa' as username",
+                        "link": "https://splunk.github.io/addonfactory-ucc-generator/",
+                        "token": "token",
+                        "linkText": "for value"
+                    }
+                }
+            ]
+        },
+        {
+            "fieldValue": "aaaa",
+            "mode": "edit",
+            "fieldsToModify": [
+                {
+                    "fieldId": "some_other_field",
+                    "disabled": false,
+                    "display": false,
+                    "label": "New label for value 'aaaa' as username used only when editing entity",
+                    "value": "New value for value 'aaaa' as username used only when editing entity",
+                    "help":  "New help for value 'aaaa' as username used only when editing entity",
+                    "markdownMessage": {
+                        "markdownType": "text",
+                        "text": "markdown message plain text used only when editing entity"
+                    }
+                }
+            ]
+        }
+    ]
+},
+```
diff --git a/docs/images/openapi/download_openapi_button.png b/docs/images/openapi/download_openapi_button.png
new file mode 100644
index 000000000..6cf42e9a5
Binary files /dev/null and b/docs/images/openapi/download_openapi_button.png differ
diff --git a/docs/openapi.md b/docs/openapi.md
index f837e4240..6f16c9f75 100644
--- a/docs/openapi.md
+++ b/docs/openapi.md
@@ -9,17 +9,13 @@ Once `ucc-gen` command is executed, OpenAPI description document is located in o
 
 One of ways is to download it via button displayed in top right corner of configuration page.
 
-When add-on is installed to Splunk instance, it is exposed via web and management interface, so is available under following addresses accordingly:
-
-* \[protocol\]://\[domain\]:\[port\]/en-GB/splunkd/__raw/servicesNS/\[user\]/\[appname\]/static/openapi.json
-
-(eg. http://localhost:8000/en-GB/splunkd/__raw/servicesNS/admin/Splunk_TA_cisco_meraki/static/openapi.json)
+![image](./images/openapi/download_openapi_button.png)
 
-* https://\[domain\]:\[port\]/servicesNS/\[user\]/\[appname\]/static/openapi.json
+When add-on is installed to Splunk instance, it is exposed via web and management interface, so is available under following addresses accordingly:
 
-(eg. https://localhost:8089/servicesNS/admin/Splunk_TA_cisco_meraki/static/openapi.json)
+* \[protocol\]://\[domain\]:\[port\]/en-GB/static/app/\[appname\]/openapi.json
 
-All security rules are applied so user has to be authenticated and authorised to be able to have access to the document.
+(eg. http://localhost:8000/en-GB/static/app/Splunk_TA_cisco_meraki/openapi.json)
 
 See the following resources for more information on working with the Splunk REST API (eg. how to authenticate):
 
@@ -47,8 +43,14 @@ Check [swagger](https://swagger.io/) or [other tools](https://github.com/OAI/Ope
 
 ### Instruction
 
-1. Run in terminal: `docker run -p 8081:8080 swaggerapi/swagger-editor`
-2. Open SwaggerEditor in web browser (http://localhost:8081/) and load the OpenAPI description document (File > Import file)
+1. Open https://editor.swagger.io/
+   * Alternatively, you can run your own instance of Swagger Editor
+     by running the following command in terminal:
+     
+     `docker run -p 8081:8080 swaggerapi/swagger-editor`
+     
+     Then go to: http://localhost:8081/
+2. Load the OpenAPI description document (File > Import file)
 3. Check domain and port values for your Splunk instance and Authorize
 4. Select method-path pair (eg. GET - /splunk_ta_snow_settings/logging ) and "Try it out"
 5. Define parameters and "Execute"
@@ -76,45 +78,31 @@ Make sure you clicked Authorize button, gave username and password and clicked A
 
 ### Instruction
 
-1. Create directory structure and open the `tmp` directory (run in terminal: `mkdir -p tmp/restapi_client ; mkdir -p tmp/generator ; cd tmp`)
-2. Save your openapi.json file to the directory
-3. Download the rest.mustache file (`wget https://raw.githubusercontent.com/swagger-api/swagger-codegen/master/modules/swagger-codegen/src/main/resources/python/rest.mustache`)
-4. Splunk does not expect body for DELETE requests, so we need to revert modifications done for https://github.com/swagger-api/swagger-codegen/issues/9558 (`sed "s/request_body[[:blank:]]=[[:blank:]]\'{}\'/request_body = None/g" rest.mustache > generator/rest.mustache`).
-If you want to understand exactly which line of rest.mustache is affected: https://github.com/swagger-api/swagger-codegen/blob/master/modules/swagger-codegen/src/main/resources/python/rest.mustache#L150
-5. Create client (`docker run --rm -v ${PWD}:/local swaggerapi/swagger-codegen-cli-v3 generate -i /local/openapi.json -l python -o /local/restapi_client -t /local/generator/`); it should appear in `restapi_client` directory
-6. Open `restapi_client` directory and read `README.md` to find out the details of how the client should be installed, imported and used. (`cd restapi_client ; more README.md`)
-7. Install the client (`python setup.py install --user`)
-8. You can use below code as an inspiration for your own script that imports the client and uses for TA configuration
-```
-from __future__ import print_function
-import os
-import swagger_client
-from swagger_client.rest import ApiException
-from pprint import pprint
-
-def get_from_environment_variable(environment_variable: str) -> str:
-    if environment_variable not in os.environ:
-        print(40*'*')
-        print(f"{environment_variable} environment variable not set")
-        print("run below in terminal:")
-        print(f"export {environment_variable}=[your value]")
-        print(40*'*')
-        exit(1)
-    return os.environ[environment_variable]
-
-configuration = swagger_client.Configuration()
-configuration.host = configuration.host.replace('{domain}','localhost')
-configuration.host = configuration.host.replace('{port}','8089')
+1. Go to the directory where you downloaded `openapi.json` file
+2. Run the following command: `docker run --rm -v ${PWD}:/local openapitools/openapi-generator-cli generate -i /local/openapi.json -g python -o /local/restapi_client`
+   * make sure `openapi.json` is in the current directory
+   * you can generate clients for other languages as well - run
 
-configuration.verify_ssl = False
-configuration.username = get_from_environment_variable("SPLUNK_USERNAME")
-configuration.password = get_from_environment_variable("SPLUNK_PASSWORD")
+     `docker run --rm openapitools/openapi-generator-cli generate list`
 
-api_instance = swagger_client.DefaultApi(swagger_client.ApiClient(configuration))
+     to see the list of supported languages
+3. The client should appear in `restapi_client`. Open that directory (`cd restapi_client`)
+4. Install the client (`pip install .`)
+5. See `README.md` for an example of usage
 
-output_mode = 'json'
+### Troubleshooting
+
+In case of an SSL error (e.g. when connecting to localhost), you can disable verification:
+
+```python
+configuration = openapi_client.Configuration(
+    host = "https://localhost:8089/servicesNS/-/addon-name",
+    username = "user",
+    password = "pass",
+)
+
+configuration.verify_ssl = False
 ```
 
-### Troubleshooting
+This option should only be used when connecting to a non-prod Splunk instance.
 
-* swaggerapi/swagger-codegen-cli-v3 docker image does not work on ARM platforms (eg. M-based Mac machines)
\ No newline at end of file
diff --git a/docs/quickstart.md b/docs/quickstart.md
index b1205813d..fefb3ba88 100644
--- a/docs/quickstart.md
+++ b/docs/quickstart.md
@@ -2,68 +2,66 @@
 
 ## Prerequisites
 
-You need to have Python 3.7+ and Git available in the machine to be able to utilize `ucc-gen` command.
+You need to have Python 3.7+ and Git available in your machine to be able to use the `ucc-gen` command.
 
-> Git is used to generate the add-on version from Git tags. Alternatively you can use `--ta-version` parameter. More info below.
+> Git is used to generate the add-on version from Git tags. Alternatively, you can use the `--ta-version` parameter. 
+To be able to create an add-on using the UCC framework, you need to have at least:
 
-To be able to create an add-on using UCC framework, you need to have at least:
-
-* `globalConfig` file (in `JSON` or `YAML` format, `JSON` is mostly used)
-* `package` folder
+* a `globalConfig` file (in `JSON` or `YAML` format, `JSON` is mostly used).
+* a `package` folder.
 * `app.manifest` in the `package` folder ([documentation here](https://dev.splunk.com/enterprise/reference/packagingtoolkit/pkgtoolkitappmanifest/)).
 
-`app.manifest` file now is being validated according to the [documentation here](https://dev.splunk.com/enterprise/reference/packagingtoolkit/pkgtoolkitappmanifest/#JSON-schema-200).
+The `app.manifest` file now is being validated. See [Splunk Packaging Toolkit app.manifest schema definition](https://dev.splunk.com/enterprise/reference/packagingtoolkit/pkgtoolkitappmanifest/#JSON-schema-200) for more details.
 
-> If both globalConfig.json and globalConfig.yaml files are present, then the globalConfig.json file will take precedence.
+> If both the globalConfig.json and globalConfig.yaml files are present, then the globalConfig.json file will take precedence.
 
-The JSON schema for the `globalConfig` file can be found in `splunk_add_on_ucc_framework/schema/schema.json` file.
+The JSON schema for the `globalConfig` file can be found in the `splunk_add_on_ucc_framework/schema/schema.json` file.
 
 ### Add-on naming convention
 
-Refer to Splunkbase documentation 
-[here](https://dev.splunk.com/enterprise/docs/releaseapps/splunkbase/namingguidelines/) 
-to figure out what should be the name of your add-on.
+See [Naming conventions for apps and add-ons in Splunkbase](https://dev.splunk.com/enterprise/docs/releaseapps/splunkbase/namingguidelines/) 
+for help naming your add-on. 
 
 ## Initialize new add-on
 
-> Initialization of the new add-on is available from `5.19.0` version of `ucc-gen`.
+> Initialization of the new add-on is available from version `5.19.0` and up of `ucc-gen`.
 
-Commands below are macOS and Linux specific.
+The following commands are macOS and Linux specific.
 
-* Set up and activate Python virtual environment
+* Set up and activate the Python virtual environment: 
 
 ```bash
 python3 -m venv .venv
 source .venv/bin/activate
 ```
 
-* Install `splunk-add-on-ucc-framework`
+* Install `splunk-add-on-ucc-framework`:
 
 ```bash
 pip install splunk-add-on-ucc-framework
 ```
 
-* Initialize new add-on
+* Initialize the new add-on:
 
 ```bash
 ucc-gen init --addon-name "demo_addon_for_splunk" --addon-display-name "Demo Add-on for Splunk" --addon-input-name demo_input
 ```
 
-The new add-on is located in `demo_addon_for_splunk` folder and can be built using 
-the commands [below](#build-already-existing-add-on).
+The new add-on is located in the `demo_addon_for_splunk` folder and can be built using 
+the [the following commands](#build-already-existing-add-on):
 
-## Build already existing add-on
+## Build the already existing add-on
 
-Commands below are macOS and Linux specific.
+The following commands are macOS and Linux specific:
 
-* Set up and activate Python virtual environment (skip if you already have an environment)
+* Set up and activate the Python virtual environment (skip if you already have an environment):
 
 ```bash
 python3 -m venv .venv
 source .venv/bin/activate
 ```
 
-* Install `splunk-add-on-ucc-framework` and `splunk-packaging-toolkit` (skip if you already installed libraries)
+* Install `splunk-add-on-ucc-framework` and `splunk-packaging-toolkit` (skip if you already installed the libraries):
 
 ```bash
 pip install splunk-add-on-ucc-framework splunk-packaging-toolkit
@@ -71,156 +69,157 @@ pip install splunk-add-on-ucc-framework splunk-packaging-toolkit
 
 > Note: `splunk-packaging-toolkit` does not work with Python 3.10+.
 
-> Note: `ucc-gen package` can be used instead of `slim` if UCC `v5.30.0+` is used (more details below). 
+> Note: If you use UCC `v5.30.0+`, `ucc-gen package` can be used instead of `slim`. 
 
 * Run `ucc-gen build` and package it
 
-> Provide `--ta-version=<version>` parameter if this repository is not version controlled.
+> Provide a `--ta-version=<version>` parameter if this repository is not version controlled.
 
 ```bash
 ucc-gen build
 slim package output/<add-on-name>
 ```
 
-> Please use `ucc-gen build` instead of `ucc-gen` if you are using UCC `v5.19.0` and higher.
+> Please use `ucc-gen build` instead of `ucc-gen` if you are using UCC `v5.19.0` or higher.
 
-Now you should see an archive created in the same level as your `globalConfig.json` is located.
+Now you should see an archive created on the same level as your `globalConfig.json`.
 
 Now you can go to Splunk and install this add-on using the generated archive.
 
-After validating that the add-on was loaded fine and all the basic operations 
+After validating that the add-on was loaded correctly and all the basic operations 
 are working, you can extend the functionality of the input by copying and 
-pasting the automatically generated modular inputs file into `package/bin` 
-folder and extending their functionality. The generated inputs are using 
+pasting the automatically generated modular inputs file into the `package/bin` 
+folder. The generated inputs use the
 [Splunk SDK for Python](https://github.com/splunk/splunk-sdk-python). After you
-update the modular input code, you can run `ucc-gen` again and `ucc-gen` will 
+update the modular input code, you can run `ucc-gen` again, and then `ucc-gen` will 
 use updated modular inputs from `package/bin` instead of generating new ones.
 
 ## Commands
 
 ### `ucc-gen build`
 
-Builds the add-on. As of now, running `ucc-gen` does the same thing as running `ucc-gen build`, 
+The `ucc-gen build` command builds the add-on. As of now, running `ucc-gen` does the same thing as running `ucc-gen build`, 
 but eventually calling `ucc-gen` without specifying a subcommand will be 
 deprecated.
 
 It takes the following parameters:
 
 * `--source` - [optional] folder containing the `app.manifest` and app 
-    source. Default: `package`.
-* `--config` - [optional] path to the configuration file, defaults to
-    globalConfig file in the parent directory of source provided.
-* `--ta-version` - [optional] override current version of TA, default
+    source. The default is `package`.
+* `--config` - [optional] path to the configuration file. It defaults to
+    the globalConfig file in the parent directory of the source provided.
+* `--ta-version` - [optional] override current version of TA. The default
     version is version specified in `globalConfig.json` or `globalConfig.yaml`. 
-    Splunkbase compatible version of SEMVER will be used by default.
-* `-o` / `--output` - [optional] output folder to store build add-on in.
+    A Splunkbase compatible version of SEMVER will be used by default.
+* `-o` / `--output` - [optional] output folder to store the build add-on.
     By default, it will be saved in the `current directory/output` folder.
-    Accepts absolute paths as well.
+    Absolute paths are accepted as well.
 * `--python-binary-name` - [optional] Python binary name to use when
-    installing Python libraries. Default: `python3`.
-* `-v` / `--verbose` - [optional] show detailed information about
+    installing Python libraries. The default is `python3`.
+* `-v` / `--verbose` - [optional] shows detailed information about
     created/copied/modified/conflict files after build is complete.
-    This option is in experimental mode. Default: `False`.
-* `--pip-version` - [optional] pip version that will be used to install python libraries. Default: `latest`.
+    This option is in experimental mode. The default is `False`.
+* `--pip-version` - [optional] pip version that will be used to install python libraries. The default is `latest`.
 * `--pip-legacy-resolver` - [optional] Use old pip dependency resolver by adding flag '--use-deprecated=legacy-resolver' 
-  to pip install command. Default: `False`. PLEASE NOTE: this flag is deprecated and will be removed from pip in the future.
-Instead of using this flag, the correct solution would be to fix the packages your project depends on to work properly with the new resolver.
-Additionally, please note that this flag is not compatible with pip version `23.2`, use `23.2.1` instead. 
+  to pip install command. The default is`False`. NOTE: This flag is deprecated and will be removed from pip in the future.
+Instead of using this flag, the correct solution would be to fix the packages your project depends on to work properly with the new resolver. Additionally, this flag is not compatible with pip version `23.2`. Use `23.2.1` instead. 
 
 #### Verbose mode
 
-Available from `v5.35.0`.
+Verbose mode is available for `v5.35.0` and up.
 
 Running `ucc-gen build -v` or `ucc-gen build --verbose` prints additional information about
-what was exactly created / copied / modified / conflict after the build is complete. It does
-not scan `lib` folder due to the nature of the folder.
+what was exactly created / copied / modified / conflicted after the build is complete. It does
+not scan the `lib` folder due to the nature of the folder.
 
-Below is the explanation on what exactly each state means:
+See the following explanation on what exactly each state means:
 
-* `created` - file is not in the original package and was created during the build process
-* `copied` - file is in the original package and was copied during the build process
-* `modified` - file is in the original package and was modified during the build process
-* `conflict` - file is in the original package and was copied during the build process but may be generated by UCC itself so incorrect usage can lead to not working add-on
+* `created`: The file is not in the original package and was created during the build process.
+* `copied`: The file is in the original package and was copied during the build process.
+* `modified`: The file is in the original package and was modified during the build process.
+* `conflict`: The file is in the original package and was copied during the build process, but may be generated by UCC itself, so incorrect usage can stop the add-on from working. 
 
 ### `ucc-gen init`
 
-Initializes the add-on (available from `v5.19.0`).
-`ucc-gen init` command initializes the add-on and bootstraps some code in the 
+`ucc-gen init` initializes the add-on. This is available on `v5.19.0` and up. 
+The `ucc-gen init` command initializes the add-on and bootstraps some code in the 
 modular input which you, as a developer, can extend for your needs.
 
 Apart from standard files needed for the add-on, it also adds search head 
-clustering files in `default/server.conf` file and reload triggers in 
-`default/app.conf` file. Those files will be generated automatically soon by 
-`ucc-gen build` command itself, for now you need to include them manually 
+clustering files in the `default/server.conf` file and reload triggers in the
+`default/app.conf` file. Those files will be soon by generated automatically by the
+`ucc-gen build` command itself. For now, you need to include them manually 
 during the add-on development.
 
 It takes the following parameters:
 
-* `--addon-name` - [required] add-on name. Consult with 
+* `--addon-name` - [required] add-on name. See the 
     [official naming convention guide](https://dev.splunk.com/enterprise/docs/releaseapps/splunkbase/namingguidelines/).
 * `--addon-rest-root` - [optional] add-on REST root, defaults to `--addon-name` if not provided. 
 * `--addon-display-name` - [required] add-on "official" name.
 * `--addon-input-name` - [required] name of the generated input. 
-* `--addon-version` - [optional] version of the generated add-on, `0.0.1` by default.
-* `--overwrite` - [optional] overwrites already existing folder if used, 
-    by default you can't generate a new add-on to already existing folder.
+* `--addon-version` - [optional] version of the generated add-on, with `0.0.1` by default.
+* `--overwrite` - [optional] overwrites the already existing folder. 
+    By default, you can't generate a new add-on to an already existing folder.
 
 ### `ucc-gen import-from-aob`
 
-Import from AoB (Add-on Builder) (available from `v5.24.0`). It is in the
+Import from AoB (Add-on Builder), from `v5.24.0` and up. It is in the
 **experimental** state as of now, meaning that running this command may not
-produce 100% UCC compatible add-on, but we are going to work on future
+produce a 100% UCC compatible add-on, but we are going to work on future
 improvements for the script itself.
 
-> Note: `import-from-aob` command does not support Windows as of now.
+> Note: the `import-from-aob` command does not currently support Windows.
 
 The import functionality is based on the 
 [ucc_migration_test](https://github.com/tmartin14/ucc_migration_test) bash
 script.
 One of the ways you can use it is to download an AoB-based add-on from
-Splunkbase, unarchive it and use 
+Splunkbase, unarchive the folder, and then use 
 `ucc-gen import-from-aob --addon-name <unarchived-folder-name>`. Or you can
 run the same command against your locally developed add-on, but it should be
 exported from AoB.
 
-It takes the following parameters:
+It accepts the following parameters:
 
 * `--addon-name` - [required] add-on name.
 
 ### `ucc-gen package`
 
-Available from `v5.30.0`. Packages the add-on so it can be installed. 
+`ucc-gen package` can be used for `v5.30.0` and up. It packages the add-on so it can be installed. 
 It mimics the basics of the `slim package` command. This command can be used for most of the simple cases.
 
 It does not support:
 
-* `.slimignore` file
-* [dependencies section](https://dev.splunk.com/enterprise/docs/releaseapps/packageapps/packagingtoolkit/#Dependencies-section)
+* the `.slimignore` file.
+* the [dependencies section](https://dev.splunk.com/enterprise/docs/releaseapps/packageapps/packagingtoolkit/#Dependencies-section).
 
-It takes the following parameters:
+It accepts the following parameters:
 
-* `--path` - [required] path to the built add-on (should include `app.manifest` file).
-* `-o` / `--output` - [optional] output folder to store packaged add-on in.
+* `--path` - [required] path to the built add-on (should include the `app.manifest` file).
+* `-o` / `--output` - [optional] output folder to store the packaged add-on.
     By default, it will be saved in the `current directory` folder.
-    Accepts absolute paths as well.
-
-## What `ucc-gen build` does
-
-* Cleans the output folder.
-* Retrieves the package ID of addon.
-* Copies UCC template directory under `output/<package_ID>` directory.
-* Copies globalConfig.json or globalConfig.yaml file to
-    `output/<package_ID>/appserver/static/js/build` directory.
-* Collects and install Addon's requirements into
-    `output/<package_ID>/lib` directory of addon's package.
-* For the addon's requirements, packages are installed according to
-    following table:
-    * `lib/requirements.txt` - install Python3 compatible packages into
-        `output/<package_ID>/lib`
-    * Removes `setuptools*`, `bin*`, `pip*`, `distribute*`, `wheel*` if 
+    It accepts absolute paths as well.
+
+## `ucc-gen build`
+
+`ucc-gen build`: 
+
+* cleans the output folder.
+* retrieves the package ID of the add-on.
+* copies the UCC template directory under the `output/<package_ID>` directory.
+* copies the globalConfig.json or the globalConfig.yaml file to
+    the `output/<package_ID>/appserver/static/js/build` directory.
+* collects and installs the add-on's requirements into the
+    `output/<package_ID>/lib` directory of add-on's package.
+* NOTE: For the add-on's requirements, the packages are installed according to
+    following information: 
+    * `lib/requirements.txt` installs Python3 compatible packages into
+        the `output/<package_ID>/lib`.
+    * It removes `setuptools*`, `bin*`, `pip*`, `distribute*`, and `wheel*` if 
         they exist from `output/<package_ID>/lib`
-    * Removes execute bit from every file under `output/<package_ID>/lib`
-* Replaces tokens in views.
-* Copies addon's `package/*` to `output/<package_ID>/*` directory.
-* If an addon requires some additional configurations in packaging
+    * It removes the execute bit from every file under `output/<package_ID>/lib`.
+* replaces tokens in views.
+* copies the add-on's `package/*` to the `output/<package_ID>/*` directory.
+* If an add-on requires some additional configurations in packaging,
     then `ucc-gen` runs the code in the `additional_packaging.py` file as well.
diff --git a/docs/table.md b/docs/table.md
index 0a1b99d4f..b1488f865 100644
--- a/docs/table.md
+++ b/docs/table.md
@@ -1,4 +1,4 @@
-This is a common feature that is used to display the account and input stanzas on the [Inputs](inputs/index.md) and [Configuration](configurations.md) pages, respectively.
+This is a common feature that is used to display the account and input stanzas on the [Inputs](inputs/index.md) and [Configuration](configurations/index.md) pages, respectively.
 
 Tables include many built-in features such as sorting, filtering, and pagination.
 
diff --git a/mkdocs.yml b/mkdocs.yml
index bbc975475..4782e937a 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -36,13 +36,17 @@ nav:
     - Introduction: "inputs/index.md"
     - Tabs: "inputs/tabs.md"
     - Multi-level Menu: "inputs/multilevel_menu.md"
-  - Configuration: "configurations.md"
+  - Configuration:
+      - "configurations/index.md"
+      - Proxy: "configurations/proxy.md"
   - Dashboard: "dashboard.md"
   - Entity:
     - "entity/index.md"
     - Introduction: "entity/index.md"
     - Components: "entity/components.md"
     - Validators: "entity/validators.md"
+    - Modify Fields On Change: "entity/modifyFieldsOnValue.md"
+
   - Table: "table.md"
   - Additional packaging: "additional_packaging.md"
   - UCC Ignore: "uccignore.md"
diff --git a/renovate.json b/renovate.json
index 0a176cdef..ac449a794 100644
--- a/renovate.json
+++ b/renovate.json
@@ -1,7 +1,6 @@
 {
   "extends": [
     "config:base",
-    "group:all",
     ":semanticCommitTypeAll(chore)",
     ":disableDependencyDashboard"
   ],
@@ -33,6 +32,8 @@
         "@npmcli/git",
         "@testing-library/react",
         "@types/react",
+        "@typescript-eslint/eslint-plugin",
+        "@typescript-eslint/parser",
         "babel-eslint",
         "babel-loader",
         "css-what",
diff --git a/splunk_add_on_ucc_framework/schema/schema.json b/splunk_add_on_ucc_framework/schema/schema.json
index 3a29ab0dc..34d28f05f 100644
--- a/splunk_add_on_ucc_framework/schema/schema.json
+++ b/splunk_add_on_ucc_framework/schema/schema.json
@@ -446,6 +446,9 @@
             },
             "requiredWhenVisible": {
               "type": "boolean"
+            },
+            "modifyFieldsOnValue": {
+              "$ref": "#/definitions/modifyFieldsOnValue"
             }
           },
           "additionalProperties": false
@@ -530,6 +533,9 @@
             },
             "rowsMax": {
               "type": "number"
+            },
+            "modifyFieldsOnValue": {
+              "$ref": "#/definitions/modifyFieldsOnValue"
             }
           },
           "additionalProperties": false
@@ -652,6 +658,9 @@
               "items": {
                 "$ref": "#/definitions/ValueLabelPair"
               }
+            },
+            "modifyFieldsOnValue": {
+              "$ref": "#/definitions/modifyFieldsOnValue"
             }
           },
           "additionalProperties": false
@@ -771,6 +780,9 @@
             "delimiter": {
               "type": "string",
               "maxLength": 1
+            },
+            "modifyFieldsOnValue": {
+              "$ref": "#/definitions/modifyFieldsOnValue"
             }
           },
           "additionalProperties": false
@@ -830,6 +842,9 @@
             }
           },
           "additionalProperties": false
+        },
+        "modifyFieldsOnValue": {
+          "$ref": "#/definitions/modifyFieldsOnValue"
         }
       },
       "required": ["field", "label", "type"],
@@ -1005,6 +1020,9 @@
               "items": {
                 "$ref": "#/definitions/ValueLabelPair"
               }
+            },
+            "modifyFieldsOnValue": {
+              "$ref": "#/definitions/modifyFieldsOnValue"
             }
           },
           "required": ["items"],
@@ -1081,6 +1099,9 @@
                 "type": "string"
               },
               "uniqueItems": true
+            },
+            "modifyFieldsOnValue": {
+              "$ref": "#/definitions/modifyFieldsOnValue"
             }
           },
           "additionalProperties": false
@@ -1749,6 +1770,9 @@
             }
           },
           "additionalProperties": false
+        },
+        "modifyFieldsOnValue": {
+          "$ref": "#/definitions/modifyFieldsOnValue"
         }
       },
       "additionalProperties": false
@@ -2035,6 +2059,155 @@
           "required": ["text"]
         }
       }
+    },
+    "singleFieldToModify": {
+      "type": "object",
+      "properties": {
+        "fieldId": {
+          "type": "string"
+        },
+        "display": {
+          "type": "boolean"
+        },
+        "value": {
+          "oneOf": [
+            {
+              "type": "number"
+            },
+            {
+              "type": "string"
+            },
+            {
+              "type": "boolean"
+            }
+          ]
+        },
+        "disabled": {
+          "type": "boolean"
+        },
+        "help": {
+          "type": "string"
+        },
+        "label": {
+          "type": "string"
+        },
+        "markdownMessage": {
+          "$ref": "#/definitions/markdownMessage"
+        }
+      },
+      "required": ["fieldId"]
+    },
+    "fieldToModify": {
+      "type": "object",
+      "properties": {
+        "fieldValue": {
+          "oneOf": [
+            {
+              "type": "number"
+            },
+            {
+              "type": "string"
+            },
+            {
+              "type": "boolean"
+            }
+          ]
+        },
+        "mode": {
+          "type": "string",
+          "enum": ["create", "edit", "config", "clone"]
+        },
+        "fieldsToModify": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/singleFieldToModify"
+          },
+          "minItems": 1
+        }
+      },
+      "required": ["fieldValue", "fieldsToModify"]
+    },
+    "modifyFieldsOnValue": {
+      "type": "array",
+      "items": {
+        "$ref": "#/definitions/fieldToModify"
+      }
+    },
+    "markdownMessageText": {
+      "type": "object",
+      "properties": {
+        "markdownType": {
+          "const": "text"
+        },
+        "text": {
+          "type": "string"
+        },
+        "color": {
+          "type": "string"
+        }
+      },
+      "required": ["markdownType", "text"]
+    },
+    "markdownMessageHybrid": {
+      "type": "object",
+      "properties": {
+        "markdownType": {
+          "const": "hybrid"
+        },
+        "text": {
+          "type": "string"
+        },
+        "token": {
+          "type": "string"
+        },
+        "linkText": {
+          "type": "string"
+        },
+        "link": {
+          "type": "string"
+        }
+      },
+      "required": ["markdownType", "text", "token", "link", "linkText"]
+    },
+    "markdownMessageLink": {
+      "type": "object",
+      "properties": {
+        "markdownType": {
+          "const": "link"
+        },
+        "text": {
+          "type": "string"
+        },
+        "link": {
+          "type": "string"
+        }
+      },
+      "required": ["markdownType", "text", "link"]
+    },
+    "markdownMessagePlainText": {
+      "type": "object",
+      "properties": {
+        "text": {
+          "type": "string"
+        }
+      },
+      "required": ["text"]
+    },
+    "markdownMessage": {
+      "anyOf": [
+        {
+          "$ref": "#/definitions/markdownMessageText"
+        },
+        {
+          "$ref": "#/definitions/markdownMessageHybrid"
+        },
+        {
+          "$ref": "#/definitions/markdownMessageLink"
+        },
+        {
+          "$ref": "#/definitions/markdownMessagePlainText"
+        }
+      ]
     }
   },
   "type": "object",
diff --git a/ui/.Dockerfile b/ui/.Dockerfile
new file mode 100644
index 000000000..433832eb2
--- /dev/null
+++ b/ui/.Dockerfile
@@ -0,0 +1,30 @@
+#
+# Copyright 2024 Splunk Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+FROM node:lts-bookworm-slim as base
+
+# Set working directory
+WORKDIR /usr/src/app
+
+# Install dependencies
+COPY package.json yarn.lock ./
+RUN npm install --global --force yarn &&  \
+    yarn install --frozen-lockfile && \
+    yarn playwright install --with-deps chromium
+
+# Copy everything except 'src' (specified in .dockerignore)
+COPY . .
+
diff --git a/ui/.dockerignore b/ui/.dockerignore
new file mode 100644
index 000000000..4856771af
--- /dev/null
+++ b/ui/.dockerignore
@@ -0,0 +1,21 @@
+#
+# Copyright 2024 Splunk Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+node_modules/
+.git
+.idea
+# src is mounted as volume
+src
diff --git a/ui/.gitignore b/ui/.gitignore
index 68e34e22b..3a070f533 100644
--- a/ui/.gitignore
+++ b/ui/.gitignore
@@ -30,25 +30,11 @@ pids
 *.seed
 *.pid.lock
 
-# Directory for instrumented libs generated by jscoverage/JSCover
-lib-cov
 
 # Coverage directory used by tools like istanbul
 coverage
 *.lcov
 
-# nyc test coverage
-.nyc_output
-
-# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
-.grunt
-
-# Bower dependency directory (https://bower.io/)
-bower_components
-
-# node-waf configuration
-.lock-wscript
-
 # Compiled binary addons (https://nodejs.org/api/addons.html)
 build/Release
 
@@ -68,15 +54,6 @@ typings/
 # Optional eslint cache
 .eslintcache
 
-# Microbundle cache
-.rpt2_cache/
-.rts2_cache_cjs/
-.rts2_cache_es/
-.rts2_cache_umd/
-
-# Optional REPL history
-.node_repl_history
-
 # Output of 'npm pack'
 *.tgz
 
@@ -87,40 +64,11 @@ typings/
 .env
 .env.test
 
-# parcel-bundler cache (https://parceljs.org/)
-.cache
-
-# Next.js build output
-.next
-
-# Nuxt.js build / generate output
-.nuxt
-dist
-
-# Gatsby files
-.cache/
-# Comment in the public line in if your project uses Gatsby and *not* Next.js
-# https://nextjs.org/blog/next-9-1#public-directory-support
-# public
-
-# vuepress build output
-.vuepress/dist
-
-# Serverless directories
-.serverless/
-
-# FuseBox cache
-.fusebox/
-
-# DynamoDB Local files
-.dynamodb/
-
-# TernJS port file
-.tern-port
-
 
 # output
 dist/**
 .idea
 
 storybook-static
+test-reports/
+!.storybook/assets/
diff --git a/ui/.storybook/assets/fonts/splunkdatasans-bold.woff b/ui/.storybook/assets/fonts/splunkdatasans-bold.woff
new file mode 100755
index 000000000..431a45152
Binary files /dev/null and b/ui/.storybook/assets/fonts/splunkdatasans-bold.woff differ
diff --git a/ui/.storybook/assets/fonts/splunkdatasans-medium.woff b/ui/.storybook/assets/fonts/splunkdatasans-medium.woff
new file mode 100755
index 000000000..918c48a20
Binary files /dev/null and b/ui/.storybook/assets/fonts/splunkdatasans-medium.woff differ
diff --git a/ui/.storybook/assets/fonts/splunkdatasans-regular.woff b/ui/.storybook/assets/fonts/splunkdatasans-regular.woff
new file mode 100755
index 000000000..2bcc81daa
Binary files /dev/null and b/ui/.storybook/assets/fonts/splunkdatasans-regular.woff differ
diff --git a/ui/.storybook/assets/fonts/splunkdatasansmono-regular.woff b/ui/.storybook/assets/fonts/splunkdatasansmono-regular.woff
new file mode 100644
index 000000000..e11372d45
Binary files /dev/null and b/ui/.storybook/assets/fonts/splunkdatasansmono-regular.woff differ
diff --git a/ui/.storybook/fontDefinitions.ts b/ui/.storybook/fontDefinitions.ts
new file mode 100644
index 000000000..691f45aad
--- /dev/null
+++ b/ui/.storybook/fontDefinitions.ts
@@ -0,0 +1,34 @@
+import { css } from 'styled-components';
+import splunkDataSansRegular from './assets/fonts/splunkdatasans-regular.woff';
+import splunkDataSansMedium from './assets/fonts/splunkdatasans-medium.woff';
+import splunkDataSansBold from './assets/fonts/splunkdatasans-bold.woff';
+import splunkDataSansMonoRegular from './assets/fonts/splunkdatasansmono-regular.woff';
+
+const fontDefinitions = css`
+    @font-face {
+        font-family: 'Splunk Platform Sans';
+        src: url('${splunkDataSansRegular}') format('woff');
+        font-weight: 400;
+        font-style: normal;
+    }
+    @font-face {
+        font-family: 'Splunk Platform Sans';
+        src: url('${splunkDataSansMedium}') format('woff');
+        font-weight: 600;
+        font-style: normal;
+    }
+    @font-face {
+        font-family: 'Splunk Platform Sans';
+        src: url('${splunkDataSansBold}') format('woff');
+        font-weight: 700;
+        font-style: normal;
+    }
+    @font-face {
+        font-family: 'Splunk Platform Mono';
+        src: url('${splunkDataSansMonoRegular}') format('woff');
+        font-weight: 400;
+        font-style: normal;
+    }
+`;
+
+export default fontDefinitions;
diff --git a/ui/.storybook/main.ts b/ui/.storybook/main.ts
index c82e12d01..6e7728a16 100644
--- a/ui/.storybook/main.ts
+++ b/ui/.storybook/main.ts
@@ -3,11 +3,21 @@ import * as custom from '../webpack.config.js';
 import * as path from 'path';
 
 const config: StorybookConfig = {
-    stories: ['../src/**/*.mdx', '../src/**/*.stories.@(js|jsx|mjs|ts|tsx)'],
+    stories: [
+        {
+            titlePrefix: 'Components',
+            directory: '../src/components',
+        },
+        {
+            titlePrefix: 'Pages',
+            directory: '../src/pages',
+        },
+    ],
     addons: [
         '@storybook/addon-links',
         '@storybook/addon-essentials',
         '@storybook/addon-interactions',
+        '@storybook/addon-a11y',
     ],
     framework: {
         name: '@storybook/react-webpack5',
@@ -16,7 +26,7 @@ const config: StorybookConfig = {
     docs: {
         autodocs: 'tag',
     },
-    staticDirs: ['../src/public'],
+    staticDirs: ['../src/public', './assets'],
     webpackFinal: async (config) => {
         const alias = config.resolve?.alias || {};
         return {
diff --git a/ui/.storybook/preview.tsx b/ui/.storybook/preview.tsx
index 11b0af8b2..e4a80e83d 100644
--- a/ui/.storybook/preview.tsx
+++ b/ui/.storybook/preview.tsx
@@ -6,9 +6,17 @@ import { withSplunkThemeToolbar } from './withSplunkTheme';
 
 // Initialize MSW
 initialize({
+    serviceWorker: {
+        url: './mockServiceWorker.js',
+    },
     onUnhandledRequest(req) {
         const url = req.url;
-        const skipList = ['bundle.js', 'hot-update.js', 'http://localhost:6006/index.json'];
+        const skipList = [
+            'bundle.js',
+            'hot-update.js',
+            'http://localhost:6006/index.json',
+            '.woff',
+        ];
         const shouldRequestBeBypassed = skipList.some((passItem) => url.includes(passItem));
         if (!shouldRequestBeBypassed) {
             console.warn('Found an unhandled %s request to %s', req.method, url);
diff --git a/ui/.storybook/withSplunkTheme.tsx b/ui/.storybook/withSplunkTheme.tsx
index cbb1711e5..fd13fb0b8 100644
--- a/ui/.storybook/withSplunkTheme.tsx
+++ b/ui/.storybook/withSplunkTheme.tsx
@@ -1,4 +1,4 @@
-import styled from 'styled-components';
+import styled, { createGlobalStyle } from 'styled-components';
 import variables from '@splunk/themes/variables';
 import { PartialStoryFn as StoryFunction, Renderer, StoryContext } from '@storybook/types';
 import { AnimationToggleProvider } from '@splunk/react-ui/AnimationToggle';
@@ -7,6 +7,18 @@ import { BrowserRouter as Router } from 'react-router-dom';
 import React, { Suspense } from 'react';
 import { StyledContainer } from '../src/pages/EntryPageStyle';
 import { WaitSpinnerWrapper } from '../src/components/table/CustomTableStyle';
+import fontDefinitions from './fontDefinitions';
+
+const TestStylesForConsistentScreenshots = createGlobalStyle`
+    ${fontDefinitions}
+
+    * {
+        text-rendering: geometricPrecision;
+        -webkit-font-smoothing: subpixel-antialiased;
+        -webkit-font-smoothing: antialiased;
+        -moz-osx-font-smoothing: grayscale;
+    }
+`;
 
 // https://storybook.js.org/blog/how-to-add-a-theme-switcher-to-storybook/
 // syncing storybook preview background with selected theme
@@ -28,9 +40,14 @@ export const withSplunkThemeToolbar = <TRenderer extends Renderer>(
     { globals }: StoryContext<TRenderer>
 ) => {
     // vars from globalTypes of preview.tsx
-    const { colorScheme, density, family, animation } = globals;
+    const { colorScheme, density, family } = globals;
+    const isTestRunner = !!window?.navigator?.userAgent?.match(/StorybookTestRunner/);
+
+    const animation = isTestRunner ? false : globals.animation;
+
     return (
         <AnimationToggleProvider enabled={animation}>
+            <TestStylesForConsistentScreenshots />
             <SplunkThemeProvider family={family} density={density} colorScheme={colorScheme}>
                 <BackgroundBlock>
                     <StyledContainer>
diff --git a/ui/README.md b/ui/README.md
index 71293f147..0f8be53a1 100644
--- a/ui/README.md
+++ b/ui/README.md
@@ -2,7 +2,7 @@
 
 ## Overview
 
-The project contains UI framework that renders UI components dynamically based on provided `globalConfig.json`.
+This project includes a UI framework that dynamically renders UI components based on the provided `globalConfig.json`.
 
 ## Getting Started
 
@@ -10,21 +10,63 @@ The project contains UI framework that renders UI components dynamically based o
 2. Install yarn (>= 1.2) if you haven't already: `npm install --global yarn`.
 3. Run the setup task: `yarn run setup`.
 
-After this step, the following tasks will be available:
+After completing these steps, the following tasks will be available:
 
-* `yarn run build` – Create a production bundle
-* `yarn run start` – build bundle and watch changes
-* `yarn run storybook` - start storybook and open http://localhost:6006
-* `yarn run eslint` – Run linters
-* `yarn run eslint:fix` – Fixed the linters and run prettier
-* `yarn run format` – Run prettier to auto-format `*.js`, `*.jsx` and `*.css` files. This command will overwrite files without 
-asking, `format:verify` won't.
+* `yarn build` – Creates a production bundle.
+* `yarn start` – Builds bundle and watches for changes.
+* `yarn run storybook` - Starts Storybook and opens http://localhost:6006.
+* `yarn run test-storybook` - Checks if screenshots match for every story.
+* `yarn run test-storybook:update-snapshots` - Updates screenshots. Must be run after every visual change.
+* `yarn run eslint` – Runs linters.
+* `yarn run eslint:fix` – Fixes linter issues and runs prettier.
+* `yarn run format` – Runs prettier to auto-format `*.js`, `*.jsx`, and `*.css` files. This command overwrites files without confirmation. Use `format:verify` for a non-destructive check.
 
-Running `yarn run setup` once is required to enable all other tasks. The command might take a few minutes to finish.
+Running `yarn run setup` is required to enable all other tasks. This command might take a few minutes to complete.
 
-We have published Storybook: https://splunk.github.io/addonfactory-ucc-generator/storybook
+We have published Storybook at: https://splunk.github.io/addonfactory-ucc-generator/storybook
 
 ## Code Formatting
 
-UCC UI Lib uses [prettier](https://github.com/prettier/prettier) to ensure consistent code formatting. It is recommended
- to [add a prettier plugin to your editor/ide](https://github.com/prettier/prettier#editor-integration).
+UCC UI Lib uses [prettier](https://github.com/prettier/prettier) for consistent code formatting. It's recommended to [add a prettier plugin to your editor/IDE](https://github.com/prettier/prettier#editor-integration).
+
+## Screenshot Testing Guide
+This section outlines how to work with screenshot testing in our project, utilizing [Git Large File Storage (Git LFS)](https://git-lfs.com/) and a continuous integration (CI) setup to ensure visual consistency across our Storybook stories.
+
+### Prerequisites
+- Git LFS: Our screenshots are stored with Git LFS. Ensure it's installed on your system by following [the installation guide](https://github.com/git-lfs/git-lfs#installing). For MacOS it is:
+```bash
+brew install git-lfs
+```
+
+After installing Git LFS, set it up with the following command:
+```bash
+git lfs install
+git lfs pull
+```
+
+### Automated Screenshot Testing
+Our CI pipeline includes a job defined in [storybook-visual.yml](../.github/workflows/storybook-visual.yml). This job automates the following process:
+- Build and serve Storybook.
+- Captures screenshots of all stories.
+- Compares these screenshots against those stored in the repository.
+- If discrepancies are found, the job updates the screenshots and pushes the updates to the current branch.
+
+### Updating Screenshots Locally
+Due to differences in application appearance between MacOS and Linux (especially in text rendering), we recommend using Docker to update screenshots for consistency. Here's how you can update screenshots locally:
+
+1. Start Storybook:
+
+Run Storybook locally using Yarn:
+
+```bash
+yarn run storybook
+```
+
+2. Capture and Update Screenshots:
+
+Once Storybook is running, use Docker Compose to update the screenshots:
+
+```bash
+docker compose up --build
+```
+This approach ensures that screenshots are consistent and reflective of how the application is intended to look across different environments.
diff --git a/ui/docker-compose.yml b/ui/docker-compose.yml
new file mode 100644
index 000000000..b37d02766
--- /dev/null
+++ b/ui/docker-compose.yml
@@ -0,0 +1,33 @@
+#
+# Copyright 2024 Splunk Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+version: '3.8'
+services:
+    storybook-tester:
+        build:
+            context: .
+            dockerfile: .Dockerfile
+        container_name: storybook_tester
+        volumes:
+            - .:/usr/src/app # This will mount the entire current directory
+            - /usr/src/app/node_modules # Use node_modules from the image
+            - ./src:/usr/src/app/src # Specifically mount `src` from the host to update screenshots
+        working_dir: /usr/src/app
+        network_mode: "host"
+        command: >
+            /bin/bash -c "
+                yarn test-storybook:update-snapshots --url http://host.docker.internal:6006
+            "
diff --git a/ui/package.json b/ui/package.json
index 3c589d7f3..4334689ab 100644
--- a/ui/package.json
+++ b/ui/package.json
@@ -15,13 +15,15 @@
     "start": "webpack --watch",
     "setup": "yarn && yarn run build",
     "storybook": "storybook dev -p 6006",
-    "build-storybook": "storybook build"
+    "build-storybook": "storybook build",
+    "test-storybook": "test-storybook",
+    "test-storybook:update-snapshots": "yarn run test-storybook -u"
   },
   "dependencies": {
     "@splunk/react-icons": "^4.2.0",
     "@splunk/react-page": "^6.3.3",
     "@splunk/react-toast-notifications": "^0.11.3",
-    "@splunk/react-ui": "^4.24.0",
+    "@splunk/react-ui": "^4.25.0",
     "@splunk/splunk-utils": "^3.0.0",
     "@splunk/themes": "^0.16.4",
     "@splunk/ui-utils": "^1.6.0",
@@ -33,80 +35,84 @@
     "react": "^16.14.0",
     "react-dom": "^16.14.0",
     "react-is": "^16.13.1",
-    "react-router-dom": "^6.21.3",
+    "react-router-dom": "^6.22.0",
     "styled-components": "^5.3.11",
     "uuid": "^9.0.1",
     "zod": "^3.22.4"
   },
   "devDependencies": {
     "@babel/core": "^7.23.9",
-    "@babel/eslint-parser": "^7.23.9",
+    "@babel/eslint-parser": "^7.23.10",
     "@babel/plugin-transform-runtime": "^7.23.9",
     "@babel/preset-env": "^7.23.9",
     "@babel/preset-react": "^7.23.3",
     "@splunk/babel-preset": "^4.0.0",
     "@splunk/eslint-config": "^4.0.0",
     "@splunk/webpack-configs": "^7.0.2",
-    "@storybook/addon-essentials": "^7.6.10",
-    "@storybook/addon-interactions": "^7.6.10",
-    "@storybook/addon-links": "^7.6.10",
-    "@storybook/blocks": "^7.6.10",
-    "@storybook/react": "^7.6.10",
-    "@storybook/react-webpack5": "^7.6.10",
+    "@storybook/addon-a11y": "^7.6.16",
+    "@storybook/addon-essentials": "^7.6.16",
+    "@storybook/addon-interactions": "^7.6.16",
+    "@storybook/addon-links": "^7.6.16",
+    "@storybook/blocks": "^7.6.16",
+    "@storybook/jest": "^0.2.3",
+    "@storybook/react": "^7.6.16",
+    "@storybook/react-webpack5": "^7.6.16",
+    "@storybook/test-runner": "^0.16.0",
     "@storybook/testing-library": "^0.2.2",
-    "@testing-library/jest-dom": "^6.3.0",
+    "@testing-library/jest-dom": "^6.4.2",
     "@testing-library/react": "^12.1.5",
     "@testing-library/user-event": "^14.5.2",
-    "@types/jest": "^29.5.11",
+    "@types/jest": "^29.5.12",
     "@types/js-yaml": "^4.0.9",
-    "@types/node": "^20.11.7",
-    "@types/react": "^16.14.51",
-    "@typescript-eslint/eslint-plugin": "^6.19.1",
-    "@typescript-eslint/parser": "^6.19.1",
+    "@types/node": "^20.11.19",
+    "@types/react": "^16.14.56",
+    "@typescript-eslint/eslint-plugin": "^6.21.0",
+    "@typescript-eslint/parser": "^6.21.0",
     "babel-eslint": "^10.1.0",
     "babel-jest": "^29.7.0",
     "babel-loader": "^8.3.0",
     "cross-env": "^7.0.3",
-    "css-loader": "^6.9.1",
+    "css-loader": "^6.10.0",
     "eslint": "^7.32.0",
     "eslint-config-airbnb": "^18.2.1",
     "eslint-config-prettier": "^7.2.0",
     "eslint-import-resolver-typescript": "^3.6.1",
     "eslint-plugin-import": "^2.29.1",
-    "eslint-plugin-jest": "^27.6.3",
+    "eslint-plugin-jest": "^27.8.0",
     "eslint-plugin-jsx-a11y": "^6.8.0",
     "eslint-plugin-prettier": "^4.2.1",
     "eslint-plugin-react": "^7.33.2",
     "eslint-plugin-react-hooks": "^4.6.0",
-    "eslint-plugin-storybook": "^0.6.15",
+    "eslint-plugin-storybook": "^0.7.0",
     "fork-ts-checker-webpack-plugin": "^9.0.2",
     "jest": "^29.7.0",
     "jest-environment-jsdom": "^29.7.0",
+    "jest-image-snapshot": "^6.4.0",
     "js-yaml": "^4.1.0",
-    "msw": "^2.1.5",
+    "msw": "^2.2.0",
     "msw-storybook-addon": "2.0.0--canary.122.06f0c92.0",
     "prettier": "^2.8.8",
     "querystring-es3": "^0.2.1",
-    "storybook": "^7.6.10",
+    "storybook": "^7.6.16",
     "style-loader": "^3.3.4",
     "stylelint": "^14.16.1",
     "ts-node": "^10.9.2",
     "typescript": "^5.3.3",
-    "undici": "^5.28.2",
+    "undici": "^5.28.3",
     "url": "^0.11.3",
-    "webpack": "^5.90.0",
+    "webpack": "^5.90.2",
     "webpack-cli": "^5.1.4",
     "webpack-merge": "^5.10.0"
   },
   "resolutions": {
-    "@npmcli/git": "^2.0.8",
-    "@types/react": "^16.14.35",
-    "css-what": "^5.0.1",
+    "@npmcli/git": "^2.1.0",
+    "@types/react": "^16.14.56",
+    "css-what": "^5.1.0",
     "glob-parent": "^5.1.2",
-    "postcss": "^8.4.33",
-    "semver": "^7.5.4",
+    "postcss": "^8.4.35",
+    "semver": "^7.6.0",
     "strip-ansi": "^6.0.1",
-    "string-width": "^4.2.2"
+    "string-width": "^4.2.3"
   },
   "engines": {
     "node": ">=20.10.0",
@@ -117,4 +123,4 @@
       "src/public"
     ]
   }
-}
\ No newline at end of file
+}
diff --git a/ui/src/components/AcceptModal/AcceptModal.stories.ts b/ui/src/components/AcceptModal/stories/AcceptModal.stories.ts
similarity index 84%
rename from ui/src/components/AcceptModal/AcceptModal.stories.ts
rename to ui/src/components/AcceptModal/stories/AcceptModal.stories.ts
index dd8bca654..b152ff3b8 100644
--- a/ui/src/components/AcceptModal/AcceptModal.stories.ts
+++ b/ui/src/components/AcceptModal/stories/AcceptModal.stories.ts
@@ -1,9 +1,9 @@
 import type { Meta, StoryObj } from '@storybook/react';
-import AcceptModal from './AcceptModal';
+import AcceptModal from '../AcceptModal';
 
 const meta = {
     component: AcceptModal,
-    title: 'Components/AcceptModal',
+    title: 'AcceptModal',
 } satisfies Meta<typeof AcceptModal>;
 
 export default meta;
diff --git a/ui/src/components/AcceptModal/stories/__images__/AcceptModal-base-chromium.png b/ui/src/components/AcceptModal/stories/__images__/AcceptModal-base-chromium.png
new file mode 100644
index 000000000..5abe8f57d
--- /dev/null
+++ b/ui/src/components/AcceptModal/stories/__images__/AcceptModal-base-chromium.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d06b1c396f7f8d12dd9b9d8eb546405b10d927502b55215679fee4bd99511c1b
+size 16990
diff --git a/ui/src/components/BaseFormTypes.ts b/ui/src/components/BaseFormTypes.ts
index 9cc0b2ad1..f46b17505 100644
--- a/ui/src/components/BaseFormTypes.ts
+++ b/ui/src/components/BaseFormTypes.ts
@@ -4,8 +4,18 @@ import {
     AcceptableFormValueOrNull,
     AcceptableFormValueOrNullish,
 } from '../types/components/shareableTypes';
-import { AnyOfEntity, OAuthFields } from '../types/globalConfig/entities';
-import { MarkdownMessageProps } from './MarkdownMessage';
+import { MarkdownMessageProps } from './MarkdownMessage/MarkdownMessage';
+import {
+    AnyOfEntity,
+    CheckboxEntity,
+    FileEntity,
+    MultipleSelectEntity,
+    OAuthFields,
+    RadioEntity,
+    SingleSelectEntity,
+    TextAreaEntity,
+    TextEntity,
+} from '../types/globalConfig/entities';
 
 export type CurrentBaseFormInput =
     | Record<string, AcceptableFormValueOrNull>
@@ -16,6 +26,24 @@ export interface CustomHookError {
     message: string;
 }
 
+type SingleFieldToModify = {
+    fieldId: string;
+    display?: boolean;
+    value?: string | number | boolean;
+    disabled?: boolean;
+    help?: string;
+    label?: string;
+    markdownMessage?: MarkdownMessageProps;
+};
+
+export type ModificationCriteria = {
+    fieldValue: string | number | boolean;
+    mode?: 'create' | 'edit' | 'config' | 'clone';
+    fieldsToModify: Array<SingleFieldToModify>;
+};
+
+export type ModifyFieldsOnValue = Array<ModificationCriteria>;
+
 export interface BaseFormStateData {
     [x: string]: {
         disabled: boolean;
@@ -25,6 +53,10 @@ export interface BaseFormStateData {
         display: boolean;
         markdownMessage?: MarkdownMessageProps;
         dependencyValues?: string;
+        modifiedEntitiesData?: {
+            help?: string;
+            label?: string;
+        };
     };
 }
 
@@ -43,9 +75,10 @@ export interface BaseFormState {
     mode?: Mode;
     page?: string;
     stanzaName?: string;
-    data?: BaseFormStateData;
+    data: BaseFormStateData;
     errorMsg?: string;
     warningMsg?: string;
+    stateModified?: boolean;
 }
 
 export interface SingleSelectEntityType {
@@ -59,6 +92,7 @@ export interface SingleSelectEntityType {
             value: 'oauth' | 'basic';
         }[];
     };
+    modifyFieldsOnValue?: ModifyFieldsOnValue;
 }
 
 export interface UtilBaseForm {
@@ -109,6 +143,16 @@ export interface CustomHook {
 
 export type AnyEntity = z.TypeOf<typeof AnyOfEntity> | z.TypeOf<typeof OAuthFields>;
 
+export type EntitiesAllowingModifications =
+    | z.TypeOf<typeof TextEntity>
+    | z.TypeOf<typeof TextAreaEntity>
+    | z.TypeOf<typeof SingleSelectEntity>
+    | z.TypeOf<typeof MultipleSelectEntity>
+    | z.TypeOf<typeof CheckboxEntity>
+    | z.TypeOf<typeof RadioEntity>
+    | z.TypeOf<typeof FileEntity>
+    | z.TypeOf<typeof OAuthFields>;
+
 export type OAuthEntity = z.TypeOf<typeof OAuthFields>;
 
 export interface BasicEntity {
diff --git a/ui/src/components/BaseFormView.tsx b/ui/src/components/BaseFormView.tsx
index ccc147188..d0beb1513 100644
--- a/ui/src/components/BaseFormView.tsx
+++ b/ui/src/components/BaseFormView.tsx
@@ -4,7 +4,7 @@ import { v4 as uuidv4 } from 'uuid';
 
 import Message from '@splunk/react-ui/Message';
 
-import ControlWrapper from './ControlWrapper';
+import ControlWrapper from './ControlWrapper/ControlWrapper';
 import Validator, { SaveValidator } from '../util/Validator';
 import { getUnifiedConfigs, generateToast } from '../util/util';
 import { MODE_CLONE, MODE_CREATE, MODE_EDIT, MODE_CONFIG } from '../constants/modes';
@@ -21,7 +21,7 @@ import {
     ERROR_STATE_MISSING_TRY_AGAIN,
 } from '../constants/oAuthErrorMessage';
 import TableContext from '../context/TableContext';
-import Group from './Group';
+import Group from './Group/Group';
 import {
     AcceptableFormValueOrNull,
     AcceptableFormValueOrNullish,
@@ -43,7 +43,12 @@ import {
     BasicEntity,
     ChangeRecord,
     CustomHookClass,
+    EntitiesAllowingModifications,
 } from './BaseFormTypes';
+import {
+    getAllFieldsWithModifications,
+    getModifiedState,
+} from './FormModifications/FormModifications';
 
 function onCustomHookError(params: { methodName: string; error?: CustomHookError }) {
     // eslint-disable-next-line no-console
@@ -118,11 +123,13 @@ class BaseFormView extends PureComponent<BaseFormProps, BaseFormState> {
 
     customWarningMessage: { message: string; alwaysDisplay?: boolean };
 
+    fieldsWithModifications: EntitiesAllowingModifications[];
+
     constructor(props: BaseFormProps, context: React.ContextType<typeof TableContext>) {
         super(props);
         // flag for to render hook method for once
         this.flag = true;
-        this.state = {};
+        this.state = { data: {} };
         this.datadict = {};
         this.currentInput = {};
         const globalConfig = getUnifiedConfigs();
@@ -222,7 +229,6 @@ class BaseFormView extends PureComponent<BaseFormProps, BaseFormState> {
         this.authMap = {};
         let temState: BaseFormStateData = {};
         const temEntities: AnyEntity[] = [];
-
         this.entities?.forEach((e) => {
             if (e.type === 'oauth') {
                 this.isOAuth = true;
@@ -493,6 +499,16 @@ class BaseFormView extends PureComponent<BaseFormProps, BaseFormState> {
         // apply dependency field changes in state
         // @ts-expect-error variable changes should have property '$apply'
         temState = update(temState, changes);
+
+        this.fieldsWithModifications = getAllFieldsWithModifications(this.entities);
+        const stateWithModifications = getModifiedState(
+            { data: temState },
+            this.props.mode,
+            this.fieldsWithModifications
+        );
+        if (stateWithModifications.shouldUpdateState) {
+            temState = { ...stateWithModifications.newState.data };
+        }
         this.state = {
             data: temState,
             errorMsg: '',
@@ -522,7 +538,7 @@ class BaseFormView extends PureComponent<BaseFormProps, BaseFormState> {
         }
     };
 
-    handleSubmit = (event: React.MouseEvent | React.FormEvent) => {
+    handleSubmit = async (event: React.MouseEvent | React.FormEvent) => {
         event.preventDefault();
         this.clearErrorMsg();
         this.props.handleFormSubmit(/* isSubmitting */ true, /* closeEntity */ false);
@@ -536,7 +552,8 @@ class BaseFormView extends PureComponent<BaseFormProps, BaseFormState> {
         });
 
         if (this.hook && typeof this.hook.onSave === 'function') {
-            const validationPass = this.hook.onSave(this.datadict);
+            const validationPass = await this.hook.onSave(this.datadict);
+
             if (!validationPass) {
                 this.props.handleFormSubmit(/* isSubmitting */ false, /* closeEntity */ false);
                 return;
@@ -564,7 +581,7 @@ class BaseFormView extends PureComponent<BaseFormProps, BaseFormState> {
                         if (entityLabel && nameFromDict && typeof nameFromDict !== 'object') {
                             this.setErrorFieldMsg(
                                 'name',
-                                getFormattedMessage(2, [entityLabel, nameFromDict])
+                                getFormattedMessage(2, [entityLabel, String(nameFromDict)])
                             );
                         }
                     }
@@ -899,15 +916,21 @@ class BaseFormView extends PureComponent<BaseFormProps, BaseFormState> {
             const newFields = update(prevState, { data: changes });
             const tempState = this.clearAllErrorMsg(newFields);
 
+            const { newState } = getModifiedState(
+                tempState,
+                this.props.mode,
+                this.fieldsWithModifications.filter((entity) => entity.field === field)
+            );
+
             if (this.hookDeferred) {
                 this.hookDeferred.then(() => {
-                    if (typeof this.hook?.onChange === 'function' && tempState) {
-                        this.hook.onChange(field, targetValue, tempState);
+                    if (typeof this.hook?.onChange === 'function') {
+                        this.hook.onChange(field, targetValue, newState);
                     }
                 });
             }
 
-            return tempState;
+            return newState;
         });
     };
 
@@ -969,7 +992,7 @@ class BaseFormView extends PureComponent<BaseFormProps, BaseFormState> {
             }
         });
         newFields.data = temData;
-        return State ? newFields : null;
+        return newFields;
     };
 
     // Display error message
@@ -1251,6 +1274,7 @@ class BaseFormView extends PureComponent<BaseFormProps, BaseFormState> {
             }
             this.flag = false;
         }
+
         return (
             <div>
                 <form
@@ -1285,6 +1309,7 @@ class BaseFormView extends PureComponent<BaseFormProps, BaseFormState> {
                                 markdownMessage={temState.markdownMessage}
                                 dependencyValues={temState.dependencyValues || null}
                                 fileNameToDisplay={temState.fileNameToDisplay}
+                                modifiedEntitiesData={temState.modifiedEntitiesData}
                             />
                         );
                     })}
diff --git a/ui/src/components/CheckBoxComponent/CheckBoxComponent.stories.tsx b/ui/src/components/CheckBoxComponent/stories/CheckBoxComponent.stories.tsx
similarity index 91%
rename from ui/src/components/CheckBoxComponent/CheckBoxComponent.stories.tsx
rename to ui/src/components/CheckBoxComponent/stories/CheckBoxComponent.stories.tsx
index 94c505815..f9a75f69a 100644
--- a/ui/src/components/CheckBoxComponent/CheckBoxComponent.stories.tsx
+++ b/ui/src/components/CheckBoxComponent/stories/CheckBoxComponent.stories.tsx
@@ -1,10 +1,10 @@
 import type { Meta, StoryObj } from '@storybook/react';
 import React, { useState } from 'react';
-import CheckBoxComponent from './CheckBoxComponent';
+import CheckBoxComponent from '../CheckBoxComponent';
 
 const meta = {
     component: CheckBoxComponent,
-    title: 'Components/CheckBoxComponent',
+    title: 'CheckBoxComponent',
     render: (props) => {
         // due to stories incompatibility, eslint rule is off
         // React Hook "useState" is called in function "render" that is neither a React function component
diff --git a/ui/src/components/CheckBoxComponent/stories/__images__/CheckBoxComponent-base-chromium.png b/ui/src/components/CheckBoxComponent/stories/__images__/CheckBoxComponent-base-chromium.png
new file mode 100644
index 000000000..50e6d713d
--- /dev/null
+++ b/ui/src/components/CheckBoxComponent/stories/__images__/CheckBoxComponent-base-chromium.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:229908a933e2967683fafad204999a094ac21ca6d86bce7a319cce92a12aa26a
+size 3434
diff --git a/ui/src/components/CheckboxGroup/CheckboxSubGroup.tsx b/ui/src/components/CheckboxGroup/CheckboxSubGroup.tsx
index 4d6e636bc..7945d3348 100644
--- a/ui/src/components/CheckboxGroup/CheckboxSubGroup.tsx
+++ b/ui/src/components/CheckboxGroup/CheckboxSubGroup.tsx
@@ -1,6 +1,6 @@
 import React from 'react';
 import styled from 'styled-components';
-import Group from '../Group';
+import Group from '../Group/Group';
 import { getCheckedCheckboxesCount, GroupWithRows, ValueByField } from './checkboxGroup.utils';
 import CheckboxRowWrapper from './CheckboxRowWrapper';
 
diff --git a/ui/src/components/CheckboxGroup/CheckboxGroup.stories.tsx b/ui/src/components/CheckboxGroup/stories/CheckboxGroup.stories.tsx
similarity index 97%
rename from ui/src/components/CheckboxGroup/CheckboxGroup.stories.tsx
rename to ui/src/components/CheckboxGroup/stories/CheckboxGroup.stories.tsx
index 09a5c9eb3..2c2912e35 100644
--- a/ui/src/components/CheckboxGroup/CheckboxGroup.stories.tsx
+++ b/ui/src/components/CheckboxGroup/stories/CheckboxGroup.stories.tsx
@@ -1,10 +1,10 @@
 import type { Meta, StoryObj } from '@storybook/react';
-import CheckboxGroup from './CheckboxGroup';
-import { MODE_CREATE, MODE_EDIT } from '../../constants/modes';
+import CheckboxGroup from '../CheckboxGroup';
+import { MODE_CREATE, MODE_EDIT } from '../../../constants/modes';
 
 const meta = {
     component: CheckboxGroup,
-    title: 'Components/CheckboxGroup',
+    title: 'CheckboxGroup/Component',
 } satisfies Meta<typeof CheckboxGroup>;
 
 export default meta;
diff --git a/ui/src/components/CheckboxGroup/CheckboxGroupInputPage.stories.tsx b/ui/src/components/CheckboxGroup/stories/CheckboxGroupInputPage.stories.tsx
similarity index 62%
rename from ui/src/components/CheckboxGroup/CheckboxGroupInputPage.stories.tsx
rename to ui/src/components/CheckboxGroup/stories/CheckboxGroupInputPage.stories.tsx
index 1dffa8bbe..f68e3e3c5 100644
--- a/ui/src/components/CheckboxGroup/CheckboxGroupInputPage.stories.tsx
+++ b/ui/src/components/CheckboxGroup/stories/CheckboxGroupInputPage.stories.tsx
@@ -1,15 +1,16 @@
 import type { Meta, StoryObj } from '@storybook/react';
 import React from 'react';
 import { within, userEvent } from '@storybook/testing-library';
-import BaseFormView from '../BaseFormView';
-import { setUnifiedConfig } from '../../util/util';
-import { serverHandlers } from './checkboxGroupMocks';
-import checkboxGroupConfig from './checkboxGroupMocks.json';
-import InputPage from '../../pages/Input/InputPage';
+import { expect } from '@storybook/jest';
+import BaseFormView from '../../BaseFormView';
+import { setUnifiedConfig } from '../../../util/util';
+import { serverHandlers } from '../checkboxGroupMocks';
+import checkboxGroupConfig from '../checkboxGroupMocks.json';
+import InputPage from '../../../pages/Input/InputPage';
 
 const meta = {
     component: InputPage,
-    title: 'InputPage/CheckboxGroup',
+    title: 'CheckboxGroup/Page',
     render: (args) => {
         setUnifiedConfig(args.globalConfig);
         return <InputPage />;
@@ -27,6 +28,9 @@ const meta = {
 
         const newInputBtn = canvas.getByRole('button', { name: 'Create New Input' });
         await userEvent.click(newInputBtn);
+
+        const root = within(canvasElement.ownerDocument.body);
+        await expect(await root.findByRole('dialog')).toBeVisible();
     },
 } satisfies Meta;
 
diff --git a/ui/src/components/CheckboxGroup/stories/__images__/CheckboxGroup-base-chromium.png b/ui/src/components/CheckboxGroup/stories/__images__/CheckboxGroup-base-chromium.png
new file mode 100644
index 000000000..a680d8bb8
--- /dev/null
+++ b/ui/src/components/CheckboxGroup/stories/__images__/CheckboxGroup-base-chromium.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3c9fae0b33aa75af16f8ebe887070d8d42f6d2b1d7c36a2faf855cb7a4bbf235
+size 17954
diff --git a/ui/src/components/CheckboxGroup/stories/__images__/CheckboxGroup-create-mode-chromium.png b/ui/src/components/CheckboxGroup/stories/__images__/CheckboxGroup-create-mode-chromium.png
new file mode 100644
index 000000000..23c0d77ff
--- /dev/null
+++ b/ui/src/components/CheckboxGroup/stories/__images__/CheckboxGroup-create-mode-chromium.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ccf6368da37d000ec8d7038c45e159fc2514d1790f6ea95e1c60c519798fc11a
+size 11558
diff --git a/ui/src/components/CheckboxGroup/stories/__images__/CheckboxGroup-input-page-view-chromium.png b/ui/src/components/CheckboxGroup/stories/__images__/CheckboxGroup-input-page-view-chromium.png
new file mode 100644
index 000000000..1a1366733
--- /dev/null
+++ b/ui/src/components/CheckboxGroup/stories/__images__/CheckboxGroup-input-page-view-chromium.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:07c690c818baaed094e60b3ff9682b50502fdd4b11b6acae9bb048b19c0b71f1
+size 34757
diff --git a/ui/src/components/CheckboxGroup/stories/__images__/CheckboxGroup-mixed-with-groups-chromium.png b/ui/src/components/CheckboxGroup/stories/__images__/CheckboxGroup-mixed-with-groups-chromium.png
new file mode 100644
index 000000000..da863a6e0
--- /dev/null
+++ b/ui/src/components/CheckboxGroup/stories/__images__/CheckboxGroup-mixed-with-groups-chromium.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e9beeab5bcd6d9ad8f7edcd2a33f1b5be289f87aaf9ccb9c94f20f3c962d4812
+size 27441
diff --git a/ui/src/components/CheckboxGroup/stories/__images__/CheckboxGroup-with-single-group-chromium.png b/ui/src/components/CheckboxGroup/stories/__images__/CheckboxGroup-with-single-group-chromium.png
new file mode 100644
index 000000000..4ede25343
--- /dev/null
+++ b/ui/src/components/CheckboxGroup/stories/__images__/CheckboxGroup-with-single-group-chromium.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ed0d4d4dba479ff0b2f138bde244a0426ff79e0cc32f4bd54a861e04ac79830e
+size 14917
diff --git a/ui/src/components/ConfigurationFormView.jsx b/ui/src/components/ConfigurationFormView.jsx
index 87b6cc284..659f2c0d6 100644
--- a/ui/src/components/ConfigurationFormView.jsx
+++ b/ui/src/components/ConfigurationFormView.jsx
@@ -28,8 +28,6 @@ function ConfigurationFormView({ serviceName }) {
             serviceName: `settings/${serviceName}`,
             handleError: true,
             callbackOnError: (err) => {
-                // eslint-disable-next-line no-param-reassign
-                err.uccErrorCode = 'ERR0005';
                 setError(err);
             },
         }).then((response) => {
@@ -48,7 +46,7 @@ function ConfigurationFormView({ serviceName }) {
         setIsSubmitting(set);
     };
 
-    if (error?.uccErrorCode) {
+    if (error) {
         throw error;
     }
 
diff --git a/ui/src/components/ConfigurationTable.jsx b/ui/src/components/ConfigurationTable.jsx
index 8453caee7..27be00e29 100644
--- a/ui/src/components/ConfigurationTable.jsx
+++ b/ui/src/components/ConfigurationTable.jsx
@@ -4,7 +4,7 @@ import PropTypes from 'prop-types';
 import { TableContextProvider } from '../context/TableContext';
 import TableWrapper from './table/TableWrapper';
 import EntityModal from './EntityModal/EntityModal';
-import EntityPage from './EntityPage';
+import EntityPage from './EntityPage/EntityPage';
 import { MODE_CREATE, MODE_CLONE } from '../constants/modes';
 import { PAGE_CONF } from '../constants/pages';
 import { STYLE_PAGE } from '../constants/dialogStyles';
diff --git a/ui/src/components/ControlWrapper.tsx b/ui/src/components/ControlWrapper/ControlWrapper.tsx
similarity index 79%
rename from ui/src/components/ControlWrapper.tsx
rename to ui/src/components/ControlWrapper/ControlWrapper.tsx
index c3ee6925b..92bd9b93f 100644
--- a/ui/src/components/ControlWrapper.tsx
+++ b/ui/src/components/ControlWrapper/ControlWrapper.tsx
@@ -1,10 +1,10 @@
 import React from 'react';
 import ControlGroup from '@splunk/react-ui/ControlGroup';
 import styled from 'styled-components';
-import MarkdownMessage, { MarkdownMessageProps } from './MarkdownMessage';
-import CONTROL_TYPE_MAP, { ComponentTypes } from '../constants/ControlTypeMap';
-import { AnyEntity, UtilControlWrapper } from './BaseFormTypes';
-import { AcceptableFormValueOrNullish } from '../types/components/shareableTypes';
+import MarkdownMessage from '../MarkdownMessage/MarkdownMessage';
+import CONTROL_TYPE_MAP, { ComponentTypes } from '../../constants/ControlTypeMap';
+import { AnyEntity, UtilControlWrapper } from '../BaseFormTypes';
+import { AcceptableFormValueOrNullish } from '../../types/components/shareableTypes';
 
 const CustomElement = styled.div``;
 
@@ -34,8 +34,19 @@ interface ControlWrapperProps {
     serviceName: string;
     dependencyValues: unknown;
     entity?: AnyEntity;
-    markdownMessage?: MarkdownMessageProps;
+    markdownMessage?: {
+        text: string;
+        link?: string;
+        color?: string;
+        markdownType?: 'text' | 'link' | 'hybrid';
+        token?: string;
+        linkText?: string;
+    };
     fileNameToDisplay?: string;
+    modifiedEntitiesData?: {
+        help?: string;
+        label?: string;
+    };
 }
 
 class ControlWrapper extends React.PureComponent<ControlWrapperProps> {
@@ -72,6 +83,7 @@ class ControlWrapper extends React.PureComponent<ControlWrapperProps> {
                       utilCustomFunctions,
                       controlOptions: this.props.entity.options,
                       ...this?.props?.entity,
+                      ...this.props?.modifiedEntitiesData,
                   })
                 : `No View Found for ${this?.props?.entity?.type} type`;
         } else {
@@ -87,6 +99,7 @@ class ControlWrapper extends React.PureComponent<ControlWrapperProps> {
                       fileNameToDisplay: this.props.fileNameToDisplay,
                       mode: this.props.mode,
                       ...this?.props?.entity,
+                      ...this.props?.modifiedEntitiesData,
                   })
                 : `No View Found for ${this?.props?.entity?.type} type`;
         }
@@ -97,24 +110,24 @@ class ControlWrapper extends React.PureComponent<ControlWrapperProps> {
                     text={text || ''}
                     link={link || ''}
                     color={color || ''}
-                    markdownType={markdownType || ''}
+                    markdownType={markdownType}
                     token={token || ''}
                     linkText={linkText || ''}
                 />
-                {this?.props?.entity?.help || ''}
+                {this.props?.modifiedEntitiesData?.help || this?.props?.entity?.help || ''}
             </>
         );
 
         return (
             this.props.display && (
                 <ControlGroupWrapper
+                    {...this?.props?.entity}
+                    {...this.props?.modifiedEntitiesData}
                     help={helpText}
                     error={this.props.error}
-                    // eslint-disable-next-line @typescript-eslint/ban-ts-comment
-                    // @ts-ignore property should be data-name, but is mapped in obj ControlGroupWrapper
+                    // @ts-expect-error property should be data-name, but is mapped in obj ControlGroupWrapper
                     dataName={this?.props?.entity.field}
                     labelWidth={240}
-                    {...this?.props?.entity}
                 >
                     <CustomElement>{rowView}</CustomElement>
                 </ControlGroupWrapper>
diff --git a/ui/src/components/ControlWrapper.stories.ts b/ui/src/components/ControlWrapper/stories/ControlWrapper.stories.ts
similarity index 88%
rename from ui/src/components/ControlWrapper.stories.ts
rename to ui/src/components/ControlWrapper/stories/ControlWrapper.stories.ts
index 419bcd7f3..9abcd4ccd 100644
--- a/ui/src/components/ControlWrapper.stories.ts
+++ b/ui/src/components/ControlWrapper/stories/ControlWrapper.stories.ts
@@ -1,9 +1,14 @@
 import type { Meta, StoryObj } from '@storybook/react';
-import ControlWrapper from './ControlWrapper';
+import ControlWrapper from '../ControlWrapper';
 
 const meta = {
     component: ControlWrapper,
-    title: 'Components/ControlWrapper',
+    title: 'ControlWrapper',
+    parameters: {
+        snapshots: {
+            height: 300,
+        },
+    },
 } satisfies Meta<typeof ControlWrapper>;
 
 export default meta;
diff --git a/ui/src/components/ControlWrapper/stories/__images__/ControlWrapper-base-chromium.png b/ui/src/components/ControlWrapper/stories/__images__/ControlWrapper-base-chromium.png
new file mode 100644
index 000000000..b21905705
--- /dev/null
+++ b/ui/src/components/ControlWrapper/stories/__images__/ControlWrapper-base-chromium.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7ba1ce57ce5c74d0986b4f6b5901cfb63be57d3706ee85823f5489e1f217b258
+size 18504
diff --git a/ui/src/components/CustomTab.jsx b/ui/src/components/CustomTab/CustomTab.jsx
similarity index 93%
rename from ui/src/components/CustomTab.jsx
rename to ui/src/components/CustomTab/CustomTab.jsx
index cbacddc6c..f7f146696 100644
--- a/ui/src/components/CustomTab.jsx
+++ b/ui/src/components/CustomTab/CustomTab.jsx
@@ -1,8 +1,8 @@
 import React, { useEffect, useRef, useState } from 'react';
 import PropTypes from 'prop-types';
 import { _ } from '@splunk/ui-utils/i18n';
-import { getUnifiedConfigs } from '../util/util';
-import { getBuildDirPath } from '../util/script';
+import { getUnifiedConfigs } from '../../util/util';
+import { getBuildDirPath } from '../../util/script';
 
 function CustomTab({ tab }) {
     const [loading, setLoading] = useState(true);
diff --git a/ui/src/components/CustomTab.stories.tsx b/ui/src/components/CustomTab/stories/CustomTab.stories.tsx
similarity index 92%
rename from ui/src/components/CustomTab.stories.tsx
rename to ui/src/components/CustomTab/stories/CustomTab.stories.tsx
index 37823e22f..0334d84cc 100644
--- a/ui/src/components/CustomTab.stories.tsx
+++ b/ui/src/components/CustomTab/stories/CustomTab.stories.tsx
@@ -1,12 +1,12 @@
 import type { Meta, StoryObj } from '@storybook/react';
 import React from 'react';
-import CustomTab from './CustomTab';
-import { setUnifiedConfig } from '../util/util';
-import { getGlobalConfigMock } from '../mocks/globalConfigMock';
+import CustomTab from '../CustomTab';
+import { setUnifiedConfig } from '../../../util/util';
+import { getGlobalConfigMock } from '../../../mocks/globalConfigMock';
 
 const meta = {
     component: CustomTab,
-    title: 'Components/CustomTab',
+    title: 'CustomTab',
     render: (props) => {
         // TODO: introduce a stateless stories component to reflect thaat component logic itself
         setUnifiedConfig(getGlobalConfigMock());
diff --git a/ui/src/components/CustomTab/stories/__images__/CustomTab-base-chromium.png b/ui/src/components/CustomTab/stories/__images__/CustomTab-base-chromium.png
new file mode 100644
index 000000000..c3f083c6a
--- /dev/null
+++ b/ui/src/components/CustomTab/stories/__images__/CustomTab-base-chromium.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7961199bed21213b648b5c27435b546c8347930696ad9a80eeb3c8eb8f12d09c
+size 4986
diff --git a/ui/src/components/DeleteModal/DeleteModal.stories.tsx b/ui/src/components/DeleteModal/stories/DeleteModal.stories.tsx
similarity index 79%
rename from ui/src/components/DeleteModal/DeleteModal.stories.tsx
rename to ui/src/components/DeleteModal/stories/DeleteModal.stories.tsx
index 365ddc891..91f904fdc 100644
--- a/ui/src/components/DeleteModal/DeleteModal.stories.tsx
+++ b/ui/src/components/DeleteModal/stories/DeleteModal.stories.tsx
@@ -1,12 +1,12 @@
 import type { Meta, StoryObj } from '@storybook/react';
 import React from 'react';
-import DeleteModal from './DeleteModal';
-import { getGlobalConfigMock } from '../../mocks/globalConfigMock';
-import { setUnifiedConfig } from '../../util/util';
+import DeleteModal from '../DeleteModal';
+import { getGlobalConfigMock } from '../../../mocks/globalConfigMock';
+import { setUnifiedConfig } from '../../../util/util';
 
 const meta = {
     component: DeleteModal,
-    title: 'Components/DeleteModal',
+    title: 'DeleteModal',
     render: (props) => {
         // TODO: introduce a stateless stories component to reflect thaat component logic itself
         setUnifiedConfig(getGlobalConfigMock());
diff --git a/ui/src/components/DeleteModal/stories/__images__/DeleteModal-base-chromium.png b/ui/src/components/DeleteModal/stories/__images__/DeleteModal-base-chromium.png
new file mode 100644
index 000000000..9a6502287
--- /dev/null
+++ b/ui/src/components/DeleteModal/stories/__images__/DeleteModal-base-chromium.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:27378961013136a03044f48d343ae6c307030dfcdedcac50ec29683589408e28
+size 24944
diff --git a/ui/src/components/DeleteModal/stories/__images__/DeleteModal-inputs-chromium.png b/ui/src/components/DeleteModal/stories/__images__/DeleteModal-inputs-chromium.png
new file mode 100644
index 000000000..219dbe56c
--- /dev/null
+++ b/ui/src/components/DeleteModal/stories/__images__/DeleteModal-inputs-chromium.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:44e6171e61214910526d936caaf420f471fa74b80586a2363ad1517b9fcc5c76
+size 17235
diff --git a/ui/src/components/DownloadButton/DownloadButton.stories.ts b/ui/src/components/DownloadButton/stories/DownloadButton.stories.ts
similarity index 83%
rename from ui/src/components/DownloadButton/DownloadButton.stories.ts
rename to ui/src/components/DownloadButton/stories/DownloadButton.stories.ts
index c626eb753..f92a084b5 100644
--- a/ui/src/components/DownloadButton/DownloadButton.stories.ts
+++ b/ui/src/components/DownloadButton/stories/DownloadButton.stories.ts
@@ -1,9 +1,9 @@
 import type { Meta, StoryObj } from '@storybook/react';
-import DownloadButton from './DownloadButton';
+import DownloadButton from '../DownloadButton';
 
 const meta = {
     component: DownloadButton,
-    title: 'Components/DownloadButton',
+    title: 'DownloadButton',
 } satisfies Meta<typeof DownloadButton>;
 
 export default meta;
diff --git a/ui/src/components/DownloadButton/stories/__images__/DownloadButton-base-chromium.png b/ui/src/components/DownloadButton/stories/__images__/DownloadButton-base-chromium.png
new file mode 100644
index 000000000..8a1ac8f5f
--- /dev/null
+++ b/ui/src/components/DownloadButton/stories/__images__/DownloadButton-base-chromium.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e03f11c3e143a706ed02ee2d903bae2cd77ed04164be0afab9a0bee8c3e1e0cb
+size 5317
diff --git a/ui/src/components/EntityModal/EntityModal.tsx b/ui/src/components/EntityModal/EntityModal.tsx
index 0c47c6456..040efcd86 100644
--- a/ui/src/components/EntityModal/EntityModal.tsx
+++ b/ui/src/components/EntityModal/EntityModal.tsx
@@ -54,8 +54,8 @@ class EntityModal extends Component<EntityModalProps, EntityModalState> {
         this.props.handleRequestClose();
     };
 
-    handleSubmit: ButtonClickHandler = (e) => {
-        const result = this.form.current?.handleSubmit(e);
+    handleSubmit: ButtonClickHandler = async (e) => {
+        const result = await this.form.current?.handleSubmit(e);
         if (result) {
             this.handleRequestClose();
         }
diff --git a/ui/src/components/EntityModal/EntityModal.stories.tsx b/ui/src/components/EntityModal/stories/EntityModal.stories.tsx
similarity index 76%
rename from ui/src/components/EntityModal/EntityModal.stories.tsx
rename to ui/src/components/EntityModal/stories/EntityModal.stories.tsx
index 3a4676ef2..7b478cf1f 100644
--- a/ui/src/components/EntityModal/EntityModal.stories.tsx
+++ b/ui/src/components/EntityModal/stories/EntityModal.stories.tsx
@@ -1,18 +1,23 @@
 import type { Meta, StoryObj } from '@storybook/react';
 import React from 'react';
-import EntityModal from './EntityModal';
-import { setUnifiedConfig } from '../../util/util';
-import { getGlobalConfigMock } from '../../mocks/globalConfigMock';
+import EntityModal from '../EntityModal';
+import { setUnifiedConfig } from '../../../util/util';
+import { getGlobalConfigMock } from '../../../mocks/globalConfigMock';
 
 const meta = {
     component: EntityModal,
-    title: 'Components/EntityModal',
+    title: 'EntityModal',
     render: (props) => {
         // TODO: introduce a stateless stories component to reflect thaat component logic itself
         setUnifiedConfig(getGlobalConfigMock()); // eslint-disable-line no-use-before-define
 
         return <EntityModal {...props} />;
     },
+    parameters: {
+        a11y: {
+            element: '[data-test="modal"]',
+        },
+    },
 } satisfies Meta<typeof EntityModal>;
 
 export default meta;
diff --git a/ui/src/components/EntityModal/stories/__images__/EntityModal-base-chromium.png b/ui/src/components/EntityModal/stories/__images__/EntityModal-base-chromium.png
new file mode 100644
index 000000000..e2709bbcf
--- /dev/null
+++ b/ui/src/components/EntityModal/stories/__images__/EntityModal-base-chromium.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1008bbf916b16a9b15b6553fedb713512044ea2d3c0eb7d6d78c3d2e8c0fbbb7
+size 24700
diff --git a/ui/src/components/EntityModal/stories/__images__/EntityModal-inputs-chromium.png b/ui/src/components/EntityModal/stories/__images__/EntityModal-inputs-chromium.png
new file mode 100644
index 000000000..6eb7354ab
--- /dev/null
+++ b/ui/src/components/EntityModal/stories/__images__/EntityModal-inputs-chromium.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:bb976bcef92257ec0121c5415675ed08090a194712387a1ee1d4057db273f20b
+size 30955
diff --git a/ui/src/components/EntityPage.tsx b/ui/src/components/EntityPage/EntityPage.tsx
similarity index 90%
rename from ui/src/components/EntityPage.tsx
rename to ui/src/components/EntityPage/EntityPage.tsx
index fbe689153..653d748ca 100644
--- a/ui/src/components/EntityPage.tsx
+++ b/ui/src/components/EntityPage/EntityPage.tsx
@@ -9,11 +9,11 @@ import { variables } from '@splunk/themes';
 import Heading from '@splunk/react-ui/Heading';
 import styled from 'styled-components';
 import { ButtonClickHandler } from '@splunk/react-ui/Button';
-import { MODE_CLONE, MODE_CREATE, MODE_EDIT, Mode } from '../constants/modes';
-import BaseFormView from './BaseFormView';
-import { SubTitleComponent } from '../pages/Input/InputPageStyle';
-import { PAGE_INPUT } from '../constants/pages';
-import { StyledButton } from '../pages/EntryPageStyle';
+import { MODE_CLONE, MODE_CREATE, MODE_EDIT, Mode } from '../../constants/modes';
+import BaseFormView from '../BaseFormView';
+import { SubTitleComponent } from '../../pages/Input/InputPageStyle';
+import { PAGE_INPUT } from '../../constants/pages';
+import { StyledButton } from '../../pages/EntryPageStyle';
 
 interface EntityPageProps {
     handleRequestClose: () => void;
@@ -56,8 +56,8 @@ function EntityPage({
         buttonText = _('Update');
     }
 
-    const handleSubmit: ButtonClickHandler = (e) => {
-        const result = form.current?.handleSubmit(e);
+    const handleSubmit: ButtonClickHandler = async (e) => {
+        const result = await form.current?.handleSubmit(e);
         if (result) {
             handleRequestClose();
         }
diff --git a/ui/src/components/EntityPage.stories.tsx b/ui/src/components/EntityPage/stories/EntityPage.stories.tsx
similarity index 76%
rename from ui/src/components/EntityPage.stories.tsx
rename to ui/src/components/EntityPage/stories/EntityPage.stories.tsx
index 8db79f072..56b9f0798 100644
--- a/ui/src/components/EntityPage.stories.tsx
+++ b/ui/src/components/EntityPage/stories/EntityPage.stories.tsx
@@ -1,17 +1,22 @@
 import type { Meta, StoryObj } from '@storybook/react';
 import React from 'react';
-import EntityPage from './EntityPage';
-import { setUnifiedConfig } from '../util/util';
-import { getGlobalConfigMock } from '../mocks/globalConfigMock';
+import EntityPage from '../EntityPage';
+import { setUnifiedConfig } from '../../../util/util';
+import { getGlobalConfigMock } from '../../../mocks/globalConfigMock';
 
 const meta = {
     component: EntityPage,
-    title: 'Components/EntityPage',
+    title: 'EntityPage',
     render: (props) => {
         // TODO: introduce a stateless stories component to reflect thaat component logic itself
         setUnifiedConfig(getGlobalConfigMock());
         return <EntityPage {...props} />;
     },
+    parameters: {
+        snapshots: {
+            width: 1000,
+        },
+    },
 } satisfies Meta<typeof EntityPage>;
 
 export default meta;
diff --git a/ui/src/components/EntityPage/stories/__images__/EntityPage-base-chromium.png b/ui/src/components/EntityPage/stories/__images__/EntityPage-base-chromium.png
new file mode 100644
index 000000000..750a6cdd6
--- /dev/null
+++ b/ui/src/components/EntityPage/stories/__images__/EntityPage-base-chromium.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:039c36f948726044ee09df980780a0fd9e81d49d0b8f819bb49b904666d8f093
+size 27038
diff --git a/ui/src/components/EntityPage/stories/__images__/EntityPage-inputs-chromium.png b/ui/src/components/EntityPage/stories/__images__/EntityPage-inputs-chromium.png
new file mode 100644
index 000000000..aee089c99
--- /dev/null
+++ b/ui/src/components/EntityPage/stories/__images__/EntityPage-inputs-chromium.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:90e34dcd4a5f0bdd568aa911af20ebbd62866b5380dcfa619426c9dac15c602a
+size 31325
diff --git a/ui/src/components/ErrorBoundary.tsx b/ui/src/components/ErrorBoundary.tsx
deleted file mode 100644
index cdcc0008a..000000000
--- a/ui/src/components/ErrorBoundary.tsx
+++ /dev/null
@@ -1,76 +0,0 @@
-import React, { ReactElement } from 'react';
-import Heading from '@splunk/react-ui/Heading';
-import { _ } from '@splunk/ui-utils/i18n';
-import Card from '@splunk/react-ui/Card';
-import WarningIcon from '@splunk/react-icons/enterprise/Warning';
-import errorCodes from '../constants/errorCodes';
-
-interface ErrorBoundaryProps {
-    children: ReactElement | ReactElement[];
-}
-
-interface ErrorBoundaryState {
-    errorCode: keyof typeof errorCodes | null;
-    error: null | unknown;
-}
-
-class ErrorBoundary extends React.Component<ErrorBoundaryProps, ErrorBoundaryState> {
-    constructor(props: ErrorBoundaryProps) {
-        super(props);
-        this.state = { errorCode: null, error: null };
-    }
-
-    static getDerivedStateFromError(error: { uccErrorCode: unknown }) {
-        // Update state so the next render will show the fallback UI.
-        return { errorCode: error.uccErrorCode, error };
-    }
-
-    componentDidCatch(error: unknown) {
-        // Catch errors in any components below and re-render with error message
-        this.setState({
-            error,
-        });
-        // You can also log error messages to an error reporting service here
-    }
-
-    render() {
-        if (this.state.error) {
-            // Error path
-            return (
-                <div style={{ marginTop: '10%' }}>
-                    <Card style={{ boxShadow: '10px 10px 5px #aaaaaa' }}>
-                        <Card.Header>
-                            <Heading style={{ textAlign: 'center' }} level={2}>
-                                <WarningIcon style={{ fontSize: '120px', color: '#ff9900' }} />
-                                <br />
-                                <br />
-                                {this.state.errorCode === 'ERR0001'
-                                    ? _('Failed to load Inputs Page')
-                                    : _('Something went wrong!')}
-                            </Heading>
-                        </Card.Header>
-                        <Card.Body>
-                            {this.state.errorCode ? (
-                                <>
-                                    {_(errorCodes[this.state.errorCode])}
-                                    <br />
-                                    <br />
-                                </>
-                            ) : null}
-                            <details style={{ whiteSpace: 'pre-wrap' }}>
-                                {this.state.error?.toString()}
-                            </details>
-                        </Card.Body>
-                        <Card.Footer showBorder={false}>
-                            {this.state.errorCode ? this.state.errorCode : null}
-                        </Card.Footer>
-                    </Card>
-                </div>
-            );
-        }
-        // Normally, just render children
-        return this.props.children;
-    }
-}
-
-export default ErrorBoundary;
diff --git a/ui/src/components/ErrorBoundary/ErrorBoundary.tsx b/ui/src/components/ErrorBoundary/ErrorBoundary.tsx
new file mode 100644
index 000000000..35b7d2053
--- /dev/null
+++ b/ui/src/components/ErrorBoundary/ErrorBoundary.tsx
@@ -0,0 +1,104 @@
+import React, { ReactElement } from 'react';
+import Heading from '@splunk/react-ui/Heading';
+import { gettext } from '@splunk/ui-utils/i18n';
+import Card from '@splunk/react-ui/Card';
+import WarningIcon from '@splunk/react-icons/enterprise/Warning';
+import styled from 'styled-components';
+import { variables } from '@splunk/themes';
+import { parseErrorMsg } from '../../util/messageUtil';
+
+interface ErrorBoundaryProps {
+    children: ReactElement | ReactElement[];
+}
+
+interface ErrorBoundaryState {
+    error:
+        | {
+              response?: {
+                  data?: {
+                      messages?: { text: string }[];
+                  };
+              };
+          }
+        | null
+        | unknown;
+}
+
+const StyledContainer = styled.div`
+    display: flex;
+    justify-content: center; // Ensures horizontal centering of children
+    align-items: center; // Ensures vertical centering
+    width: 100%; // Takes up full width of its parent
+`;
+
+const StyledCard = styled(Card)`
+    display: flex;
+    flex: 0;
+    box-shadow: ${variables.overlayShadow};
+    min-width: 30rem;
+`;
+
+const StyledHeading = styled(Heading)`
+    text-align: center;
+`;
+
+const StyledWarningIcon = styled(WarningIcon)`
+    font-size: 120px;
+    color: ${variables.alertColor};
+`;
+
+const StyledTypography = styled.details`
+    white-space: pre-wrap;
+    word-break: break-word;
+`;
+
+class ErrorBoundary extends React.Component<ErrorBoundaryProps, ErrorBoundaryState> {
+    constructor(props: ErrorBoundaryProps) {
+        super(props);
+        this.state = { error: null };
+    }
+
+    static getDerivedStateFromError(error: unknown) {
+        // Update state so the next render will show the fallback UI.
+        return { error };
+    }
+
+    componentDidCatch(error: unknown) {
+        // Catch errors in any components below and re-render with error message
+        this.setState({
+            error,
+        });
+        // eslint-disable-next-line no-console
+        console.error(error);
+    }
+
+    render() {
+        if (this.state.error) {
+            const parsedErrorMessage = parseErrorMsg(this.state?.error);
+            // Error path
+            return (
+                <StyledContainer>
+                    <StyledCard>
+                        <Card.Header>
+                            <StyledHeading level={2}>
+                                <StyledWarningIcon />
+                                <StyledTypography as="p">
+                                    {gettext('Something went wrong!')}
+                                </StyledTypography>
+                            </StyledHeading>
+                        </Card.Header>
+                        <Card.Body>
+                            {parsedErrorMessage && (
+                                <StyledTypography as="p">{parsedErrorMessage}</StyledTypography>
+                            )}
+                        </Card.Body>
+                    </StyledCard>
+                </StyledContainer>
+            );
+        }
+        // Normally, just render children
+        return this.props.children;
+    }
+}
+
+export default ErrorBoundary;
diff --git a/ui/src/components/ErrorBoundary.stories.tsx b/ui/src/components/ErrorBoundary/stories/ErrorBoundary.stories.tsx
similarity index 73%
rename from ui/src/components/ErrorBoundary.stories.tsx
rename to ui/src/components/ErrorBoundary/stories/ErrorBoundary.stories.tsx
index 8dbbf039c..4b39e3a3b 100644
--- a/ui/src/components/ErrorBoundary.stories.tsx
+++ b/ui/src/components/ErrorBoundary/stories/ErrorBoundary.stories.tsx
@@ -1,14 +1,14 @@
 import type { Meta, StoryObj } from '@storybook/react';
 import React from 'react';
-import ErrorBoundary from './ErrorBoundary';
+import ErrorBoundary from '../ErrorBoundary';
 
 const ErrorGenerator = () => {
-    throw new Error('some error message');
+    throw new Error('Some internal error message. It should not be shown to the user');
 };
 
 const meta = {
     component: ErrorBoundary,
-    title: 'Components/ErrorBoundary',
+    title: 'ErrorBoundary',
     render: () => (
         <ErrorBoundary>
             <ErrorGenerator />
diff --git a/ui/src/components/ErrorBoundary/stories/__images__/ErrorBoundary-base-chromium.png b/ui/src/components/ErrorBoundary/stories/__images__/ErrorBoundary-base-chromium.png
new file mode 100644
index 000000000..5282980c2
--- /dev/null
+++ b/ui/src/components/ErrorBoundary/stories/__images__/ErrorBoundary-base-chromium.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:51165175b820ecf15e7a5084a1fe7837159ae958cc9341299c611a51d1016021
+size 14152
diff --git a/ui/src/components/ErrorModal.tsx b/ui/src/components/ErrorModal/ErrorModal.tsx
similarity index 89%
rename from ui/src/components/ErrorModal.tsx
rename to ui/src/components/ErrorModal/ErrorModal.tsx
index 9c5ae67f7..6153609f9 100644
--- a/ui/src/components/ErrorModal.tsx
+++ b/ui/src/components/ErrorModal/ErrorModal.tsx
@@ -3,8 +3,8 @@ import Modal from '@splunk/react-ui/Modal';
 import Message from '@splunk/react-ui/Message';
 import styled from 'styled-components';
 
-import { getFormattedMessage } from '../util/messageUtil';
-import { StyledButton } from '../pages/EntryPageStyle';
+import { getFormattedMessage } from '../../util/messageUtil';
+import { StyledButton } from '../../pages/EntryPageStyle';
 
 const ModalWrapper = styled(Modal)`
     width: 600px;
diff --git a/ui/src/components/ErrorModal.stories.tsx b/ui/src/components/ErrorModal/stories/ErrorModal.stories.tsx
similarity index 80%
rename from ui/src/components/ErrorModal.stories.tsx
rename to ui/src/components/ErrorModal/stories/ErrorModal.stories.tsx
index b42ef01db..0b9c93212 100644
--- a/ui/src/components/ErrorModal.stories.tsx
+++ b/ui/src/components/ErrorModal/stories/ErrorModal.stories.tsx
@@ -1,9 +1,9 @@
 import type { Meta, StoryObj } from '@storybook/react';
-import ErrorModal from './ErrorModal';
+import ErrorModal from '../ErrorModal';
 
 const meta = {
     component: ErrorModal,
-    title: 'Components/ErrorModal',
+    title: 'ErrorModal',
 } satisfies Meta<typeof ErrorModal>;
 
 export default meta;
diff --git a/ui/src/components/ErrorModal/stories/__images__/ErrorModal-base-chromium.png b/ui/src/components/ErrorModal/stories/__images__/ErrorModal-base-chromium.png
new file mode 100644
index 000000000..b5f563fb2
--- /dev/null
+++ b/ui/src/components/ErrorModal/stories/__images__/ErrorModal-base-chromium.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:750aea4e2e6e5cc482264374d3b8c48fff71de750fd48b3a64d7c583643e1164
+size 12763
diff --git a/ui/src/components/FileInputComponent/FileInputComponent.stories.tsx b/ui/src/components/FileInputComponent/stories/FileInputComponent.stories.tsx
similarity index 82%
rename from ui/src/components/FileInputComponent/FileInputComponent.stories.tsx
rename to ui/src/components/FileInputComponent/stories/FileInputComponent.stories.tsx
index d7cc54e5f..b8c81e186 100644
--- a/ui/src/components/FileInputComponent/FileInputComponent.stories.tsx
+++ b/ui/src/components/FileInputComponent/stories/FileInputComponent.stories.tsx
@@ -1,9 +1,14 @@
 import type { Meta, StoryObj } from '@storybook/react';
-import FileInputComponent from './FileInputComponent';
+import FileInputComponent from '../FileInputComponent';
 
 const meta = {
     component: FileInputComponent,
-    title: 'Components/FileInputComponent',
+    title: 'FileInputComponent',
+    parameters: {
+        snapshots: {
+            height: 300,
+        },
+    },
 } satisfies Meta<typeof FileInputComponent>;
 
 export default meta;
diff --git a/ui/src/components/FileInputComponent/stories/__images__/FileInputComponent-base-chromium.png b/ui/src/components/FileInputComponent/stories/__images__/FileInputComponent-base-chromium.png
new file mode 100644
index 000000000..345676b42
--- /dev/null
+++ b/ui/src/components/FileInputComponent/stories/__images__/FileInputComponent-base-chromium.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b508b37934adede4f54911041afb89d858cf6295efae996acc6c25fe35c3c002
+size 9117
diff --git a/ui/src/components/FileInputComponent/stories/__images__/FileInputComponent-encrypted-with-default-name-chromium.png b/ui/src/components/FileInputComponent/stories/__images__/FileInputComponent-encrypted-with-default-name-chromium.png
new file mode 100644
index 000000000..f105c53a3
--- /dev/null
+++ b/ui/src/components/FileInputComponent/stories/__images__/FileInputComponent-encrypted-with-default-name-chromium.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5e5d7130265e9391bd70ff01c5426633ef24c31eda710ddb25c7ba9a5751d908
+size 14249
diff --git a/ui/src/components/FileInputComponent/stories/__images__/FileInputComponent-with-default-name-chromium.png b/ui/src/components/FileInputComponent/stories/__images__/FileInputComponent-with-default-name-chromium.png
new file mode 100644
index 000000000..fda910d07
--- /dev/null
+++ b/ui/src/components/FileInputComponent/stories/__images__/FileInputComponent-with-default-name-chromium.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7bef29d4446be28b9c58911ceb9b696d41bba05acde5b4a88070d3ecca851183
+size 12024
diff --git a/ui/src/components/FormModifications/FormModifications.ts b/ui/src/components/FormModifications/FormModifications.ts
new file mode 100644
index 000000000..e3e792e44
--- /dev/null
+++ b/ui/src/components/FormModifications/FormModifications.ts
@@ -0,0 +1,164 @@
+import { Mode } from '../../constants/modes';
+import { AcceptableFormValueOrNullish } from '../../types/components/shareableTypes';
+import { BaseFormState, AnyEntity, EntitiesAllowingModifications } from '../BaseFormTypes';
+import { MarkdownMessageProps } from '../MarkdownMessage/MarkdownMessage';
+
+const VALUE_TO_TRIGGER_UPDATE_FOR_ANY_NOT_LISTED_VALUES = '[[any_other_value]]';
+
+export const handleStateFieldModificationProp = (
+    key: 'display' | 'value' | 'disabled' | 'markdownMessage',
+    propValue: string | number | boolean | MarkdownMessageProps,
+    fieldId: string,
+    state: BaseFormState
+) => {
+    const shallowStateCopy = { ...state };
+    if (shallowStateCopy.data) {
+        shallowStateCopy.data[fieldId][key] = propValue as boolean &
+            AcceptableFormValueOrNullish &
+            (MarkdownMessageProps | undefined);
+        return {
+            changesOccured: true,
+            data: shallowStateCopy,
+        };
+    }
+    return {
+        changesOccured: false,
+        data: shallowStateCopy,
+    };
+};
+
+export const handleEntityModificationProp = (
+    key: 'help' | 'label',
+    propValue: string,
+    fieldId: string,
+    state: BaseFormState
+) => {
+    const shallowStateCopy = { ...state };
+    if (shallowStateCopy?.data?.[fieldId]) {
+        shallowStateCopy.data[fieldId].modifiedEntitiesData = {
+            ...shallowStateCopy.data[fieldId].modifiedEntitiesData,
+            [key]: propValue,
+        };
+        return {
+            changesOccured: true,
+            data: shallowStateCopy,
+        };
+    }
+
+    return {
+        changesOccured: false,
+        data: shallowStateCopy,
+    };
+};
+
+export const isEntityWithModifications = (
+    entity: AnyEntity
+): entity is EntitiesAllowingModifications =>
+    !!(
+        (entity.type === 'text' ||
+            entity.type === 'textarea' ||
+            entity.type === 'singleSelect' ||
+            entity.type === 'multipleSelect' ||
+            entity.type === 'checkbox' ||
+            entity.type === 'radio' ||
+            entity.type === 'file') &&
+        entity?.modifyFieldsOnValue
+    );
+
+export function getAllFieldsWithModifications(
+    entities: AnyEntity[]
+): EntitiesAllowingModifications[] {
+    const entitiesWithModifications = entities.filter((e) => isEntityWithModifications(e));
+    return entitiesWithModifications as EntitiesAllowingModifications[];
+}
+
+const getModificationForEntity = (
+    entity: EntitiesAllowingModifications,
+    stateShallowCopy: BaseFormState,
+    mode: Mode
+) => {
+    let modification = entity.modifyFieldsOnValue?.find(
+        (mod) =>
+            stateShallowCopy.data?.[entity.field]?.value === mod.fieldValue &&
+            (!mod.mode || mod.mode === mode)
+    );
+
+    if (!modification) {
+        modification = entity.modifyFieldsOnValue?.find(
+            (mod) =>
+                mod.fieldValue === VALUE_TO_TRIGGER_UPDATE_FOR_ANY_NOT_LISTED_VALUES &&
+                (!mod.mode || mod.mode === mode)
+        );
+    }
+
+    return modification;
+};
+
+const isStateField = (
+    propKey: string
+): propKey is 'value' | 'display' | 'disabled' | 'markdownMessage' =>
+    propKey === 'display' ||
+    propKey === 'value' ||
+    propKey === 'disabled' ||
+    propKey === 'markdownMessage';
+
+const isEntityField = (propKey: string): propKey is 'help' | 'label' =>
+    propKey === 'help' || propKey === 'label';
+
+const getStateAfterModification = (
+    modificationKey: string,
+    modificationValue: string | number | boolean | MarkdownMessageProps,
+    fieldId: string,
+    stateShallowCopy: BaseFormState
+) => {
+    if (isStateField(modificationKey)) {
+        return handleStateFieldModificationProp(
+            modificationKey,
+            modificationValue,
+            fieldId,
+            stateShallowCopy
+        );
+    }
+    if (isEntityField(modificationKey) && typeof modificationValue === 'string') {
+        return handleEntityModificationProp(
+            modificationKey,
+            modificationValue,
+            fieldId,
+            stateShallowCopy
+        );
+    }
+    return {
+        changesOccured: false,
+        data: stateShallowCopy,
+    };
+};
+
+export const getModifiedState = (
+    state: BaseFormState,
+    mode: Mode,
+    entitiesToModify: EntitiesAllowingModifications[]
+) => {
+    let stateShallowCopy = { ...state };
+    let shouldUpdateState = false;
+
+    entitiesToModify.forEach((entity: EntitiesAllowingModifications) => {
+        const modifications = getModificationForEntity(entity, stateShallowCopy, mode);
+
+        modifications?.fieldsToModify.forEach((modificationFields) => {
+            const { fieldId, ...fieldProps } = modificationFields;
+            Object.entries(fieldProps).forEach(([propKey, propValue]) => {
+                const { data, changesOccured } = getStateAfterModification(
+                    propKey,
+                    propValue,
+                    fieldId,
+                    stateShallowCopy
+                );
+                if (changesOccured) {
+                    stateShallowCopy = data;
+                    shouldUpdateState = true;
+                }
+            });
+        });
+    });
+    return { newState: stateShallowCopy, shouldUpdateState };
+};
diff --git a/ui/src/components/FormModifications/TestConfig.ts b/ui/src/components/FormModifications/TestConfig.ts
new file mode 100644
index 000000000..0825e24c4
--- /dev/null
+++ b/ui/src/components/FormModifications/TestConfig.ts
@@ -0,0 +1,166 @@
+import { z } from 'zod';
+import { getGlobalConfigMock } from '../../mocks/globalConfigMock';
+import { GlobalConfigSchema } from '../../types/globalConfig/globalConfig';
+import { TabSchema } from '../../types/globalConfig/pages';
+import { CheckboxEntity, TextEntity } from '../../types/globalConfig/entities';
+
+const defaultTableProps = {
+    name: 'account',
+    table: {
+        actions: ['edit', 'delete', 'clone'],
+        header: [
+            {
+                label: 'Name',
+                field: 'name',
+            },
+            {
+                label: 'Auth Type',
+                field: 'auth_type',
+            },
+        ],
+    },
+    title: 'Account jest test',
+} satisfies z.infer<typeof TabSchema>;
+
+export const firstStandardTextField = {
+    type: 'text',
+    label: 'Standard text label first field',
+    field: 'standard_text1',
+    help: 'Standard Text help first field',
+} satisfies z.infer<typeof TextEntity>;
+
+export const secondStandardTextField = {
+    type: 'text',
+    label: 'Standard text label second field',
+    field: 'standard_text2',
+    help: 'Standard Text help second field',
+} satisfies z.infer<typeof TextEntity>;
+
+export const firstModificationField = {
+    type: 'text',
+    label: 'First Modification field - text - label',
+    field: 'modification_field1',
+    help: 'First Modification field - text - help',
+    modifyFieldsOnValue: [
+        {
+            fieldValue: 'a',
+            fieldsToModify: [
+                {
+                    fieldId: 'standard_text1',
+                    disabled: true,
+                    value: 'field1a',
+                    help: 'field1a new help for a value',
+                    label: 'field1a new label for a value',
+                },
+                {
+                    fieldId: 'standard_text2',
+                    disabled: true,
+                    value: 'field2a',
+                    help: 'field2a new help for a value',
+                    label: 'field2a new label for a value',
+                },
+            ],
+        },
+        {
+            fieldValue: 'aa',
+            fieldsToModify: [
+                {
+                    fieldId: 'standard_text1',
+                    disabled: false,
+                    value: 'field1aa',
+                    help: 'field1aa new help for a value',
+                    label: 'field1aa new label for a value',
+                },
+                {
+                    fieldId: 'standard_text2',
+                    disabled: false,
+                    value: 'field2aa',
+                    help: 'field2aa new help for a value',
+                    label: 'field2aa new label for a value',
+                },
+            ],
+        },
+    ],
+} satisfies z.infer<typeof TextEntity>;
+
+export const secondModificationField = {
+    type: 'text',
+    label: 'Second Modification field - text - label',
+    field: 'modification_field2',
+    help: 'Second Modification field - text - help',
+    modifyFieldsOnValue: [
+        {
+            fieldValue: 'a',
+            fieldsToModify: [
+                {
+                    fieldId: 'standard_text1',
+                },
+                {
+                    fieldId: 'standard_text2',
+                    markdownMessage: {
+                        markdownType: 'hybrid',
+                        text: 'markdown message to open token and explain sth',
+                        link: 'http://localhost:8000/en-GB/app/Splunk_TA_UCCExample/configuration',
+                        token: 'token',
+                        linkText: 'conf page',
+                    },
+                },
+            ],
+        },
+        {
+            fieldValue: 'aa',
+            fieldsToModify: [
+                {
+                    fieldId: 'standard_text1',
+                    markdownMessage: {
+                        markdownType: 'link',
+                        text: 'markdown message test conf page',
+                        link: 'http://localhost:8000/en-GB/app/Splunk_TA_UCCExample/configuration',
+                    },
+                },
+                {
+                    fieldId: 'standard_text2',
+                    markdownMessage: {
+                        markdownType: 'text',
+                        text: 'markdown message test',
+                        color: 'red',
+                    },
+                },
+            ],
+        },
+    ],
+} satisfies z.infer<typeof TextEntity>;
+
+export const thirdModificationField = {
+    type: 'checkbox',
+    label: 'Third Modification field - checkbox - label',
+    field: 'modification_field3',
+    help: 'Third Modification field - checkbox - help',
+} satisfies z.infer<typeof CheckboxEntity>;
+
+export const getConfigWithModifications = () => {
+    const standardConfig = getGlobalConfigMock();
+    const newConfig = {
+        ...standardConfig,
+        pages: {
+            ...standardConfig.pages,
+            configuration: {
+                ...standardConfig.pages.configuration,
+                tabs: [
+                    {
+                        entity: [
+                            firstModificationField,
+                            secondModificationField,
+                            thirdModificationField,
+                            firstStandardTextField,
+                            secondStandardTextField,
+                        ],
+                        ...defaultTableProps,
+                    },
+                ],
+            },
+        },
+    };
+
+    return newConfig satisfies z.infer<typeof GlobalConfigSchema>;
+};
diff --git a/ui/src/components/Group.tsx b/ui/src/components/Group/Group.tsx
similarity index 100%
rename from ui/src/components/Group.tsx
rename to ui/src/components/Group/Group.tsx
diff --git a/ui/src/components/Group.stories.tsx b/ui/src/components/Group/stories/Group.stories.tsx
similarity index 93%
rename from ui/src/components/Group.stories.tsx
rename to ui/src/components/Group/stories/Group.stories.tsx
index 96ef6e2ab..16242c1db 100644
--- a/ui/src/components/Group.stories.tsx
+++ b/ui/src/components/Group/stories/Group.stories.tsx
@@ -1,10 +1,10 @@
 import type { Meta, StoryObj } from '@storybook/react';
 import React from 'react';
-import Group from './Group';
+import Group from '../Group';
 
 const meta = {
     component: Group,
-    title: 'Components/Group',
+    title: 'Group',
 } satisfies Meta<typeof Group>;
 
 export default meta;
diff --git a/ui/src/components/Group/stories/__images__/Group-base-chromium.png b/ui/src/components/Group/stories/__images__/Group-base-chromium.png
new file mode 100644
index 000000000..6f5778903
--- /dev/null
+++ b/ui/src/components/Group/stories/__images__/Group-base-chromium.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:08084ab1f18556a2a96c0fc3ba709141b01f469f94afa9d2516667363821859a
+size 10027
diff --git a/ui/src/components/Group/stories/__images__/Group-expandable-chromium.png b/ui/src/components/Group/stories/__images__/Group-expandable-chromium.png
new file mode 100644
index 000000000..f2b7dd100
--- /dev/null
+++ b/ui/src/components/Group/stories/__images__/Group-expandable-chromium.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:bd645b473d174c92ad2c13c9b14e7218bd518be416ab6b7063cdf1cf25509503
+size 9639
diff --git a/ui/src/components/HelpLinkComponent.tsx b/ui/src/components/HelpLinkComponent/HelpLinkComponent.tsx
similarity index 100%
rename from ui/src/components/HelpLinkComponent.tsx
rename to ui/src/components/HelpLinkComponent/HelpLinkComponent.tsx
diff --git a/ui/src/components/HelpLinkComponent.stories.ts b/ui/src/components/HelpLinkComponent/stories/HelpLinkComponent.stories.ts
similarity index 79%
rename from ui/src/components/HelpLinkComponent.stories.ts
rename to ui/src/components/HelpLinkComponent/stories/HelpLinkComponent.stories.ts
index df7a795f5..690313222 100644
--- a/ui/src/components/HelpLinkComponent.stories.ts
+++ b/ui/src/components/HelpLinkComponent/stories/HelpLinkComponent.stories.ts
@@ -1,9 +1,9 @@
 import type { Meta, StoryObj } from '@storybook/react';
-import HelpLinkComponent from './HelpLinkComponent';
+import HelpLinkComponent from '../HelpLinkComponent';
 
 const meta = {
     component: HelpLinkComponent,
-    title: 'Components/HelpLinkComponent',
+    title: 'HelpLinkComponent',
 } satisfies Meta<typeof HelpLinkComponent>;
 
 export default meta;
diff --git a/ui/src/components/HelpLinkComponent/stories/__images__/HelpLinkComponent-base-chromium.png b/ui/src/components/HelpLinkComponent/stories/__images__/HelpLinkComponent-base-chromium.png
new file mode 100644
index 000000000..048a2bdad
--- /dev/null
+++ b/ui/src/components/HelpLinkComponent/stories/__images__/HelpLinkComponent-base-chromium.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5308bb0aad58a2346d4d87160a2cff746f722119354159823cd120cfe41c71a9
+size 5790
diff --git a/ui/src/components/MarkdownMessage.tsx b/ui/src/components/MarkdownMessage/MarkdownMessage.tsx
similarity index 90%
rename from ui/src/components/MarkdownMessage.tsx
rename to ui/src/components/MarkdownMessage/MarkdownMessage.tsx
index a2ba2b73e..cf7964b66 100644
--- a/ui/src/components/MarkdownMessage.tsx
+++ b/ui/src/components/MarkdownMessage/MarkdownMessage.tsx
@@ -1,19 +1,14 @@
 import React, { ReactElement } from 'react';
 import styled from 'styled-components';
 import Link from '@splunk/react-ui/Link';
+import { z } from 'zod';
+import { MarkdownMessageType } from '../../types/globalConfig/entities';
 
 const MarkdownWrapper = styled.span`
     color: ${(props) => props.color};
 `;
 
-export interface MarkdownMessageProps {
-    text: string;
-    link: string;
-    color: string;
-    markdownType: 'text' | 'link' | 'hybrid' | '';
-    token: string;
-    linkText: string;
-}
+export type MarkdownMessageProps = z.infer<typeof MarkdownMessageType>;
 
 function MarkdownMessage(props: MarkdownMessageProps) {
     // flatMap adds the link to the part of text that has been split from text
@@ -47,7 +42,6 @@ function MarkdownMessage(props: MarkdownMessageProps) {
 
         return markdownText;
     }
-
     return <div data-test="msg-markdown">{getMarkdownText()}</div>;
 }
 
diff --git a/ui/src/components/MarkdownMessage.stories.ts b/ui/src/components/MarkdownMessage/stories/MarkdownMessage.stories.ts
similarity index 64%
rename from ui/src/components/MarkdownMessage.stories.ts
rename to ui/src/components/MarkdownMessage/stories/MarkdownMessage.stories.ts
index a53eefb35..a2a912c12 100644
--- a/ui/src/components/MarkdownMessage.stories.ts
+++ b/ui/src/components/MarkdownMessage/stories/MarkdownMessage.stories.ts
@@ -1,9 +1,15 @@
 import type { Meta, StoryObj } from '@storybook/react';
-import MarkdownMessage from './MarkdownMessage';
+import MarkdownMessage from '../MarkdownMessage';
 
 const meta = {
     component: MarkdownMessage,
-    title: 'Components/MarkdownMessage',
+    title: 'MarkdownMessage',
+    parameters: {
+        snapshots: {
+            height: 200,
+            width: 200,
+        },
+    },
 } satisfies Meta<typeof MarkdownMessage>;
 
 export default meta;
@@ -11,11 +17,8 @@ type Story = StoryObj<typeof meta>;
 
 export const Base: Story = {
     args: {
+        markdownType: 'text',
         text: 'text',
-        link: 'link',
         color: 'color',
-        markdownType: 'text',
-        token: 'token',
-        linkText: 'linkText',
     },
 };
diff --git a/ui/src/components/MarkdownMessage/stories/__images__/MarkdownMessage-base-chromium.png b/ui/src/components/MarkdownMessage/stories/__images__/MarkdownMessage-base-chromium.png
new file mode 100644
index 000000000..0261ee8f3
--- /dev/null
+++ b/ui/src/components/MarkdownMessage/stories/__images__/MarkdownMessage-base-chromium.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9a3d5ccce46345708f0c487044dca718a9f203471bf28cf48a436c6abef3286c
+size 1607
diff --git a/ui/src/components/MenuInput.tsx b/ui/src/components/MenuInput/MenuInput.tsx
similarity index 96%
rename from ui/src/components/MenuInput.tsx
rename to ui/src/components/MenuInput/MenuInput.tsx
index 889812f2a..a35fcc2b8 100644
--- a/ui/src/components/MenuInput.tsx
+++ b/ui/src/components/MenuInput/MenuInput.tsx
@@ -8,11 +8,11 @@ import ChevronLeft from '@splunk/react-icons/ChevronLeft';
 import { _ as i18n } from '@splunk/ui-utils/i18n';
 import styled from 'styled-components';
 import { variables } from '@splunk/themes';
-import { getFormattedMessage } from '../util/messageUtil';
-import { getUnifiedConfigs } from '../util/util';
-import CustomMenu from './CustomMenu';
-import { StyledButton } from '../pages/EntryPageStyle';
-import { invariant } from '../util/invariant';
+import { getFormattedMessage } from '../../util/messageUtil';
+import { getUnifiedConfigs } from '../../util/util';
+import CustomMenu from '../CustomMenu';
+import { StyledButton } from '../../pages/EntryPageStyle';
+import { invariant } from '../../util/invariant';
 
 const CustomSubTitle = styled.span`
     color: ${variables.brandColorD20};
diff --git a/ui/src/components/MenuInput.stories.tsx b/ui/src/components/MenuInput/stories/MenuInput.stories.tsx
similarity index 89%
rename from ui/src/components/MenuInput.stories.tsx
rename to ui/src/components/MenuInput/stories/MenuInput.stories.tsx
index 60325ace4..88f2116a6 100644
--- a/ui/src/components/MenuInput.stories.tsx
+++ b/ui/src/components/MenuInput/stories/MenuInput.stories.tsx
@@ -1,12 +1,12 @@
 import type { Meta, StoryObj } from '@storybook/react';
 import React, { useState, useEffect } from 'react';
 import { z } from 'zod';
-import MenuInput from './MenuInput';
-import { setUnifiedConfig } from '../util/util';
-import { GlobalConfig } from '../types/globalConfig/globalConfig';
-import { getGlobalConfigMock } from '../mocks/globalConfigMock';
-import { invariant } from '../util/invariant';
-import { TableFullServiceSchema, TableSchema } from '../types/globalConfig/pages';
+import MenuInput from '../MenuInput';
+import { setUnifiedConfig } from '../../../util/util';
+import { GlobalConfig } from '../../../types/globalConfig/globalConfig';
+import { getGlobalConfigMock } from '../../../mocks/globalConfigMock';
+import { invariant } from '../../../util/invariant';
+import { TableFullServiceSchema, TableSchema } from '../../../types/globalConfig/pages';
 
 interface MenuInputProps {
     handleRequestOpen: (args: { serviceName: string; input?: string; groupName?: string }) => void;
@@ -34,7 +34,7 @@ function MenuInputWrapper(props: MenuInputProps) {
 
 const meta = {
     component: MenuInputWrapper,
-    title: 'Components/MenuInput',
+    title: 'MenuInput',
 } satisfies Meta<typeof MenuInputWrapper>;
 
 export default meta;
diff --git a/ui/src/components/MenuInput/stories/__images__/MenuInput-base-chromium.png b/ui/src/components/MenuInput/stories/__images__/MenuInput-base-chromium.png
new file mode 100644
index 000000000..7c015725f
--- /dev/null
+++ b/ui/src/components/MenuInput/stories/__images__/MenuInput-base-chromium.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6efe34955e42aac84389f917a140b8887335e72148e85793f7ede023a6cca24f
+size 6401
diff --git a/ui/src/components/MenuInput/stories/__images__/MenuInput-with-sub-menu-and-custom-menu-chromium.png b/ui/src/components/MenuInput/stories/__images__/MenuInput-with-sub-menu-and-custom-menu-chromium.png
new file mode 100644
index 000000000..e27b3500f
--- /dev/null
+++ b/ui/src/components/MenuInput/stories/__images__/MenuInput-with-sub-menu-and-custom-menu-chromium.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:473f8716e1d0aaff7ffe6b564bec203e3d3a5f2086dc97dfd5f9fd2c6bf4952b
+size 7909
diff --git a/ui/src/components/MenuInput/stories/__images__/MenuInput-with-sub-menu-chromium.png b/ui/src/components/MenuInput/stories/__images__/MenuInput-with-sub-menu-chromium.png
new file mode 100644
index 000000000..7c015725f
--- /dev/null
+++ b/ui/src/components/MenuInput/stories/__images__/MenuInput-with-sub-menu-chromium.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6efe34955e42aac84389f917a140b8887335e72148e85793f7ede023a6cca24f
+size 6401
diff --git a/ui/src/components/MultiInputComponent/MultiInputComponent.tsx b/ui/src/components/MultiInputComponent/MultiInputComponent.tsx
index 4a6caef3b..b090a8c75 100644
--- a/ui/src/components/MultiInputComponent/MultiInputComponent.tsx
+++ b/ui/src/components/MultiInputComponent/MultiInputComponent.tsx
@@ -16,6 +16,7 @@ const WaitSpinnerWrapper = styled(WaitSpinner)`
 `;
 
 export interface MultiInputComponentProps {
+    id?: string;
     handleChange: (field: string, data: string) => void;
     field: string;
     controlOptions: {
@@ -40,6 +41,7 @@ export interface MultiInputComponentProps {
 
 function MultiInputComponent(props: MultiInputComponentProps) {
     const {
+        id,
         field,
         disabled = false,
         error = false,
@@ -135,6 +137,7 @@ function MultiInputComponent(props: MultiInputComponentProps) {
     return (
         <>
             <MultiSelectWrapper
+                inputId={id}
                 values={valueList}
                 error={error}
                 name={field}
diff --git a/ui/src/components/MultiInputComponent/MultiInputComponent.stories.tsx b/ui/src/components/MultiInputComponent/stories/MultiInputComponent.stories.tsx
similarity index 95%
rename from ui/src/components/MultiInputComponent/MultiInputComponent.stories.tsx
rename to ui/src/components/MultiInputComponent/stories/MultiInputComponent.stories.tsx
index f85d06077..7ca229793 100644
--- a/ui/src/components/MultiInputComponent/MultiInputComponent.stories.tsx
+++ b/ui/src/components/MultiInputComponent/stories/MultiInputComponent.stories.tsx
@@ -1,10 +1,10 @@
 import type { Meta, StoryObj } from '@storybook/react';
 import React, { useState } from 'react';
-import MultiInputComponent from './MultiInputComponent';
+import MultiInputComponent from '../MultiInputComponent';
 
 const meta = {
     component: MultiInputComponent,
-    title: 'Components/MultiInputComponent',
+    title: 'MultiInputComponent',
     render: (props) => {
         // due to stories incompatibility, eslint rule is off
         // React Hook "useState" is called in function "render" that is neither a React function component
diff --git a/ui/src/components/MultiInputComponent/stories/__images__/MultiInputComponent-all-props-chromium.png b/ui/src/components/MultiInputComponent/stories/__images__/MultiInputComponent-all-props-chromium.png
new file mode 100644
index 000000000..d5b72f216
--- /dev/null
+++ b/ui/src/components/MultiInputComponent/stories/__images__/MultiInputComponent-all-props-chromium.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c95ab325e302b0f42b13375b87498bf3f18686b57d25cbc1757fb5552adaf405
+size 4703
diff --git a/ui/src/components/MultiInputComponent/stories/__images__/MultiInputComponent-base-chromium.png b/ui/src/components/MultiInputComponent/stories/__images__/MultiInputComponent-base-chromium.png
new file mode 100644
index 000000000..d5b72f216
--- /dev/null
+++ b/ui/src/components/MultiInputComponent/stories/__images__/MultiInputComponent-base-chromium.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c95ab325e302b0f42b13375b87498bf3f18686b57d25cbc1757fb5552adaf405
+size 4703
diff --git a/ui/src/components/PlaceholderComponent.tsx b/ui/src/components/PlaceholderComponent/PlaceholderComponent.tsx
similarity index 100%
rename from ui/src/components/PlaceholderComponent.tsx
rename to ui/src/components/PlaceholderComponent/PlaceholderComponent.tsx
diff --git a/ui/src/components/PlaceholderComponent.stories.ts b/ui/src/components/PlaceholderComponent/stories/PlaceholderComponent.stories.ts
similarity index 76%
rename from ui/src/components/PlaceholderComponent.stories.ts
rename to ui/src/components/PlaceholderComponent/stories/PlaceholderComponent.stories.ts
index 1ce7477ae..b3a1e0b02 100644
--- a/ui/src/components/PlaceholderComponent.stories.ts
+++ b/ui/src/components/PlaceholderComponent/stories/PlaceholderComponent.stories.ts
@@ -1,9 +1,9 @@
 import type { Meta, StoryObj } from '@storybook/react';
-import PlaceholderComponent from './PlaceholderComponent';
+import PlaceholderComponent from '../PlaceholderComponent';
 
 const meta = {
     component: PlaceholderComponent,
-    title: 'Components/PlaceholderComponent',
+    title: 'PlaceholderComponent',
 } satisfies Meta<typeof PlaceholderComponent>;
 
 export default meta;
diff --git a/ui/src/components/PlaceholderComponent/stories/__images__/PlaceholderComponent-base-chromium.png b/ui/src/components/PlaceholderComponent/stories/__images__/PlaceholderComponent-base-chromium.png
new file mode 100644
index 000000000..b1c8ea637
--- /dev/null
+++ b/ui/src/components/PlaceholderComponent/stories/__images__/PlaceholderComponent-base-chromium.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9cb31e53476b63c386f6f20d7ba34107bafaf9a1cec86c9e7641090dddc39904
+size 5113
diff --git a/ui/src/components/RadioComponent/RadioComponent.tsx b/ui/src/components/RadioComponent/RadioComponent.tsx
index 8505077b7..1fdc8ac2b 100644
--- a/ui/src/components/RadioComponent/RadioComponent.tsx
+++ b/ui/src/components/RadioComponent/RadioComponent.tsx
@@ -11,6 +11,7 @@ const RadioBarOption = styled(RadioBar.Option)`
 `;
 
 interface RadioComponentProps {
+    id?: string;
     value: string;
     handleChange: (field: string, value: string) => void;
     field: string;
@@ -31,6 +32,7 @@ class RadioComponent extends Component<RadioComponentProps> {
     render() {
         return (
             <RadioBarWrapper
+                id={this.props.id}
                 inline
                 onChange={this.handleChange}
                 value={this.props.value}
diff --git a/ui/src/components/RadioComponent/RadioComponent.stories.ts b/ui/src/components/RadioComponent/stories/RadioComponent.stories.ts
similarity index 89%
rename from ui/src/components/RadioComponent/RadioComponent.stories.ts
rename to ui/src/components/RadioComponent/stories/RadioComponent.stories.ts
index a68cf27dc..80dec6a93 100644
--- a/ui/src/components/RadioComponent/RadioComponent.stories.ts
+++ b/ui/src/components/RadioComponent/stories/RadioComponent.stories.ts
@@ -1,9 +1,9 @@
 import type { Meta, StoryObj } from '@storybook/react';
-import RadioComponent from './RadioComponent';
+import RadioComponent from '../RadioComponent';
 
 const meta = {
     component: RadioComponent,
-    title: 'Components/RadioComponent',
+    title: 'RadioComponent',
 } satisfies Meta<typeof RadioComponent>;
 
 export default meta;
diff --git a/ui/src/components/RadioComponent/stories/__images__/RadioComponent-base-chromium.png b/ui/src/components/RadioComponent/stories/__images__/RadioComponent-base-chromium.png
new file mode 100644
index 000000000..dee5ca3ec
--- /dev/null
+++ b/ui/src/components/RadioComponent/stories/__images__/RadioComponent-base-chromium.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:bbef38ff315e462ec2dcbed6cd004c984fa01be7f147e89ef3abee6a6047c723
+size 6476
diff --git a/ui/src/components/SingleInputComponent.tsx b/ui/src/components/SingleInputComponent/SingleInputComponent.tsx
similarity index 97%
rename from ui/src/components/SingleInputComponent.tsx
rename to ui/src/components/SingleInputComponent/SingleInputComponent.tsx
index 22ba378e6..0e7137589 100755
--- a/ui/src/components/SingleInputComponent.tsx
+++ b/ui/src/components/SingleInputComponent/SingleInputComponent.tsx
@@ -7,8 +7,8 @@ import axios from 'axios';
 import styled from 'styled-components';
 import WaitSpinner from '@splunk/react-ui/WaitSpinner';
 
-import { axiosCallWrapper } from '../util/axiosCallWrapper';
-import { filterResponse } from '../util/util';
+import { axiosCallWrapper } from '../../util/axiosCallWrapper';
+import { filterResponse } from '../../util/util';
 
 const SelectWrapper = styled(Select)`
     width: 320px !important;
@@ -31,6 +31,7 @@ interface FormItem {
 }
 
 interface SingleInputComponentProps {
+    id?: string;
     disabled?: boolean;
     value: string;
     error?: boolean;
@@ -181,6 +182,7 @@ function SingleInputComponent(props: SingleInputComponentProps) {
     ) : (
         <>
             <SelectWrapper
+                inputId={props.id}
                 className="dropdownBox"
                 data-test-loading={loading}
                 value={props.value}
diff --git a/ui/src/components/SingleInputComponent.stories.tsx b/ui/src/components/SingleInputComponent/stories/SingleInputComponent.stories.tsx
similarity index 91%
rename from ui/src/components/SingleInputComponent.stories.tsx
rename to ui/src/components/SingleInputComponent/stories/SingleInputComponent.stories.tsx
index 52470fd9c..67c44b235 100644
--- a/ui/src/components/SingleInputComponent.stories.tsx
+++ b/ui/src/components/SingleInputComponent/stories/SingleInputComponent.stories.tsx
@@ -1,12 +1,12 @@
 import type { Meta, StoryObj } from '@storybook/react';
 import React, { useState } from 'react';
-import SingleInputComponent from './SingleInputComponent';
-import { setUnifiedConfig } from '../util/util';
-import { getGlobalConfigMock } from '../mocks/globalConfigMock';
+import SingleInputComponent from '../SingleInputComponent';
+import { setUnifiedConfig } from '../../../util/util';
+import { getGlobalConfigMock } from '../../../mocks/globalConfigMock';
 
 const meta = {
     component: SingleInputComponent,
-    title: 'Components/SingleInputComponent',
+    title: 'SingleInputComponent',
     render: (props) => {
         // due to stories incompatibility, eslint rule is off
         // React Hook "useState" is called in function "render" that is neither a React function component
diff --git a/ui/src/components/SingleInputComponent/stories/__images__/SingleInputComponent-accept-any-input-chromium.png b/ui/src/components/SingleInputComponent/stories/__images__/SingleInputComponent-accept-any-input-chromium.png
new file mode 100644
index 000000000..ae65bae7d
--- /dev/null
+++ b/ui/src/components/SingleInputComponent/stories/__images__/SingleInputComponent-accept-any-input-chromium.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:52a629776673c91460d2638555734285d6a8f438949743493701f3c7ca9466c3
+size 4828
diff --git a/ui/src/components/SingleInputComponent/stories/__images__/SingleInputComponent-allow-deny-list-from-backend-chromium.png b/ui/src/components/SingleInputComponent/stories/__images__/SingleInputComponent-allow-deny-list-from-backend-chromium.png
new file mode 100644
index 000000000..0aa3ad83b
--- /dev/null
+++ b/ui/src/components/SingleInputComponent/stories/__images__/SingleInputComponent-allow-deny-list-from-backend-chromium.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9da8d642c0b8c28175c1ab3367e919596febbc95bdd18b7e6566a3f8cf04c34b
+size 4828
diff --git a/ui/src/components/SingleInputComponent/stories/__images__/SingleInputComponent-select-list-chromium.png b/ui/src/components/SingleInputComponent/stories/__images__/SingleInputComponent-select-list-chromium.png
new file mode 100644
index 000000000..0aa3ad83b
--- /dev/null
+++ b/ui/src/components/SingleInputComponent/stories/__images__/SingleInputComponent-select-list-chromium.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9da8d642c0b8c28175c1ab3367e919596febbc95bdd18b7e6566a3f8cf04c34b
+size 4828
diff --git a/ui/src/components/SubDescription/SubDescription.stories.tsx b/ui/src/components/SubDescription/stories/SubDescription.stories.tsx
similarity index 91%
rename from ui/src/components/SubDescription/SubDescription.stories.tsx
rename to ui/src/components/SubDescription/stories/SubDescription.stories.tsx
index 0e9f51cd7..174b2f18f 100644
--- a/ui/src/components/SubDescription/SubDescription.stories.tsx
+++ b/ui/src/components/SubDescription/stories/SubDescription.stories.tsx
@@ -1,9 +1,9 @@
 import type { Meta, StoryObj } from '@storybook/react';
-import SubDescription from './SubDescription';
+import SubDescription from '../SubDescription';
 
 const meta = {
     component: SubDescription,
-    title: 'Components/SubDescription',
+    title: 'SubDescription',
 } satisfies Meta<typeof SubDescription>;
 
 export default meta;
diff --git a/ui/src/components/SubDescription/stories/__images__/SubDescription-base-chromium.png b/ui/src/components/SubDescription/stories/__images__/SubDescription-base-chromium.png
new file mode 100644
index 000000000..c5cd12985
--- /dev/null
+++ b/ui/src/components/SubDescription/stories/__images__/SubDescription-base-chromium.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2636f4d823cae45f6e380708b0585c65c772ae948da359bd8f323c29d989999c
+size 41191
diff --git a/ui/src/components/TextAreaComponent/TextAreaComponent.tsx b/ui/src/components/TextAreaComponent/TextAreaComponent.tsx
index bc0885045..ee2b2f24b 100644
--- a/ui/src/components/TextAreaComponent/TextAreaComponent.tsx
+++ b/ui/src/components/TextAreaComponent/TextAreaComponent.tsx
@@ -6,7 +6,8 @@ const TextWrapper = styled(TextArea)`
     width: 320px !important;
 `;
 
-interface TextAreadComponentProps {
+interface TextAreaComponentProps {
+    id?: string;
     value: string | number;
     handleChange: (field: string, value: string) => void;
     field: string;
@@ -15,13 +16,14 @@ interface TextAreadComponentProps {
     disabled?: boolean;
 }
 
-function TextAreaComponent(props: TextAreadComponentProps) {
+function TextAreaComponent(props: TextAreaComponentProps) {
     const handleChange = (e: unknown, { value }: { value: string }) => {
         props.handleChange(props.field, value);
     };
 
     return (
         <TextWrapper
+            inputId={props.id}
             inline
             canClear
             error={props.error}
diff --git a/ui/src/components/TextAreaComponent/TextAreaComponent.stories.tsx b/ui/src/components/TextAreaComponent/stories/TextAreaComponent.stories.tsx
similarity index 92%
rename from ui/src/components/TextAreaComponent/TextAreaComponent.stories.tsx
rename to ui/src/components/TextAreaComponent/stories/TextAreaComponent.stories.tsx
index e89912d9e..ccca83ce9 100644
--- a/ui/src/components/TextAreaComponent/TextAreaComponent.stories.tsx
+++ b/ui/src/components/TextAreaComponent/stories/TextAreaComponent.stories.tsx
@@ -1,10 +1,10 @@
 import type { Meta, StoryObj } from '@storybook/react';
 import React, { useState } from 'react';
-import TextAreaComponent from './TextAreaComponent';
+import TextAreaComponent from '../TextAreaComponent';
 
 const meta = {
     component: TextAreaComponent,
-    title: 'Components/TextAreaComponent',
+    title: 'TextAreaComponent',
     render: (props) => {
         // due to stories incompatibility, eslint rule is off
         // React Hook "useState" is called in function "render" that is neither a React function component
diff --git a/ui/src/components/TextAreaComponent/stories/__images__/TextAreaComponent-base-chromium.png b/ui/src/components/TextAreaComponent/stories/__images__/TextAreaComponent-base-chromium.png
new file mode 100644
index 000000000..552ecc892
--- /dev/null
+++ b/ui/src/components/TextAreaComponent/stories/__images__/TextAreaComponent-base-chromium.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:eaf1b6428a2126fa11917a19f99ef41f2bfbd9c28b0009b6791fadfb82359f31
+size 3527
diff --git a/ui/src/components/TextComponent/TextComponent.tsx b/ui/src/components/TextComponent/TextComponent.tsx
index 139ccf4b3..ede7349ce 100755
--- a/ui/src/components/TextComponent/TextComponent.tsx
+++ b/ui/src/components/TextComponent/TextComponent.tsx
@@ -14,6 +14,7 @@ interface TextComponentProps {
     error?: boolean;
     encrypted?: boolean;
     disabled?: boolean;
+    id?: string;
 }
 
 class TextComponent extends Component<TextComponentProps> {
@@ -24,6 +25,7 @@ class TextComponent extends Component<TextComponentProps> {
     render() {
         return (
             <TextWrapper
+                inputId={this.props.id}
                 inline
                 error={this.props.error}
                 className={this.props.field}
diff --git a/ui/src/components/TextComponent/TextComponent.stories.tsx b/ui/src/components/TextComponent/stories/TextComponent.stories.tsx
similarity index 93%
rename from ui/src/components/TextComponent/TextComponent.stories.tsx
rename to ui/src/components/TextComponent/stories/TextComponent.stories.tsx
index f90846885..052a4795f 100644
--- a/ui/src/components/TextComponent/TextComponent.stories.tsx
+++ b/ui/src/components/TextComponent/stories/TextComponent.stories.tsx
@@ -1,10 +1,10 @@
 import type { Meta, StoryObj } from '@storybook/react';
 import React, { useState } from 'react';
-import TextComponent from './TextComponent';
+import TextComponent from '../TextComponent';
 
 const meta = {
     component: TextComponent,
-    title: 'Components/TextComponent',
+    title: 'TextComponent',
     argTypes: { handleChange: { action: 'handleChange' } },
     render: (props) => {
         // due to stories incompatibility, eslint rule is off
diff --git a/ui/src/components/TextComponent/stories/__images__/TextComponent-base-chromium.png b/ui/src/components/TextComponent/stories/__images__/TextComponent-base-chromium.png
new file mode 100644
index 000000000..e5f17d341
--- /dev/null
+++ b/ui/src/components/TextComponent/stories/__images__/TextComponent-base-chromium.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:aad30351b3806a607ba2793224d3824c373abfadf501c7c09d352bdc5a141f10
+size 3527
diff --git a/ui/src/components/table/TableWrapper.jsx b/ui/src/components/table/TableWrapper.jsx
index 3a60c55e3..482680ad0 100644
--- a/ui/src/components/table/TableWrapper.jsx
+++ b/ui/src/components/table/TableWrapper.jsx
@@ -10,6 +10,7 @@ import CustomTable from './CustomTable';
 import TableHeader from './TableHeader';
 import TableContext from '../../context/TableContext';
 import { PAGE_INPUT } from '../../constants/pages';
+import { parseErrorMsg } from '../../util/messageUtil';
 
 function TableWrapper({
     page,
@@ -76,29 +77,13 @@ function TableWrapper({
         });
         axios
             .all(requests)
-            // eslint-disable-next-line no-shadow
-            .catch((error) => {
-                let message = '';
-                let errorCode = '';
-                if (error.response) {
-                    // The request was made and the server responded with a status code
-                    message = `Error received from server: ${error.response.data.messages[0].text}`;
-                    errorCode = page === PAGE_INPUT ? 'ERR0001' : 'ERR0002';
-                } else if (error.request) {
-                    // The request was made but no response was received
-                    message = `No response received while making request to ${page} services`;
-                    errorCode = 'ERR0003';
-                } else {
-                    // Something happened in setting up the request that triggered an Error
-                    message = `Error making request to ${page} services`;
-                    errorCode = 'ERR0004';
-                }
-                // eslint-disable-next-line no-param-reassign
-                error.uccErrorCode = errorCode;
-                generateToast(message);
+            .catch((caughtError) => {
+                const message = parseErrorMsg(caughtError);
+
+                generateToast(message, 'error');
                 setLoading(false);
-                setError(error);
-                return Promise.reject(error);
+                setError(caughtError);
+                return Promise.reject(caughtError);
             })
             .then((response) => {
                 modifyAPIResponse(response.map((res) => res.data.entry));
@@ -245,7 +230,7 @@ function TableWrapper({
         return [updatedArr, arr.length, arr];
     };
 
-    if (error?.uccErrorCode) {
+    if (error) {
         throw error;
     }
 
diff --git a/ui/src/constants/ControlTypeMap.ts b/ui/src/constants/ControlTypeMap.ts
index 2190ef897..6f9b6ac3c 100644
--- a/ui/src/constants/ControlTypeMap.ts
+++ b/ui/src/constants/ControlTypeMap.ts
@@ -1,11 +1,11 @@
-import HelpLinkComponent from '../components/HelpLinkComponent';
+import HelpLinkComponent from '../components/HelpLinkComponent/HelpLinkComponent';
 import TextComponent from '../components/TextComponent/TextComponent';
 import TextAreaComponent from '../components/TextAreaComponent/TextAreaComponent';
-import SingleInputComponent from '../components/SingleInputComponent';
+import SingleInputComponent from '../components/SingleInputComponent/SingleInputComponent';
 import MultiInputComponent from '../components/MultiInputComponent/MultiInputComponent';
 import CheckBoxComponent from '../components/CheckBoxComponent/CheckBoxComponent';
 import RadioComponent from '../components/RadioComponent/RadioComponent';
-import PlaceholderComponent from '../components/PlaceholderComponent';
+import PlaceholderComponent from '../components/PlaceholderComponent/PlaceholderComponent';
 import CustomControl from '../components/CustomControl';
 import FileInputComponent from '../components/FileInputComponent/FileInputComponent';
 import CheckboxGroup from '../components/CheckboxGroup/CheckboxGroup';
diff --git a/ui/src/constants/errorCodes.tsx b/ui/src/constants/errorCodes.tsx
deleted file mode 100644
index 479532e2e..000000000
--- a/ui/src/constants/errorCodes.tsx
+++ /dev/null
@@ -1,16 +0,0 @@
-import React from 'react';
-import Link from '@splunk/react-ui/Link';
-
-export default {
-    ERR0001: (
-        <>
-            This is normal on Splunk search heads as they do not require an Input page. Check your
-            installation or return to the <Link to="configuration">configuration page</Link>.
-        </>
-    ),
-    ERR0002:
-        'Configuration page failed to load, the server reported internal errors which may indicate you do not have access to this page.',
-    ERR0003: 'Failed to load content due to no response from server!',
-    ERR0004: 'Failed to load content due to failed request processing!',
-    ERR0005: 'Failed to load current state for selected entity in form!',
-};
diff --git a/ui/src/constants/messageDict.ts b/ui/src/constants/messageDict.ts
index 0953a1964..210fba002 100644
--- a/ui/src/constants/messageDict.ts
+++ b/ui/src/constants/messageDict.ts
@@ -1,4 +1,4 @@
-export default {
+const MESSAGE_DICT: Record<number | 'unknown', string> = {
     /* validation messages, range [0, 99] */
     0: 'Field {{args[0]}} is required',
     1: 'Field {{args[0]}} must be a string',
@@ -59,4 +59,6 @@ export default {
     118: 'configuration file not found',
 
     unknown: 'An unknown error occurred',
-} as const;
+};
+
+export default MESSAGE_DICT;
diff --git a/ui/src/pages/Configuration/ConfigurationPage.jsx b/ui/src/pages/Configuration/ConfigurationPage.jsx
index 8ef2d8a35..ddaa3b606 100644
--- a/ui/src/pages/Configuration/ConfigurationPage.jsx
+++ b/ui/src/pages/Configuration/ConfigurationPage.jsx
@@ -9,8 +9,8 @@ import styled from 'styled-components';
 import useQuery from '../../hooks/useQuery';
 import { getUnifiedConfigs } from '../../util/util';
 import { TitleComponent, SubTitleComponent } from '../Input/InputPageStyle';
-import ErrorBoundary from '../../components/ErrorBoundary';
-import CustomTab from '../../components/CustomTab';
+import ErrorBoundary from '../../components/ErrorBoundary/ErrorBoundary';
+import CustomTab from '../../components/CustomTab/CustomTab';
 import ConfigurationFormView from '../../components/ConfigurationFormView';
 import ConfigurationTable from '../../components/ConfigurationTable';
 import OpenApiDownloadButton from '../../components/DownloadButton/OpenApiDownloadBtn';
diff --git a/ui/src/pages/Input/InputPage.jsx b/ui/src/pages/Input/InputPage.jsx
index 3a602df0d..6efd7af93 100644
--- a/ui/src/pages/Input/InputPage.jsx
+++ b/ui/src/pages/Input/InputPage.jsx
@@ -12,11 +12,11 @@ import { TableContextProvider } from '../../context/TableContext';
 import { MODE_CREATE, MODE_CLONE, MODE_EDIT } from '../../constants/modes';
 import { PAGE_INPUT } from '../../constants/pages';
 import { STYLE_PAGE } from '../../constants/dialogStyles';
-import MenuInput, { ROOT_GROUP_NAME } from '../../components/MenuInput';
+import MenuInput, { ROOT_GROUP_NAME } from '../../components/MenuInput/MenuInput';
 import TableWrapper from '../../components/table/TableWrapper';
 import EntityModal from '../../components/EntityModal/EntityModal';
-import ErrorBoundary from '../../components/ErrorBoundary';
-import EntityPage from '../../components/EntityPage';
+import ErrorBoundary from '../../components/ErrorBoundary/ErrorBoundary';
+import EntityPage from '../../components/EntityPage/EntityPage';
 import SubDescription from '../../components/SubDescription/SubDescription';
 import useQuery from '../../hooks/useQuery';
 
diff --git a/ui/src/pages/Input/stories/InputPage.stories.tsx b/ui/src/pages/Input/stories/InputPage.stories.tsx
index 87d47f364..d60b2a19e 100644
--- a/ui/src/pages/Input/stories/InputPage.stories.tsx
+++ b/ui/src/pages/Input/stories/InputPage.stories.tsx
@@ -9,7 +9,7 @@ import { mockServerResponse } from '../../../mocks/server-response';
 
 const meta = {
     component: InputPage,
-    title: 'InputPage/Base',
+    title: 'InputPage',
     render: (args) => {
         setUnifiedConfig(args.globalConfig);
         return <InputPage />;
@@ -23,6 +23,10 @@ const meta = {
                 http.get('/servicesNS/nobody/-/:name', () => HttpResponse.json(mockServerResponse)),
             ],
         },
+        snapshots: {
+            width: 1200,
+            height: 1200,
+        },
     },
 } satisfies Meta;
 
diff --git a/ui/src/pages/Input/stories/__images__/InputPage-input-page-view-chromium.png b/ui/src/pages/Input/stories/__images__/InputPage-input-page-view-chromium.png
new file mode 100644
index 000000000..0fb3192ce
--- /dev/null
+++ b/ui/src/pages/Input/stories/__images__/InputPage-input-page-view-chromium.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c17e9b4a04de4a8ad1ca9fb9b701dd8c1528e5ed68c24ef5736a7578068c3cc2
+size 75241
diff --git a/ui/src/pages/Input/stories/__images__/InputPage-input-tab-view-chromium.png b/ui/src/pages/Input/stories/__images__/InputPage-input-tab-view-chromium.png
new file mode 100644
index 000000000..b79d3fb7c
--- /dev/null
+++ b/ui/src/pages/Input/stories/__images__/InputPage-input-tab-view-chromium.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5d1923748c7da1b450b4d2b523d38103e1e812c742ec6459a2e727637bd95df2
+size 70585
diff --git a/ui/src/types/globalConfig/entities.ts b/ui/src/types/globalConfig/entities.ts
index c8bf3c0b1..47bd8ae01 100644
--- a/ui/src/types/globalConfig/entities.ts
+++ b/ui/src/types/globalConfig/entities.ts
@@ -14,6 +14,31 @@ const ValueLabelPair = z.object({
     label: z.string(),
 });
 
+export const MarkdownMessageText = z.object({
+    markdownType: z.literal('text'),
+    text: z.string(),
+    color: z.string().optional(),
+});
+
+export const MarkdownMessageHybrid = z.object({
+    markdownType: z.literal('hybrid'),
+    text: z.string(),
+    token: z.string(),
+    linkText: z.string(),
+    link: z.string(),
+});
+
+export const MarkdownMessageLink = z.object({
+    markdownType: z.literal('link'),
+    text: z.string(),
+    link: z.string(),
+});
+
+export const MarkdownMessagePlaintext = z.object({
+    markdownType: z.undefined().optional(),
+    text: z.string(),
+});
+
 const CommonEntityFields = z.object({
     type: z.string(),
     field: z.string(),
@@ -35,6 +60,31 @@ const CommonEditableEntityOptions = z.object({
     requiredWhenVisible: z.boolean().default(false).optional(),
 });
 
+export const MarkdownMessageType = z.union([
+    MarkdownMessageText,
+    MarkdownMessageHybrid,
+    MarkdownMessageLink,
+    MarkdownMessagePlaintext,
+]);
+
+const FieldToModify = z.object({
+    fieldValue: z.union([z.number(), z.string(), z.boolean()]),
+    mode: z.enum(['create', 'edit', 'config', 'clone']).optional(),
+    fieldsToModify: z.array(
+        z.object({
+            fieldId: z.string(),
+            display: z.boolean().optional(),
+            value: z.union([z.number(), z.string(), z.boolean()]).optional(),
+            disabled: z.boolean().optional(),
+            help: z.string().optional(),
+            label: z.string().optional(),
+            markdownMessage: MarkdownMessageType.optional(),
+        })
+    ),
+});
+
+const ModifyFieldsOnValue = z.array(FieldToModify).optional();
+
 const AllValidators = z
     .array(
         z.union([
@@ -63,6 +113,7 @@ export const TextEntity = CommonEditableEntityFields.extend({
     validators: AllValidators.optional(),
     defaultValue: z.union([z.string(), z.number(), z.boolean()]).optional(),
     options: CommonEditableEntityOptions.optional(),
+    modifyFieldsOnValue: ModifyFieldsOnValue,
 });
 
 export const TextAreaEntity = CommonEditableEntityFields.extend({
@@ -73,6 +124,7 @@ export const TextAreaEntity = CommonEditableEntityFields.extend({
         rowsMin: z.number().optional(),
         rowsMax: z.number().optional(),
     }).optional(),
+    modifyFieldsOnValue: ModifyFieldsOnValue,
 });
 
 const AutoCompleteFields = z.array(
@@ -102,6 +154,7 @@ export const SingleSelectEntity = CommonEditableEntityFields.extend({
     validators: AllValidators.optional(),
     defaultValue: z.union([z.string(), z.number(), z.boolean()]).optional(),
     options: SelectCommonOptions,
+    modifyFieldsOnValue: ModifyFieldsOnValue,
 });
 
 export const MultipleSelectEntity = CommonEditableEntityFields.extend({
@@ -111,12 +164,14 @@ export const MultipleSelectEntity = CommonEditableEntityFields.extend({
     options: SelectCommonOptions.extend({
         delimiter: z.string().length(1).optional(),
     }),
+    modifyFieldsOnValue: ModifyFieldsOnValue,
 });
 
 export const CheckboxEntity = CommonEditableEntityFields.extend({
     type: z.literal('checkbox'),
     defaultValue: z.union([z.number(), z.boolean()]).optional(),
     options: CommonEditableEntityOptions.omit({ placeholder: true }).optional(),
+    modifyFieldsOnValue: ModifyFieldsOnValue,
 });
 
 export const CheckboxGroupEntity = CommonEditableEntityFields.extend({
@@ -165,6 +220,7 @@ export const RadioEntity = CommonEditableEntityFields.extend({
     options: CommonEditableEntityOptions.extend({
         items: z.array(ValueLabelPair),
     }),
+    modifyFieldsOnValue: ModifyFieldsOnValue,
 });
 
 export const FileEntity = CommonEditableEntityFields.extend({
@@ -178,6 +234,7 @@ export const FileEntity = CommonEditableEntityFields.extend({
             supportedFileTypes: z.array(z.string()),
         })
         .optional(),
+    modifyFieldsOnValue: ModifyFieldsOnValue,
 });
 
 export const OAuthFields = z.object({
@@ -198,6 +255,7 @@ export const OAuthFields = z.object({
             requiredWhenVisible: z.boolean().default(false).optional(),
         })
         .optional(),
+    modifyFieldsOnValue: ModifyFieldsOnValue,
 });
 
 export const OAuthEntity = CommonEditableEntityFields.extend({
diff --git a/ui/src/types/modules.d.ts b/ui/src/types/modules.d.ts
index 808e1381a..ceb7d7db7 100644
--- a/ui/src/types/modules.d.ts
+++ b/ui/src/types/modules.d.ts
@@ -4,3 +4,11 @@ declare module '@splunk/splunk-utils/url';
 
 declare module '@splunk/ui-utils/i18n';
 declare module 'uuid';
+
+declare global {
+    namespace jest {
+        interface Matchers<R> {
+            toMatchImageSnapshot(): R;
+        }
+    }
+}
diff --git a/ui/src/util/axiosCallWrapper.ts b/ui/src/util/axiosCallWrapper.ts
index b181d3354..004123137 100755
--- a/ui/src/util/axiosCallWrapper.ts
+++ b/ui/src/util/axiosCallWrapper.ts
@@ -2,6 +2,7 @@ import axios, { CancelToken } from 'axios';
 import { CSRFToken, app } from '@splunk/splunk-utils/config';
 import { createRESTURL } from '@splunk/splunk-utils/url';
 import { generateEndPointUrl, generateToast } from './util';
+import { parseErrorMsg } from './messageUtil';
 
 interface axiosCallWithServiceName {
     serviceName?: string;
@@ -82,20 +83,11 @@ const axiosCallWrapper = ({
 
     return handleError
         ? axios(options).catch((error) => {
-              let message = '';
               if (axios.isCancel(error)) {
                   return Promise.reject(error);
               }
-              if (error.response) {
-                  // The request was made and the server responded with a status code
-                  message = `Error response received from server: ${error.response.data.messages[0].text}`;
-              } else if (error.request) {
-                  // The request was made but no response was received
-                  message = `No response received while making request to ${endpoint}`;
-              } else {
-                  // Something happened in setting up the request that triggered an Error
-                  message = `Error making ${method} request to ${endpoint}`;
-              }
+              const message = parseErrorMsg(error);
+
               generateToast(message, 'error');
               callbackOnError(error);
               return Promise.reject(error);
diff --git a/ui/src/util/configManager.jsx b/ui/src/util/configManager.jsx
index 5612d907d..267c2d87d 100644
--- a/ui/src/util/configManager.jsx
+++ b/ui/src/util/configManager.jsx
@@ -4,7 +4,7 @@ import PropTypes from 'prop-types';
 import { getFormattedMessage } from './messageUtil';
 import { setMetaInfo, setUnifiedConfig } from './util';
 import { loadGlobalConfig } from './script';
-import ErrorModal from '../components/ErrorModal';
+import ErrorModal from '../components/ErrorModal/ErrorModal';
 
 class ConfigManager extends Component {
     constructor(props) {
diff --git a/ui/src/util/messageUtil.js b/ui/src/util/messageUtil.js
deleted file mode 100644
index 969792855..000000000
--- a/ui/src/util/messageUtil.js
+++ /dev/null
@@ -1,44 +0,0 @@
-import * as __ from 'lodash';
-import { _ } from '@splunk/ui-utils/i18n';
-import messageDict from '../constants/messageDict';
-
-/**
- * @param {number} code  a int value.
- * @param {(string|number|boolean)[]=} msg arguments to format the message.
- * @returns {string}
- */
-export const getFormattedMessage = (code, msg /* , ... , args */) => {
-    let template = messageDict[code] || messageDict.unknown;
-    template = _(template);
-    return __.template(template, {
-        escape: /\{\{(.+?)\}\}/g,
-    })({
-        args: msg,
-    });
-};
-
-export const parseErrorMsg = (err) => {
-    let errorMsg = '';
-    let regex;
-    let matches;
-    try {
-        const msg = err.response.data.messages[0].text;
-        regex =
-            /.+"REST Error \[[\d]+\]:\s+.+\s+--\s+([\s\S]*)"\.\s*See splunkd\.log(\/python.log)? for more details\./;
-        matches = regex.exec(msg);
-        if (matches && matches[1]) {
-            try {
-                const innerMsgJSON = JSON.parse(matches[1]);
-                errorMsg = String(innerMsgJSON.messages[0].text);
-            } catch (error) {
-                // eslint-disable-next-line prefer-destructuring
-                errorMsg = matches[1];
-            }
-        } else {
-            errorMsg = msg;
-        }
-    } catch (e) {
-        errorMsg = _('Error in processing the request');
-    }
-    return errorMsg;
-};
diff --git a/ui/src/util/messageUtil.ts b/ui/src/util/messageUtil.ts
new file mode 100644
index 000000000..d34a8fb50
--- /dev/null
+++ b/ui/src/util/messageUtil.ts
@@ -0,0 +1,64 @@
+import * as __ from 'lodash';
+import { _ } from '@splunk/ui-utils/i18n';
+import messageDict from '../constants/messageDict';
+
+/**
+ * @param code  a int value.
+ * @param msg arguments to format the message.
+ */
+export const getFormattedMessage = (code: number, msg?: (string | number | boolean)[]): string => {
+    let template = messageDict[code] || messageDict.unknown;
+    template = _(template);
+    return __.template(template, {
+        escape: /\{\{(.+?)\}\}/g,
+    })({
+        args: msg,
+    });
+};
+
+const tryParseByteString = (text: string) => {
+    try {
+        if (text.startsWith(`b'`) || text.startsWith(`b"`)) {
+            // bytestring starts from b and Quotation mark (b') and ends with Quotation mark(')
+            const parsedString = JSON.parse(text.slice(2, -1));
+            return String(parsedString.messages[0].text);
+        }
+        return text;
+    } catch {
+        return text;
+    }
+};
+
+export const tryTrimErrorMessage = (msg: string) => {
+    try {
+        const regex =
+            /.+"REST Error \[[\d]+\]:\s+.+\s+--\s+([\s\S]*)"\.\s*See splunkd\.log(\/python.log)? for more details\./;
+        const matches = regex.exec(msg);
+        if (matches && matches[1]) {
+            try {
+                const innerMsgJSON = JSON.parse(matches[1]);
+                return String(innerMsgJSON.messages[0].text);
+            } catch (error) {
+                return tryParseByteString(matches[1]);
+            }
+        }
+    } catch (e) {
+        return msg;
+    }
+
+    return msg;
+};
+
+export const parseErrorMsg = (err?: {
+    response?: { data?: { messages?: { text?: string }[] } };
+}) => {
+    try {
+        const msg = err?.response?.data?.messages?.[0]?.text;
+        if (!msg) {
+            return messageDict.unknown;
+        }
+        return tryTrimErrorMessage(msg);
+    } catch (e) {
+        return _('Error in processing the request');
+    }
+};
diff --git a/ui/yarn.lock b/ui/yarn.lock
index e6a1f76bd..075853798 100644
--- a/ui/yarn.lock
+++ b/ui/yarn.lock
@@ -47,7 +47,7 @@
   resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz#ffb878728bb6bdcb6f4510aa51b1be9afb8cfd98"
   integrity sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==
 
-"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.18.9", "@babel/core@^7.23.0", "@babel/core@^7.23.2", "@babel/core@^7.23.9":
+"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.18.9", "@babel/core@^7.22.5", "@babel/core@^7.23.0", "@babel/core@^7.23.2", "@babel/core@^7.23.9", "@babel/core@^7.7.5":
   version "7.23.9"
   resolved "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz#b028820718000f267870822fec434820e9b1e4d1"
   integrity sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==
@@ -68,16 +68,16 @@
     json5 "^2.2.3"
     semver "^6.3.1"
 
-"@babel/eslint-parser@^7.23.9":
-  version "7.23.9"
-  resolved "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.23.9.tgz#052c13b39144e21fdd1e03fc9b67e98976a1ebfc"
-  integrity sha512-xPndlO7qxiJbn0ATvfXQBjCS7qApc9xmKHArgI/FTEFxXas5dnjC/VqM37lfZun9dclRYcn+YQAr6uDFy0bB2g==
+"@babel/eslint-parser@^7.23.10":
+  version "7.23.10"
+  resolved "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.23.10.tgz#2d4164842d6db798873b40e0c4238827084667a2"
+  integrity sha512-3wSYDPZVnhseRnxRJH6ZVTNknBz76AEnyC+AYYhasjP3Yy23qz0ERR7Fcd2SHmYuSFJ2kY9gaaDd3vyqU09eSw==
   dependencies:
     "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1"
     eslint-visitor-keys "^2.1.0"
     semver "^6.3.1"
 
-"@babel/generator@^7.23.0", "@babel/generator@^7.23.6", "@babel/generator@^7.7.2":
+"@babel/generator@^7.22.5", "@babel/generator@^7.23.0", "@babel/generator@^7.23.6", "@babel/generator@^7.7.2":
   version "7.23.6"
   resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz#9e1fca4811c77a10580d17d26b57b036133f3c2e"
   integrity sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==
@@ -1094,7 +1094,7 @@
   dependencies:
     regenerator-runtime "^0.14.0"
 
-"@babel/template@^7.22.15", "@babel/template@^7.23.9", "@babel/template@^7.3.3":
+"@babel/template@^7.22.15", "@babel/template@^7.22.5", "@babel/template@^7.23.9", "@babel/template@^7.3.3":
   version "7.23.9"
   resolved "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz#f881d0487cba2828d3259dcb9ef5005a9731011a"
   integrity sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==
@@ -1413,6 +1413,18 @@
   resolved "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz#16308cea045f0fc777b6ff20a9f25474dd8293d2"
   integrity sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==
 
+"@hapi/hoek@^9.0.0", "@hapi/hoek@^9.3.0":
+  version "9.3.0"
+  resolved "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb"
+  integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==
+
+"@hapi/topo@^5.1.0":
+  version "5.1.0"
+  resolved "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012"
+  integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==
+  dependencies:
+    "@hapi/hoek" "^9.0.0"
+
 "@humanwhocodes/config-array@^0.5.0":
   version "0.5.0"
   resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9"
@@ -1427,6 +1439,39 @@
   resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45"
   integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==
 
+"@inquirer/confirm@^3.0.0":
+  version "3.0.0"
+  resolved "https://registry.npmjs.org/@inquirer/confirm/-/confirm-3.0.0.tgz#6e1e35d18675fe659752d11021f9fddf547950b7"
+  integrity sha512-LHeuYP1D8NmQra1eR4UqvZMXwxEdDXyElJmmZfU44xdNLL6+GcQBS0uE16vyfZVjH8c22p9e+DStROfE/hyHrg==
+  dependencies:
+    "@inquirer/core" "^7.0.0"
+    "@inquirer/type" "^1.2.0"
+
+"@inquirer/core@^7.0.0":
+  version "7.0.0"
+  resolved "https://registry.npmjs.org/@inquirer/core/-/core-7.0.0.tgz#18d2d2bb5cc6858765b4dcf3dce544ad15898e81"
+  integrity sha512-g13W5yEt9r1sEVVriffJqQ8GWy94OnfxLCreNSOTw0HPVcszmc/If1KIf7YBmlwtX4klmvwpZHnQpl3N7VX2xA==
+  dependencies:
+    "@inquirer/type" "^1.2.0"
+    "@types/mute-stream" "^0.0.4"
+    "@types/node" "^20.11.16"
+    "@types/wrap-ansi" "^3.0.0"
+    ansi-escapes "^4.3.2"
+    chalk "^4.1.2"
+    cli-spinners "^2.9.2"
+    cli-width "^4.1.0"
+    figures "^3.2.0"
+    mute-stream "^1.0.0"
+    run-async "^3.0.0"
+    signal-exit "^4.1.0"
+    strip-ansi "^6.0.1"
+    wrap-ansi "^6.2.0"
+
+"@inquirer/type@^1.2.0":
+  version "1.2.0"
+  resolved "https://registry.npmjs.org/@inquirer/type/-/type-1.2.0.tgz#a569613628a881c2104289ca868a7def54e5c49d"
+  integrity sha512-/vvkUkYhrjbm+RolU7V1aUFDydZVKNKqKHR5TsE+j5DXgXFwrsOPcoGUJ02K0O7q7O53CU2DOTMYCHeGZ25WHA==
+
 "@isaacs/cliui@^8.0.2":
   version "8.0.2"
   resolved "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550"
@@ -1501,6 +1546,13 @@
     slash "^3.0.0"
     strip-ansi "^6.0.0"
 
+"@jest/create-cache-key-function@^29.7.0":
+  version "29.7.0"
+  resolved "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-29.7.0.tgz#793be38148fab78e65f40ae30c36785f4ad859f0"
+  integrity sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==
+  dependencies:
+    "@jest/types" "^29.6.3"
+
 "@jest/environment@^29.7.0":
   version "29.7.0"
   resolved "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz#24d61f54ff1f786f3cd4073b4b94416383baf2a7"
@@ -1578,6 +1630,13 @@
     strip-ansi "^6.0.0"
     v8-to-istanbul "^9.0.1"
 
+"@jest/schemas@^28.1.3":
+  version "28.1.3"
+  resolved "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz#ad8b86a66f11f33619e3d7e1dcddd7f2d40ff905"
+  integrity sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==
+  dependencies:
+    "@sinclair/typebox" "^0.24.1"
+
 "@jest/schemas@^29.6.3":
   version "29.6.3"
   resolved "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03"
@@ -1724,10 +1783,10 @@
   resolved "https://registry.npmjs.org/@mswjs/cookies/-/cookies-1.1.0.tgz#1528eb43630caf83a1d75d5332b30e75e9bb1b5b"
   integrity sha512-0ZcCVQxifZmhwNBoQIrystCb+2sWBY2Zw8lpfJBPCHGCA/HWqehITeCRVIv4VMy8MPlaHo2w2pTHFV2pFfqKPw==
 
-"@mswjs/interceptors@^0.25.15":
-  version "0.25.15"
-  resolved "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.25.15.tgz#183c5761d3c20e07ac49a206df39a5b6df9e8242"
-  integrity sha512-s4jdyxmq1eeftfDXJ7MUiK/jlvYaU8Sr75+42hHCVBrYez0k51RHbMitKIKdmsF92Q6gwhp8Sm1MmvdA9llpcg==
+"@mswjs/interceptors@^0.25.16":
+  version "0.25.16"
+  resolved "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.25.16.tgz#7955fbb8da479bc691df117dd4c8d889e507ecc2"
+  integrity sha512-8QC8JyKztvoGAdPgyZy49c9vSHHAZjHagwl4RY9E8carULk8ym3iTaiawrT1YoLF/qb449h48f71XDPgkUSOUg==
   dependencies:
     "@open-draft/deferred-promise" "^2.2.0"
     "@open-draft/logger" "^0.3.0"
@@ -1773,7 +1832,7 @@
     "@nodelib/fs.scandir" "2.1.5"
     fastq "^1.6.0"
 
-"@npmcli/git@^2.0.8":
+"@npmcli/git@^2.1.0":
   version "2.1.0"
   resolved "https://registry.npmjs.org/@npmcli/git/-/git-2.1.0.tgz#2fbd77e147530247d37f325930d457b3ebe894f6"
   integrity sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw==
@@ -2207,10 +2266,32 @@
     "@react-spring/shared" "~9.2.6-beta.0"
     "@react-spring/types" "~9.2.6-beta.0"
 
-"@remix-run/router@1.14.2":
-  version "1.14.2"
-  resolved "https://registry.npmjs.org/@remix-run/router/-/router-1.14.2.tgz#4d58f59908d9197ba3179310077f25c88e49ed17"
-  integrity sha512-ACXpdMM9hmKZww21yEqWwiLws/UPLhNKvimN8RrYSqPSvB3ov7sLvAcfvaxePeLvccTQKGdkDIhLYApZVDFuKg==
+"@remix-run/router@1.15.0":
+  version "1.15.0"
+  resolved "https://registry.npmjs.org/@remix-run/router/-/router-1.15.0.tgz#461a952c2872dd82c8b2e9b74c4dfaff569123e2"
+  integrity sha512-HOil5aFtme37dVQTB6M34G95kPM3MMuqSmIRVCC52eKV+Y/tGSqw9P3rWhlAx6A+mz+MoX+XxsGsNJbaI5qCgQ==
+
+"@sideway/address@^4.1.5":
+  version "4.1.5"
+  resolved "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz#4bc149a0076623ced99ca8208ba780d65a99b9d5"
+  integrity sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==
+  dependencies:
+    "@hapi/hoek" "^9.0.0"
+
+"@sideway/formula@^3.0.1":
+  version "3.0.1"
+  resolved "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz#80fcbcbaf7ce031e0ef2dd29b1bfc7c3f583611f"
+  integrity sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==
+
+"@sideway/pinpoint@^2.0.0":
+  version "2.0.0"
+  resolved "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df"
+  integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==
+
+"@sinclair/typebox@^0.24.1":
+  version "0.24.51"
+  resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz#645f33fe4e02defe26f2f5c0410e1c094eac7f5f"
+  integrity sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==
 
 "@sinclair/typebox@^0.27.8":
   version "0.27.8"
@@ -2285,7 +2366,7 @@
     prop-types "^15.6.2"
     react-flip-move "^3.0.1"
 
-"@splunk/react-ui@^4.22.0", "@splunk/react-ui@^4.23.0", "@splunk/react-ui@^4.24.0":
+"@splunk/react-ui@^4.22.0", "@splunk/react-ui@^4.23.0":
   version "4.24.0"
   resolved "https://registry.npmjs.org/@splunk/react-ui/-/react-ui-4.24.0.tgz#1250eda179f30c51d22c289d41a07ff0e2fd7c3e"
   integrity sha512-qrPKWe8H4w6hl3dIPPeIDgvWqwAk9DjhkVbKw3ffInrLk32bbA816y5WfQZdi0rBhZLOKNl1j4Om875qO33mpQ==
@@ -2314,6 +2395,28 @@
     tinycolor2 "^1.4.1"
     use-typed-event-listener "^3.0.0"
 
+"@splunk/react-ui@^4.25.0":
+  version "4.25.0"
+  resolved "https://registry.npmjs.org/@splunk/react-ui/-/react-ui-4.25.0.tgz#7aa6f4144cd5c8729458e4d729b7a08b304213a2"
+  integrity sha512-3gYmThJ2ssB46RmbWEUgBiEzqSFyQNINbLN76cQ63KPrdij8DfatoA7cD9u5S+apn8FCAc4RZhkH3QE+6ODeLw==
+  dependencies:
+    "@dnd-kit/core" "6.0.8"
+    "@dnd-kit/sortable" "7.0.2"
+    "@dnd-kit/utilities" "3.2.1"
+    "@splunk/react-icons" "^4.2.0"
+    "@splunk/themes" "^0.16.4"
+    "@splunk/ui-utils" "^1.6.0"
+    commonmark "^0.30.0"
+    commonmark-react-renderer "^4.3.2"
+    decimal.js-light "^2.2.3"
+    lodash "^4.17.14"
+    moment "^2.29.4"
+    prop-types "^15.6.2"
+    react-resize-detector "^3.2.1"
+    react-spring "9.2.4"
+    tinycolor2 "^1.4.1"
+    use-typed-event-listener "^3.0.0"
+
 "@splunk/splunk-utils@^2.3.4":
   version "2.3.4"
   resolved "https://registry.npmjs.org/@splunk/splunk-utils/-/splunk-utils-2.3.4.tgz#0c86aba8c0c18ce341f04d2d7b38584cfa52befc"
@@ -2363,152 +2466,160 @@
     webpack-livereload-plugin "^3.0.2"
     webpack-merge "^5.9.0"
 
-"@storybook/addon-actions@7.6.10":
-  version "7.6.10"
-  resolved "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-7.6.10.tgz#5b43534e158797114db032f4ad8505a81809ed00"
-  integrity sha512-pcKmf0H/caGzKDy8cz1adNSjv+KOBWLJ11RzGExrWm+Ad5ACifwlsQPykJ3TQ/21sTd9IXVrE9uuq4LldEnPbg==
+"@storybook/addon-a11y@^7.6.16":
+  version "7.6.16"
+  resolved "https://registry.npmjs.org/@storybook/addon-a11y/-/addon-a11y-7.6.16.tgz#1eb2776979ddabb6dc9eedb373a5a3f3e3a07c16"
+  integrity sha512-ebxgx6uSWm5gCK8R6T/VHScXy+XR5d7vltkn2wen08rzJhuA4nzMYpz9KwTsV+cu9vvrKfMKn4mpTP3kqnBI5Q==
+  dependencies:
+    "@storybook/addon-highlight" "7.6.16"
+    axe-core "^4.2.0"
+
+"@storybook/addon-actions@7.6.16":
+  version "7.6.16"
+  resolved "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-7.6.16.tgz#aed33b43743832f037aede8ce2bfda26b3b91fe6"
+  integrity sha512-wCpZljLXnu08TZzp+qL5AXousfUBzY6TgHVwn4yoZkMhPg3WLxZTceKYnc+XAxoMmdTrDjwanEF7v/uQ9eu64Q==
   dependencies:
-    "@storybook/core-events" "7.6.10"
+    "@storybook/core-events" "7.6.16"
     "@storybook/global" "^5.0.0"
     "@types/uuid" "^9.0.1"
     dequal "^2.0.2"
     polished "^4.2.2"
     uuid "^9.0.0"
 
-"@storybook/addon-backgrounds@7.6.10":
-  version "7.6.10"
-  resolved "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-7.6.10.tgz#4ecfc017befd400e5eabad347ab1819c2ea67a8c"
-  integrity sha512-kGzsN1QkfyI8Cz7TErEx9OCB3PMzpCFGLd/iy7FreXwbMbeAQ3/9fYgKUsNOYgOhuTz7S09koZUWjS/WJuZGFA==
+"@storybook/addon-backgrounds@7.6.16":
+  version "7.6.16"
+  resolved "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-7.6.16.tgz#3a1dd8a4592d129bbedb238c7df4890aec3f5945"
+  integrity sha512-q9985hjtoX3ytvReV2YC4UY0FVASXFq2fW6RNOrrivw81UbW2SWxVG01vh7ZXjMrWbQ6r3yC05X9vVAmCa7TdQ==
   dependencies:
     "@storybook/global" "^5.0.0"
     memoizerific "^1.11.3"
     ts-dedent "^2.0.0"
 
-"@storybook/addon-controls@7.6.10":
-  version "7.6.10"
-  resolved "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-7.6.10.tgz#6cd309440bf2b86c21f11a8b5f20bc1340d6c045"
-  integrity sha512-LjwCQRMWq1apLtFwDi6U8MI6ITUr+KhxJucZ60tfc58RgB2v8ayozyDAonFEONsx9YSR1dNIJ2Z/e2rWTBJeYA==
+"@storybook/addon-controls@7.6.16":
+  version "7.6.16"
+  resolved "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-7.6.16.tgz#1b948080cbdc8b3337c523a3dcc5ee512f8619a9"
+  integrity sha512-WeIuwyGxaMMClWSHhSH0ibwPSarEFtxE6SPQxCTmGIeD11bn5vQ6UUrmm9A2xbFqHOJBoB60TJhw69alnI0AHA==
   dependencies:
-    "@storybook/blocks" "7.6.10"
+    "@storybook/blocks" "7.6.16"
     lodash "^4.17.21"
     ts-dedent "^2.0.0"
 
-"@storybook/addon-docs@7.6.10":
-  version "7.6.10"
-  resolved "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-7.6.10.tgz#aab69f253a9cfbb57fd84062f00fac08f9c796cd"
-  integrity sha512-GtyQ9bMx1AOOtl6ZS9vwK104HFRK+tqzxddRRxhXkpyeKu3olm9aMgXp35atE/3fJSqyyDm2vFtxxH8mzBA20A==
+"@storybook/addon-docs@7.6.16":
+  version "7.6.16"
+  resolved "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-7.6.16.tgz#4c205d1ebce7b07c0ebc58ccb3e9bd17921d5939"
+  integrity sha512-X4WLAwwxGq9ki49FtERT5VHstGeZYca+l+8lxVXW6NQYuQ1xCeSy5puwknDv5p5u4thIVW2Fa4Uvma7wCfddtg==
   dependencies:
     "@jest/transform" "^29.3.1"
     "@mdx-js/react" "^2.1.5"
-    "@storybook/blocks" "7.6.10"
-    "@storybook/client-logger" "7.6.10"
-    "@storybook/components" "7.6.10"
-    "@storybook/csf-plugin" "7.6.10"
-    "@storybook/csf-tools" "7.6.10"
+    "@storybook/blocks" "7.6.16"
+    "@storybook/client-logger" "7.6.16"
+    "@storybook/components" "7.6.16"
+    "@storybook/csf-plugin" "7.6.16"
+    "@storybook/csf-tools" "7.6.16"
     "@storybook/global" "^5.0.0"
     "@storybook/mdx2-csf" "^1.0.0"
-    "@storybook/node-logger" "7.6.10"
-    "@storybook/postinstall" "7.6.10"
-    "@storybook/preview-api" "7.6.10"
-    "@storybook/react-dom-shim" "7.6.10"
-    "@storybook/theming" "7.6.10"
-    "@storybook/types" "7.6.10"
+    "@storybook/node-logger" "7.6.16"
+    "@storybook/postinstall" "7.6.16"
+    "@storybook/preview-api" "7.6.16"
+    "@storybook/react-dom-shim" "7.6.16"
+    "@storybook/theming" "7.6.16"
+    "@storybook/types" "7.6.16"
     fs-extra "^11.1.0"
     remark-external-links "^8.0.0"
     remark-slug "^6.0.0"
     ts-dedent "^2.0.0"
 
-"@storybook/addon-essentials@^7.6.10":
-  version "7.6.10"
-  resolved "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-7.6.10.tgz#9078abe56b15d976e3d4c15247c748b2e8e53c30"
-  integrity sha512-cjbuCCK/3dtUity0Uqi5LwbkgfxqCCE5x5mXZIk9lTMeDz5vB9q6M5nzncVDy8F8przF3NbDLLgxKlt8wjiICg==
-  dependencies:
-    "@storybook/addon-actions" "7.6.10"
-    "@storybook/addon-backgrounds" "7.6.10"
-    "@storybook/addon-controls" "7.6.10"
-    "@storybook/addon-docs" "7.6.10"
-    "@storybook/addon-highlight" "7.6.10"
-    "@storybook/addon-measure" "7.6.10"
-    "@storybook/addon-outline" "7.6.10"
-    "@storybook/addon-toolbars" "7.6.10"
-    "@storybook/addon-viewport" "7.6.10"
-    "@storybook/core-common" "7.6.10"
-    "@storybook/manager-api" "7.6.10"
-    "@storybook/node-logger" "7.6.10"
-    "@storybook/preview-api" "7.6.10"
+"@storybook/addon-essentials@^7.6.16":
+  version "7.6.16"
+  resolved "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-7.6.16.tgz#395ab6f53d91fa0667ac2870a09843a9f0a41ce0"
+  integrity sha512-LTrsud7yphxA7dpbk8TvIsHXqk5Wkq3JAwby3yQDEOFakpgNeXj8b6rlr9CHJja2p13pB4LuXokLk8t+qJGnQQ==
+  dependencies:
+    "@storybook/addon-actions" "7.6.16"
+    "@storybook/addon-backgrounds" "7.6.16"
+    "@storybook/addon-controls" "7.6.16"
+    "@storybook/addon-docs" "7.6.16"
+    "@storybook/addon-highlight" "7.6.16"
+    "@storybook/addon-measure" "7.6.16"
+    "@storybook/addon-outline" "7.6.16"
+    "@storybook/addon-toolbars" "7.6.16"
+    "@storybook/addon-viewport" "7.6.16"
+    "@storybook/core-common" "7.6.16"
+    "@storybook/manager-api" "7.6.16"
+    "@storybook/node-logger" "7.6.16"
+    "@storybook/preview-api" "7.6.16"
     ts-dedent "^2.0.0"
 
-"@storybook/addon-highlight@7.6.10":
-  version "7.6.10"
-  resolved "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-7.6.10.tgz#19cad3d67655e9b9eef3d2f6760789fc29ba0790"
-  integrity sha512-dIuS5QmoT1R+gFOcf6CoBa6D9UR5/wHCfPqPRH8dNNcCLtIGSHWQ4v964mS5OCq1Huj7CghmR15lOUk7SaYwUA==
+"@storybook/addon-highlight@7.6.16":
+  version "7.6.16"
+  resolved "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-7.6.16.tgz#2c91179ca59e05fd7430b7d96c2d2d1e9c7658e2"
+  integrity sha512-DJtUBiButx6cz55eaRe5JFVBORVtp3Htr9PnxWVGEy4Ki5aoYCYWxMcPOuXVFvtWgBmh6d3HO0pEd888qPr60g==
   dependencies:
     "@storybook/global" "^5.0.0"
 
-"@storybook/addon-interactions@^7.6.10":
-  version "7.6.10"
-  resolved "https://registry.npmjs.org/@storybook/addon-interactions/-/addon-interactions-7.6.10.tgz#e1522ed169021f808401dfc46271b8c896abd258"
-  integrity sha512-lEsAdP/PrOZK/KmRbZ/fU4RjEqDP+e/PBlVVVJT2QvHniWK/xxkjCD0axsHU/XuaeQRFhmg0/KR342PC/cIf9A==
+"@storybook/addon-interactions@^7.6.16":
+  version "7.6.16"
+  resolved "https://registry.npmjs.org/@storybook/addon-interactions/-/addon-interactions-7.6.16.tgz#ca43e87e15c336f70a5568f2d06a15af2b0b3777"
+  integrity sha512-nOjbQCqX+u3yAwlaGHQZCoSkdsvctfiWxcUjMwDBdky2vPKUGLpfJs65w31ay/UgeR+ZWYROGwVMkOHzB4GOIA==
   dependencies:
     "@storybook/global" "^5.0.0"
-    "@storybook/types" "7.6.10"
+    "@storybook/types" "7.6.16"
     jest-mock "^27.0.6"
     polished "^4.2.2"
     ts-dedent "^2.2.0"
 
-"@storybook/addon-links@^7.6.10":
-  version "7.6.10"
-  resolved "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-7.6.10.tgz#e437d35b360ac9a33ee6078d901417a73f916629"
-  integrity sha512-s/WkSYHpr2pb9p57j6u/xDBg3TKJhBq55YMl0GB5gXgkRPIeuGbPhGJhm2yTGVFLvXgr/aHHnOxb/R/W8PiRhA==
+"@storybook/addon-links@^7.6.16":
+  version "7.6.16"
+  resolved "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-7.6.16.tgz#783764da92e920b9cf5e43378a88053cd8f7d6eb"
+  integrity sha512-+582ePJxvweYZB5s133Uou6YRzZtnXGMRtKMJVovy/P5cWtq8FS5wzyMJPeK4z6ioR6BQJQVF2NV5lfrjoxpKQ==
   dependencies:
     "@storybook/csf" "^0.1.2"
     "@storybook/global" "^5.0.0"
     ts-dedent "^2.0.0"
 
-"@storybook/addon-measure@7.6.10":
-  version "7.6.10"
-  resolved "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-7.6.10.tgz#5e41d64aa6e02b9c6df1696d918058979598250e"
-  integrity sha512-OVfTI56+kc4hLWfZ/YPV3WKj/aA9e4iKXYxZyPdhfX4Z8TgZdD1wv9Z6e8DKS0H5kuybYrHKHaID5ki6t7qz3w==
+"@storybook/addon-measure@7.6.16":
+  version "7.6.16"
+  resolved "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-7.6.16.tgz#68e8b9fd4debf944021a89fd983795ae25d3258d"
+  integrity sha512-lQw7WXEeLuvDe3bfi7699WnHMryLIRnoT/w7oHqvS19UHp2HR0TKqYiPPppI6Yy4RoWHx+qFhKZJlajFyKDGfg==
   dependencies:
     "@storybook/global" "^5.0.0"
     tiny-invariant "^1.3.1"
 
-"@storybook/addon-outline@7.6.10":
-  version "7.6.10"
-  resolved "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-7.6.10.tgz#02b51084cc1d555c270995cebfe512924df0ce7e"
-  integrity sha512-RVJrEoPArhI6zAIMNl1Gz0zrj84BTfEWYYz0yDWOTVgvN411ugsoIk1hw0671MOneXJ2RcQ9MFIeV/v6AVDQYg==
+"@storybook/addon-outline@7.6.16":
+  version "7.6.16"
+  resolved "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-7.6.16.tgz#5019328486ccba0db3b6a714a70024a72f016a24"
+  integrity sha512-bG9KN10ANLUDIsm4e6RXRsCZ++b8pyfYTyu0MlSNXf6KdYcuDvdTY59gj6RIeVGKqWeX5yYCYUm2oPLtkms1NQ==
   dependencies:
     "@storybook/global" "^5.0.0"
     ts-dedent "^2.0.0"
 
-"@storybook/addon-toolbars@7.6.10":
-  version "7.6.10"
-  resolved "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-7.6.10.tgz#4d841e87acca5455a8339a29c1062612ccb07df6"
-  integrity sha512-PaXY/oj9yxF7/H0CNdQKcioincyCkfeHpISZriZbZqhyqsjn3vca7RFEmsB88Q+ou6rMeqyA9st+6e2cx/Ct6A==
+"@storybook/addon-toolbars@7.6.16":
+  version "7.6.16"
+  resolved "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-7.6.16.tgz#a3c81400e0b54ad77a4b2980aaef3f977a170793"
+  integrity sha512-6wSNXe50auEVwHCcupYPrJkpzQFugumEBfgYuQ6ICW9k2xJtGtahy7TyM9sZbYgnDkoTm2ba7UhML6Noy3JuUg==
 
-"@storybook/addon-viewport@7.6.10":
-  version "7.6.10"
-  resolved "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-7.6.10.tgz#834bad76a56e4117ffb2dc935d349dca3b49bcc3"
-  integrity sha512-+bA6juC/lH4vEhk+w0rXakaG8JgLG4MOYrIudk5vJKQaC6X58LIM9N4kzIS2KSExRhkExXBPrWsnMfCo7uxmKg==
+"@storybook/addon-viewport@7.6.16":
+  version "7.6.16"
+  resolved "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-7.6.16.tgz#81ddb7004c2811092eddadcadbed8d69f9dc87a9"
+  integrity sha512-WkvixYHncLXpAeEnktjfYIffJ3b6poymB+wDbHKK/tg7m3N8llLlys64nvyeb7DbZ/+1yJls3K1DVbk1AIEHrQ==
   dependencies:
     memoizerific "^1.11.3"
 
-"@storybook/blocks@7.6.10", "@storybook/blocks@^7.6.10":
-  version "7.6.10"
-  resolved "https://registry.npmjs.org/@storybook/blocks/-/blocks-7.6.10.tgz#353a5efa6a922a9a3766254f9f24cc2adad34f83"
-  integrity sha512-oSIukGC3yuF8pojABC/HLu5tv2axZvf60TaUs8eDg7+NiiKhzYSPoMQxs5uMrKngl+EJDB92ESgWT9vvsfvIPg==
+"@storybook/blocks@7.6.16", "@storybook/blocks@^7.6.16":
+  version "7.6.16"
+  resolved "https://registry.npmjs.org/@storybook/blocks/-/blocks-7.6.16.tgz#0bcea894051645c1f7b1d4b341f0b3bf4313519d"
+  integrity sha512-rWG9a7BbK0qYvge1oJTIpAbcQ4eOSxetKqgeZc7jxQGeJw0Xvq7C/CmkBY4ZrdP8nj7M7R1Yw49u6OV4aXlyOg==
   dependencies:
-    "@storybook/channels" "7.6.10"
-    "@storybook/client-logger" "7.6.10"
-    "@storybook/components" "7.6.10"
-    "@storybook/core-events" "7.6.10"
+    "@storybook/channels" "7.6.16"
+    "@storybook/client-logger" "7.6.16"
+    "@storybook/components" "7.6.16"
+    "@storybook/core-events" "7.6.16"
     "@storybook/csf" "^0.1.2"
-    "@storybook/docs-tools" "7.6.10"
+    "@storybook/docs-tools" "7.6.16"
     "@storybook/global" "^5.0.0"
-    "@storybook/manager-api" "7.6.10"
-    "@storybook/preview-api" "7.6.10"
-    "@storybook/theming" "7.6.10"
-    "@storybook/types" "7.6.10"
+    "@storybook/manager-api" "7.6.16"
+    "@storybook/preview-api" "7.6.16"
+    "@storybook/theming" "7.6.16"
+    "@storybook/types" "7.6.16"
     "@types/lodash" "^4.14.167"
     color-convert "^2.0.1"
     dequal "^2.0.2"
@@ -2522,15 +2633,15 @@
     ts-dedent "^2.0.0"
     util-deprecate "^1.0.2"
 
-"@storybook/builder-manager@7.6.10":
-  version "7.6.10"
-  resolved "https://registry.npmjs.org/@storybook/builder-manager/-/builder-manager-7.6.10.tgz#fc30b19dd74e6f6ae896d8f4045552c3206c25f9"
-  integrity sha512-f+YrjZwohGzvfDtH8BHzqM3xW0p4vjjg9u7uzRorqUiNIAAKHpfNrZ/WvwPlPYmrpAHt4xX/nXRJae4rFSygPw==
+"@storybook/builder-manager@7.6.16":
+  version "7.6.16"
+  resolved "https://registry.npmjs.org/@storybook/builder-manager/-/builder-manager-7.6.16.tgz#f27eb05b2a40cae13bfc7ca899ef1d4599c750b0"
+  integrity sha512-QTmvjmk49tpPe5IFM3SwHvRb1P6G0PTip4mCO7ab/zKiWaXlg9QZF5su+2e3KSil4ATssr3ybUlKlkqSubaCyQ==
   dependencies:
     "@fal-works/esbuild-plugin-global-externals" "^2.1.2"
-    "@storybook/core-common" "7.6.10"
-    "@storybook/manager" "7.6.10"
-    "@storybook/node-logger" "7.6.10"
+    "@storybook/core-common" "7.6.16"
+    "@storybook/manager" "7.6.16"
+    "@storybook/node-logger" "7.6.16"
     "@types/ejs" "^3.1.1"
     "@types/find-cache-dir" "^3.2.1"
     "@yarnpkg/esbuild-plugin-pnp" "^3.0.0-rc.10"
@@ -2544,20 +2655,20 @@
     process "^0.11.10"
     util "^0.12.4"
 
-"@storybook/builder-webpack5@7.6.10":
-  version "7.6.10"
-  resolved "https://registry.npmjs.org/@storybook/builder-webpack5/-/builder-webpack5-7.6.10.tgz#9cd8ae541e836c089e17e5f8d527b9cad6d4d99f"
-  integrity sha512-ja47rdy75tAs37T+JLSqgUGJiba+74zM/8IpEZAzgJmGxLetnHuCWEDskZWh3NXemxYS2uCvsg5rNc+dL9z4RA==
+"@storybook/builder-webpack5@7.6.16":
+  version "7.6.16"
+  resolved "https://registry.npmjs.org/@storybook/builder-webpack5/-/builder-webpack5-7.6.16.tgz#7f732f87081f0ed05ccf4a011e0ce4e86a7dc10b"
+  integrity sha512-KBUwFXlG+BBp3W7eyZMdTpWqiGsI6bsKcbyEtzbX4pSPWDRVWaJB2wito+Y1VhOAo/pPukzV/3GLVUlyq4wdsw==
   dependencies:
     "@babel/core" "^7.23.2"
-    "@storybook/channels" "7.6.10"
-    "@storybook/client-logger" "7.6.10"
-    "@storybook/core-common" "7.6.10"
-    "@storybook/core-events" "7.6.10"
-    "@storybook/core-webpack" "7.6.10"
-    "@storybook/node-logger" "7.6.10"
-    "@storybook/preview" "7.6.10"
-    "@storybook/preview-api" "7.6.10"
+    "@storybook/channels" "7.6.16"
+    "@storybook/client-logger" "7.6.16"
+    "@storybook/core-common" "7.6.16"
+    "@storybook/core-events" "7.6.16"
+    "@storybook/core-webpack" "7.6.16"
+    "@storybook/node-logger" "7.6.16"
+    "@storybook/preview" "7.6.16"
+    "@storybook/preview-api" "7.6.16"
     "@swc/core" "^1.3.82"
     "@types/node" "^18.0.0"
     "@types/semver" "^7.3.4"
@@ -2588,35 +2699,47 @@
     webpack-hot-middleware "^2.25.1"
     webpack-virtual-modules "^0.5.0"
 
-"@storybook/channels@7.6.10":
-  version "7.6.10"
-  resolved "https://registry.npmjs.org/@storybook/channels/-/channels-7.6.10.tgz#04fd2c2f0b530bb8d236f5763e8df8cb5fa7c921"
-  integrity sha512-ITCLhFuDBKgxetuKnWwYqMUWlU7zsfH3gEKZltTb+9/2OAWR7ez0iqU7H6bXP1ridm0DCKkt2UMWj2mmr9iQqg==
+"@storybook/channels@7.6.13":
+  version "7.6.13"
+  resolved "https://registry.npmjs.org/@storybook/channels/-/channels-7.6.13.tgz#4d60407ecab0cfb99184fc230fec237d1df019c2"
+  integrity sha512-AiplFJXPjgHA62xqZFq7SwCS+o8bFrYLPM9I8yNY+8jhAi9N3Yig+h2P0jOXxLKicwrCXa5ZJ7PZK05M1r6YqA==
   dependencies:
-    "@storybook/client-logger" "7.6.10"
-    "@storybook/core-events" "7.6.10"
+    "@storybook/client-logger" "7.6.13"
+    "@storybook/core-events" "7.6.13"
     "@storybook/global" "^5.0.0"
     qs "^6.10.0"
     telejson "^7.2.0"
     tiny-invariant "^1.3.1"
 
-"@storybook/cli@7.6.10":
-  version "7.6.10"
-  resolved "https://registry.npmjs.org/@storybook/cli/-/cli-7.6.10.tgz#2436276c5404b166a9f795fef44bbd75826d9bfe"
-  integrity sha512-pK1MEseMm73OMO2OVoSz79QWX8ymxgIGM8IeZTCo9gImiVRChMNDFYcv8yPWkjuyesY8c15CoO48aR7pdA1OjQ==
+"@storybook/channels@7.6.16":
+  version "7.6.16"
+  resolved "https://registry.npmjs.org/@storybook/channels/-/channels-7.6.16.tgz#0aa15f77356211270d2dad8a7e257ed7374ade50"
+  integrity sha512-LKB0t4OGISez1O4TRJ/CDPxlb2wAW7gg8YRL91VVUHeffVyr4bnpklvMbLbuEcYrysM82Q2UMB9ipQdyK6Issg==
+  dependencies:
+    "@storybook/client-logger" "7.6.16"
+    "@storybook/core-events" "7.6.16"
+    "@storybook/global" "^5.0.0"
+    qs "^6.10.0"
+    telejson "^7.2.0"
+    tiny-invariant "^1.3.1"
+
+"@storybook/cli@7.6.16":
+  version "7.6.16"
+  resolved "https://registry.npmjs.org/@storybook/cli/-/cli-7.6.16.tgz#a54705fe652278b1144288b5faf497f69ece7f34"
+  integrity sha512-bFEiAXv69ZLqFnxAMCEBTxZqLnPG0GAEpGqwpPbt2lk6lLtro8g+//OR9RiztZt0YFHpp0YK5WCy6Xq0gwXcPw==
   dependencies:
     "@babel/core" "^7.23.2"
     "@babel/preset-env" "^7.23.2"
     "@babel/types" "^7.23.0"
     "@ndelangen/get-tarball" "^3.0.7"
-    "@storybook/codemod" "7.6.10"
-    "@storybook/core-common" "7.6.10"
-    "@storybook/core-events" "7.6.10"
-    "@storybook/core-server" "7.6.10"
-    "@storybook/csf-tools" "7.6.10"
-    "@storybook/node-logger" "7.6.10"
-    "@storybook/telemetry" "7.6.10"
-    "@storybook/types" "7.6.10"
+    "@storybook/codemod" "7.6.16"
+    "@storybook/core-common" "7.6.16"
+    "@storybook/core-events" "7.6.16"
+    "@storybook/core-server" "7.6.16"
+    "@storybook/csf-tools" "7.6.16"
+    "@storybook/node-logger" "7.6.16"
+    "@storybook/telemetry" "7.6.16"
+    "@storybook/types" "7.6.16"
     "@types/semver" "^7.3.4"
     "@yarnpkg/fslib" "2.10.3"
     "@yarnpkg/libzip" "2.3.0"
@@ -2646,25 +2769,32 @@
     ts-dedent "^2.0.0"
     util-deprecate "^1.0.2"
 
-"@storybook/client-logger@7.6.10":
-  version "7.6.10"
-  resolved "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.6.10.tgz#5d66feb18a21836f84b63f71cf5b3a85d669f049"
-  integrity sha512-U7bbpu21ntgePMz/mKM18qvCSWCUGCUlYru8mgVlXLCKqFqfTeP887+CsPEQf29aoE3cLgDrxqbRJ1wxX9kL9A==
+"@storybook/client-logger@7.6.13":
+  version "7.6.13"
+  resolved "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.6.13.tgz#bcba58e9a7ad706ca7309d50854a09ec04687f34"
+  integrity sha512-uo51MsUG1Fbi1IA+me9tewF1mFiaYuyR0IMeBmaU3Z3CtjEUdOekmvRQ9ckoFn+BbKtxSipTodiR4HmIZDta3g==
   dependencies:
     "@storybook/global" "^5.0.0"
 
-"@storybook/codemod@7.6.10":
-  version "7.6.10"
-  resolved "https://registry.npmjs.org/@storybook/codemod/-/codemod-7.6.10.tgz#21cc0e69df6f57d567fc27264310f820662d62fa"
-  integrity sha512-pzFR0nocBb94vN9QCJLC3C3dP734ZigqyPmd0ZCDj9Xce2ytfHK3v1lKB6TZWzKAZT8zztauECYxrbo4LVuagw==
+"@storybook/client-logger@7.6.16":
+  version "7.6.16"
+  resolved "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.6.16.tgz#73782e461bfd29f94c3006e6ebe6f90294ca339b"
+  integrity sha512-Vquhmgk/SO0VeAkojcA1juuicBHoTST+f4XwBvyUNiebOSOdGIkxHVxpDFXu2kS0aKflFBEutX2IgoysDup+fQ==
+  dependencies:
+    "@storybook/global" "^5.0.0"
+
+"@storybook/codemod@7.6.16":
+  version "7.6.16"
+  resolved "https://registry.npmjs.org/@storybook/codemod/-/codemod-7.6.16.tgz#c10a648f0d100628dc6aa2e2eb4e3ab597ec56f1"
+  integrity sha512-RlL2I7UV+ef3j+6NaFa1Y6j/hU9KDKssync1GfKypUKlFAP76ozfpRWdDVEkc/29JruEEkbvMiUxQdP7CE3PMQ==
   dependencies:
     "@babel/core" "^7.23.2"
     "@babel/preset-env" "^7.23.2"
     "@babel/types" "^7.23.0"
     "@storybook/csf" "^0.1.2"
-    "@storybook/csf-tools" "7.6.10"
-    "@storybook/node-logger" "7.6.10"
-    "@storybook/types" "7.6.10"
+    "@storybook/csf-tools" "7.6.16"
+    "@storybook/node-logger" "7.6.16"
+    "@storybook/types" "7.6.16"
     "@types/cross-spawn" "^6.0.2"
     cross-spawn "^7.0.3"
     globby "^11.0.2"
@@ -2673,38 +2803,67 @@
     prettier "^2.8.0"
     recast "^0.23.1"
 
-"@storybook/components@7.6.10":
-  version "7.6.10"
-  resolved "https://registry.npmjs.org/@storybook/components/-/components-7.6.10.tgz#2d1b8c66c374327663b91f65db3b1be5749a1a6b"
-  integrity sha512-H5hF8pxwtbt0LxV24KMMsPlbYG9Oiui3ObvAQkvGu6q62EYxRPeNSrq3GBI5XEbI33OJY9bT24cVaZx18dXqwQ==
+"@storybook/components@7.6.16":
+  version "7.6.16"
+  resolved "https://registry.npmjs.org/@storybook/components/-/components-7.6.16.tgz#08c6f53d41d81d1bef7952e30195928c8127151e"
+  integrity sha512-5KZQqxFiVEGM485ceF/7PmiNEkHgouEa8ZUJvDGrW9Ap5MfN0xqAuyTTveHvZzGrKp0YlOcOnpqwu/cSk0HQKA==
   dependencies:
     "@radix-ui/react-select" "^1.2.2"
     "@radix-ui/react-toolbar" "^1.0.4"
-    "@storybook/client-logger" "7.6.10"
+    "@storybook/client-logger" "7.6.16"
     "@storybook/csf" "^0.1.2"
     "@storybook/global" "^5.0.0"
-    "@storybook/theming" "7.6.10"
-    "@storybook/types" "7.6.10"
+    "@storybook/theming" "7.6.16"
+    "@storybook/types" "7.6.16"
     memoizerific "^1.11.3"
     use-resize-observer "^9.1.0"
     util-deprecate "^1.0.2"
 
-"@storybook/core-client@7.6.10":
-  version "7.6.10"
-  resolved "https://registry.npmjs.org/@storybook/core-client/-/core-client-7.6.10.tgz#cd427d7017c1f32b2e956b4eb8ea89f3424b60c9"
-  integrity sha512-DjnzSzSNDmZyxyg6TxugzWQwOsW+n/iWVv6sHNEvEd5STr0mjuJjIEELmv58LIr5Lsre5+LEddqHsyuLyt8ubg==
+"@storybook/core-client@7.6.16":
+  version "7.6.16"
+  resolved "https://registry.npmjs.org/@storybook/core-client/-/core-client-7.6.16.tgz#0769b7b2abad90e71e09c2d7d7e652ca5a6b3696"
+  integrity sha512-ogVwvjpNPrcv8Lk9oSa38b7X4NNgYIgVnCjvvr9FCmhh4xAuA4XNUyB+vyAdK4JOT0/CoMKRpTp+VL5e2+BZbg==
+  dependencies:
+    "@storybook/client-logger" "7.6.16"
+    "@storybook/preview-api" "7.6.16"
+
+"@storybook/core-common@7.6.16":
+  version "7.6.16"
+  resolved "https://registry.npmjs.org/@storybook/core-common/-/core-common-7.6.16.tgz#be5de3cd56df03653feb8576dc19dad6a62721f8"
+  integrity sha512-Xn3Fbo4k9RRKgYzOBx9CeJFpWgS9gkcdo3J9XMMzmUqdZ+MUGT74kl2sMmzSypcH5aI1AUl5vZIKvLwloliejw==
   dependencies:
-    "@storybook/client-logger" "7.6.10"
-    "@storybook/preview-api" "7.6.10"
+    "@storybook/core-events" "7.6.16"
+    "@storybook/node-logger" "7.6.16"
+    "@storybook/types" "7.6.16"
+    "@types/find-cache-dir" "^3.2.1"
+    "@types/node" "^18.0.0"
+    "@types/node-fetch" "^2.6.4"
+    "@types/pretty-hrtime" "^1.0.0"
+    chalk "^4.1.0"
+    esbuild "^0.18.0"
+    esbuild-register "^3.5.0"
+    file-system-cache "2.3.0"
+    find-cache-dir "^3.0.0"
+    find-up "^5.0.0"
+    fs-extra "^11.1.0"
+    glob "^10.0.0"
+    handlebars "^4.7.7"
+    lazy-universal-dotenv "^4.0.0"
+    node-fetch "^2.0.0"
+    picomatch "^2.3.0"
+    pkg-dir "^5.0.0"
+    pretty-hrtime "^1.0.3"
+    resolve-from "^5.0.0"
+    ts-dedent "^2.0.0"
 
-"@storybook/core-common@7.6.10":
-  version "7.6.10"
-  resolved "https://registry.npmjs.org/@storybook/core-common/-/core-common-7.6.10.tgz#00b73761eb3c4452105a7d79b5179237a6f01b32"
-  integrity sha512-K3YWqjCKMnpvYsWNjOciwTH6zWbuuZzmOiipziZaVJ+sB1XYmH52Y3WGEm07TZI8AYK9DRgwA13dR/7W0nw72Q==
+"@storybook/core-common@^7.0.0-beta.0 || ^7.0.0-rc.0 || ^7.0.0":
+  version "7.6.13"
+  resolved "https://registry.npmjs.org/@storybook/core-common/-/core-common-7.6.13.tgz#46b47cce8f563a4542e9d5a9128733bc2229469d"
+  integrity sha512-kCCVDga/66wIWFSluT3acD3/JT3vwV7A9rxG8FZF5K38quU/b37sRXvCw8Yk5HJ4rQhrB76cxVhIOy/ZucaZVw==
   dependencies:
-    "@storybook/core-events" "7.6.10"
-    "@storybook/node-logger" "7.6.10"
-    "@storybook/types" "7.6.10"
+    "@storybook/core-events" "7.6.13"
+    "@storybook/node-logger" "7.6.13"
+    "@storybook/types" "7.6.13"
     "@types/find-cache-dir" "^3.2.1"
     "@types/node" "^18.0.0"
     "@types/node-fetch" "^2.6.4"
@@ -2726,33 +2885,40 @@
     resolve-from "^5.0.0"
     ts-dedent "^2.0.0"
 
-"@storybook/core-events@7.6.10":
-  version "7.6.10"
-  resolved "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.6.10.tgz#d521cbdadebfa56caaa8815a1e132694a20f05e9"
-  integrity sha512-yccDH67KoROrdZbRKwxgTswFMAco5nlCyxszCDASCLygGSV2Q2e+YuywrhchQl3U6joiWi3Ps1qWu56NeNafag==
+"@storybook/core-events@7.6.13":
+  version "7.6.13"
+  resolved "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.6.13.tgz#772834ebf72f1fda339d7152566f051ac38394b9"
+  integrity sha512-hsL6JT273b1RcJBGHpNNLJ1ilzFMT4UCJwwtOpNNQVPBJt0Hn22vxC69/hpqSINrhHRLj3ak8CTtA0ynVjngaQ==
   dependencies:
     ts-dedent "^2.0.0"
 
-"@storybook/core-server@7.6.10":
-  version "7.6.10"
-  resolved "https://registry.npmjs.org/@storybook/core-server/-/core-server-7.6.10.tgz#53bf43b8b3c999c87196774a0b92e2e10a434e4c"
-  integrity sha512-2icnqJkn3vwq0eJPP0rNaHd7IOvxYf5q4lSVl2AWTxo/Ae19KhokI6j/2vvS2XQJMGQszwshlIwrZUNsj5p0yw==
+"@storybook/core-events@7.6.16":
+  version "7.6.16"
+  resolved "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.6.16.tgz#320f88f463201a1a1c857c7b596dd61bde34e4c8"
+  integrity sha512-mkBqzrbp6vmdjo0fBZGrFQQ4YdvMFxF6AesdKTf8EzPa69FoxnhQLrmQ4aXF+9vXkxfXVJF2HfpoTEdfqqAo+w==
+  dependencies:
+    ts-dedent "^2.0.0"
+
+"@storybook/core-server@7.6.16":
+  version "7.6.16"
+  resolved "https://registry.npmjs.org/@storybook/core-server/-/core-server-7.6.16.tgz#9d5daeea44b957b5259a1f2ec51eff2c5322d0ca"
+  integrity sha512-Sj8j45XMg1bI7ktMqj9gxXHsZ4d1KgR+2A2eaxR7Heho7253WkUltLYxhu3hdH01rRJXYFxn/zZBxYfEib94Vg==
   dependencies:
     "@aw-web-design/x-default-browser" "1.4.126"
     "@discoveryjs/json-ext" "^0.5.3"
-    "@storybook/builder-manager" "7.6.10"
-    "@storybook/channels" "7.6.10"
-    "@storybook/core-common" "7.6.10"
-    "@storybook/core-events" "7.6.10"
+    "@storybook/builder-manager" "7.6.16"
+    "@storybook/channels" "7.6.16"
+    "@storybook/core-common" "7.6.16"
+    "@storybook/core-events" "7.6.16"
     "@storybook/csf" "^0.1.2"
-    "@storybook/csf-tools" "7.6.10"
+    "@storybook/csf-tools" "7.6.16"
     "@storybook/docs-mdx" "^0.1.0"
     "@storybook/global" "^5.0.0"
-    "@storybook/manager" "7.6.10"
-    "@storybook/node-logger" "7.6.10"
-    "@storybook/preview-api" "7.6.10"
-    "@storybook/telemetry" "7.6.10"
-    "@storybook/types" "7.6.10"
+    "@storybook/manager" "7.6.16"
+    "@storybook/node-logger" "7.6.16"
+    "@storybook/preview-api" "7.6.16"
+    "@storybook/telemetry" "7.6.16"
+    "@storybook/types" "7.6.16"
     "@types/detect-port" "^1.3.0"
     "@types/node" "^18.0.0"
     "@types/pretty-hrtime" "^1.0.0"
@@ -2780,36 +2946,51 @@
     watchpack "^2.2.0"
     ws "^8.2.3"
 
-"@storybook/core-webpack@7.6.10":
-  version "7.6.10"
-  resolved "https://registry.npmjs.org/@storybook/core-webpack/-/core-webpack-7.6.10.tgz#e4ca086973d4d10f08b5bed789f1398eb983d8b1"
-  integrity sha512-+GiCRp+2Hw0NO3NYRKamG/U5SyOQ8tOfRUxuAqWI7nduXwB3WWdjji3/ofjqOm/ryKesuQFtfhozaczvBJBvng==
+"@storybook/core-webpack@7.6.16":
+  version "7.6.16"
+  resolved "https://registry.npmjs.org/@storybook/core-webpack/-/core-webpack-7.6.16.tgz#4cde5b4f74f89b238ed8a3e58c2fa5d82e2f4998"
+  integrity sha512-Ol/FD6jHcCspw0GK5o9uT6Pjk5HuDD9bxU+03bEyCpGPodk0BE9qaoahs1+WO4wG8A1m5QYdfy5zRq6VeI1WHg==
   dependencies:
-    "@storybook/core-common" "7.6.10"
-    "@storybook/node-logger" "7.6.10"
-    "@storybook/types" "7.6.10"
+    "@storybook/core-common" "7.6.16"
+    "@storybook/node-logger" "7.6.16"
+    "@storybook/types" "7.6.16"
     "@types/node" "^18.0.0"
     ts-dedent "^2.0.0"
 
-"@storybook/csf-plugin@7.6.10":
-  version "7.6.10"
-  resolved "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-7.6.10.tgz#479cffe04c68a87f60589a6891a306805c758437"
-  integrity sha512-Sc+zZg/BnPH2X28tthNaQBnDiFfO0QmfjVoOx0fGYM9SvY3P5ehzWwp5hMRBim6a/twOTzePADtqYL+t6GMqqg==
+"@storybook/csf-plugin@7.6.16":
+  version "7.6.16"
+  resolved "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-7.6.16.tgz#cb93eb3dea9449bc30f14ccaed59f4a3ca323475"
+  integrity sha512-hslhGtnijMpL7HAcYYgIuo6acVLP7BDptflMwIyGFWKK3MHjMxqWTZ3Sj+BV1yg/pYZdqC2NYyUypeuuSpivSA==
   dependencies:
-    "@storybook/csf-tools" "7.6.10"
+    "@storybook/csf-tools" "7.6.16"
     unplugin "^1.3.1"
 
-"@storybook/csf-tools@7.6.10":
-  version "7.6.10"
-  resolved "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-7.6.10.tgz#320638f64e2e14cf539dd55188f676fd82789be5"
-  integrity sha512-TnDNAwIALcN6SA4l00Cb67G02XMOrYU38bIpFJk5VMDX2dvgPjUtJNBuLmEbybGcOt7nPyyFIHzKcY5FCVGoWA==
+"@storybook/csf-tools@7.6.16":
+  version "7.6.16"
+  resolved "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-7.6.16.tgz#6226e18221823e3e91378b10b2368ca0a5b4903a"
+  integrity sha512-8kVBq3UKDrEQq7rTHlNMoe1TDOTdO8iL8Jtv/FMDu/Qzj6AoT8/bjrtPsGjGMfVjP7QwBDeiLn6rStT4TlVGog==
+  dependencies:
+    "@babel/generator" "^7.23.0"
+    "@babel/parser" "^7.23.0"
+    "@babel/traverse" "^7.23.2"
+    "@babel/types" "^7.23.0"
+    "@storybook/csf" "^0.1.2"
+    "@storybook/types" "7.6.16"
+    fs-extra "^11.1.0"
+    recast "^0.23.1"
+    ts-dedent "^2.0.0"
+
+"@storybook/csf-tools@^7.0.0-beta.0 || ^7.0.0-rc.0 || ^7.0.0":
+  version "7.6.13"
+  resolved "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-7.6.13.tgz#c7a59063d6151b44760183d283e2996cf9d24e95"
+  integrity sha512-N0erD3fhbZIDkQpcHlNTLvkpWVVtpiOjY3JO8B5SdBT2uQ8T7aXx7IEM3Q8g1f/BpfjkM15rZl9r4HFtm5E43Q==
   dependencies:
     "@babel/generator" "^7.23.0"
     "@babel/parser" "^7.23.0"
     "@babel/traverse" "^7.23.2"
     "@babel/types" "^7.23.0"
     "@storybook/csf" "^0.1.2"
-    "@storybook/types" "7.6.10"
+    "@storybook/types" "7.6.13"
     fs-extra "^11.1.0"
     recast "^0.23.1"
     ts-dedent "^2.0.0"
@@ -2821,7 +3002,7 @@
   dependencies:
     lodash "^4.17.15"
 
-"@storybook/csf@^0.1.2":
+"@storybook/csf@^0.1.1", "@storybook/csf@^0.1.2":
   version "0.1.2"
   resolved "https://registry.npmjs.org/@storybook/csf/-/csf-0.1.2.tgz#8e7452f0097507f5841b5ade3f5da1525bc9afb2"
   integrity sha512-ePrvE/pS1vsKR9Xr+o+YwdqNgHUyXvg+1Xjx0h9LrVx7Zq4zNe06pd63F5EvzTbCbJsHj7GHr9tkiaqm7U8WRA==
@@ -2833,37 +3014,54 @@
   resolved "https://registry.npmjs.org/@storybook/docs-mdx/-/docs-mdx-0.1.0.tgz#33ba0e39d1461caf048b57db354b2cc410705316"
   integrity sha512-JDaBR9lwVY4eSH5W8EGHrhODjygPd6QImRbwjAuJNEnY0Vw4ie3bPkeGfnacB3OBW6u/agqPv2aRlR46JcAQLg==
 
-"@storybook/docs-tools@7.6.10":
-  version "7.6.10"
-  resolved "https://registry.npmjs.org/@storybook/docs-tools/-/docs-tools-7.6.10.tgz#90ce6bcf468b8d0a479fb75e9a6ff87f482095dc"
-  integrity sha512-UgbikducoXzqQHf2TozO0f2rshaeBNnShVbL5Ai4oW7pDymBmrfzdjGbF/milO7yxNKcoIByeoNmu384eBamgQ==
+"@storybook/docs-tools@7.6.16":
+  version "7.6.16"
+  resolved "https://registry.npmjs.org/@storybook/docs-tools/-/docs-tools-7.6.16.tgz#61a2c3178ca6a0537855f0aa7a562b46276fe337"
+  integrity sha512-meuq5uLGBLOSJXKeCt9iEH0uVKgGqwfEBi2T4E2w3BcubC/6oQ3VeZl25/KO+l1XcLmOg9LkN2ZOtLV9TEiVLQ==
   dependencies:
-    "@storybook/core-common" "7.6.10"
-    "@storybook/preview-api" "7.6.10"
-    "@storybook/types" "7.6.10"
+    "@storybook/core-common" "7.6.16"
+    "@storybook/preview-api" "7.6.16"
+    "@storybook/types" "7.6.16"
     "@types/doctrine" "^0.0.3"
     assert "^2.1.0"
     doctrine "^3.0.0"
     lodash "^4.17.21"
 
+"@storybook/expect@storybook-jest":
+  version "28.1.3-5"
+  resolved "https://registry.npmjs.org/@storybook/expect/-/expect-28.1.3-5.tgz#ecb680851866aa411238b23b48c43285bd7477cf"
+  integrity sha512-lS1oJnY1qTAxnH87C765NdfvGhksA6hBcbUVI5CHiSbNsEtr456wtg/z+dT9XlPriq1D5t2SgfNL9dBAoIGyIA==
+  dependencies:
+    "@types/jest" "28.1.3"
+
 "@storybook/global@^5.0.0":
   version "5.0.0"
   resolved "https://registry.npmjs.org/@storybook/global/-/global-5.0.0.tgz#b793d34b94f572c1d7d9e0f44fac4e0dbc9572ed"
   integrity sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==
 
-"@storybook/manager-api@7.6.10":
-  version "7.6.10"
-  resolved "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-7.6.10.tgz#0c2932f42bb97de8fb25240844fcf64474fc8905"
-  integrity sha512-8eGVpRlpunuFScDtc7nxpPJf/4kJBAAZlNdlhmX09j8M3voX6GpcxabBamSEX5pXZqhwxQCshD4IbqBmjvadlw==
-  dependencies:
-    "@storybook/channels" "7.6.10"
-    "@storybook/client-logger" "7.6.10"
-    "@storybook/core-events" "7.6.10"
+"@storybook/jest@^0.2.3":
+  version "0.2.3"
+  resolved "https://registry.npmjs.org/@storybook/jest/-/jest-0.2.3.tgz#21512b92469978b37f69d6555949801ef34af153"
+  integrity sha512-ov5izrmbAFObzKeh9AOC5MlmFxAcf0o5i6YFGae9sDx6DGh6alXsRM+chIbucVkUwVHVlSzdfbLDEFGY/ShaYw==
+  dependencies:
+    "@storybook/expect" storybook-jest
+    "@testing-library/jest-dom" "^6.1.2"
+    "@types/jest" "28.1.3"
+    jest-mock "^27.3.0"
+
+"@storybook/manager-api@7.6.16":
+  version "7.6.16"
+  resolved "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-7.6.16.tgz#ad74839cc51a6e3318ce651eb9bf03752eb43851"
+  integrity sha512-pX3xw4DsPhYTWEDspsnJiZSoakn0z3Rdt9YmHU0/NaFBLn64EClzd9XMDnGXnZzW1DtdG6T6l2CwDNDCNIVkWg==
+  dependencies:
+    "@storybook/channels" "7.6.16"
+    "@storybook/client-logger" "7.6.16"
+    "@storybook/core-events" "7.6.16"
     "@storybook/csf" "^0.1.2"
     "@storybook/global" "^5.0.0"
-    "@storybook/router" "7.6.10"
-    "@storybook/theming" "7.6.10"
-    "@storybook/types" "7.6.10"
+    "@storybook/router" "7.6.16"
+    "@storybook/theming" "7.6.16"
+    "@storybook/types" "7.6.16"
     dequal "^2.0.2"
     lodash "^4.17.21"
     memoizerific "^1.11.3"
@@ -2871,38 +3069,43 @@
     telejson "^7.2.0"
     ts-dedent "^2.0.0"
 
-"@storybook/manager@7.6.10":
-  version "7.6.10"
-  resolved "https://registry.npmjs.org/@storybook/manager/-/manager-7.6.10.tgz#eb1b71c802fbf04353f3bf017dfb102eb0db217e"
-  integrity sha512-Co3sLCbNYY6O4iH2ggmRDLCPWLj03JE5s/DOG8OVoXc6vBwTc/Qgiyrsxxp6BHQnPpM0mxL6aKAxE3UjsW/Nog==
+"@storybook/manager@7.6.16":
+  version "7.6.16"
+  resolved "https://registry.npmjs.org/@storybook/manager/-/manager-7.6.16.tgz#98335dbd865c74351ba6cc1ed2d617362fb0df49"
+  integrity sha512-CPDhgT4jjF0CDgLDxT/R+amMJXpXxSsVp+XzahPbEB9Yu4v0W0HW3f2vSuNJXwpfofrPSkbJweO/oC4ioOtavw==
 
 "@storybook/mdx2-csf@^1.0.0":
   version "1.1.0"
   resolved "https://registry.npmjs.org/@storybook/mdx2-csf/-/mdx2-csf-1.1.0.tgz#97f6df04d0bf616991cc1005a073ac004a7281e5"
   integrity sha512-TXJJd5RAKakWx4BtpwvSNdgTDkKM6RkXU8GK34S/LhidQ5Pjz3wcnqb0TxEkfhK/ztbP8nKHqXFwLfa2CYkvQw==
 
-"@storybook/node-logger@7.6.10":
-  version "7.6.10"
-  resolved "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-7.6.10.tgz#d4c52d04384d2728d6610fb0afff6eb1feb50fd4"
-  integrity sha512-ZBuqrv4bjJzKXyfRGFkVIi+z6ekn6rOPoQao4KmsfLNQAUUsEdR8Baw/zMnnU417zw5dSEaZdpuwx75SCQAeOA==
+"@storybook/node-logger@7.6.13":
+  version "7.6.13"
+  resolved "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-7.6.13.tgz#bab8256bafa7f54be7d2465db8a72d5f73cec679"
+  integrity sha512-Ci/2Gd0+Qd3fX6GWGS1UAa/bTl0uALsEuMuzOO0meKEPEEYZvBFCoeK6lP1ysMnxWxKaDjxNr01JlTpmjfT6ag==
 
-"@storybook/postinstall@7.6.10":
-  version "7.6.10"
-  resolved "https://registry.npmjs.org/@storybook/postinstall/-/postinstall-7.6.10.tgz#9e81c54b1f23f71a59a6db7ee8a4d5ac40852d17"
-  integrity sha512-SMdXtednPCy3+SRJ7oN1OPN1oVFhj3ih+ChOEX8/kZ5J3nfmV3wLPtsZvFGUCf0KWQEP1xL+1Urv48mzMKcV/w==
+"@storybook/node-logger@7.6.16":
+  version "7.6.16"
+  resolved "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-7.6.16.tgz#6ae9380b52dba770d669f293c79a161c7d450237"
+  integrity sha512-s18wgtLynLWnunz47lkVIpjk8J6LxT/OmfzkggieU8cG2XYRbf//t7/EOUpOqK77+Xqm3epSwgDAxOXGfjOjAA==
 
-"@storybook/preset-react-webpack@7.6.10":
-  version "7.6.10"
-  resolved "https://registry.npmjs.org/@storybook/preset-react-webpack/-/preset-react-webpack-7.6.10.tgz#86b34f7156258ddf6481bffd6c638e5382d01054"
-  integrity sha512-fUcr4dmXJdPIQdjkhA4bE8QF8Pavr4BSLxovtTRupbWxtRjZxJrH5hf+0HZycq1cp9umO/11Lsmw9Nx5Xg3Eww==
+"@storybook/postinstall@7.6.16":
+  version "7.6.16"
+  resolved "https://registry.npmjs.org/@storybook/postinstall/-/postinstall-7.6.16.tgz#0a7a3307edf68a305fb98d0e6970c1833d344eee"
+  integrity sha512-axWxj8e90+iLUZPGU9Zvn2Jc/GQrWspu8DpwRCS7N23epTVW6n6OWp31GAShdSx8Oh5lmCMXGegTd1v2Mwc61A==
+
+"@storybook/preset-react-webpack@7.6.16":
+  version "7.6.16"
+  resolved "https://registry.npmjs.org/@storybook/preset-react-webpack/-/preset-react-webpack-7.6.16.tgz#1d9f632a009273b961f9f8b5a929a742a33e5ee5"
+  integrity sha512-fJIbS7rlKiIokKBuZnZScLM8A8YaR0LrmMEEbHHzl6HgcjTp2/stRxOxsBXViLvyCi6QFNFCJDiPI8H1JuI3Ug==
   dependencies:
     "@babel/preset-flow" "^7.22.15"
     "@babel/preset-react" "^7.22.15"
     "@pmmmwh/react-refresh-webpack-plugin" "^0.5.11"
-    "@storybook/core-webpack" "7.6.10"
-    "@storybook/docs-tools" "7.6.10"
-    "@storybook/node-logger" "7.6.10"
-    "@storybook/react" "7.6.10"
+    "@storybook/core-webpack" "7.6.16"
+    "@storybook/docs-tools" "7.6.16"
+    "@storybook/node-logger" "7.6.16"
+    "@storybook/react" "7.6.16"
     "@storybook/react-docgen-typescript-plugin" "1.0.6--canary.9.0c3f3b7.0"
     "@types/node" "^18.0.0"
     "@types/semver" "^7.3.4"
@@ -2914,17 +3117,17 @@
     semver "^7.3.7"
     webpack "5"
 
-"@storybook/preview-api@7.6.10":
-  version "7.6.10"
-  resolved "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.6.10.tgz#b8d5a4f897745fc28f0ae75f7e0e9278b0e4a50a"
-  integrity sha512-5A3etoIwZCx05yuv3KSTv1wynN4SR4rrzaIs/CTBp3BC4q1RBL+Or/tClk0IJPXQMlx/4Y134GtNIBbkiDofpw==
+"@storybook/preview-api@7.6.16":
+  version "7.6.16"
+  resolved "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.6.16.tgz#a696ef2bdd79b53da2902f11b36fae46345d323a"
+  integrity sha512-V9x9HOhi4CJuiX+0a7GU0JlfRAp6txStGMkV0DrCATbxSWpK+6d5x2Te521z16V3RIMMmYn33aEyarOp5WjTqw==
   dependencies:
-    "@storybook/channels" "7.6.10"
-    "@storybook/client-logger" "7.6.10"
-    "@storybook/core-events" "7.6.10"
+    "@storybook/channels" "7.6.16"
+    "@storybook/client-logger" "7.6.16"
+    "@storybook/core-events" "7.6.16"
     "@storybook/csf" "^0.1.2"
     "@storybook/global" "^5.0.0"
-    "@storybook/types" "7.6.10"
+    "@storybook/types" "7.6.16"
     "@types/qs" "^6.9.5"
     dequal "^2.0.2"
     lodash "^4.17.21"
@@ -2934,10 +3137,30 @@
     ts-dedent "^2.0.0"
     util-deprecate "^1.0.2"
 
-"@storybook/preview@7.6.10":
-  version "7.6.10"
-  resolved "https://registry.npmjs.org/@storybook/preview/-/preview-7.6.10.tgz#895053c97f7e09141c6321fa42390fa8af377bef"
-  integrity sha512-F07BzVXTD3byq+KTWtvsw3pUu3fQbyiBNLFr2CnfU4XSdLKja5lDt8VqDQq70TayVQOf5qfUTzRd4M6pQkjw1w==
+"@storybook/preview-api@^7.0.0-beta.0 || ^7.0.0-rc.0 || ^7.0.0":
+  version "7.6.13"
+  resolved "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.6.13.tgz#ace76ab343ef01328d8244264749913345979d6f"
+  integrity sha512-BbRlVpxgOXSe4/hpf9cRtbvvCJoRrFbjMCnmaDh+krd8O4wLbVknKhqgSR46qLyW/VGud9Rb3upakz7tNP+mtg==
+  dependencies:
+    "@storybook/channels" "7.6.13"
+    "@storybook/client-logger" "7.6.13"
+    "@storybook/core-events" "7.6.13"
+    "@storybook/csf" "^0.1.2"
+    "@storybook/global" "^5.0.0"
+    "@storybook/types" "7.6.13"
+    "@types/qs" "^6.9.5"
+    dequal "^2.0.2"
+    lodash "^4.17.21"
+    memoizerific "^1.11.3"
+    qs "^6.10.0"
+    synchronous-promise "^2.0.15"
+    ts-dedent "^2.0.0"
+    util-deprecate "^1.0.2"
+
+"@storybook/preview@7.6.16":
+  version "7.6.16"
+  resolved "https://registry.npmjs.org/@storybook/preview/-/preview-7.6.16.tgz#f1a8b2b421be81e88183565eb586b2478ca75f3a"
+  integrity sha512-q4DbLn9kEK8JM9s+2oIjXBPHQhY0tQzsZ5hFeq833vNFcmuHnXS+WYk20b+UkmzL6j+E8pLm8WpI7rdbi0ZUVA==
 
 "@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0":
   version "1.0.6--canary.9.0c3f3b7.0"
@@ -2952,33 +3175,33 @@
     react-docgen-typescript "^2.2.2"
     tslib "^2.0.0"
 
-"@storybook/react-dom-shim@7.6.10":
-  version "7.6.10"
-  resolved "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-7.6.10.tgz#d16df5d65a51ed66df92430d8f51d50bd177f2c2"
-  integrity sha512-M+N/h6ximacaFdIDjMN2waNoWwApeVYTpFeoDppiFTvdBTXChyIuiPgYX9QSg7gDz92OaA52myGOot4wGvXVzg==
+"@storybook/react-dom-shim@7.6.16":
+  version "7.6.16"
+  resolved "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-7.6.16.tgz#b5eb4bde02ec9c69b4c4d4b485160b2f828d4892"
+  integrity sha512-F6pGgL2pWy5utn6m2YAVz1PYZO3pdlNHfT85g5Om3q7CR4msWpMQ1O/oEVYgqfJ9UfOqCV/mHeDWICzUa7pv6g==
 
-"@storybook/react-webpack5@^7.6.10":
-  version "7.6.10"
-  resolved "https://registry.npmjs.org/@storybook/react-webpack5/-/react-webpack5-7.6.10.tgz#f9d3cb4abc4177d43cefcc62d497b2cbee2b5181"
-  integrity sha512-LWwasiSLEg4wqsMjoRHcOn6BXv2ZyZfTfQV7gCvaX732xf0teblh+/GltAz8x+BtFXruXWmZ8bJ5cd9U4I6hUg==
+"@storybook/react-webpack5@^7.6.16":
+  version "7.6.16"
+  resolved "https://registry.npmjs.org/@storybook/react-webpack5/-/react-webpack5-7.6.16.tgz#f4025fda1169e2d7671a0ba79d1590474f380e41"
+  integrity sha512-K1+C3Uw0PkRnF5LrXX34AouRzHoyZmufllgrSpkuNsilAxJHbk5uXiHlZQBUPcht7aPVRLu5jwbcynTHuRxd2A==
   dependencies:
-    "@storybook/builder-webpack5" "7.6.10"
-    "@storybook/preset-react-webpack" "7.6.10"
-    "@storybook/react" "7.6.10"
+    "@storybook/builder-webpack5" "7.6.16"
+    "@storybook/preset-react-webpack" "7.6.16"
+    "@storybook/react" "7.6.16"
     "@types/node" "^18.0.0"
 
-"@storybook/react@7.6.10", "@storybook/react@^7.6.10":
-  version "7.6.10"
-  resolved "https://registry.npmjs.org/@storybook/react/-/react-7.6.10.tgz#aca5c446f43de75981f19d112a8a04d7abd0a03d"
-  integrity sha512-wwBn1cg2uZWW4peqqBjjU7XGmFq8HdkVUtWwh6dpfgmlY1Aopi+vPgZt7pY9KkWcTOq5+DerMdSfwxukpc3ajQ==
+"@storybook/react@7.6.16", "@storybook/react@^7.6.16":
+  version "7.6.16"
+  resolved "https://registry.npmjs.org/@storybook/react/-/react-7.6.16.tgz#bd7546b53c75677b7f6343580c43f5b5d6c8a112"
+  integrity sha512-3vzjtEHu9xXLz827JiwC448ZVattzAR5qkfVg3dVOD1MtLH8LTJ/gOqv/8Kq0fOtEgOdlcAF4jQV/XAL6pEAkQ==
   dependencies:
-    "@storybook/client-logger" "7.6.10"
-    "@storybook/core-client" "7.6.10"
-    "@storybook/docs-tools" "7.6.10"
+    "@storybook/client-logger" "7.6.16"
+    "@storybook/core-client" "7.6.16"
+    "@storybook/docs-tools" "7.6.16"
     "@storybook/global" "^5.0.0"
-    "@storybook/preview-api" "7.6.10"
-    "@storybook/react-dom-shim" "7.6.10"
-    "@storybook/types" "7.6.10"
+    "@storybook/preview-api" "7.6.16"
+    "@storybook/react-dom-shim" "7.6.16"
+    "@storybook/types" "7.6.16"
     "@types/escodegen" "^0.0.6"
     "@types/estree" "^0.0.51"
     "@types/node" "^18.0.0"
@@ -2994,29 +3217,63 @@
     type-fest "~2.19"
     util-deprecate "^1.0.2"
 
-"@storybook/router@7.6.10":
-  version "7.6.10"
-  resolved "https://registry.npmjs.org/@storybook/router/-/router-7.6.10.tgz#b1f2c550eeb9f7146eefa33c5460e4149a62d721"
-  integrity sha512-G/H4Jn2+y8PDe8Zbq4DVxF/TPn0/goSItdILts39JENucHiuGBCjKjSWGBe1rkwKi1tUbB3yhxJVrLagxFEPpQ==
+"@storybook/router@7.6.16":
+  version "7.6.16"
+  resolved "https://registry.npmjs.org/@storybook/router/-/router-7.6.16.tgz#a971f9b0350a8b7ab9969900645c3271505a449a"
+  integrity sha512-PgVuzs83g4dq2r1qdcc0wvS1Pe1UpKdq54uy4TkBrrei7hBzB/+POztPXs0rVXXBXdCQT/jomLmRo/yC45bsGg==
   dependencies:
-    "@storybook/client-logger" "7.6.10"
+    "@storybook/client-logger" "7.6.16"
     memoizerific "^1.11.3"
     qs "^6.10.0"
 
-"@storybook/telemetry@7.6.10":
-  version "7.6.10"
-  resolved "https://registry.npmjs.org/@storybook/telemetry/-/telemetry-7.6.10.tgz#31c0edfb9c7005cf9b5922e51ca896218e3d81ea"
-  integrity sha512-p3mOSUtIyy2tF1z6pQXxNh1JzYFcAm97nUgkwLzF07GfEdVAPM+ftRSLFbD93zVvLEkmLTlsTiiKaDvOY/lQWg==
+"@storybook/telemetry@7.6.16":
+  version "7.6.16"
+  resolved "https://registry.npmjs.org/@storybook/telemetry/-/telemetry-7.6.16.tgz#7a630e044f2ba6e85bc03e5f461309aa2b4b9b6a"
+  integrity sha512-5Uaz6zSRBEio89ScrAN7KKz+mBTJ5Jc/8Uf0uUHIhAxiHprs16PhIBo6MtBeWPQoiNwytN884sAtiUFAP4zFQQ==
   dependencies:
-    "@storybook/client-logger" "7.6.10"
-    "@storybook/core-common" "7.6.10"
-    "@storybook/csf-tools" "7.6.10"
+    "@storybook/client-logger" "7.6.16"
+    "@storybook/core-common" "7.6.16"
+    "@storybook/csf-tools" "7.6.16"
     chalk "^4.1.0"
     detect-package-manager "^2.0.1"
     fetch-retry "^5.0.2"
     fs-extra "^11.1.0"
     read-pkg-up "^7.0.1"
 
+"@storybook/test-runner@^0.16.0":
+  version "0.16.0"
+  resolved "https://registry.npmjs.org/@storybook/test-runner/-/test-runner-0.16.0.tgz#dbac234a0c81c815e8ca4c486f0a340f4493331d"
+  integrity sha512-LDmNbKFoEDW/VS9o6KR8e1r5MnbCc5ZojUfi5yqLdq80gFD7BvilgKgV0lUh/xWHryzoy+Ids5LYgrPJZmU2dQ==
+  dependencies:
+    "@babel/core" "^7.22.5"
+    "@babel/generator" "^7.22.5"
+    "@babel/template" "^7.22.5"
+    "@babel/types" "^7.22.5"
+    "@jest/types" "^29.6.3"
+    "@storybook/core-common" "^7.0.0-beta.0 || ^7.0.0-rc.0 || ^7.0.0"
+    "@storybook/csf" "^0.1.1"
+    "@storybook/csf-tools" "^7.0.0-beta.0 || ^7.0.0-rc.0 || ^7.0.0"
+    "@storybook/preview-api" "^7.0.0-beta.0 || ^7.0.0-rc.0 || ^7.0.0"
+    "@swc/core" "^1.3.18"
+    "@swc/jest" "^0.2.23"
+    can-bind-to-host "^1.1.1"
+    commander "^9.0.0"
+    expect-playwright "^0.8.0"
+    glob "^10.2.2"
+    jest "^29.6.4"
+    jest-circus "^29.6.4"
+    jest-environment-node "^29.6.4"
+    jest-junit "^16.0.0"
+    jest-playwright-preset "^4.0.0"
+    jest-runner "^29.6.4"
+    jest-serializer-html "^7.1.0"
+    jest-watch-typeahead "^2.0.0"
+    node-fetch "^2"
+    playwright "^1.14.0"
+    read-pkg-up "^7.0.1"
+    tempy "^1.0.1"
+    ts-dedent "^2.0.0"
+
 "@storybook/testing-library@^0.2.2":
   version "0.2.2"
   resolved "https://registry.npmjs.org/@storybook/testing-library/-/testing-library-0.2.2.tgz#c8e089cc8d7354f6066fdb580fae3eedf568aa7c"
@@ -3026,22 +3283,32 @@
     "@testing-library/user-event" "^14.4.0"
     ts-dedent "^2.2.0"
 
-"@storybook/theming@7.6.10":
-  version "7.6.10"
-  resolved "https://registry.npmjs.org/@storybook/theming/-/theming-7.6.10.tgz#c09d66d19f5756964cc89b1f94051545fc4aaea7"
-  integrity sha512-f5tuy7yV3TOP3fIboSqpgLHy0wKayAw/M8HxX0jVET4Z4fWlFK0BiHJabQ+XEdAfQM97XhPFHB2IPbwsqhCEcQ==
+"@storybook/theming@7.6.16":
+  version "7.6.16"
+  resolved "https://registry.npmjs.org/@storybook/theming/-/theming-7.6.16.tgz#27347e6b59d3778aed20aa14aef4b2dc0817d3e2"
+  integrity sha512-ZiUyakApTzAiAR28JwqbqY426U1OlJPG/Y7ddQgYgTsdoRFR1iMewAxWW1LId1q3B1dtiIHAccqhocEMNcYkLA==
   dependencies:
     "@emotion/use-insertion-effect-with-fallbacks" "^1.0.0"
-    "@storybook/client-logger" "7.6.10"
+    "@storybook/client-logger" "7.6.16"
     "@storybook/global" "^5.0.0"
     memoizerific "^1.11.3"
 
-"@storybook/types@7.6.10":
-  version "7.6.10"
-  resolved "https://registry.npmjs.org/@storybook/types/-/types-7.6.10.tgz#20cfb2dfeba2ecf54721de131276041d073fe42e"
-  integrity sha512-hcS2HloJblaMpCAj2axgGV+53kgSRYPT0a1PG1IHsZaYQILfHSMmBqM8XzXXYTsgf9250kz3dqFX1l0n3EqMlQ==
+"@storybook/types@7.6.13":
+  version "7.6.13"
+  resolved "https://registry.npmjs.org/@storybook/types/-/types-7.6.13.tgz#4d957ac6ddb2213b90525b28b8548749899c2f18"
+  integrity sha512-N8HfqhL5uaI69BZx+xLkKi1YIgDp34XeL3uhxii4NfThcY1KJA643Gqk3oLKefiBqBpIRGKN0nA41Fhdvhr7Hw==
+  dependencies:
+    "@storybook/channels" "7.6.13"
+    "@types/babel__core" "^7.0.0"
+    "@types/express" "^4.7.0"
+    file-system-cache "2.3.0"
+
+"@storybook/types@7.6.16":
+  version "7.6.16"
+  resolved "https://registry.npmjs.org/@storybook/types/-/types-7.6.16.tgz#58d1ab44ecde1def28a4ed35f5cdc3c01c1f717a"
+  integrity sha512-Ld4dKbgSbvqThdBNwNlOxQu5AiS6U9DXI5evf/j83eWs6skO3OBdQp+GWa6sUCI9eRqH8tFsw/YmMcIZ4uZrBQ==
   dependencies:
-    "@storybook/channels" "7.6.10"
+    "@storybook/channels" "7.6.16"
     "@types/babel__core" "^7.0.0"
     "@types/express" "^4.7.0"
     file-system-cache "2.3.0"
@@ -3051,51 +3318,120 @@
   resolved "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.106.tgz#05adb015d4f8abe7b8b435af10b6e24863cf3b6c"
   integrity sha512-XYcbViNyHnnm7RWOAO1YipMmthM7m2aXF32b0y+JMLYFBEyFpjVX9btLkzeL7wRx/5B3I35yJNhE+xyx0Q1Gkw==
 
+"@swc/core-darwin-arm64@1.4.0":
+  version "1.4.0"
+  resolved "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.4.0.tgz#11abf23b884929a467ba270cf6789b9c50c4248b"
+  integrity sha512-UTJ/Vz+s7Pagef6HmufWt6Rs0aUu+EJF4Pzuwvr7JQQ5b1DZeAAUeUtkUTFx/PvCbM8Xfw4XdKBUZfrIKCfW8A==
+
 "@swc/core-darwin-x64@1.3.106":
   version "1.3.106"
   resolved "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.3.106.tgz#da3aa19bcea1caf77b9267b48c40506b3fbc9e3e"
   integrity sha512-YKDPhUdfuwhmOUS9+CaIwl/0Tp+f1b73BH2EIESuxSNsogZf18a8HQ8O0fQEwdiwmA5LEqw47cj+kfOWV/0+kw==
 
+"@swc/core-darwin-x64@1.4.0":
+  version "1.4.0"
+  resolved "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.4.0.tgz#f044ddaca60c5081e907b148721ad7461f6f6dfe"
+  integrity sha512-f8v58u2GsGak8EtZFN9guXqE0Ep10Suny6xriaW2d8FGqESPyNrnBzli3aqkSeQk5gGqu2zJ7WiiKp3XoUOidA==
+
 "@swc/core-linux-arm-gnueabihf@1.3.106":
   version "1.3.106"
   resolved "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.106.tgz#08c4f0b56c4607e124868f9793d5d6e198abdb3e"
   integrity sha512-bHxxJXogvFfocLL5inZxxtx/x/WgKozigp80Vbx0viac1fPDJrqKBw2X4MzpMiuTRAGVQ03jJI6pDwbSBf+yDw==
 
+"@swc/core-linux-arm-gnueabihf@1.4.0":
+  version "1.4.0"
+  resolved "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.4.0.tgz#52ceea673fc76692c0bd6d58e1863125c3e6173b"
+  integrity sha512-q2KAkBzmPcTnRij/Y1fgHCKAGevUX/H4uUESrw1J5gmUg9Qip6onKV80lTumA1/aooGJ18LOsB31qdbwmZk9OA==
+
 "@swc/core-linux-arm64-gnu@1.3.106":
   version "1.3.106"
   resolved "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.106.tgz#cfa2ac91ca279bf09db8ef001a139a3840a2b05a"
   integrity sha512-c7jue++CHLgtpeaakEukoCLT9eNrImizbleE9Y7Is8CHqLq/7DG4s+7ma9DFKXIzW2MpTg9byIEQfpqSphVW6A==
 
+"@swc/core-linux-arm64-gnu@1.4.0":
+  version "1.4.0"
+  resolved "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.4.0.tgz#7f3ff1ab824ec48acdb39d231cbcb4096a4f9dd0"
+  integrity sha512-SknGu96W0mzHtLHWm+62fk5+Omp9fMPFO7AWyGFmz2tr8EgRRXtTSrBUnWhAbgcalnhen48GsvtMdxf1KNputg==
+
 "@swc/core-linux-arm64-musl@1.3.106":
   version "1.3.106"
   resolved "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.106.tgz#1eff9b3e51a84ea13e0be4de2784bbb28a0e097b"
   integrity sha512-51EaC3Q8qAhLtWVnAVqoYX/gk3tK31cCBzUpwCcmhianhEBM2/WtKRAS4MqPhE8VVZuN3WjO2c2JaF2mX0yuoA==
 
+"@swc/core-linux-arm64-musl@1.4.0":
+  version "1.4.0"
+  resolved "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.4.0.tgz#26c3b1f7947c19ef725997af716f230957d586f8"
+  integrity sha512-/k3TDvpBRMDNskHooNN1KqwUhcwkfBlIYxRTnJvsfT2C7My4pffR+4KXmt0IKynlTTbCdlU/4jgX4801FSuliw==
+
 "@swc/core-linux-x64-gnu@1.3.106":
   version "1.3.106"
   resolved "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.106.tgz#c3c7681efaeb36c528eb0cd133e0e52a85554a5b"
   integrity sha512-tOUi8BB6jAeCXgx7ESLNnX7nrbMVKQ/XajK77v7Ad4SXf9HYArnimBJpXUUyVFJTXLSv4e6c7s6XHHqXb5Lwcg==
 
+"@swc/core-linux-x64-gnu@1.4.0":
+  version "1.4.0"
+  resolved "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.4.0.tgz#2c7d03a04a7d045394cfed7d46419ff8816ec22e"
+  integrity sha512-GYsTMvNt5+WTVlwwQzOOWsPMw6P/F41u5PGHWmfev8Nd4QJ1h3rWPySKk4mV42IJwH9MgQCVSl3ygwNqwl6kFg==
+
 "@swc/core-linux-x64-musl@1.3.106":
   version "1.3.106"
   resolved "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.106.tgz#1e7287e379c503f8e565eab7fc5065739611690f"
   integrity sha512-binLw4Lbd83NPy4/m/teH2nbaifxveSD+sKDvpxywRbvYW2I0w/iCBpUBcbnl16TQF4TPOGpq5YwG9lVxPVw5g==
 
+"@swc/core-linux-x64-musl@1.4.0":
+  version "1.4.0"
+  resolved "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.4.0.tgz#0e76442dfb6d5026d8d6e7db6b2f4922b7692d0f"
+  integrity sha512-jGVPdM/VwF7kK/uYRW5N6FwzKf/FnDjGIR3RPvQokjYJy7Auk+3Oj21C0Jev7sIT9RYnO/TrFEoEozKeD/z2Qw==
+
 "@swc/core-win32-arm64-msvc@1.3.106":
   version "1.3.106"
   resolved "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.106.tgz#02d7418c202a33906949a5e6924baaaa0a3fce5f"
   integrity sha512-n4ttBWr8tM7DPzwcEOIBTyTMHZTzCmbic/HTtxEsPyMAf/Daen+yrTKzjPP6k2usfSrjkxA780RSJJxI1N8r2w==
 
+"@swc/core-win32-arm64-msvc@1.4.0":
+  version "1.4.0"
+  resolved "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.4.0.tgz#0177bebf312eb251d6749ab76259c0e08088e837"
+  integrity sha512-biHYm1AronEKlt47O/H8sSOBM2BKXMmWT+ApvlxUw50m1RGNnVnE0bgY7tylFuuSiWyXsQPJbmUV708JqORXVg==
+
 "@swc/core-win32-ia32-msvc@1.3.106":
   version "1.3.106"
   resolved "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.106.tgz#22f07b4710e79e22c7828ad89e87636671680e2d"
   integrity sha512-GhDNIwxE5FhkujESI6h/4ysT3wxwmrzTUlZYaR8rRui6a6SdX9feIPUHPEE5o5hpyp+xqlmvRxKkRxOnwsq8iA==
 
+"@swc/core-win32-ia32-msvc@1.4.0":
+  version "1.4.0"
+  resolved "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.4.0.tgz#27fa650280e5651aa42129eaf03e02787b866417"
+  integrity sha512-TL5L2tFQb19kJwv6+elToGBj74QXCn9j+hZfwQatvZEJRA5rDK16eH6oAE751dGUArhnWlW3Vj65hViPvTuycw==
+
 "@swc/core-win32-x64-msvc@1.3.106":
   version "1.3.106"
   resolved "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.106.tgz#cc28822b1476345ef4ee2a1895ff7c51a42dd45f"
   integrity sha512-2M6yWChuMS1+/MPo3Dor0SOMkvmiugonWlzsZBAu/oZboH2xKrHSRv7brsBujb2Oe47r+NsbV+vq9tnnP9Vl1Q==
 
+"@swc/core-win32-x64-msvc@1.4.0":
+  version "1.4.0"
+  resolved "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.4.0.tgz#bd575c599bd6847bddc4863a3babd85e3db5e11e"
+  integrity sha512-e2xVezU7XZ2Stzn4i7TOQe2Kn84oYdG0M3A7XI7oTdcpsKCcKwgiMoroiAhqCv+iN20KNqhnWwJiUiTj/qN5AA==
+
+"@swc/core@^1.3.18":
+  version "1.4.0"
+  resolved "https://registry.npmjs.org/@swc/core/-/core-1.4.0.tgz#3a0ceeea5b889173f4592955fe1da4d071d86a76"
+  integrity sha512-wc5DMI5BJftnK0Fyx9SNJKkA0+BZSJQx8430yutWmsILkHMBD3Yd9GhlMaxasab9RhgKqZp7Ht30hUYO5ZDvQg==
+  dependencies:
+    "@swc/counter" "^0.1.1"
+    "@swc/types" "^0.1.5"
+  optionalDependencies:
+    "@swc/core-darwin-arm64" "1.4.0"
+    "@swc/core-darwin-x64" "1.4.0"
+    "@swc/core-linux-arm-gnueabihf" "1.4.0"
+    "@swc/core-linux-arm64-gnu" "1.4.0"
+    "@swc/core-linux-arm64-musl" "1.4.0"
+    "@swc/core-linux-x64-gnu" "1.4.0"
+    "@swc/core-linux-x64-musl" "1.4.0"
+    "@swc/core-win32-arm64-msvc" "1.4.0"
+    "@swc/core-win32-ia32-msvc" "1.4.0"
+    "@swc/core-win32-x64-msvc" "1.4.0"
+
 "@swc/core@^1.3.82":
   version "1.3.106"
   resolved "https://registry.npmjs.org/@swc/core/-/core-1.3.106.tgz#7e054f8a7db56de3f519c48db03f58e3f09fe8ee"
@@ -3120,6 +3456,20 @@
   resolved "https://registry.npmjs.org/@swc/counter/-/counter-0.1.2.tgz#bf06d0770e47c6f1102270b744e17b934586985e"
   integrity sha512-9F4ys4C74eSTEUNndnER3VJ15oru2NumfQxS8geE+f3eB5xvfxpWyqE5XlVnxb/R14uoXi6SLbBwwiDSkv+XEw==
 
+"@swc/counter@^0.1.3":
+  version "0.1.3"
+  resolved "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz#cc7463bd02949611c6329596fccd2b0ec782b0e9"
+  integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==
+
+"@swc/jest@^0.2.23":
+  version "0.2.36"
+  resolved "https://registry.npmjs.org/@swc/jest/-/jest-0.2.36.tgz#2797450a30d28b471997a17e901ccad946fe693e"
+  integrity sha512-8X80dp81ugxs4a11z1ka43FPhP+/e+mJNXJSxiNYk8gIX/jPBtY4gQTrKu/KIoco8bzKuPI5lUxjfLiGsfvnlw==
+  dependencies:
+    "@jest/create-cache-key-function" "^29.7.0"
+    "@swc/counter" "^0.1.3"
+    jsonc-parser "^3.2.0"
+
 "@swc/types@^0.1.5":
   version "0.1.5"
   resolved "https://registry.npmjs.org/@swc/types/-/types-0.1.5.tgz#043b731d4f56a79b4897a3de1af35e75d56bc63a"
@@ -3153,10 +3503,10 @@
     lz-string "^1.5.0"
     pretty-format "^27.0.2"
 
-"@testing-library/jest-dom@^6.3.0":
-  version "6.3.0"
-  resolved "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.3.0.tgz#e8d308e0c0e91d882340cbbfdea0e4daa7987d36"
-  integrity sha512-hJVIrkFizEQxoWsGBlycTcQhrpoCH4DhXfrnHFFXgkx3Xdm15zycsq5Ep+vpw4W8S0NJa8cxDHcuJib+1tEbhg==
+"@testing-library/jest-dom@^6.1.2", "@testing-library/jest-dom@^6.4.2":
+  version "6.4.2"
+  resolved "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.4.2.tgz#38949f6b63722900e2d75ba3c6d9bf8cffb3300e"
+  integrity sha512-CzqH0AFymEMG48CpzXFriYYkOjk6ZGPCLMhW9e9jg3KMCn5OfJecF8GtGW7yGfR/IgCe3SX8BSwjdzI6BBbZLw==
   dependencies:
     "@adobe/css-tools" "^4.3.2"
     "@babel/runtime" "^7.9.2"
@@ -3401,10 +3751,18 @@
   dependencies:
     "@types/istanbul-lib-report" "*"
 
-"@types/jest@^29.5.11":
-  version "29.5.11"
-  resolved "https://registry.npmjs.org/@types/jest/-/jest-29.5.11.tgz#0c13aa0da7d0929f078ab080ae5d4ced80fa2f2c"
-  integrity sha512-S2mHmYIVe13vrm6q4kN6fLYYAka15ALQki/vgDC3mIukEOx8WJlv0kQPM+d4w8Gp6u0uSdKND04IlTXBv0rwnQ==
+"@types/jest@28.1.3":
+  version "28.1.3"
+  resolved "https://registry.npmjs.org/@types/jest/-/jest-28.1.3.tgz#52f3f3e50ce59191ff5fbb1084896cc0cf30c9ce"
+  integrity sha512-Tsbjk8Y2hkBaY/gJsataeb4q9Mubw9EOz7+4RjPkzD5KjTvHHs7cpws22InaoXxAVAhF5HfFbzJjo6oKWqSZLw==
+  dependencies:
+    jest-matcher-utils "^28.0.0"
+    pretty-format "^28.0.0"
+
+"@types/jest@^29.5.12":
+  version "29.5.12"
+  resolved "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz#7f7dc6eb4cf246d2474ed78744b05d06ce025544"
+  integrity sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==
   dependencies:
     expect "^29.0.0"
     pretty-format "^29.0.0"
@@ -3463,6 +3821,13 @@
   resolved "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz#ec10755e871497bcd83efe927e43ec46e8c0747e"
   integrity sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==
 
+"@types/mute-stream@^0.0.4":
+  version "0.0.4"
+  resolved "https://registry.npmjs.org/@types/mute-stream/-/mute-stream-0.0.4.tgz#77208e56a08767af6c5e1237be8888e2f255c478"
+  integrity sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==
+  dependencies:
+    "@types/node" "*"
+
 "@types/node-fetch@^2.6.4":
   version "2.6.11"
   resolved "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.11.tgz#9b39b78665dae0e82a08f02f4967d62c66f95d24"
@@ -3471,7 +3836,7 @@
     "@types/node" "*"
     form-data "^4.0.0"
 
-"@types/node@*", "@types/node@^20.11.7":
+"@types/node@*":
   version "20.11.7"
   resolved "https://registry.npmjs.org/@types/node/-/node-20.11.7.tgz#cb49aedd758c978c30806d0c38b520ed2a3df6e0"
   integrity sha512-GPmeN1C3XAyV5uybAf4cMLWT9fDWcmQhZVtMFu7OR32WjrqGG+Wnk2V1d0bmtUyE/Zy1QJ9BxyiTih9z8Oks8A==
@@ -3485,6 +3850,13 @@
   dependencies:
     undici-types "~5.26.4"
 
+"@types/node@^20.11.16", "@types/node@^20.11.19":
+  version "20.11.19"
+  resolved "https://registry.npmjs.org/@types/node/-/node-20.11.19.tgz#b466de054e9cb5b3831bee38938de64ac7f81195"
+  integrity sha512-7xMnVEcZFu0DikYjWOlRq7NTPETrm7teqUT2WkQjrTIkEgUyyGdWsj/Zg8bEJt5TNklzbPD1X3fqfsHw3SpapQ==
+  dependencies:
+    undici-types "~5.26.4"
+
 "@types/normalize-package-data@^2.4.0":
   version "2.4.4"
   resolved "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901"
@@ -3536,7 +3908,7 @@
   dependencies:
     "@types/react" "*"
 
-"@types/react@*", "@types/react@>=16", "@types/react@^16", "@types/react@^16.14.35", "@types/react@^16.14.51", "@types/react@^16.9.38", "@types/react@^17":
+"@types/react@*", "@types/react@>=16", "@types/react@^16", "@types/react@^16.14.56", "@types/react@^16.9.38", "@types/react@^17":
   version "16.14.56"
   resolved "https://registry.npmjs.org/@types/react/-/react-16.14.56.tgz#4cf37850a87edcb9f3526648338eff35d283c9ab"
   integrity sha512-MxuHB7dvVm5yOxRr7hJoonLG0JY8YvqZtaQ9Quirp3Oe4FLFjAgxkxsKE6IspdHPpRVZKo2ZoDEravWO81EeYA==
@@ -3616,6 +3988,18 @@
   resolved "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz#7545ba4fc3c003d6c756f651f3bf163d8f0f29ba"
   integrity sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==
 
+"@types/wait-on@^5.2.0":
+  version "5.3.4"
+  resolved "https://registry.npmjs.org/@types/wait-on/-/wait-on-5.3.4.tgz#5ee270b3e073fb01073f9f044922c6893de8c4d2"
+  integrity sha512-EBsPjFMrFlMbbUFf9D1Fp+PAB2TwmUn7a3YtHyD9RLuTIk1jDd8SxXVAoez2Ciy+8Jsceo2MYEYZzJ/DvorOKw==
+  dependencies:
+    "@types/node" "*"
+
+"@types/wrap-ansi@^3.0.0":
+  version "3.0.0"
+  resolved "https://registry.npmjs.org/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz#18b97a972f94f60a679fd5c796d96421b9abb9fd"
+  integrity sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==
+
 "@types/yargs-parser@*":
   version "21.0.3"
   resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15"
@@ -3635,16 +4019,16 @@
   dependencies:
     "@types/yargs-parser" "*"
 
-"@typescript-eslint/eslint-plugin@^6.19.1":
-  version "6.19.1"
-  resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.19.1.tgz#bb0676af940bc23bf299ca58dbdc6589c2548c2e"
-  integrity sha512-roQScUGFruWod9CEyoV5KlCYrubC/fvG8/1zXuT0WTcxX87GnMMmnksMwSg99lo1xiKrBzw2icsJPMAw1OtKxg==
+"@typescript-eslint/eslint-plugin@^6.21.0":
+  version "6.21.0"
+  resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz#30830c1ca81fd5f3c2714e524c4303e0194f9cd3"
+  integrity sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==
   dependencies:
     "@eslint-community/regexpp" "^4.5.1"
-    "@typescript-eslint/scope-manager" "6.19.1"
-    "@typescript-eslint/type-utils" "6.19.1"
-    "@typescript-eslint/utils" "6.19.1"
-    "@typescript-eslint/visitor-keys" "6.19.1"
+    "@typescript-eslint/scope-manager" "6.21.0"
+    "@typescript-eslint/type-utils" "6.21.0"
+    "@typescript-eslint/utils" "6.21.0"
+    "@typescript-eslint/visitor-keys" "6.21.0"
     debug "^4.3.4"
     graphemer "^1.4.0"
     ignore "^5.2.4"
@@ -3652,15 +4036,15 @@
     semver "^7.5.4"
     ts-api-utils "^1.0.1"
 
-"@typescript-eslint/parser@^6.19.1":
-  version "6.19.1"
-  resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.19.1.tgz#68a87bb21afaf0b1689e9cdce0e6e75bc91ada78"
-  integrity sha512-WEfX22ziAh6pRE9jnbkkLGp/4RhTpffr2ZK5bJ18M8mIfA8A+k97U9ZyaXCEJRlmMHh7R9MJZWXp/r73DzINVQ==
+"@typescript-eslint/parser@^6.21.0":
+  version "6.21.0"
+  resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz#af8fcf66feee2edc86bc5d1cf45e33b0630bf35b"
+  integrity sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==
   dependencies:
-    "@typescript-eslint/scope-manager" "6.19.1"
-    "@typescript-eslint/types" "6.19.1"
-    "@typescript-eslint/typescript-estree" "6.19.1"
-    "@typescript-eslint/visitor-keys" "6.19.1"
+    "@typescript-eslint/scope-manager" "6.21.0"
+    "@typescript-eslint/types" "6.21.0"
+    "@typescript-eslint/typescript-estree" "6.21.0"
+    "@typescript-eslint/visitor-keys" "6.21.0"
     debug "^4.3.4"
 
 "@typescript-eslint/scope-manager@5.62.0":
@@ -3671,21 +4055,21 @@
     "@typescript-eslint/types" "5.62.0"
     "@typescript-eslint/visitor-keys" "5.62.0"
 
-"@typescript-eslint/scope-manager@6.19.1":
-  version "6.19.1"
-  resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.19.1.tgz#2f527ee30703a6169a52b31d42a1103d80acd51b"
-  integrity sha512-4CdXYjKf6/6aKNMSly/BP4iCSOpvMmqtDzRtqFyyAae3z5kkqEjKndR5vDHL8rSuMIIWP8u4Mw4VxLyxZW6D5w==
+"@typescript-eslint/scope-manager@6.21.0":
+  version "6.21.0"
+  resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz#ea8a9bfc8f1504a6ac5d59a6df308d3a0630a2b1"
+  integrity sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==
   dependencies:
-    "@typescript-eslint/types" "6.19.1"
-    "@typescript-eslint/visitor-keys" "6.19.1"
+    "@typescript-eslint/types" "6.21.0"
+    "@typescript-eslint/visitor-keys" "6.21.0"
 
-"@typescript-eslint/type-utils@6.19.1":
-  version "6.19.1"
-  resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.19.1.tgz#6a130e3afe605a4898e043fa9f72e96309b54935"
-  integrity sha512-0vdyld3ecfxJuddDjACUvlAeYNrHP/pDeQk2pWBR2ESeEzQhg52DF53AbI9QCBkYE23lgkhLCZNkHn2hEXXYIg==
+"@typescript-eslint/type-utils@6.21.0":
+  version "6.21.0"
+  resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz#6473281cfed4dacabe8004e8521cee0bd9d4c01e"
+  integrity sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==
   dependencies:
-    "@typescript-eslint/typescript-estree" "6.19.1"
-    "@typescript-eslint/utils" "6.19.1"
+    "@typescript-eslint/typescript-estree" "6.21.0"
+    "@typescript-eslint/utils" "6.21.0"
     debug "^4.3.4"
     ts-api-utils "^1.0.1"
 
@@ -3694,10 +4078,10 @@
   resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f"
   integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==
 
-"@typescript-eslint/types@6.19.1":
-  version "6.19.1"
-  resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.19.1.tgz#2d4c9d492a63ede15e7ba7d129bdf7714b77f771"
-  integrity sha512-6+bk6FEtBhvfYvpHsDgAL3uo4BfvnTnoge5LrrCj2eJN8g3IJdLTD4B/jK3Q6vo4Ql/Hoip9I8aB6fF+6RfDqg==
+"@typescript-eslint/types@6.21.0":
+  version "6.21.0"
+  resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz#205724c5123a8fef7ecd195075fa6e85bac3436d"
+  integrity sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==
 
 "@typescript-eslint/typescript-estree@5.62.0":
   version "5.62.0"
@@ -3712,13 +4096,13 @@
     semver "^7.3.7"
     tsutils "^3.21.0"
 
-"@typescript-eslint/typescript-estree@6.19.1":
-  version "6.19.1"
-  resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.19.1.tgz#796d88d88882f12e85bb33d6d82d39e1aea54ed1"
-  integrity sha512-aFdAxuhzBFRWhy+H20nYu19+Km+gFfwNO4TEqyszkMcgBDYQjmPJ61erHxuT2ESJXhlhrO7I5EFIlZ+qGR8oVA==
+"@typescript-eslint/typescript-estree@6.21.0":
+  version "6.21.0"
+  resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz#c47ae7901db3b8bddc3ecd73daff2d0895688c46"
+  integrity sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==
   dependencies:
-    "@typescript-eslint/types" "6.19.1"
-    "@typescript-eslint/visitor-keys" "6.19.1"
+    "@typescript-eslint/types" "6.21.0"
+    "@typescript-eslint/visitor-keys" "6.21.0"
     debug "^4.3.4"
     globby "^11.1.0"
     is-glob "^4.0.3"
@@ -3726,17 +4110,17 @@
     semver "^7.5.4"
     ts-api-utils "^1.0.1"
 
-"@typescript-eslint/utils@6.19.1":
-  version "6.19.1"
-  resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.19.1.tgz#df93497f9cfddde2bcc2a591da80536e68acd151"
-  integrity sha512-JvjfEZuP5WoMqwh9SPAPDSHSg9FBHHGhjPugSRxu5jMfjvBpq5/sGTD+9M9aQ5sh6iJ8AY/Kk/oUYVEMAPwi7w==
+"@typescript-eslint/utils@6.21.0":
+  version "6.21.0"
+  resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz#4714e7a6b39e773c1c8e97ec587f520840cd8134"
+  integrity sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==
   dependencies:
     "@eslint-community/eslint-utils" "^4.4.0"
     "@types/json-schema" "^7.0.12"
     "@types/semver" "^7.5.0"
-    "@typescript-eslint/scope-manager" "6.19.1"
-    "@typescript-eslint/types" "6.19.1"
-    "@typescript-eslint/typescript-estree" "6.19.1"
+    "@typescript-eslint/scope-manager" "6.21.0"
+    "@typescript-eslint/types" "6.21.0"
+    "@typescript-eslint/typescript-estree" "6.21.0"
     semver "^7.5.4"
 
 "@typescript-eslint/utils@^5.10.0", "@typescript-eslint/utils@^5.45.0":
@@ -3761,12 +4145,12 @@
     "@typescript-eslint/types" "5.62.0"
     eslint-visitor-keys "^3.3.0"
 
-"@typescript-eslint/visitor-keys@6.19.1":
-  version "6.19.1"
-  resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.19.1.tgz#2164073ed4fc34a5ff3b5e25bb5a442100454c4c"
-  integrity sha512-gkdtIO+xSO/SmI0W68DBg4u1KElmIUo3vXzgHyGPs6cxgB0sa3TlptRAAE0hUY1hM6FcDKEv7aIwiTGm76cXfQ==
+"@typescript-eslint/visitor-keys@6.21.0":
+  version "6.21.0"
+  resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz#87a99d077aa507e20e238b11d56cc26ade45fe47"
+  integrity sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==
   dependencies:
-    "@typescript-eslint/types" "6.19.1"
+    "@typescript-eslint/types" "6.21.0"
     eslint-visitor-keys "^3.4.1"
 
 "@webassemblyjs/ast@1.11.6", "@webassemblyjs/ast@^1.11.5":
@@ -4058,13 +4442,20 @@ ansi-colors@^4.1.1:
   resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b"
   integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==
 
-ansi-escapes@^4.2.1:
+ansi-escapes@^4.2.1, ansi-escapes@^4.3.2:
   version "4.3.2"
   resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e"
   integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==
   dependencies:
     type-fest "^0.21.3"
 
+ansi-escapes@^6.0.0:
+  version "6.2.0"
+  resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.0.tgz#8a13ce75286f417f1963487d86ba9f90dccf9947"
+  integrity sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==
+  dependencies:
+    type-fest "^3.0.0"
+
 ansi-html-community@0.0.8, ansi-html-community@^0.0.8:
   version "0.0.8"
   resolved "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41"
@@ -4112,6 +4503,18 @@ app-root-dir@^1.0.2:
   resolved "https://registry.npmjs.org/app-root-dir/-/app-root-dir-1.0.2.tgz#38187ec2dea7577fff033ffcb12172692ff6e118"
   integrity sha512-jlpIfsOoNoafl92Sz//64uQHGSyMrD2vYG5d8o2a4qGvyNCvXur7bzIsWtAC/6flI2RYAp3kv8rsfBtaLm7w0g==
 
+append-transform@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz#99d9d29c7b38391e6f428d28ce136551f0b77e12"
+  integrity sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==
+  dependencies:
+    default-require-extensions "^3.0.0"
+
+archy@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40"
+  integrity sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==
+
 arg@^4.1.0:
   version "4.1.3"
   resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089"
@@ -4306,7 +4709,12 @@ axe-core@=4.7.0:
   resolved "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz#34ba5a48a8b564f67e103f0aa5768d76e15bbbbf"
   integrity sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==
 
-axios@^1.6.7:
+axe-core@^4.2.0:
+  version "4.8.3"
+  resolved "https://registry.npmjs.org/axe-core/-/axe-core-4.8.3.tgz#205df863dd9917d5979e9435dab4d47692759051"
+  integrity sha512-d5ZQHPSPkF9Tw+yfyDcRoUOc4g/8UloJJe5J8m4L5+c7AtDdjDLRxew/knnI4CxvtdxEUVgWz4x3OIQUIFiMfw==
+
+axios@^1.6.1, axios@^1.6.7:
   version "1.6.7"
   resolved "https://registry.npmjs.org/axios/-/axios-1.6.7.tgz#7b48c2e27c96f9c68a2f8f31e2ab19f59b06b0a7"
   integrity sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==
@@ -4632,6 +5040,16 @@ bytes@3.1.2:
   resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5"
   integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==
 
+caching-transform@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz#00d297a4206d71e2163c39eaffa8157ac0651f0f"
+  integrity sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==
+  dependencies:
+    hasha "^5.0.0"
+    make-dir "^3.0.0"
+    package-hash "^4.0.0"
+    write-file-atomic "^3.0.0"
+
 call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.4, call-bind@^1.0.5:
   version "1.0.5"
   resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz#6fa2b7845ce0ea49bf4d8b9ef64727a2c2e2e513"
@@ -4663,7 +5081,7 @@ camelcase-keys@^6.2.2:
     map-obj "^4.0.0"
     quick-lru "^4.0.1"
 
-camelcase@^5.3.1:
+camelcase@^5.0.0, camelcase@^5.3.1:
   version "5.3.1"
   resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
   integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
@@ -4678,6 +5096,11 @@ camelize@^1.0.0:
   resolved "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz#89b7e16884056331a35d6b5ad064332c91daa6c3"
   integrity sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==
 
+can-bind-to-host@^1.1.1:
+  version "1.1.2"
+  resolved "https://registry.npmjs.org/can-bind-to-host/-/can-bind-to-host-1.1.2.tgz#45919a1fb426eb1b709ddd4853cd5eda0549e606"
+  integrity sha512-CqsgmaqiyFRNtP17Ihqa/uHbZxRirntNVNl/kJz31DLKuNRfzvzionkLoUSkElQ6Cz+cpXKA3mhHq4tjbieujA==
+
 caniuse-lite@^1.0.30001565:
   version "1.0.30001580"
   resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001580.tgz#e3c76bc6fe020d9007647044278954ff8cd17d1e"
@@ -4705,7 +5128,7 @@ chalk@^3.0.0:
     ansi-styles "^4.1.0"
     supports-color "^7.1.0"
 
-chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2:
+chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.2:
   version "4.1.2"
   resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
   integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
@@ -4713,17 +5136,22 @@ chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2:
     ansi-styles "^4.1.0"
     supports-color "^7.1.0"
 
+chalk@^5.2.0:
+  version "5.3.0"
+  resolved "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385"
+  integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==
+
 char-regex@^1.0.2:
   version "1.0.2"
   resolved "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf"
   integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==
 
-chardet@^0.7.0:
-  version "0.7.0"
-  resolved "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e"
-  integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==
+char-regex@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.npmjs.org/char-regex/-/char-regex-2.0.1.tgz#6dafdb25f9d3349914079f010ba8d0e6ff9cd01e"
+  integrity sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw==
 
-chokidar@^3.4.2, chokidar@^3.5.3:
+chokidar@^3.5.3:
   version "3.5.3"
   resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd"
   integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==
@@ -4789,7 +5217,7 @@ cli-cursor@^3.1.0:
   dependencies:
     restore-cursor "^3.1.0"
 
-cli-spinners@^2.5.0:
+cli-spinners@^2.5.0, cli-spinners@^2.9.2:
   version "2.9.2"
   resolved "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41"
   integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==
@@ -4803,10 +5231,19 @@ cli-table3@^0.6.1:
   optionalDependencies:
     "@colors/colors" "1.5.0"
 
-cli-width@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6"
-  integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==
+cli-width@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz#42daac41d3c254ef38ad8ac037672130173691c5"
+  integrity sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==
+
+cliui@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1"
+  integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==
+  dependencies:
+    string-width "^4.2.0"
+    strip-ansi "^6.0.0"
+    wrap-ansi "^6.2.0"
 
 cliui@^8.0.1:
   version "8.0.1"
@@ -4897,6 +5334,16 @@ commander@^2.20.0:
   resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
   integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
 
+commander@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e"
+  integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==
+
+commander@^5.1.0:
+  version "5.1.0"
+  resolved "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae"
+  integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==
+
 commander@^6.2.1:
   version "6.2.1"
   resolved "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c"
@@ -4907,6 +5354,11 @@ commander@^8.3.0:
   resolved "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66"
   integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==
 
+commander@^9.0.0:
+  version "9.5.0"
+  resolved "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz#bc08d1eb5cedf7ccb797a96199d41c7bc3e60d30"
+  integrity sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==
+
 common-path-prefix@^3.0.0:
   version "3.0.0"
   resolved "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz#7d007a7e07c58c4b4d5f433131a19141b29f11e0"
@@ -5004,6 +5456,11 @@ continuable-cache@^0.3.1:
   resolved "https://registry.npmjs.org/continuable-cache/-/continuable-cache-0.3.1.tgz#bd727a7faed77e71ff3985ac93351a912733ad0f"
   integrity sha512-TF30kpKhTH8AGCG3dut0rdd/19B7Z+qCnrMoBLpyQu/2drZdNrrpcjPEoJeSVsQM+8KmWG5O56oPDjSSUsuTyA==
 
+convert-source-map@^1.7.0:
+  version "1.9.0"
+  resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f"
+  integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==
+
 convert-source-map@^2.0.0:
   version "2.0.0"
   resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a"
@@ -5106,7 +5563,21 @@ css-functions-list@^3.1.0:
   resolved "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.1.tgz#2eb205d8ce9f9ce74c5c1d7490b66b77c45ce3ea"
   integrity sha512-Nj5YcaGgBtuUmn1D7oHqPW0c9iui7xsTsj5lIX8ZgevdfhmjFfKB3r8moHJtNJnctnYXJyYX5I1pp90HM4TPgQ==
 
-css-loader@^6.7.1, css-loader@^6.9.1:
+css-loader@^6.10.0:
+  version "6.10.0"
+  resolved "https://registry.npmjs.org/css-loader/-/css-loader-6.10.0.tgz#7c172b270ec7b833951b52c348861206b184a4b7"
+  integrity sha512-LTSA/jWbwdMlk+rhmElbDR2vbtQoTBPr7fkJE+mxrHj+7ru0hUmHafDRzWIjIHTwpitWVaqY2/UWGRca3yUgRw==
+  dependencies:
+    icss-utils "^5.1.0"
+    postcss "^8.4.33"
+    postcss-modules-extract-imports "^3.0.0"
+    postcss-modules-local-by-default "^4.0.4"
+    postcss-modules-scope "^3.1.1"
+    postcss-modules-values "^4.0.0"
+    postcss-value-parser "^4.2.0"
+    semver "^7.5.4"
+
+css-loader@^6.7.1:
   version "6.9.1"
   resolved "https://registry.npmjs.org/css-loader/-/css-loader-6.9.1.tgz#9ec9a434368f2bdfeffbf8f6901a1ce773586c6b"
   integrity sha512-OzABOh0+26JKFdMzlK6PY1u5Zx8+Ck7CVRlcGNZoY9qwJjdfu2VWFuprTIpPW+Av5TZTVViYWcFQaEEQURLknQ==
@@ -5140,7 +5611,7 @@ css-to-react-native@^3.0.0:
     css-color-keywords "^1.0.0"
     postcss-value-parser "^4.0.2"
 
-css-what@^5.0.1, css-what@^6.0.1:
+css-what@^5.1.0, css-what@^6.0.1:
   version "5.1.0"
   resolved "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz#3f7b707aadf633baf62c2ceb8579b545bb40f7fe"
   integrity sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==
@@ -5177,6 +5648,14 @@ csstype@^3.0.2:
   resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81"
   integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==
 
+cwd@^0.10.0:
+  version "0.10.0"
+  resolved "https://registry.npmjs.org/cwd/-/cwd-0.10.0.tgz#172400694057c22a13b0cf16162c7e4b7a7fe567"
+  integrity sha512-YGZxdTTL9lmLkCUTpg4j0zQ7IhRB5ZmqNBbGCl3Tg6MP/d5/6sY7L5mmTjzbc6JKgVZYiqTQTNhPFsbXNGlRaA==
+  dependencies:
+    find-pkg "^0.1.2"
+    fs-exists-sync "^0.1.0"
+
 damerau-levenshtein@^1.0.8:
   version "1.0.8"
   resolved "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7"
@@ -5287,6 +5766,13 @@ default-browser-id@3.0.0:
     bplist-parser "^0.2.0"
     untildify "^4.0.0"
 
+default-require-extensions@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz#bfae00feeaeada68c2ae256c62540f60b80625bd"
+  integrity sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==
+  dependencies:
+    strip-bom "^4.0.0"
+
 defaults@^1.0.3:
   version "1.0.4"
   resolved "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a"
@@ -5386,6 +5872,11 @@ detect-port@^1.3.0:
     address "^1.0.1"
     debug "4"
 
+diff-sequences@^28.1.1:
+  version "28.1.1"
+  resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz#9989dc731266dc2903457a70e996f3a041913ac6"
+  integrity sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==
+
 diff-sequences@^29.6.3:
   version "29.6.3"
   resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921"
@@ -5396,6 +5887,13 @@ diff@^4.0.1:
   resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d"
   integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==
 
+diffable-html@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.npmjs.org/diffable-html/-/diffable-html-4.1.0.tgz#e7a2d1de187c4e23a59751b4e4c17483a058c696"
+  integrity sha512-++kyNek+YBLH8cLXS+iTj/Hiy2s5qkRJEJ8kgu/WHbFrVY2vz9xPFUT+fii2zGF0m1CaojDlQJjkfrCt7YWM1g==
+  dependencies:
+    htmlparser2 "^3.9.2"
+
 dir-glob@^3.0.1:
   version "3.0.1"
   resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f"
@@ -5434,6 +5932,14 @@ dom-converter@^0.2.0:
   dependencies:
     utila "~0.4"
 
+dom-serializer@0:
+  version "0.2.2"
+  resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51"
+  integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==
+  dependencies:
+    domelementtype "^2.0.1"
+    entities "^2.0.0"
+
 dom-serializer@^1.0.1:
   version "1.4.1"
   resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30"
@@ -5443,6 +5949,11 @@ dom-serializer@^1.0.1:
     domhandler "^4.2.0"
     entities "^2.0.0"
 
+domelementtype@1, domelementtype@^1.3.1:
+  version "1.3.1"
+  resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f"
+  integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==
+
 domelementtype@^2.0.1, domelementtype@^2.2.0:
   version "2.3.0"
   resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d"
@@ -5455,6 +5966,13 @@ domexception@^4.0.0:
   dependencies:
     webidl-conversions "^7.0.0"
 
+domhandler@^2.3.0:
+  version "2.4.2"
+  resolved "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803"
+  integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==
+  dependencies:
+    domelementtype "1"
+
 domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1:
   version "4.3.1"
   resolved "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c"
@@ -5462,6 +5980,14 @@ domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1:
   dependencies:
     domelementtype "^2.2.0"
 
+domutils@^1.5.1:
+  version "1.7.0"
+  resolved "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a"
+  integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==
+  dependencies:
+    dom-serializer "0"
+    domelementtype "1"
+
 domutils@^2.5.2, domutils@^2.8.0:
   version "2.8.0"
   resolved "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135"
@@ -5573,6 +6099,11 @@ enquirer@^2.3.5:
     ansi-colors "^4.1.1"
     strip-ansi "^6.0.1"
 
+entities@^1.1.1:
+  version "1.1.2"
+  resolved "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56"
+  integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==
+
 entities@^2.0.0:
   version "2.2.0"
   resolved "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55"
@@ -5729,6 +6260,11 @@ es-to-primitive@^1.2.1:
     is-date-object "^1.0.1"
     is-symbol "^1.0.2"
 
+es6-error@^4.0.1:
+  version "4.1.1"
+  resolved "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d"
+  integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==
+
 esbuild-plugin-alias@^0.2.1:
   version "0.2.1"
   resolved "https://registry.npmjs.org/esbuild-plugin-alias/-/esbuild-plugin-alias-0.2.1.tgz#45a86cb941e20e7c2bc68a2bea53562172494fcb"
@@ -5880,10 +6416,10 @@ eslint-plugin-import@^2.29.1:
     semver "^6.3.1"
     tsconfig-paths "^3.15.0"
 
-eslint-plugin-jest@^27.6.3:
-  version "27.6.3"
-  resolved "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.6.3.tgz#8acb8b1e45597fe1f4d4cf25163d90119efc12be"
-  integrity sha512-+YsJFVH6R+tOiO3gCJon5oqn4KWc+mDq2leudk8mrp8RFubLOo9CVyi3cib4L7XMpxExmkmBZQTPDYVBzgpgOA==
+eslint-plugin-jest@^27.8.0:
+  version "27.8.0"
+  resolved "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.8.0.tgz#c8900c3e74e4c6b8cee67ea77dbc8de9cbd9e093"
+  integrity sha512-347hVFiu4ZKMYl5xFp0X81gLNwBdno0dl0CMpUMjwuAux9X/M2a7z+ab2VHmPL6XCT87q8nv1vaVzhIO4TE/hw==
   dependencies:
     "@typescript-eslint/utils" "^5.10.0"
 
@@ -5943,10 +6479,10 @@ eslint-plugin-react@^7.33.2:
     semver "^6.3.1"
     string.prototype.matchall "^4.0.8"
 
-eslint-plugin-storybook@^0.6.15:
-  version "0.6.15"
-  resolved "https://registry.npmjs.org/eslint-plugin-storybook/-/eslint-plugin-storybook-0.6.15.tgz#8a091605b0a90974ec8e62d8112db6c4bd3a6faa"
-  integrity sha512-lAGqVAJGob47Griu29KXYowI4G7KwMoJDOkEip8ujikuDLxU+oWJ1l0WL6F2oDO4QiyUFXvtDkEkISMOPzo+7w==
+eslint-plugin-storybook@^0.7.0:
+  version "0.7.0"
+  resolved "https://registry.npmjs.org/eslint-plugin-storybook/-/eslint-plugin-storybook-0.7.0.tgz#4d5fbabc26a5216c4b657463547c0461be5b4883"
+  integrity sha512-lmvnszv3Xyd0TcxFLoDfLOaVN5v0vKwZh7ZDDY9xCeT/+knHn1ZnktHVO4tun/xVj8aBMYynXpBk0DIiWWRnww==
   dependencies:
     "@storybook/csf" "^0.0.1"
     "@typescript-eslint/utils" "^5.45.0"
@@ -6117,6 +6653,18 @@ exit@^0.1.2:
   resolved "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c"
   integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==
 
+expand-tilde@^1.2.2:
+  version "1.2.2"
+  resolved "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz#0b81eba897e5a3d31d1c3d102f8f01441e559449"
+  integrity sha512-rtmc+cjLZqnu9dSYosX9EWmSJhTwpACgJQTfj4hgg2JjOD/6SIQalZrt4a3aQeh++oNxkazcaxrhPUj6+g5G/Q==
+  dependencies:
+    os-homedir "^1.0.1"
+
+expect-playwright@^0.8.0:
+  version "0.8.0"
+  resolved "https://registry.npmjs.org/expect-playwright/-/expect-playwright-0.8.0.tgz#6d4ebe0bdbdd3c1693d880d97153b96a129ae4e8"
+  integrity sha512-+kn8561vHAY+dt+0gMqqj1oY+g5xWrsuGMk4QGxotT2WS545nVqqjs37z6hrYfIuucwqthzwJfCJUEYqixyljg==
+
 expect@^29.0.0, expect@^29.7.0:
   version "29.7.0"
   resolved "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc"
@@ -6170,15 +6718,6 @@ extend@^3.0.0:
   resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
   integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
 
-external-editor@^3.0.3:
-  version "3.1.0"
-  resolved "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495"
-  integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==
-  dependencies:
-    chardet "^0.7.0"
-    iconv-lite "^0.4.24"
-    tmp "^0.0.33"
-
 extract-zip@^1.6.6:
   version "1.7.0"
   resolved "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz#556cc3ae9df7f452c493a0cfb51cc30277940927"
@@ -6263,7 +6802,7 @@ fetch-retry@^5.0.2:
   resolved "https://registry.npmjs.org/fetch-retry/-/fetch-retry-5.0.6.tgz#17d0bc90423405b7a88b74355bf364acd2a7fa56"
   integrity sha512-3yurQZ2hD9VISAhJJP9bpYFNQrHHBXE2JxxjY5aLEcDi46RmAzJE2OC9FAde0yis5ElW0jTTzs0zfg/Cca4XqQ==
 
-figures@^3.0.0:
+figures@^3.2.0:
   version "3.2.0"
   resolved "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af"
   integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==
@@ -6321,7 +6860,7 @@ find-cache-dir@^2.0.0:
     make-dir "^2.0.0"
     pkg-dir "^3.0.0"
 
-find-cache-dir@^3.0.0, find-cache-dir@^3.3.1:
+find-cache-dir@^3.0.0, find-cache-dir@^3.2.0, find-cache-dir@^3.3.1:
   version "3.3.2"
   resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b"
   integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==
@@ -6338,6 +6877,30 @@ find-cache-dir@^4.0.0:
     common-path-prefix "^3.0.0"
     pkg-dir "^7.0.0"
 
+find-file-up@^0.1.2:
+  version "0.1.3"
+  resolved "https://registry.npmjs.org/find-file-up/-/find-file-up-0.1.3.tgz#cf68091bcf9f300a40da411b37da5cce5a2fbea0"
+  integrity sha512-mBxmNbVyjg1LQIIpgO8hN+ybWBgDQK8qjht+EbrTCGmmPV/sc7RF1i9stPTD6bpvXZywBdrwRYxhSdJv867L6A==
+  dependencies:
+    fs-exists-sync "^0.1.0"
+    resolve-dir "^0.1.0"
+
+find-pkg@^0.1.2:
+  version "0.1.2"
+  resolved "https://registry.npmjs.org/find-pkg/-/find-pkg-0.1.2.tgz#1bdc22c06e36365532e2a248046854b9788da557"
+  integrity sha512-0rnQWcFwZr7eO0513HahrWafsc3CTFioEB7DRiEYCUM/70QXSY8f3mCST17HXLcPvEhzH/Ty/Bxd72ZZsr/yvw==
+  dependencies:
+    find-file-up "^0.1.2"
+
+find-process@^1.4.4:
+  version "1.4.7"
+  resolved "https://registry.npmjs.org/find-process/-/find-process-1.4.7.tgz#8c76962259216c381ef1099371465b5b439ea121"
+  integrity sha512-/U4CYp1214Xrp3u3Fqr9yNynUrr5Le4y0SsJh2lMDDSbpwYSz3M2SMWQC+wqcx79cN8PQtHQIL8KnuY9M66fdg==
+  dependencies:
+    chalk "^4.0.0"
+    commander "^5.1.0"
+    debug "^4.1.1"
+
 find-up@^3.0.0:
   version "3.0.0"
   resolved "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73"
@@ -6405,6 +6968,14 @@ for-each@^0.3.3:
   dependencies:
     is-callable "^1.1.3"
 
+foreground-child@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz#71b32800c9f15aa8f2f83f4a6bd9bff35d861a53"
+  integrity sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==
+  dependencies:
+    cross-spawn "^7.0.0"
+    signal-exit "^3.0.2"
+
 foreground-child@^3.1.0:
   version "3.1.1"
   resolved "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d"
@@ -6468,11 +7039,21 @@ fresh@0.5.2:
   resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
   integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==
 
+fromentries@^1.2.0:
+  version "1.3.2"
+  resolved "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz#e4bca6808816bf8f93b52750f1127f5a6fd86e3a"
+  integrity sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==
+
 fs-constants@^1.0.0:
   version "1.0.0"
   resolved "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
   integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==
 
+fs-exists-sync@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add"
+  integrity sha512-cR/vflFyPZtrN6b38ZyWxpWdhlXrzZEBawlpBQMq7033xVY7/kg0GDMBK5jg8lDYQckdJ5x/YC88lM3C7VMsLg==
+
 fs-extra@11.1.1:
   version "11.1.1"
   resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz#da69f7c39f3b002378b0954bb6ae7efdc0876e2d"
@@ -6517,6 +7098,11 @@ fs.realpath@^1.0.0:
   resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
   integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==
 
+fsevents@2.3.2:
+  version "2.3.2"
+  resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
+  integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
+
 fsevents@^2.3.2, fsevents@~2.3.2:
   version "2.3.3"
   resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6"
@@ -6552,7 +7138,7 @@ gensync@^1.0.0-beta.2:
   resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0"
   integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==
 
-get-caller-file@^2.0.5:
+get-caller-file@^2.0.1, get-caller-file@^2.0.5:
   version "2.0.5"
   resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
   integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
@@ -6587,6 +7173,11 @@ get-port@^5.1.1:
   resolved "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz#0469ed07563479de6efb986baf053dcd7d4e3193"
   integrity sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==
 
+get-stdin@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz#122e161591e21ff4c52530305693f20e6393a398"
+  integrity sha512-jZV7n6jGE3Gt7fgSTJoz91Ak5MuTLwMwkoYdjxuJ/AmjIsE1UC03y/IWkZCQGEvVNS9qoRNwy5BCqxImv0FVeA==
+
 get-stream@^6.0.0:
   version "6.0.1"
   resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7"
@@ -6643,7 +7234,7 @@ glob-to-regexp@^0.4.1:
   resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e"
   integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==
 
-glob@^10.0.0:
+glob@^10.0.0, glob@^10.2.2:
   version "10.3.10"
   resolved "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b"
   integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==
@@ -6654,7 +7245,7 @@ glob@^10.0.0:
     minipass "^5.0.0 || ^6.0.2 || ^7.0.0"
     path-scurry "^1.10.1"
 
-glob@^7.1.3, glob@^7.1.4:
+glob@^7.1.3, glob@^7.1.4, glob@^7.1.6:
   version "7.2.3"
   resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b"
   integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
@@ -6666,6 +7257,14 @@ glob@^7.1.3, glob@^7.1.4:
     once "^1.3.0"
     path-is-absolute "^1.0.0"
 
+global-modules@^0.2.3:
+  version "0.2.3"
+  resolved "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz#ea5a3bed42c6d6ce995a4f8a1269b5dae223828d"
+  integrity sha512-JeXuCbvYzYXcwE6acL9V2bAOeSIGl4dD+iwLY9iUx2VBJJ80R18HCn+JCwHM9Oegdfya3lEkGCdaRkSyc10hDA==
+  dependencies:
+    global-prefix "^0.1.4"
+    is-windows "^0.2.0"
+
 global-modules@^2.0.0:
   version "2.0.0"
   resolved "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780"
@@ -6673,6 +7272,16 @@ global-modules@^2.0.0:
   dependencies:
     global-prefix "^3.0.0"
 
+global-prefix@^0.1.4:
+  version "0.1.5"
+  resolved "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz#8d3bc6b8da3ca8112a160d8d496ff0462bfef78f"
+  integrity sha512-gOPiyxcD9dJGCEArAhF4Hd0BAqvAe/JzERP7tYumE4yIkmIedPUVXcJFWbV3/p/ovIIvKjkrTk+f1UVkq7vvbw==
+  dependencies:
+    homedir-polyfill "^1.0.0"
+    ini "^1.3.4"
+    is-windows "^0.2.0"
+    which "^1.2.12"
+
 global-prefix@^3.0.0:
   version "3.0.0"
   resolved "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97"
@@ -6718,6 +7327,11 @@ globjoin@^0.1.4:
   resolved "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz#2f4494ac8919e3767c5cbb691e9f463324285d43"
   integrity sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==
 
+glur@^1.1.2:
+  version "1.1.2"
+  resolved "https://registry.npmjs.org/glur/-/glur-1.1.2.tgz#f20ea36db103bfc292343921f1f91e83c3467689"
+  integrity sha512-l+8esYHTKOx2G/Aao4lEQ0bnHWg4fWtJbVoZZT9Knxi01pB8C80BR85nONLFwkkQoFRCmXY+BUcGZN3yZ2QsRA==
+
 gopd@^1.0.1:
   version "1.0.1"
   resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c"
@@ -6725,7 +7339,7 @@ gopd@^1.0.1:
   dependencies:
     get-intrinsic "^1.1.3"
 
-graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.9:
+graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.9:
   version "4.2.11"
   resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3"
   integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
@@ -6808,6 +7422,14 @@ has-tostringtag@^1.0.0:
   dependencies:
     has-symbols "^1.0.2"
 
+hasha@^5.0.0:
+  version "5.2.2"
+  resolved "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz#a48477989b3b327aea3c04f53096d816d97522a1"
+  integrity sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==
+  dependencies:
+    is-stream "^2.0.0"
+    type-fest "^0.8.0"
+
 hasown@^2.0.0:
   version "2.0.0"
   resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c"
@@ -6832,6 +7454,13 @@ hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.3.0:
   dependencies:
     react-is "^16.7.0"
 
+homedir-polyfill@^1.0.0:
+  version "1.0.3"
+  resolved "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8"
+  integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==
+  dependencies:
+    parse-passwd "^1.0.0"
+
 hosted-git-info@^2.1.4:
   version "2.8.9"
   resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9"
@@ -6890,6 +7519,18 @@ html-webpack-plugin@^5.5.0:
     pretty-error "^4.0.0"
     tapable "^2.0.0"
 
+htmlparser2@^3.9.2:
+  version "3.10.1"
+  resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f"
+  integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==
+  dependencies:
+    domelementtype "^1.3.1"
+    domhandler "^2.3.0"
+    domutils "^1.5.1"
+    entities "^1.1.1"
+    inherits "^2.0.1"
+    readable-stream "^3.1.1"
+
 htmlparser2@^6.1.0:
   version "6.1.0"
   resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7"
@@ -6951,7 +7592,7 @@ human-signals@^5.0.0:
   resolved "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28"
   integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==
 
-iconv-lite@0.4.24, iconv-lite@^0.4.24:
+iconv-lite@0.4.24:
   version "0.4.24"
   resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
   integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
@@ -7047,32 +7688,11 @@ inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, i
   resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
   integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
 
-ini@^1.3.5:
+ini@^1.3.4, ini@^1.3.5:
   version "1.3.8"
   resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c"
   integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==
 
-inquirer@^8.2.0:
-  version "8.2.6"
-  resolved "https://registry.npmjs.org/inquirer/-/inquirer-8.2.6.tgz#733b74888195d8d400a67ac332011b5fae5ea562"
-  integrity sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==
-  dependencies:
-    ansi-escapes "^4.2.1"
-    chalk "^4.1.1"
-    cli-cursor "^3.1.0"
-    cli-width "^3.0.0"
-    external-editor "^3.0.3"
-    figures "^3.0.0"
-    lodash "^4.17.21"
-    mute-stream "0.0.8"
-    ora "^5.4.1"
-    run-async "^2.4.0"
-    rxjs "^7.5.5"
-    string-width "^4.1.0"
-    strip-ansi "^6.0.0"
-    through "^2.3.6"
-    wrap-ansi "^6.0.1"
-
 internal-slot@^1.0.4, internal-slot@^1.0.5:
   version "1.0.6"
   resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz#37e756098c4911c5e912b8edbf71ed3aa116f930"
@@ -7353,6 +7973,11 @@ is-typed-array@^1.1.10, is-typed-array@^1.1.12, is-typed-array@^1.1.3, is-typed-
   dependencies:
     which-typed-array "^1.1.11"
 
+is-typedarray@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
+  integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==
+
 is-unicode-supported@^0.1.0:
   version "0.1.0"
   resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7"
@@ -7378,6 +8003,16 @@ is-weakset@^2.0.1:
     call-bind "^1.0.2"
     get-intrinsic "^1.1.1"
 
+is-windows@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c"
+  integrity sha512-n67eJYmXbniZB7RF4I/FTjK1s6RPOCTxhYrVYLRaCt3lF0mpWZPKr3T2LSZAqyjQsxR2qMmGYXXzK0YWwcPM1Q==
+
+is-windows@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
+  integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==
+
 is-wsl@^2.2.0:
   version "2.2.0"
   resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271"
@@ -7410,6 +8045,23 @@ istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0:
   resolved "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756"
   integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==
 
+istanbul-lib-hook@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz#8f84c9434888cc6b1d0a9d7092a76d239ebf0cc6"
+  integrity sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==
+  dependencies:
+    append-transform "^2.0.0"
+
+istanbul-lib-instrument@^4.0.0:
+  version "4.0.3"
+  resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d"
+  integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==
+  dependencies:
+    "@babel/core" "^7.7.5"
+    "@istanbuljs/schema" "^0.1.2"
+    istanbul-lib-coverage "^3.0.0"
+    semver "^6.3.0"
+
 istanbul-lib-instrument@^5.0.4:
   version "5.2.1"
   resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d"
@@ -7432,6 +8084,18 @@ istanbul-lib-instrument@^6.0.0:
     istanbul-lib-coverage "^3.2.0"
     semver "^7.5.4"
 
+istanbul-lib-processinfo@^2.0.2:
+  version "2.0.3"
+  resolved "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz#366d454cd0dcb7eb6e0e419378e60072c8626169"
+  integrity sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==
+  dependencies:
+    archy "^1.0.0"
+    cross-spawn "^7.0.3"
+    istanbul-lib-coverage "^3.2.0"
+    p-map "^3.0.0"
+    rimraf "^3.0.0"
+    uuid "^8.3.2"
+
 istanbul-lib-report@^3.0.0:
   version "3.0.1"
   resolved "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d"
@@ -7450,7 +8114,7 @@ istanbul-lib-source-maps@^4.0.0:
     istanbul-lib-coverage "^3.0.0"
     source-map "^0.6.1"
 
-istanbul-reports@^3.1.3:
+istanbul-reports@^3.0.2, istanbul-reports@^3.1.3:
   version "3.1.6"
   resolved "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz#2544bcab4768154281a2f0870471902704ccaa1a"
   integrity sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==
@@ -7497,7 +8161,7 @@ jest-changed-files@^29.7.0:
     jest-util "^29.7.0"
     p-limit "^3.1.0"
 
-jest-circus@^29.7.0:
+jest-circus@^29.6.4, jest-circus@^29.7.0:
   version "29.7.0"
   resolved "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz#b6817a45fcc835d8b16d5962d0c026473ee3668a"
   integrity sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==
@@ -7568,6 +8232,16 @@ jest-config@^29.7.0:
     slash "^3.0.0"
     strip-json-comments "^3.1.1"
 
+jest-diff@^28.1.3:
+  version "28.1.3"
+  resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz#948a192d86f4e7a64c5264ad4da4877133d8792f"
+  integrity sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==
+  dependencies:
+    chalk "^4.0.0"
+    diff-sequences "^28.1.1"
+    jest-get-type "^28.0.2"
+    pretty-format "^28.1.3"
+
 jest-diff@^29.7.0:
   version "29.7.0"
   resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a"
@@ -7610,7 +8284,7 @@ jest-environment-jsdom@^29.7.0:
     jest-util "^29.7.0"
     jsdom "^20.0.0"
 
-jest-environment-node@^29.7.0:
+jest-environment-node@^29.6.4, jest-environment-node@^29.7.0:
   version "29.7.0"
   resolved "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376"
   integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==
@@ -7622,6 +8296,11 @@ jest-environment-node@^29.7.0:
     jest-mock "^29.7.0"
     jest-util "^29.7.0"
 
+jest-get-type@^28.0.2:
+  version "28.0.2"
+  resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz#34622e628e4fdcd793d46db8a242227901fcf203"
+  integrity sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==
+
 jest-get-type@^29.6.3:
   version "29.6.3"
   resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1"
@@ -7646,6 +8325,30 @@ jest-haste-map@^29.7.0:
   optionalDependencies:
     fsevents "^2.3.2"
 
+jest-image-snapshot@^6.4.0:
+  version "6.4.0"
+  resolved "https://registry.npmjs.org/jest-image-snapshot/-/jest-image-snapshot-6.4.0.tgz#65831d13beb1680f3bba9fb28230fa53d76939be"
+  integrity sha512-IWGtSOnelwaVPd09STbJuLmnAwlBC/roJtTLGLb8M3TA0vfku3MRNEXmljTa1EMXqdRbA0oIWiqHFB1ttTGazQ==
+  dependencies:
+    chalk "^4.0.0"
+    get-stdin "^5.0.1"
+    glur "^1.1.2"
+    lodash "^4.17.4"
+    pixelmatch "^5.1.0"
+    pngjs "^3.4.0"
+    rimraf "^2.6.2"
+    ssim.js "^3.1.1"
+
+jest-junit@^16.0.0:
+  version "16.0.0"
+  resolved "https://registry.npmjs.org/jest-junit/-/jest-junit-16.0.0.tgz#d838e8c561cf9fdd7eb54f63020777eee4136785"
+  integrity sha512-A94mmw6NfJab4Fg/BlvVOUXzXgF0XIH6EmTgJ5NDPp4xoKq0Kr7sErb+4Xs9nZvu58pJojz5RFGpqnZYJTrRfQ==
+  dependencies:
+    mkdirp "^1.0.4"
+    strip-ansi "^6.0.1"
+    uuid "^8.3.2"
+    xml "^1.0.1"
+
 jest-leak-detector@^29.7.0:
   version "29.7.0"
   resolved "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz#5b7ec0dadfdfec0ca383dc9aa016d36b5ea4c728"
@@ -7654,6 +8357,16 @@ jest-leak-detector@^29.7.0:
     jest-get-type "^29.6.3"
     pretty-format "^29.7.0"
 
+jest-matcher-utils@^28.0.0:
+  version "28.1.3"
+  resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz#5a77f1c129dd5ba3b4d7fc20728806c78893146e"
+  integrity sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==
+  dependencies:
+    chalk "^4.0.0"
+    jest-diff "^28.1.3"
+    jest-get-type "^28.0.2"
+    pretty-format "^28.1.3"
+
 jest-matcher-utils@^29.7.0:
   version "29.7.0"
   resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12"
@@ -7679,7 +8392,7 @@ jest-message-util@^29.7.0:
     slash "^3.0.0"
     stack-utils "^2.0.3"
 
-jest-mock@^27.0.6:
+jest-mock@^27.0.6, jest-mock@^27.3.0:
   version "27.5.1"
   resolved "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz#19948336d49ef4d9c52021d34ac7b5f36ff967d6"
   integrity sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==
@@ -7696,12 +8409,40 @@ jest-mock@^29.7.0:
     "@types/node" "*"
     jest-util "^29.7.0"
 
+jest-playwright-preset@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmjs.org/jest-playwright-preset/-/jest-playwright-preset-4.0.0.tgz#c3d60cf039b48209cfd2234e6c7694d7ecb1cc7f"
+  integrity sha512-+dGZ1X2KqtwXaabVjTGxy0a3VzYfvYsWaRcuO8vMhyclHSOpGSI1+5cmlqzzCwQ3+fv0EjkTc7I5aV9lo08dYw==
+  dependencies:
+    expect-playwright "^0.8.0"
+    jest-process-manager "^0.4.0"
+    nyc "^15.1.0"
+    playwright-core ">=1.2.0"
+    rimraf "^3.0.2"
+    uuid "^8.3.2"
+
 jest-pnp-resolver@^1.2.2:
   version "1.2.3"
   resolved "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e"
   integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==
 
-jest-regex-util@^29.6.3:
+jest-process-manager@^0.4.0:
+  version "0.4.0"
+  resolved "https://registry.npmjs.org/jest-process-manager/-/jest-process-manager-0.4.0.tgz#fb05c8e09ad400fd038436004815653bb98f4e8b"
+  integrity sha512-80Y6snDyb0p8GG83pDxGI/kQzwVTkCxc7ep5FPe/F6JYdvRDhwr6RzRmPSP7SEwuLhxo80lBS/NqOdUIbHIfhw==
+  dependencies:
+    "@types/wait-on" "^5.2.0"
+    chalk "^4.1.0"
+    cwd "^0.10.0"
+    exit "^0.1.2"
+    find-process "^1.4.4"
+    prompts "^2.4.1"
+    signal-exit "^3.0.3"
+    spawnd "^5.0.0"
+    tree-kill "^1.2.2"
+    wait-on "^7.0.0"
+
+jest-regex-util@^29.0.0, jest-regex-util@^29.6.3:
   version "29.6.3"
   resolved "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52"
   integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==
@@ -7729,7 +8470,7 @@ jest-resolve@^29.7.0:
     resolve.exports "^2.0.0"
     slash "^3.0.0"
 
-jest-runner@^29.7.0:
+jest-runner@^29.6.4, jest-runner@^29.7.0:
   version "29.7.0"
   resolved "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz#809af072d408a53dcfd2e849a4c976d3132f718e"
   integrity sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==
@@ -7784,6 +8525,13 @@ jest-runtime@^29.7.0:
     slash "^3.0.0"
     strip-bom "^4.0.0"
 
+jest-serializer-html@^7.1.0:
+  version "7.1.0"
+  resolved "https://registry.npmjs.org/jest-serializer-html/-/jest-serializer-html-7.1.0.tgz#0cfea8a03b9b82bc420fd2cb969bd76713a87c08"
+  integrity sha512-xYL2qC7kmoYHJo8MYqJkzrl/Fdlx+fat4U1AqYg+kafqwcKPiMkOcjWHPKhueuNEgr+uemhGc+jqXYiwCyRyLA==
+  dependencies:
+    diffable-html "^4.1.0"
+
 jest-snapshot@^29.7.0:
   version "29.7.0"
   resolved "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz#c2c574c3f51865da1bb329036778a69bf88a6be5"
@@ -7834,7 +8582,20 @@ jest-validate@^29.7.0:
     leven "^3.1.0"
     pretty-format "^29.7.0"
 
-jest-watcher@^29.7.0:
+jest-watch-typeahead@^2.0.0:
+  version "2.2.2"
+  resolved "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-2.2.2.tgz#5516d3cd006485caa5cfc9bd1de40f1f8b136abf"
+  integrity sha512-+QgOFW4o5Xlgd6jGS5X37i08tuuXNW8X0CV9WNFi+3n8ExCIP+E1melYhvYLjv5fE6D0yyzk74vsSO8I6GqtvQ==
+  dependencies:
+    ansi-escapes "^6.0.0"
+    chalk "^5.2.0"
+    jest-regex-util "^29.0.0"
+    jest-watcher "^29.0.0"
+    slash "^5.0.0"
+    string-length "^5.0.1"
+    strip-ansi "^7.0.1"
+
+jest-watcher@^29.0.0, jest-watcher@^29.7.0:
   version "29.7.0"
   resolved "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz#7810d30d619c3a62093223ce6bb359ca1b28a2f2"
   integrity sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==
@@ -7867,7 +8628,7 @@ jest-worker@^29.7.0:
     merge-stream "^2.0.0"
     supports-color "^8.0.0"
 
-jest@^29.7.0:
+jest@^29.6.4, jest@^29.7.0:
   version "29.7.0"
   resolved "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz#994676fc24177f088f1c5e3737f5697204ff2613"
   integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==
@@ -7877,6 +8638,17 @@ jest@^29.7.0:
     import-local "^3.0.2"
     jest-cli "^29.7.0"
 
+joi@^17.11.0:
+  version "17.12.1"
+  resolved "https://registry.npmjs.org/joi/-/joi-17.12.1.tgz#3347ecf4cd3301962d42191c021b165eef1f395b"
+  integrity sha512-vtxmq+Lsc5SlfqotnfVjlViWfOL9nt/avKNbKYizwf6gsCfq9NYY/ceYRMFD8XDdrjJ9abJyScWmhmIiy+XRtQ==
+  dependencies:
+    "@hapi/hoek" "^9.3.0"
+    "@hapi/topo" "^5.1.0"
+    "@sideway/address" "^4.1.5"
+    "@sideway/formula" "^3.0.1"
+    "@sideway/pinpoint" "^2.0.0"
+
 "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
   version "4.0.0"
   resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
@@ -8002,6 +8774,11 @@ json5@^2.1.2, json5@^2.2.3:
   resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283"
   integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==
 
+jsonc-parser@^3.2.0:
+  version "3.2.1"
+  resolved "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz#031904571ccf929d7670ee8c547545081cb37f1a"
+  integrity sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==
+
 jsonfile@^6.0.1:
   version "6.1.0"
   resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae"
@@ -8157,6 +8934,11 @@ lodash.debounce@^4.0.8:
   resolved "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
   integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==
 
+lodash.flattendeep@^4.4.0:
+  version "4.4.0"
+  resolved "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2"
+  integrity sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==
+
 lodash.isplainobject@^4.0.6:
   version "4.0.6"
   resolved "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb"
@@ -8172,7 +8954,7 @@ lodash.truncate@^4.4.2:
   resolved "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193"
   integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==
 
-lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21:
+lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4:
   version "4.17.21"
   resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
   integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
@@ -8238,7 +9020,7 @@ make-dir@^2.0.0, make-dir@^2.1.0:
     pify "^4.0.1"
     semver "^5.6.0"
 
-make-dir@^3.0.2, make-dir@^3.1.0:
+make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0:
   version "3.1.0"
   resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f"
   integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==
@@ -8438,7 +9220,7 @@ minimist-options@4.1.0:
     is-plain-obj "^1.1.0"
     kind-of "^6.0.3"
 
-minimist@>=1.2.2, minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6:
+minimist@>=1.2.2, minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6, minimist@^1.2.8:
   version "1.2.8"
   resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c"
   integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==
@@ -8512,23 +9294,22 @@ msw-storybook-addon@2.0.0--canary.122.06f0c92.0:
   dependencies:
     is-node-process "^1.0.1"
 
-msw@^2.1.5:
-  version "2.1.5"
-  resolved "https://registry.npmjs.org/msw/-/msw-2.1.5.tgz#f6736ad33120f01e939416275625dcf7e7b28d14"
-  integrity sha512-r39AZk4taMmUEYwtzDAgFy38feqJy1yaKykvo0QE8q7H7c28yH/WIlOmE7oatjkC3dMgpTYfND8MaxeywgU+Yg==
+msw@^2.2.0:
+  version "2.2.0"
+  resolved "https://registry.npmjs.org/msw/-/msw-2.2.0.tgz#a57cf5503e85e7ca39d1f188bb0fef93660ff2c9"
+  integrity sha512-98cUGcIphhdf3KDbmSxji7XFqLxeSFAmPUNV00N/U76GOkuUKEwp6MHqM6KW70rlpgeJP8qIWueppdnVThzG1g==
   dependencies:
     "@bundled-es-modules/cookie" "^2.0.0"
     "@bundled-es-modules/statuses" "^1.0.1"
+    "@inquirer/confirm" "^3.0.0"
     "@mswjs/cookies" "^1.1.0"
-    "@mswjs/interceptors" "^0.25.15"
+    "@mswjs/interceptors" "^0.25.16"
     "@open-draft/until" "^2.1.0"
     "@types/cookie" "^0.6.0"
     "@types/statuses" "^2.0.4"
     chalk "^4.1.2"
-    chokidar "^3.4.2"
     graphql "^16.8.1"
     headers-polyfill "^4.0.2"
-    inquirer "^8.2.0"
     is-node-process "^1.2.0"
     outvariant "^1.4.2"
     path-to-regexp "^6.2.0"
@@ -8536,10 +9317,10 @@ msw@^2.1.5:
     type-fest "^4.9.0"
     yargs "^17.7.2"
 
-mute-stream@0.0.8:
-  version "0.0.8"
-  resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d"
-  integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==
+mute-stream@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz#e31bd9fe62f0aed23520aa4324ea6671531e013e"
+  integrity sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==
 
 nanoid@^3.3.7:
   version "3.3.7"
@@ -8586,7 +9367,7 @@ node-fetch-native@^1.6.1:
   resolved "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.1.tgz#f95c74917d3cebc794cdae0cd2a9c7594aad0cb4"
   integrity sha512-bW9T/uJDPAJB2YNYEpWzE54U5O3MQidXsOyTfnbKYtTtFexRvGzb1waphBN4ZwP6EcIvYYEOwW0b72BpAqydTw==
 
-node-fetch@^2.0.0:
+node-fetch@^2, node-fetch@^2.0.0:
   version "2.7.0"
   resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d"
   integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==
@@ -8598,6 +9379,13 @@ node-int64@^0.4.0:
   resolved "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b"
   integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==
 
+node-preload@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz#c03043bb327f417a18fee7ab7ee57b408a144301"
+  integrity sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==
+  dependencies:
+    process-on-spawn "^1.0.0"
+
 node-releases@^2.0.14:
   version "2.0.14"
   resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b"
@@ -8685,6 +9473,39 @@ nwsapi@^2.2.2:
   resolved "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz#738e0707d3128cb750dddcfe90e4610482df0f30"
   integrity sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==
 
+nyc@^15.1.0:
+  version "15.1.0"
+  resolved "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz#1335dae12ddc87b6e249d5a1994ca4bdaea75f02"
+  integrity sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==
+  dependencies:
+    "@istanbuljs/load-nyc-config" "^1.0.0"
+    "@istanbuljs/schema" "^0.1.2"
+    caching-transform "^4.0.0"
+    convert-source-map "^1.7.0"
+    decamelize "^1.2.0"
+    find-cache-dir "^3.2.0"
+    find-up "^4.1.0"
+    foreground-child "^2.0.0"
+    get-package-type "^0.1.0"
+    glob "^7.1.6"
+    istanbul-lib-coverage "^3.0.0"
+    istanbul-lib-hook "^3.0.0"
+    istanbul-lib-instrument "^4.0.0"
+    istanbul-lib-processinfo "^2.0.2"
+    istanbul-lib-report "^3.0.0"
+    istanbul-lib-source-maps "^4.0.0"
+    istanbul-reports "^3.0.2"
+    make-dir "^3.0.0"
+    node-preload "^0.2.1"
+    p-map "^3.0.0"
+    process-on-spawn "^1.0.0"
+    resolve-from "^5.0.0"
+    rimraf "^3.0.0"
+    signal-exit "^3.0.2"
+    spawn-wrap "^2.0.0"
+    test-exclude "^6.0.0"
+    yargs "^15.0.2"
+
 nypm@^0.3.3:
   version "0.3.6"
   resolved "https://registry.npmjs.org/nypm/-/nypm-0.3.6.tgz#940b558e6e56c2ed5dc43adf6dcf2c16577a80ff"
@@ -8852,10 +9673,10 @@ ora@^5.4.1:
     strip-ansi "^6.0.0"
     wcwidth "^1.0.1"
 
-os-tmpdir@~1.0.2:
+os-homedir@^1.0.1:
   version "1.0.2"
-  resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
-  integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==
+  resolved "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
+  integrity sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==
 
 outvariant@^1.2.1, outvariant@^1.4.0, outvariant@^1.4.2:
   version "1.4.2"
@@ -8911,6 +9732,13 @@ p-locate@^6.0.0:
   dependencies:
     p-limit "^4.0.0"
 
+p-map@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d"
+  integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==
+  dependencies:
+    aggregate-error "^3.0.0"
+
 p-map@^4.0.0:
   version "4.0.0"
   resolved "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b"
@@ -8923,6 +9751,16 @@ p-try@^2.0.0:
   resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
   integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
 
+package-hash@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz#3537f654665ec3cc38827387fc904c163c54f506"
+  integrity sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==
+  dependencies:
+    graceful-fs "^4.1.15"
+    hasha "^5.0.0"
+    lodash.flattendeep "^4.4.0"
+    release-zalgo "^1.0.0"
+
 pako@~0.2.0:
   version "0.2.9"
   resolved "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75"
@@ -8953,6 +9791,11 @@ parse-json@^5.0.0, parse-json@^5.2.0:
     json-parse-even-better-errors "^2.3.0"
     lines-and-columns "^1.1.6"
 
+parse-passwd@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6"
+  integrity sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==
+
 parse5@^7.0.0, parse5@^7.1.1:
   version "7.1.2"
   resolved "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32"
@@ -9080,6 +9923,13 @@ pirates@^4.0.4, pirates@^4.0.6:
   resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9"
   integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==
 
+pixelmatch@^5.1.0:
+  version "5.3.0"
+  resolved "https://registry.npmjs.org/pixelmatch/-/pixelmatch-5.3.0.tgz#5e5321a7abedfb7962d60dbf345deda87cb9560a"
+  integrity sha512-o8mkY4E/+LNUf6LzX96ht6k6CEDi65k9G2rjMtBe9Oo+VPKSvl+0GKHuH/AlG+GA5LPG/i5hrekkxUc3s2HU+Q==
+  dependencies:
+    pngjs "^6.0.0"
+
 pkg-dir@^3.0.0:
   version "3.0.0"
   resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3"
@@ -9108,6 +9958,30 @@ pkg-dir@^7.0.0:
   dependencies:
     find-up "^6.3.0"
 
+playwright-core@1.41.2, playwright-core@>=1.2.0:
+  version "1.41.2"
+  resolved "https://registry.npmjs.org/playwright-core/-/playwright-core-1.41.2.tgz#db22372c708926c697acc261f0ef8406606802d9"
+  integrity sha512-VaTvwCA4Y8kxEe+kfm2+uUUw5Lubf38RxF7FpBxLPmGe5sdNkSg5e3ChEigaGrX7qdqT3pt2m/98LiyvU2x6CA==
+
+playwright@^1.14.0:
+  version "1.41.2"
+  resolved "https://registry.npmjs.org/playwright/-/playwright-1.41.2.tgz#4e760b1c79f33d9129a8c65cc27953be6dd35042"
+  integrity sha512-v0bOa6H2GJChDL8pAeLa/LZC4feoAMbSQm1/jF/ySsWWoaNItvrMP7GEkvEEFyCTUYKMxjQKaTSg5up7nR6/8A==
+  dependencies:
+    playwright-core "1.41.2"
+  optionalDependencies:
+    fsevents "2.3.2"
+
+pngjs@^3.4.0:
+  version "3.4.0"
+  resolved "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz#99ca7d725965fb655814eaf65f38f12bbdbf555f"
+  integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==
+
+pngjs@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.npmjs.org/pngjs/-/pngjs-6.0.0.tgz#ca9e5d2aa48db0228a52c419c3308e87720da821"
+  integrity sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg==
+
 polished@^4.2.2:
   version "4.2.2"
   resolved "https://registry.npmjs.org/polished/-/polished-4.2.2.tgz#2529bb7c3198945373c52e34618c8fe7b1aa84d1"
@@ -9180,10 +10054,10 @@ postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0, postcss-value-parser@^
   resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514"
   integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
 
-postcss@^8.4.19, postcss@^8.4.33:
-  version "8.4.33"
-  resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz#1378e859c9f69bf6f638b990a0212f43e2aaa742"
-  integrity sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==
+postcss@^8.4.19, postcss@^8.4.33, postcss@^8.4.35:
+  version "8.4.35"
+  resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz#60997775689ce09011edf083a549cea44aabe2f7"
+  integrity sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==
   dependencies:
     nanoid "^3.3.7"
     picocolors "^1.0.0"
@@ -9223,6 +10097,16 @@ pretty-format@^27.0.2:
     ansi-styles "^5.0.0"
     react-is "^17.0.1"
 
+pretty-format@^28.0.0, pretty-format@^28.1.3:
+  version "28.1.3"
+  resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz#c9fba8cedf99ce50963a11b27d982a9ae90970d5"
+  integrity sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==
+  dependencies:
+    "@jest/schemas" "^28.1.3"
+    ansi-regex "^5.0.1"
+    ansi-styles "^5.0.0"
+    react-is "^18.0.0"
+
 pretty-format@^29.0.0, pretty-format@^29.7.0:
   version "29.7.0"
   resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812"
@@ -9242,6 +10126,13 @@ process-nextick-args@~2.0.0:
   resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
   integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
 
+process-on-spawn@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz#95b05a23073d30a17acfdc92a440efd2baefdc93"
+  integrity sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==
+  dependencies:
+    fromentries "^1.2.0"
+
 process@^0.11.10:
   version "0.11.10"
   resolved "https://registry.npmjs.org/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
@@ -9265,7 +10156,7 @@ promise-retry@^2.0.1:
     err-code "^2.0.2"
     retry "^0.12.0"
 
-prompts@^2.0.1, prompts@^2.4.0:
+prompts@^2.0.1, prompts@^2.4.0, prompts@^2.4.1:
   version "2.4.2"
   resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069"
   integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==
@@ -9529,20 +10420,20 @@ react-resize-detector@^3.2.1:
     prop-types "^15.6.2"
     resize-observer-polyfill "^1.5.1"
 
-react-router-dom@^6.21.3:
-  version "6.21.3"
-  resolved "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.21.3.tgz#ef3a7956a3699c7b82c21fcb3dbc63c313ed8c5d"
-  integrity sha512-kNzubk7n4YHSrErzjLK72j0B5i969GsuCGazRl3G6j1zqZBLjuSlYBdVdkDOgzGdPIffUOc9nmgiadTEVoq91g==
+react-router-dom@^6.22.0:
+  version "6.22.0"
+  resolved "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.22.0.tgz#177c8bd27146decbb991eafb5df159f7a9f70035"
+  integrity sha512-z2w+M4tH5wlcLmH3BMMOMdrtrJ9T3oJJNsAlBJbwk+8Syxd5WFJ7J5dxMEW0/GEXD1BBis4uXRrNIz3mORr0ag==
   dependencies:
-    "@remix-run/router" "1.14.2"
-    react-router "6.21.3"
+    "@remix-run/router" "1.15.0"
+    react-router "6.22.0"
 
-react-router@6.21.3:
-  version "6.21.3"
-  resolved "https://registry.npmjs.org/react-router/-/react-router-6.21.3.tgz#8086cea922c2bfebbb49c6594967418f1f167d70"
-  integrity sha512-a0H638ZXULv1OdkmiK6s6itNhoy33ywxmUFT/xtSoVyf9VnC7n7+VT4LjVzdIHSaF5TIh9ylUgxMXksHTgGrKg==
+react-router@6.22.0:
+  version "6.22.0"
+  resolved "https://registry.npmjs.org/react-router/-/react-router-6.22.0.tgz#a22b44851a79dafc6b944cb418db3e80622b9be1"
+  integrity sha512-q2yemJeg6gw/YixRlRnVx6IRJWZD6fonnfZhN1JIOhV2iJCPeRNSH3V1ISwHf+JWcESzLC3BOLD1T07tmO5dmg==
   dependencies:
-    "@remix-run/router" "1.14.2"
+    "@remix-run/router" "1.15.0"
 
 react-spring@9.2.4:
   version "9.2.4"
@@ -9722,6 +10613,13 @@ relateurl@^0.2.7:
   resolved "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9"
   integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==
 
+release-zalgo@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz#09700b7e5074329739330e535c5a90fb67851730"
+  integrity sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==
+  dependencies:
+    es6-error "^4.0.1"
+
 remark-external-links@^8.0.0:
   version "8.0.0"
   resolved "https://registry.npmjs.org/remark-external-links/-/remark-external-links-8.0.0.tgz#308de69482958b5d1cd3692bc9b725ce0240f345"
@@ -9763,6 +10661,11 @@ require-from-string@^2.0.2:
   resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909"
   integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==
 
+require-main-filename@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b"
+  integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==
+
 requireindex@^1.1.0:
   version "1.2.0"
   resolved "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz#3463cdb22ee151902635aa6c9535d4de9c2ef1ef"
@@ -9785,6 +10688,14 @@ resolve-cwd@^3.0.0:
   dependencies:
     resolve-from "^5.0.0"
 
+resolve-dir@^0.1.0:
+  version "0.1.1"
+  resolved "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz#b219259a5602fac5c5c496ad894a6e8cc430261e"
+  integrity sha512-QxMPqI6le2u0dCLyiGzgy92kjkkL6zO0XyvHzjdTNH3zM6e5Hz3BwG6+aEyNgiQ5Xz6PwTwgQEj3U50dByPKIA==
+  dependencies:
+    expand-tilde "^1.2.2"
+    global-modules "^0.2.3"
+
 resolve-from@^4.0.0:
   version "4.0.0"
   resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
@@ -9841,14 +10752,14 @@ reusify@^1.0.4:
   resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
   integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
 
-rimraf@^2.6.1:
+rimraf@^2.6.1, rimraf@^2.6.2:
   version "2.7.1"
   resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
   integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==
   dependencies:
     glob "^7.1.3"
 
-rimraf@^3.0.2:
+rimraf@^3.0.0, rimraf@^3.0.2:
   version "3.0.2"
   resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
   integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
@@ -9862,10 +10773,10 @@ rimraf@~2.6.2:
   dependencies:
     glob "^7.1.3"
 
-run-async@^2.4.0:
-  version "2.4.1"
-  resolved "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455"
-  integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==
+run-async@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz#42a432f6d76c689522058984384df28be379daad"
+  integrity sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==
 
 run-parallel@^1.1.9:
   version "1.2.0"
@@ -9874,7 +10785,7 @@ run-parallel@^1.1.9:
   dependencies:
     queue-microtask "^1.2.2"
 
-rxjs@^7.5.5:
+rxjs@^7.8.1:
   version "7.8.1"
   resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543"
   integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==
@@ -9968,10 +10879,10 @@ scriptjs@^2.5.8:
   resolved "https://registry.npmjs.org/scriptjs/-/scriptjs-2.5.9.tgz#343915cd2ec2ed9bfdde2b9875cd28f59394b35f"
   integrity sha512-qGVDoreyYiP1pkQnbnFAUIS5AjenNwwQBdl7zeos9etl+hYKWahjRTfzAZZYBv5xNHx7vNKCmaLDQZ6Fr2AEXg==
 
-"semver@2 || 3 || 4 || 5", semver@^5.6.0, semver@^6.0.0, semver@^6.3.0, semver@^6.3.1, semver@^7.1.1, semver@^7.2.1, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3, semver@^7.5.4:
-  version "7.5.4"
-  resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e"
-  integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==
+"semver@2 || 3 || 4 || 5", semver@^5.6.0, semver@^6.0.0, semver@^6.3.0, semver@^6.3.1, semver@^7.1.1, semver@^7.2.1, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0:
+  version "7.6.0"
+  resolved "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d"
+  integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==
   dependencies:
     lru-cache "^6.0.0"
 
@@ -10011,6 +10922,11 @@ serve-static@1.15.0:
     parseurl "~1.3.3"
     send "0.18.0"
 
+set-blocking@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
+  integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==
+
 set-function-length@^1.1.1:
   version "1.2.0"
   resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.0.tgz#2f81dc6c16c7059bda5ab7c82c11f03a515ed8e1"
@@ -10089,6 +11005,11 @@ slash@^3.0.0:
   resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
   integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
 
+slash@^5.0.0:
+  version "5.1.0"
+  resolved "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz#be3adddcdf09ac38eebe8dcdc7b1a57a75b095ce"
+  integrity sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==
+
 slice-ansi@^4.0.0:
   version "4.0.0"
   resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b"
@@ -10134,6 +11055,28 @@ space-separated-tokens@^1.0.0:
   resolved "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz#85f32c3d10d9682007e917414ddc5c26d1aa6899"
   integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==
 
+spawn-wrap@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz#103685b8b8f9b79771318827aa78650a610d457e"
+  integrity sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==
+  dependencies:
+    foreground-child "^2.0.0"
+    is-windows "^1.0.2"
+    make-dir "^3.0.0"
+    rimraf "^3.0.0"
+    signal-exit "^3.0.2"
+    which "^2.0.1"
+
+spawnd@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.npmjs.org/spawnd/-/spawnd-5.0.0.tgz#ea72200bdc468998e84e1c3e7b914ce85fc1c32c"
+  integrity sha512-28+AJr82moMVWolQvlAIv3JcYDkjkFTEmfDc503wxrF5l2rQ3dFz6DpbXp3kD4zmgGGldfM4xM4v1sFj/ZaIOA==
+  dependencies:
+    exit "^0.1.2"
+    signal-exit "^3.0.3"
+    tree-kill "^1.2.2"
+    wait-port "^0.2.9"
+
 spdx-correct@^3.0.0:
   version "3.2.0"
   resolved "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c"
@@ -10165,6 +11108,11 @@ sprintf-js@~1.0.2:
   resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
   integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==
 
+ssim.js@^3.1.1:
+  version "3.5.0"
+  resolved "https://registry.npmjs.org/ssim.js/-/ssim.js-3.5.0.tgz#d7276b9ee99b57a5ff0db34035f02f35197e62df"
+  integrity sha512-Aj6Jl2z6oDmgYFFbQqK7fght19bXdOxY7Tj03nF+03M9gCBAjeIiO8/PlEGMfKDwYpw4q6iBqVq2YuREorGg/g==
+
 stack-utils@^2.0.3:
   version "2.0.6"
   resolved "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f"
@@ -10194,12 +11142,12 @@ store2@^2.14.2:
   resolved "https://registry.npmjs.org/store2/-/store2-2.14.2.tgz#56138d200f9fe5f582ad63bc2704dbc0e4a45068"
   integrity sha512-siT1RiqlfQnGqgT/YzXVUNsom9S0H1OX+dpdGN1xkyYATo4I6sep5NmsRD/40s3IIOvlCq6akxkqG82urIZW1w==
 
-storybook@^7.6.10:
-  version "7.6.10"
-  resolved "https://registry.npmjs.org/storybook/-/storybook-7.6.10.tgz#2185d26cd7b43390e3e2c7581586e2f60cdbd9bd"
-  integrity sha512-ypFeGhQTUBBfqSUVZYh7wS5ghn3O2wILCiQc4459SeUpvUn+skcqw/TlrwGSoF5EWjDA7gtRrWDxO3mnlPt5Cw==
+storybook@^7.6.16:
+  version "7.6.16"
+  resolved "https://registry.npmjs.org/storybook/-/storybook-7.6.16.tgz#313faaadb9c9fb5ee78cdbb9510b57d80d785444"
+  integrity sha512-VSfaYoV/iurMtLE/OcVtKvYe/Skkc+JGQYN0uni2djTlrDbZ1IbG2ig+E2MGOE6KlPmC3wCZhW6CevZyjdFhTQ==
   dependencies:
-    "@storybook/cli" "7.6.10"
+    "@storybook/cli" "7.6.16"
 
 stream-shift@^1.0.0:
   version "1.0.3"
@@ -10219,12 +11167,20 @@ string-length@^4.0.1:
     char-regex "^1.0.2"
     strip-ansi "^6.0.0"
 
+string-length@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.npmjs.org/string-length/-/string-length-5.0.1.tgz#3d647f497b6e8e8d41e422f7e0b23bc536c8381e"
+  integrity sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==
+  dependencies:
+    char-regex "^2.0.0"
+    strip-ansi "^7.0.1"
+
 string-template@~0.2.1:
   version "0.2.1"
   resolved "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz#42932e598a352d01fc22ec3367d9d84eec6c9add"
   integrity sha512-Yptehjogou2xm4UJbxJ4CxgZx12HBfeystp0y3x7s4Dj32ltVVG1Gg8YhKjHZkHicuKpZX/ffilA8505VbUbpw==
 
-"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3, string-width@^5.0.1, string-width@^5.1.2:
+"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3, string-width@^5.0.1, string-width@^5.1.2:
   version "4.2.3"
   resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
   integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
@@ -10596,11 +11552,6 @@ through2@^2.0.3:
     readable-stream "~2.3.6"
     xtend "~4.0.1"
 
-through@^2.3.6:
-  version "2.3.8"
-  resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
-  integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==
-
 tiny-invariant@^1.3.1:
   version "1.3.1"
   resolved "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz#8560808c916ef02ecfd55e66090df23a4b7aa642"
@@ -10623,13 +11574,6 @@ tinycolor2@^1.4.1:
   resolved "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz#f98007460169b0263b97072c5ae92484ce02d09e"
   integrity sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==
 
-tmp@^0.0.33:
-  version "0.0.33"
-  resolved "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
-  integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==
-  dependencies:
-    os-tmpdir "~1.0.2"
-
 tmpl@1.0.5:
   version "1.0.5"
   resolved "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc"
@@ -10679,6 +11623,11 @@ tr46@~0.0.3:
   resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a"
   integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==
 
+tree-kill@^1.2.2:
+  version "1.2.2"
+  resolved "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc"
+  integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==
+
 trim-newlines@^3.0.0:
   version "3.0.1"
   resolved "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144"
@@ -10777,7 +11726,7 @@ type-fest@^0.6.0:
   resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b"
   integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==
 
-type-fest@^0.8.1:
+type-fest@^0.8.0, type-fest@^0.8.1:
   version "0.8.1"
   resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d"
   integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==
@@ -10787,6 +11736,11 @@ type-fest@^2.19.0, type-fest@~2.19:
   resolved "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b"
   integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==
 
+type-fest@^3.0.0:
+  version "3.13.1"
+  resolved "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz#bb744c1f0678bea7543a2d1ec24e83e68e8c8706"
+  integrity sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==
+
 type-fest@^4.9.0:
   version "4.10.1"
   resolved "https://registry.npmjs.org/type-fest/-/type-fest-4.10.1.tgz#35e6cd34d1fe331cf261d8ebb83e64788b89db4b"
@@ -10839,6 +11793,13 @@ typed-array-length@^1.0.4:
     for-each "^0.3.3"
     is-typed-array "^1.1.9"
 
+typedarray-to-buffer@^3.1.5:
+  version "3.1.5"
+  resolved "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080"
+  integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==
+  dependencies:
+    is-typedarray "^1.0.0"
+
 typedarray@^0.0.6:
   version "0.0.6"
   resolved "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
@@ -10874,10 +11835,10 @@ undici-types@~5.26.4:
   resolved "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617"
   integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==
 
-undici@^5.28.2:
-  version "5.28.2"
-  resolved "https://registry.npmjs.org/undici/-/undici-5.28.2.tgz#fea200eac65fc7ecaff80a023d1a0543423b4c91"
-  integrity sha512-wh1pHJHnUeQV5Xa8/kyQhO7WFa8M34l026L5P/+2TYiakvGy5Rdc8jWZVyG7ieht/0WgJLEd3kcU5gKx+6GC8w==
+undici@^5.28.3:
+  version "5.28.3"
+  resolved "https://registry.npmjs.org/undici/-/undici-5.28.3.tgz#a731e0eff2c3fcfd41c1169a869062be222d1e5b"
+  integrity sha512-3ItfzbrhDlINjaP0duwnNsKpDQk3acHI3gVJ1z4fmwMK31k5G9OVIAMLSIaP6w4FaGkaAkN6zaQO9LUvZ1t7VA==
   dependencies:
     "@fastify/busboy" "^2.0.0"
 
@@ -11057,6 +12018,11 @@ utils-merge@1.0.1:
   resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
   integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==
 
+uuid@^8.3.2:
+  version "8.3.2"
+  resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2"
+  integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==
+
 uuid@^9.0.0, uuid@^9.0.1:
   version "9.0.1"
   resolved "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30"
@@ -11108,6 +12074,26 @@ w3c-xmlserializer@^4.0.0:
   dependencies:
     xml-name-validator "^4.0.0"
 
+wait-on@^7.0.0:
+  version "7.2.0"
+  resolved "https://registry.npmjs.org/wait-on/-/wait-on-7.2.0.tgz#d76b20ed3fc1e2bebc051fae5c1ff93be7892928"
+  integrity sha512-wCQcHkRazgjG5XoAq9jbTMLpNIjoSlZslrJ2+N9MxDsGEv1HnFoVjOCexL0ESva7Y9cu350j+DWADdk54s4AFQ==
+  dependencies:
+    axios "^1.6.1"
+    joi "^17.11.0"
+    lodash "^4.17.21"
+    minimist "^1.2.8"
+    rxjs "^7.8.1"
+
+wait-port@^0.2.9:
+  version "0.2.14"
+  resolved "https://registry.npmjs.org/wait-port/-/wait-port-0.2.14.tgz#6df40629be2c95aa4073ceb895abef7d872b28c6"
+  integrity sha512-kIzjWcr6ykl7WFbZd0TMae8xovwqcqbx6FM9l+7agOgUByhzdjfzZBPK2CPufldTOMxbUivss//Sh9MFawmPRQ==
+  dependencies:
+    chalk "^2.4.2"
+    commander "^3.0.2"
+    debug "^4.1.1"
+
 walker@^1.0.8:
   version "1.0.8"
   resolved "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f"
@@ -11213,7 +12199,7 @@ webpack-virtual-modules@^0.6.1:
   resolved "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.1.tgz#ac6fdb9c5adb8caecd82ec241c9631b7a3681b6f"
   integrity sha512-poXpCylU7ExuvZK8z+On3kX+S8o/2dQ/SVYueKA0D4WEMXROXgY8Ez50/bQEUmvoSMMrWcrJqCHuhAbsiwg7Dg==
 
-webpack@5, webpack@^5.90.0:
+webpack@5:
   version "5.90.0"
   resolved "https://registry.npmjs.org/webpack/-/webpack-5.90.0.tgz#313bfe16080d8b2fee6e29b6c986c0714ad4290e"
   integrity sha512-bdmyXRCXeeNIePv6R6tGPyy20aUobw4Zy8r0LUS2EWO+U+Ke/gYDgsCh7bl5rB6jPpr4r0SZa6dPxBxLooDT3w==
@@ -11243,6 +12229,36 @@ webpack@5, webpack@^5.90.0:
     watchpack "^2.4.0"
     webpack-sources "^3.2.3"
 
+webpack@^5.90.2:
+  version "5.90.2"
+  resolved "https://registry.npmjs.org/webpack/-/webpack-5.90.2.tgz#189686a8a292427076db9907d495625345805fab"
+  integrity sha512-ziXu8ABGr0InCMEYFnHrYweinHK2PWrMqnwdHk2oK3rRhv/1B+2FnfwYv5oD+RrknK/Pp/Hmyvu+eAsaMYhzCw==
+  dependencies:
+    "@types/eslint-scope" "^3.7.3"
+    "@types/estree" "^1.0.5"
+    "@webassemblyjs/ast" "^1.11.5"
+    "@webassemblyjs/wasm-edit" "^1.11.5"
+    "@webassemblyjs/wasm-parser" "^1.11.5"
+    acorn "^8.7.1"
+    acorn-import-assertions "^1.9.0"
+    browserslist "^4.21.10"
+    chrome-trace-event "^1.0.2"
+    enhanced-resolve "^5.15.0"
+    es-module-lexer "^1.2.1"
+    eslint-scope "5.1.1"
+    events "^3.2.0"
+    glob-to-regexp "^0.4.1"
+    graceful-fs "^4.2.9"
+    json-parse-even-better-errors "^2.3.1"
+    loader-runner "^4.2.0"
+    mime-types "^2.1.27"
+    neo-async "^2.6.2"
+    schema-utils "^3.2.0"
+    tapable "^2.1.1"
+    terser-webpack-plugin "^5.3.10"
+    watchpack "^2.4.0"
+    webpack-sources "^3.2.3"
+
 websocket-driver@>=0.5.1:
   version "0.7.4"
   resolved "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760"
@@ -11324,6 +12340,11 @@ which-collection@^1.0.1:
     is-weakmap "^2.0.1"
     is-weakset "^2.0.1"
 
+which-module@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409"
+  integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==
+
 which-typed-array@^1.1.11, which-typed-array@^1.1.13, which-typed-array@^1.1.2, which-typed-array@^1.1.9:
   version "1.1.13"
   resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz#870cd5be06ddb616f504e7b039c4c24898184d36"
@@ -11335,7 +12356,7 @@ which-typed-array@^1.1.11, which-typed-array@^1.1.13, which-typed-array@^1.1.2,
     gopd "^1.0.1"
     has-tostringtag "^1.0.0"
 
-which@^1.3.1:
+which@^1.2.12, which@^1.3.1:
   version "1.3.1"
   resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
   integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
@@ -11360,6 +12381,7 @@ wordwrap@^1.0.0:
   integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==
 
 "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0:
+  name wrap-ansi-cjs
   version "7.0.0"
   resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
   integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
@@ -11368,7 +12390,7 @@ wordwrap@^1.0.0:
     string-width "^4.1.0"
     strip-ansi "^6.0.0"
 
-wrap-ansi@^6.0.1:
+wrap-ansi@^6.2.0:
   version "6.2.0"
   resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53"
   integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==
@@ -11400,6 +12422,16 @@ write-file-atomic@^2.3.0:
     imurmurhash "^0.1.4"
     signal-exit "^3.0.2"
 
+write-file-atomic@^3.0.0:
+  version "3.0.3"
+  resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8"
+  integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==
+  dependencies:
+    imurmurhash "^0.1.4"
+    is-typedarray "^1.0.0"
+    signal-exit "^3.0.2"
+    typedarray-to-buffer "^3.1.5"
+
 write-file-atomic@^4.0.2:
   version "4.0.2"
   resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd"
@@ -11425,6 +12457,11 @@ xml-name-validator@^4.0.0:
   resolved "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835"
   integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==
 
+xml@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz#78ba72020029c5bc87b8a81a3cfcd74b4a2fc1e5"
+  integrity sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==
+
 xmlchars@^2.2.0:
   version "2.2.0"
   resolved "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb"
@@ -11440,6 +12477,11 @@ xtend@~4.0.1:
   resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
   integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
 
+y18n@^4.0.0:
+  version "4.0.3"
+  resolved "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf"
+  integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==
+
 y18n@^5.0.5:
   version "5.0.8"
   resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55"
@@ -11460,6 +12502,14 @@ yaml@^1.10.0:
   resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b"
   integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==
 
+yargs-parser@^18.1.2:
+  version "18.1.3"
+  resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0"
+  integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==
+  dependencies:
+    camelcase "^5.0.0"
+    decamelize "^1.2.0"
+
 yargs-parser@^20.2.3:
   version "20.2.9"
   resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee"
@@ -11470,6 +12520,23 @@ yargs-parser@^21.1.1:
   resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35"
   integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==
 
+yargs@^15.0.2:
+  version "15.4.1"
+  resolved "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8"
+  integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==
+  dependencies:
+    cliui "^6.0.0"
+    decamelize "^1.2.0"
+    find-up "^4.1.0"
+    get-caller-file "^2.0.1"
+    require-directory "^2.1.1"
+    require-main-filename "^2.0.0"
+    set-blocking "^2.0.0"
+    string-width "^4.2.0"
+    which-module "^2.0.0"
+    y18n "^4.0.0"
+    yargs-parser "^18.1.2"
+
 yargs@^17.3.1, yargs@^17.7.2:
   version "17.7.2"
   resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269"


Test patch:
diff --git a/.github/workflows/build-test-release.yml b/.github/workflows/build-test-release.yml
index c03df1097..31debca20 100644
--- a/.github/workflows/build-test-release.yml
+++ b/.github/workflows/build-test-release.yml
@@ -79,6 +79,14 @@ jobs:
     with:
       node-version: ${{ matrix.node-version }}
 
+  storybook-screenshots:
+    name: Update storybook screenshots
+    permissions:
+      contents: write
+    secrets: inherit
+    uses: ./.github/workflows/storybook-visual.yml
+    with:
+      node-version: "20"
 
   build:
     needs:
@@ -342,3 +350,42 @@ jobs:
         run: |
           poetry build
           poetry publish -n -u ${{ secrets.PYPI_USERNAME }} -p ${{ secrets.PYPI_TOKEN }}
+
+  build-test-addon-openapi-client:
+    name: build-test-addon-openapi-client Splunk ${{ matrix.splunk.version }}
+    runs-on: ubuntu-latest
+    needs:
+      - meta
+      - build-test-addon
+      - build
+      - test-unit
+      - test-smoke
+    strategy:
+      matrix:
+        splunk: ${{ fromJson(needs.meta.outputs.matrix_supportedSplunk) }}
+    steps:
+      - uses: actions/checkout@v4
+      - uses: actions/setup-python@v5
+        with:
+          python-version: "3.11"
+      - uses: actions/download-artifact@v4
+        with:
+          name: UCC-UI-build
+          path: built-ui/
+      - run: curl -sSL https://install.python-poetry.org | python3 - --version 1.5.1
+      - run: |
+          cp -R built-ui/. splunk_add_on_ucc_framework/package/appserver/static/js/
+          poetry install --only main
+      - run: poetry run ucc-gen build --source tests/testdata/test_addons/package_global_config_everything/package -o out_${{ matrix.splunk.version }}
+      - run: |
+          cp out_${{ matrix.splunk.version }}/Splunk_TA_UCCExample/appserver/static/openapi.json ./oa_${{ matrix.splunk.version }}.json
+          docker run --rm -v ${PWD}:/local openapitools/openapi-generator-cli generate -i /local/oa_${{ matrix.splunk.version }}.json -g python -o /local/restapi_client_${{ matrix.splunk.version }}
+      - run: |
+          sudo chmod -R 777 ./restapi_client_${{ matrix.splunk.version }}
+          python3 -m pip install ./restapi_client_${{ matrix.splunk.version }}
+      - run: mv out_${{ matrix.splunk.version }} output
+      - run: |
+          ./run_splunk.sh ${{ matrix.splunk.version }}
+          until curl -Lsk "https://localhost:8088/services/collector/health" &>/dev/null ; do echo -n "Waiting for HEC-" && sleep 5 ; done
+        timeout-minutes: 5
+      - run: python3 tests/testdata/expected_addons/expected_output_global_config_everything/client-test.py
diff --git a/tests/testdata/expected_addons/expected_output_global_config_everything/client-test.py b/tests/testdata/expected_addons/expected_output_global_config_everything/client-test.py
new file mode 100644
index 000000000..4716c1063
--- /dev/null
+++ b/tests/testdata/expected_addons/expected_output_global_config_everything/client-test.py
@@ -0,0 +1,34 @@
+import openapi_client
+from openapi_client.rest import ApiException
+from pprint import pprint
+
+configuration = openapi_client.Configuration(
+    host = "https://localhost:8089/servicesNS/-/Splunk_TA_UCCExample",
+    username = "admin",
+    password = "Chang3d!",
+)
+
+configuration.verify_ssl = False
+
+with openapi_client.ApiClient(configuration) as api_client:
+    api_instance = openapi_client.DefaultApi(api_client)
+    output_mode = 'json'
+
+    # List accounts (should be 0)
+    api_response = api_instance.splunk_ta_uccexample_account_get(output_mode)
+    assert not api_response.entry
+
+    # Add account some_name
+    api_instance.splunk_ta_uccexample_account_post(output_mode, "some_name", account_multiple_select="aaa", account_radio="bbb", custom_endpoint="login.example.com")
+
+    # List accounts (should be 1)
+    api_response = api_instance.splunk_ta_uccexample_account_get(output_mode)
+    assert len(api_response.entry) == 1
+    assert api_response.entry[0].name == "some_name"
+
+    # Delete account
+    api_instance.splunk_ta_uccexample_account_name_delete("some_name", output_mode)
+
+    # List accounts (should be 0)
+    api_response = api_instance.splunk_ta_uccexample_account_get(output_mode)
+    assert not api_response.entry
diff --git a/tests/testdata/test_addons/package_global_config_everything/globalConfig.json b/tests/testdata/test_addons/package_global_config_everything/globalConfig.json
index 646918be7..ece8f7873 100644
--- a/tests/testdata/test_addons/package_global_config_everything/globalConfig.json
+++ b/tests/testdata/test_addons/package_global_config_everything/globalConfig.json
@@ -94,7 +94,36 @@
                             "type": "checkbox",
                             "label": "Example Checkbox",
                             "field": "account_checkbox",
-                            "help": "This is an example checkbox for the account entity"
+                            "help": "This is an example checkbox for the account entity",
+                            "modifyFieldsOnValue": [
+                                {
+                                    "fieldValue": 1,
+                                    "fieldsToModify": [
+                                        {
+                                            "fieldId": "account_radio",
+                                            "disabled": false
+                                        },
+                                        {
+                                            "fieldId": "endpoint",
+                                            "display": true
+                                        }
+                                    ]
+                                },
+                                {
+                                    "fieldValue": 0,
+                                    "mode": "edit",
+                                    "fieldsToModify": [
+                                        {
+                                            "fieldId": "account_radio",
+                                            "disabled": true
+                                        },
+                                        {
+                                            "fieldId": "endpoint",
+                                            "display": false
+                                        }
+                                    ]
+                                }
+                            ]
                         },
                         {
                             "type": "radio",
@@ -150,7 +179,94 @@
                                         "oauth_field": "username",
                                         "label": "Username",
                                         "help": "Enter the username for this account.",
-                                        "field": "username"
+                                        "field": "username",
+                                        "modifyFieldsOnValue": [
+                                            {
+                                                "fieldValue": "[[any_other_value]]",
+                                                "fieldsToModify": [
+                                                    {
+                                                        "fieldId": "oauth_oauth_text",
+                                                        "disabled": false,
+                                                        "display": true,
+                                                        "label": "Disabled on edit for oauth 1111",
+                                                        "value": "test",
+                                                        "help": "Disabled on edit for test 1",
+                                                        "markdownMessage": {
+                                                            "markdownType": "text",
+                                                            "text": "markdown message test",
+                                                            "color": "red"
+                                                        }
+                                                    }
+                                                ]
+                                            },
+                                            {
+                                                "fieldValue": "a",
+                                                "fieldsToModify": [
+                                                    {
+                                                        "fieldId": "oauth_oauth_text",
+                                                        "display": true,
+                                                        "disabled": true,
+                                                        "label": "Disabled on edit for oauth 2222",
+                                                        "value": "test 2",
+                                                        "help": "Disabled on edit for test 2",
+                                                        "markdownMessage": {
+                                                            "markdownType": "link",
+                                                            "text": "markdown message test conf page",
+                                                            "link": "http://localhost:8000/en-GB/app/Splunk_TA_UCCExample/configuration"
+                                                        }
+                                                    }
+                                                ]
+                                            },
+                                            {
+                                                "fieldValue": "aa",
+                                                "fieldsToModify": [
+                                                    {
+                                                        "fieldId": "oauth_oauth_text",
+                                                        "disabled": false,
+                                                        "display": false,
+                                                        "label": "Disabled on edit for oauth 3333",
+                                                        "value": "test 3",
+                                                        "help": "Disabled on edit for test 3"
+                                                    }
+                                                ]
+                                            },
+                                            {
+                                                "fieldValue": "aaa",
+                                                "fieldsToModify": [
+                                                    {
+                                                        "fieldId": "oauth_oauth_text",
+                                                        "disabled": true,
+                                                        "display": true,
+                                                        "label": "Disabled on edit for oauth 4444",
+                                                        "value": "test 4",
+                                                        "help": "Disabled on edit for test 4",
+                                                        "markdownMessage": {
+                                                            "markdownType": "hybrid",
+                                                            "text": "markdown message to open token and explain sth",
+                                                            "link": "http://localhost:8000/en-GB/app/Splunk_TA_UCCExample/configuration",
+                                                            "token": "token",
+                                                            "linkText": "conf page"
+                                                        }
+                                                    }
+                                                ]
+                                            },
+                                            {
+                                                "fieldValue": "aaaa",
+                                                "fieldsToModify": [
+                                                    {
+                                                        "fieldId": "oauth_oauth_text",
+                                                        "disabled": false,
+                                                        "display": false,
+                                                        "label": "Disabled on edit for oauth 44444",
+                                                        "value": "test 5",
+                                                        "help": "Disabled on edit for test 5",
+                                                        "markdownMessage": {
+                                                            "text": "markdown message plain text"
+                                                        }
+                                                    }
+                                                ]
+                                            }
+                                        ]
                                     },
                                     {
                                         "oauth_field": "password",
@@ -201,7 +317,81 @@
                                         "oauth_field": "endpoint_token",
                                         "label": "Token endpoint",
                                         "field": "endpoint_token",
-                                        "help": "Put here endpoint used for token acqusition ie. login.salesforce.com"
+                                        "help": "Put here endpoint used for token acqusition ie. login.salesforce.com",
+                                        "modifyFieldsOnValue": [
+                                            {
+                                                "fieldValue": "[[any_other_value]]",
+                                                "fieldsToModify": [
+                                                    {
+                                                        "fieldId": "oauth_oauth_text",
+                                                        "disabled": false,
+                                                        "label": "Disabled on edit for oauth 55555"
+                                                    },
+                                                    {
+                                                        "fieldId": "endpoint_authorize",
+                                                        "display": true
+                                                    }
+                                                ]
+                                            },
+                                            {
+                                                "fieldValue": "aaaaaa",
+                                                "fieldsToModify": [
+                                                    {
+                                                        "fieldId": "oauth_oauth_text",
+                                                        "disabled": false,
+                                                        "label": "Disabled on edit for oauth 1111"
+                                                    },
+                                                    {
+                                                        "fieldId": "endpoint_authorize",
+                                                        "display": true
+                                                    }
+                                                ]
+                                            },
+                                            {
+                                                "fieldValue": "bbbbb",
+                                                "fieldsToModify": [
+                                                    {
+                                                        "fieldId": "oauth_oauth_text",
+                                                        "disabled": true,
+                                                        "label": "Disabled on edit for oauth 2222"
+                                                    },
+                                                    {
+                                                        "fieldId": "endpoint_authorize",
+                                                        "display": false
+                                                    }
+                                                ]
+                                            },
+                                            {
+                                                "fieldValue": "ccccc",
+                                                "mode": "edit",
+                                                "fieldsToModify": [
+                                                    {
+                                                        "fieldId": "oauth_oauth_text",
+                                                        "disabled": false,
+                                                        "label": "Disabled on edit for oauth 3333"
+                                                    },
+                                                    {
+                                                        "fieldId": "endpoint_authorize",
+                                                        "display": false
+                                                    }
+                                                ]
+                                            },
+                                            {
+                                                "fieldValue": "dddddd",
+                                                "mode": "create",
+                                                "fieldsToModify": [
+                                                    {
+                                                        "fieldId": "oauth_oauth_text",
+                                                        "disabled": true,
+                                                        "label": "Disabled on edit for oauth 44444"
+                                                    },
+                                                    {
+                                                        "fieldId": "endpoint_authorize",
+                                                        "display": false
+                                                    }
+                                                ]
+                                            }
+                                        ]
                                     },
                                     {
                                         "oauth_field": "endpoint_authorize",
@@ -1408,9 +1598,9 @@
     "meta": {
         "name": "Splunk_TA_UCCExample",
         "restRoot": "splunk_ta_uccexample",
-        "version": "5.36.2Ref7d7543",
+        "version": "5.37.0R9e80e3a7",
         "displayName": "Splunk UCC test Add-on",
         "schemaVersion": "0.0.3",
-        "_uccVersion": "5.36.2"
+        "_uccVersion": "5.37.0"
     }
 }
diff --git a/ui/.storybook/test-runner.ts b/ui/.storybook/test-runner.ts
new file mode 100644
index 000000000..c8f959393
--- /dev/null
+++ b/ui/.storybook/test-runner.ts
@@ -0,0 +1,55 @@
+import { getStoryContext, TestRunnerConfig } from '@storybook/test-runner';
+import { toMatchImageSnapshot } from 'jest-image-snapshot';
+
+const config: TestRunnerConfig = {
+    setup() {
+        expect.extend({ toMatchImageSnapshot });
+    },
+    async preVisit(page, context) {
+        const storyContext = await getStoryContext(page, context);
+        const parameters = storyContext.parameters;
+
+        const height = parameters.snapshots?.height || 600;
+        const width = parameters.snapshots?.width || 800;
+
+        await page.setViewportSize({ width, height });
+    },
+    async postVisit(page, context) {
+        const storyContext = await getStoryContext(page, context);
+
+        const skipSnapshot = storyContext.tags.includes('skip-snapshots');
+        if (skipSnapshot) {
+            return;
+        }
+
+        const parameters = storyContext.parameters;
+        const storyFilePath = parameters.fileName as string;
+        const [_, srcFile] = storyFilePath.split('/src/');
+        const srcStoryDir = srcFile.slice(0, srcFile.lastIndexOf('/'));
+
+        const customSnapshotsDir = `${process.cwd()}/src/${srcStoryDir}/__images__/`;
+
+        const browser = page.context().browser()?.browserType().name();
+        const componentName = context.title.split('/')[1];
+        const customSnapshotIdentifier =
+            componentName + '-' + context.name.toLowerCase().replace(/ /g, '-') + '-' + browser;
+
+        const customDiffDir = `${process.cwd()}/test-reports/visual/image_snapshot_diff/`;
+        const customReceivedDir = `${process.cwd()}/test-reports/visual/image_snapshot_received/`;
+
+        // can't use waitForPageReady because networkidle never fires due to HMR for locally running Storybook
+        await page.waitForLoadState('domcontentloaded');
+        await page.waitForLoadState('load');
+        await page.evaluate(() => document.fonts.ready);
+
+        const image = await page.screenshot({ animations: 'disabled', scale: 'css' });
+        expect(image).toMatchImageSnapshot({
+            customSnapshotsDir,
+            customDiffDir,
+            customSnapshotIdentifier,
+            storeReceivedOnFailure: true,
+            customReceivedDir,
+        });
+    },
+};
+export default config;
diff --git a/ui/src/components/FormModifications/FormModifications.test.tsx b/ui/src/components/FormModifications/FormModifications.test.tsx
new file mode 100644
index 000000000..408c69c75
--- /dev/null
+++ b/ui/src/components/FormModifications/FormModifications.test.tsx
@@ -0,0 +1,207 @@
+import React from 'react';
+import { render, within } from '@testing-library/react';
+import userEvent from '@testing-library/user-event';
+import { setUnifiedConfig } from '../../util/util';
+import {
+    firstModificationField,
+    getConfigWithModifications,
+    secondModificationField,
+    firstStandardTextField,
+    thirdModificationField,
+    secondStandardTextField,
+} from './TestConfig';
+import EntityModal, { EntityModalProps } from '../EntityModal/EntityModal';
+import { EntitiesAllowingModifications } from '../BaseFormTypes';
+import { invariant } from '../../util/invariant';
+
+const handleRequestClose = jest.fn();
+const setUpConfigWithDefaultValue = () => {
+    const newConfig = getConfigWithModifications();
+    setUnifiedConfig(newConfig);
+};
+
+const renderModalWithProps = (props: EntityModalProps) => {
+    render(<EntityModal {...props} handleRequestClose={handleRequestClose} />);
+};
+
+const props = {
+    serviceName: 'account',
+    mode: 'create',
+    stanzaName: undefined,
+    formLabel: 'formLabel',
+    page: 'configuration',
+    groupName: '',
+    open: true,
+    handleRequestClose: () => {},
+} satisfies EntityModalProps;
+
+const findMods = (
+    modificationFiled: EntitiesAllowingModifications,
+    value: string | boolean | number,
+    fieldId: string
+) => {
+    const modification = modificationFiled.modifyFieldsOnValue
+        ?.find((mod) => mod.fieldValue === value)
+        ?.fieldsToModify.find((field: { fieldId: string }) => field.fieldId === fieldId);
+    invariant(modification);
+    return modification;
+};
+
+const getAndVerifyHTMLTextComponentsForField = (field: string) => {
+    const componentParentElement = document.querySelector<HTMLElement>(`[data-name="${field}"]`)!;
+    expect(componentParentElement).toBeInTheDocument();
+    const componentInput = within(componentParentElement).getByRole('textbox');
+
+    return [componentParentElement, componentInput];
+};
+
+const getAndVerifyHTMLCheckboxComponentsForField = (field: string) => {
+    const componentParentElement = document.querySelector<HTMLElement>(`[data-name="${field}"]`)!;
+    expect(componentParentElement).toBeInTheDocument();
+    const componentInput = within(componentParentElement).getByRole('checkbox');
+
+    return [componentParentElement, componentInput];
+};
+
+it('render fields with modifications correctly', async () => {
+    setUpConfigWithDefaultValue();
+    renderModalWithProps(props);
+
+    getAndVerifyHTMLTextComponentsForField(firstStandardTextField.field);
+    getAndVerifyHTMLTextComponentsForField(secondStandardTextField.field);
+    getAndVerifyHTMLTextComponentsForField(firstModificationField.field);
+    getAndVerifyHTMLTextComponentsForField(secondModificationField.field);
+    getAndVerifyHTMLCheckboxComponentsForField(thirdModificationField.field);
+});
+
+it('verify modification after text components change', async () => {
+    setUpConfigWithDefaultValue();
+    renderModalWithProps(props);
+    const firstValueToInput = 'a';
+    const secondValueToInput = 'aa';
+
+    const [componentParentElement, componentInput] = getAndVerifyHTMLTextComponentsForField(
+        firstStandardTextField.field
+    );
+    const [component2ParentElement, component2Input] = getAndVerifyHTMLTextComponentsForField(
+        secondStandardTextField.field
+    );
+
+    const componentMakingModsTextBox1 = getAndVerifyHTMLTextComponentsForField(
+        firstModificationField.field
+    )[1];
+
+    const mods1Field1 = findMods(
+        firstModificationField,
+        firstValueToInput,
+        firstStandardTextField.field
+    );
+    const mods1Field2 = findMods(
+        firstModificationField,
+        firstValueToInput,
+        secondStandardTextField.field
+    );
+
+    const mods2Field1 = findMods(
+        firstModificationField,
+        secondValueToInput,
+        firstStandardTextField.field
+    );
+    const mods2Field2 = findMods(
+        firstModificationField,
+        secondValueToInput,
+        secondStandardTextField.field
+    );
+
+    await userEvent.type(componentMakingModsTextBox1, firstValueToInput);
+
+    const verifyAllProps = (
+        parentElement: Element,
+        input: Element,
+        mods: { value?: string | number | boolean; help?: string; label?: string }
+    ) => {
+        expect(input).toHaveAttribute('value', mods.value);
+        invariant(typeof mods.help === 'string');
+        expect(parentElement).toHaveTextContent(mods.help);
+        invariant(typeof mods.label === 'string');
+        expect(parentElement).toHaveTextContent(mods.label);
+    };
+
+    expect(componentInput).toBeDisabled();
+    verifyAllProps(componentParentElement, componentInput, mods1Field1);
+
+    expect(component2Input).toBeDisabled();
+    verifyAllProps(component2ParentElement, component2Input, mods1Field2);
+
+    await userEvent.type(componentMakingModsTextBox1, secondValueToInput);
+
+    expect(componentInput).toBeEnabled();
+    verifyAllProps(componentParentElement, componentInput, mods2Field1);
+
+    expect(component2Input).toBeEnabled();
+    verifyAllProps(component2ParentElement, component2Input, mods2Field2);
+});
+
+it('verify markdown modifications', async () => {
+    setUpConfigWithDefaultValue();
+    renderModalWithProps(props);
+
+    const firstValueToInput = 'a';
+    const secondValueToInput = 'aa';
+
+    const [componentParentElement] = getAndVerifyHTMLTextComponentsForField(
+        firstStandardTextField.field
+    );
+    const [component2ParentElement] = getAndVerifyHTMLTextComponentsForField(
+        secondStandardTextField.field
+    );
+
+    const componentMakingModsTextBox1 = getAndVerifyHTMLTextComponentsForField(
+        secondModificationField.field
+    )[1];
+
+    const firstElementOuterHTMLBeforeMods = componentParentElement.outerHTML;
+
+    const mods1Field2 = findMods(
+        secondModificationField,
+        firstValueToInput,
+        secondStandardTextField.field
+    );
+
+    const mods2Field1 = findMods(
+        secondModificationField,
+        secondValueToInput,
+        firstStandardTextField.field
+    );
+    const mods2Field2 = findMods(
+        secondModificationField,
+        secondValueToInput,
+        secondStandardTextField.field
+    );
+
+    await userEvent.type(componentMakingModsTextBox1, firstValueToInput);
+
+    const firstElementOuterHTMLAfterMods = componentParentElement.outerHTML;
+
+    // only id specified as modification so no changes should occure
+    expect(firstElementOuterHTMLBeforeMods).toEqual(firstElementOuterHTMLAfterMods);
+
+    expect(component2ParentElement.textContent).toMatchInlineSnapshot(
+        `"Standard text label second fieldmarkdown message to open conf page and explain sthStandard Text help second field"`
+    );
+
+    invariant(mods1Field2.markdownMessage?.markdownType === 'hybrid');
+    const a = within(component2ParentElement).getByRole('link', { name: 'conf page' });
+    expect(a).toHaveAttribute('href', mods1Field2.markdownMessage.link);
+
+    await userEvent.type(componentMakingModsTextBox1, secondValueToInput);
+    invariant(typeof mods2Field1.markdownMessage?.text === 'string');
+    expect(componentParentElement).toHaveTextContent(mods2Field1.markdownMessage.text);
+
+    invariant(typeof mods2Field2.markdownMessage?.text === 'string');
+    expect(component2ParentElement).toHaveTextContent(mods2Field2.markdownMessage.text);
+
+    invariant(mods2Field1.markdownMessage.markdownType === 'link');
+    const anchorElementField1 = within(componentParentElement).getByRole('link');
+    expect(anchorElementField1).toHaveAttribute('href', mods1Field2.markdownMessage.link);
+});
diff --git a/ui/src/components/MenuInput.test.tsx b/ui/src/components/MenuInput/MenuInput.test.tsx
similarity index 97%
rename from ui/src/components/MenuInput.test.tsx
rename to ui/src/components/MenuInput/MenuInput.test.tsx
index b5902b3ef..7eee98baf 100644
--- a/ui/src/components/MenuInput.test.tsx
+++ b/ui/src/components/MenuInput/MenuInput.test.tsx
@@ -4,17 +4,17 @@ import userEvent from '@testing-library/user-event';
 import { AnimationToggleProvider } from '@splunk/react-ui/AnimationToggle';
 import { z } from 'zod';
 import MenuInput from './MenuInput';
-import { mockCustomMenu, MockCustomRenderable } from '../tests/helpers';
-import { getUnifiedConfigs } from '../util/util';
+import { mockCustomMenu, MockCustomRenderable } from '../../tests/helpers';
+import { getUnifiedConfigs } from '../../util/util';
 import {
     InputsPageTableSchema,
     pages,
     TableFullServiceSchema,
     TableSchema,
-} from '../types/globalConfig/pages';
-import { getGlobalConfigMock } from '../mocks/globalConfigMock';
+} from '../../types/globalConfig/pages';
+import { getGlobalConfigMock } from '../../mocks/globalConfigMock';
 
-jest.mock('../util/util');
+jest.mock('../../util/util');
 
 const getUnifiedConfigsMock = getUnifiedConfigs as jest.Mock;
 let mockCustomMenuInstance: MockCustomRenderable;