diff --git a/development/config/import.mjs b/development/config/import.mjs
index 510ec7dad6380e813730bb5ec2b42e0942a68dc3..253cf1f17f47f0c3c3665c5f267ac3d0d68e4609 100644
--- a/development/config/import.mjs
+++ b/development/config/import.mjs
@@ -1,7 +1,7 @@
 export const projectRoot = "/home/vs/workspaces/oss/monster/monster";
 export const sourcePath = "/home/vs/workspaces/oss/monster/monster/source";
 export const developmentPath = "/home/vs/workspaces/oss/monster/monster/development";
-export const pnpxBin = "/nix/store/zp7k4i6w42mmi43cjmbyv8x8v3mgp1ck-pnpm-9.15.2/bin/pnpx";
+export const pnpxBin = "/nix/store/by7hqplbckljzzsq6jpmcjp1w4jzvxpg-pnpm-9.15.3/bin/pnpx";
 export const nodeBin = "/nix/store/hnkyz55vndmvwhg6nzpliv86gh6sxg7h-nodejs-22.10.0/bin/node";
 export const license = "/**" + "\n" +
     " * Copyright © schukai GmbH and all contributing authors, {{copyRightYear}}. All rights reserved." + "\n" +
diff --git a/development/issues/closed/277.html b/development/issues/closed/277.html
index ea5bb32eb8f0870868f820cbedebdf8a47441f01..cc5b5fc60595873092560d1619b2f4840ee5a648 100644
--- a/development/issues/closed/277.html
+++ b/development/issues/closed/277.html
@@ -15,7 +15,7 @@
 </ul>
 <main>
 
-    <!--monster-host><monster-config-manager></monster-config-manager></monster-host -->
+    <monster-host><monster-config-manager></monster-config-manager></monster-host>
     <monster-notify data-monster-option-orientation="bottom right"></monster-notify>
     <monster-monitor-attribute-errors
             data-monster-option-features-notifyUser="false"
diff --git a/flake.lock b/flake.lock
index 4ec2a18bdeb338a857f46d22b92be82f48bff54f..df381a2df2a0da096d353490bebe8dabda72126f 100644
--- a/flake.lock
+++ b/flake.lock
@@ -168,11 +168,11 @@
     },
     "nixpkgs_3": {
       "locked": {
-        "lastModified": 1735922141,
-        "narHash": "sha256-vk0xwGZSlvZ/596yxOtsk4gxsIx2VemzdjiU8zhjgWw=",
+        "lastModified": 1736200483,
+        "narHash": "sha256-JO+lFN2HsCwSLMUWXHeOad6QUxOuwe9UOAF/iSl1J4I=",
         "owner": "nixos",
         "repo": "nixpkgs",
-        "rev": "d29ab98cd4a70a387b8ceea3e930b3340d41ac5a",
+        "rev": "3f0a8ac25fb674611b98089ca3a5dd6480175751",
         "type": "github"
       },
       "original": {
@@ -261,11 +261,11 @@
         ]
       },
       "locked": {
-        "lastModified": 1716914109,
-        "narHash": "sha256-JY0PLGWzYRDQ9daKLGOBWHHuYun9nSpH9J3aSk8iDmQ=",
+        "lastModified": 1736378864,
+        "narHash": "sha256-7JSw/0AbjzM9jdkJQILEHKq8hjfTDB1tHJPLDI2oLVo=",
         "ref": "refs/heads/master",
-        "rev": "fe8dd932d6c414a93b4a69c470792b2db038e0fb",
-        "revCount": 129,
+        "rev": "b721b3d463b9f796b7652df59de975a362cc7542",
+        "revCount": 130,
         "type": "git",
         "url": "https://gitlab.schukai.com/oss/utilities/version.git"
       },
diff --git a/package.json b/package.json
index 44844cc5a696b5a928d42a0e8231114da9d9a3eb..67fa9d023f3fe4bb7b98d6dafcd0692680e999f5 100644
--- a/package.json
+++ b/package.json
@@ -50,7 +50,7 @@
     "@playwright/test": "^1.49.1",
     "@roarr/cli": "^5.12.4",
     "autoprefixer": "^10.4.20",
-    "browserslist": "^4.24.3",
+    "browserslist": "^4.24.4",
     "btoa": "^1.2.1",
     "c8": "^10.1.3",
     "chai": "^5.1.2",
@@ -64,7 +64,7 @@
     "estraverse": "^5.3.0",
     "flow-bin": "^0.247.1",
     "fs": "0.0.1-security",
-    "glob": "^11.0.0",
+    "glob": "^11.0.1",
     "graphviz": "^0.0.9",
     "jsdom": "^25.0.1",
     "jsdom-global": "^3.0.2",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 4449baaf3370066fd8623d0579fb6cf950d03517..f8e551b5ac00450fe2299305f87e1aa1fa9d3085 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -34,8 +34,8 @@ importers:
         specifier: ^10.4.20
         version: 10.4.20(postcss@8.4.49)
       browserslist:
-        specifier: ^4.24.3
-        version: 4.24.3
+        specifier: ^4.24.4
+        version: 4.24.4
       btoa:
         specifier: ^1.2.1
         version: 1.2.1
@@ -76,8 +76,8 @@ importers:
         specifier: 0.0.1-security
         version: 0.0.1-security
       glob:
-        specifier: ^11.0.0
-        version: 11.0.0
+        specifier: ^11.0.1
+        version: 11.0.1
       graphviz:
         specifier: ^0.0.9
         version: 0.0.9
@@ -119,7 +119,7 @@ importers:
         version: 13.0.1(postcss@8.4.49)
       postcss-normalize:
         specifier: ^13.0.1
-        version: 13.0.1(browserslist@4.24.3)(postcss@8.4.49)
+        version: 13.0.1(browserslist@4.24.4)(postcss@8.4.49)
       postcss-responsive-type:
         specifier: ^1.0.0
         version: 1.0.0
@@ -131,7 +131,7 @@ importers:
         version: 2.0.1
       puppeteer:
         specifier: ^23.11.1
-        version: 23.11.1(typescript@5.4.2)
+        version: 23.11.1(typescript@5.7.2)
       sinon:
         specifier: ^19.0.2
         version: 19.0.2
@@ -174,6 +174,9 @@ importers:
 
 packages:
 
+  '@asamuzakjp/css-color@2.8.2':
+    resolution: {integrity: sha512-RtWv9jFN2/bLExuZgFFZ0I3pWWeezAHGgrmjqGGWclATl1aDe3yhCUaI0Ilkp6OCk9zX7+FjvDasEX8Q9Rxc5w==}
+
   '@babel/code-frame@7.26.2':
     resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==}
     engines: {node: '>=6.9.0'}
@@ -239,6 +242,34 @@ packages:
     cpu: [x64]
     os: [win32]
 
+  '@csstools/color-helpers@5.0.1':
+    resolution: {integrity: sha512-MKtmkA0BX87PKaO1NFRTFH+UnkgnmySQOvNxJubsadusqPEC2aJ9MOQiMceZJJ6oitUl/i0L6u0M1IrmAOmgBA==}
+    engines: {node: '>=18'}
+
+  '@csstools/css-calc@2.1.1':
+    resolution: {integrity: sha512-rL7kaUnTkL9K+Cvo2pnCieqNpTKgQzy5f+N+5Iuko9HAoasP+xgprVh7KN/MaJVvVL1l0EzQq2MoqBHKSrDrag==}
+    engines: {node: '>=18'}
+    peerDependencies:
+      '@csstools/css-parser-algorithms': ^3.0.4
+      '@csstools/css-tokenizer': ^3.0.3
+
+  '@csstools/css-color-parser@3.0.7':
+    resolution: {integrity: sha512-nkMp2mTICw32uE5NN+EsJ4f5N+IGFeCFu4bGpiKgb2Pq/7J/MpyLBeQ5ry4KKtRFZaYs6sTmcMYrSRIyj5DFKA==}
+    engines: {node: '>=18'}
+    peerDependencies:
+      '@csstools/css-parser-algorithms': ^3.0.4
+      '@csstools/css-tokenizer': ^3.0.3
+
+  '@csstools/css-parser-algorithms@3.0.4':
+    resolution: {integrity: sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==}
+    engines: {node: '>=18'}
+    peerDependencies:
+      '@csstools/css-tokenizer': ^3.0.3
+
+  '@csstools/css-tokenizer@3.0.3':
+    resolution: {integrity: sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==}
+    engines: {node: '>=18'}
+
   '@csstools/normalize.css@12.1.1':
     resolution: {integrity: sha512-YAYeJ+Xqh7fUou1d1j9XHl44BmsuThiTr4iNrgCQ3J27IbhXsxXDGZ1cXv8Qvs99d4rBbLiSKy3+WZiet32PcQ==}
 
@@ -679,40 +710,6 @@ packages:
     cpu: [x64]
     os: [win32]
 
-  '@eslint-community/eslint-utils@4.4.1':
-    resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==}
-    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
-    peerDependencies:
-      eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
-
-  '@eslint-community/regexpp@4.12.1':
-    resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==}
-    engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
-
-  '@eslint/config-array@0.19.1':
-    resolution: {integrity: sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==}
-    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
-
-  '@eslint/core@0.9.1':
-    resolution: {integrity: sha512-GuUdqkyyzQI5RMIWkHhvTWLCyLo1jNK3vzkSyaExH5kHPDHcuL2VOpHjmMY+y3+NC69qAKToBqldTBgYeLSr9Q==}
-    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
-
-  '@eslint/eslintrc@3.2.0':
-    resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==}
-    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
-
-  '@eslint/js@9.17.0':
-    resolution: {integrity: sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w==}
-    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
-
-  '@eslint/object-schema@2.1.5':
-    resolution: {integrity: sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==}
-    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
-
-  '@eslint/plugin-kit@0.2.4':
-    resolution: {integrity: sha512-zSkKow6H5Kdm0ZUQUB2kV5JIXqoG0+uH5YADhaEHswm664N9Db8dXSi0nMJpacpMf+MyyglF1vnZohpEg5yUtg==}
-    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
-
   '@floating-ui/core@1.6.9':
     resolution: {integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==}
 
@@ -722,26 +719,6 @@ packages:
   '@floating-ui/utils@0.2.9':
     resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==}
 
-  '@humanfs/core@0.19.1':
-    resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==}
-    engines: {node: '>=18.18.0'}
-
-  '@humanfs/node@0.16.6':
-    resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==}
-    engines: {node: '>=18.18.0'}
-
-  '@humanwhocodes/module-importer@1.0.1':
-    resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
-    engines: {node: '>=12.22'}
-
-  '@humanwhocodes/retry@0.3.1':
-    resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==}
-    engines: {node: '>=18.18'}
-
-  '@humanwhocodes/retry@0.4.1':
-    resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==}
-    engines: {node: '>=18.18'}
-
   '@isaacs/cliui@8.0.2':
     resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
     engines: {node: '>=12'}
@@ -771,11 +748,11 @@ packages:
   '@jridgewell/trace-mapping@0.3.25':
     resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
 
-  '@microsoft/api-extractor-model@7.30.1':
-    resolution: {integrity: sha512-CTS2PlASJHxVY8hqHORVb1HdECWOEMcMnM6/kDkPr0RZapAFSIHhg9D4jxuE8g+OWYHtPc10LCpmde5pylTRlA==}
+  '@microsoft/api-extractor-model@7.30.2':
+    resolution: {integrity: sha512-3/t2F+WhkJgBzSNwlkTIL0tBgUoBqDqL66pT+nh2mPbM0NIDGVGtpqbGWPgHIzn/mn7kGS/Ep8D8po58e8UUIw==}
 
-  '@microsoft/api-extractor@7.48.1':
-    resolution: {integrity: sha512-HN9Osa1WxqLM66RaqB5nPAadx+nTIQmY/XtkFdaJvusjG8Tus++QqZtD7KPZDSkhEMGHsYeSyeU8qUzCDUXPjg==}
+  '@microsoft/api-extractor@7.49.1':
+    resolution: {integrity: sha512-jRTR/XbQF2kb+dYn8hfYSicOGA99+Fo00GrsdMwdfE3eIgLtKdH6Qa2M3wZV9S2XmbgCaGX1OdPtYctbfu5jQg==}
     hasBin: true
 
   '@microsoft/tsdoc-config@0.17.1':
@@ -953,8 +930,8 @@ packages:
       '@types/node':
         optional: true
 
-  '@rushstack/node-core-library@5.10.1':
-    resolution: {integrity: sha512-BSb/KcyBHmUQwINrgtzo6jiH0HlGFmrUy33vO6unmceuVKTEyL2q+P0fQq2oB5hvXVWOEUhxB2QvlkZluvUEmg==}
+  '@rushstack/node-core-library@5.10.2':
+    resolution: {integrity: sha512-xOF/2gVJZTfjTxbo4BDj9RtQq/HFnrrKdtem4JkyRLnwsRz2UDTg8gA1/et10fBx5RxmZD9bYVGST69W8ME5OQ==}
     peerDependencies:
       '@types/node': '*'
     peerDependenciesMeta:
@@ -964,16 +941,16 @@ packages:
   '@rushstack/rig-package@0.5.3':
     resolution: {integrity: sha512-olzSSjYrvCNxUFZowevC3uz8gvKr3WTpHQ7BkpjtRpA3wK+T0ybep/SRUMfr195gBzJm5gaXw0ZMgjIyHqJUow==}
 
-  '@rushstack/terminal@0.14.4':
-    resolution: {integrity: sha512-NxACqERW0PHq8Rpq1V6v5iTHEwkRGxenjEW+VWqRYQ8T9puUzgmGHmEZUaUEDHAe9Qyvp0/Ew04sAiQw9XjhJg==}
+  '@rushstack/terminal@0.14.5':
+    resolution: {integrity: sha512-TEOpNwwmsZVrkp0omnuTUTGZRJKTr6n6m4OITiNjkqzLAkcazVpwR1SOtBg6uzpkIBLgrcNHETqI8rbw3uiUfw==}
     peerDependencies:
       '@types/node': '*'
     peerDependenciesMeta:
       '@types/node':
         optional: true
 
-  '@rushstack/ts-command-line@4.23.2':
-    resolution: {integrity: sha512-JJ7XZX5K3ThBBva38aomgsPv1L7FV6XmSOcR6HtM7HDFZJkepqT65imw26h9ggGqMjsY0R9jcl30tzKcVj9aOQ==}
+  '@rushstack/ts-command-line@4.23.3':
+    resolution: {integrity: sha512-HazKL8fv4HMQMzrKJCrOrhyBPPdzk7iajUXgsASwjQ8ROo1cmgyqxt/k9+SdmrNLGE1zATgRqMUH3s/6smbRMA==}
 
   '@sinonjs/commons@3.0.1':
     resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==}
@@ -1018,9 +995,6 @@ packages:
   '@types/jasmine@3.10.18':
     resolution: {integrity: sha512-jOk52a1Kz+1oU5fNWwAcNe64/GsE7r/Q6ronwDox0D3ETo/cr4ICMQyeXrj7G6FPW1n8YjRoAZA2F0XBr6GicQ==}
 
-  '@types/json-schema@7.0.15':
-    resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
-
   '@types/jsonfile@6.1.4':
     resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==}
 
@@ -1079,9 +1053,6 @@ packages:
       ajv:
         optional: true
 
-  ajv@6.12.6:
-    resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
-
   ajv@8.12.0:
     resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==}
 
@@ -1162,8 +1133,8 @@ packages:
   balanced-match@1.0.2:
     resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
 
-  bare-events@2.5.3:
-    resolution: {integrity: sha512-pCO3aoRJ0MBiRMu8B7vUga0qL3L7gO1+SW7ku6qlSsMLwuhaawnuvZDyzJY/kyC63Un0XAB0OPUcfF1eTO/V+Q==}
+  bare-events@2.5.4:
+    resolution: {integrity: sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==}
 
   bare-fs@2.3.5:
     resolution: {integrity: sha512-SlE9eTxifPDJrT6YgemQ1WGFleevzwY+XAP1Xqgl56HtcrisC2CHCZ2tq6dBpcH2TnNxwUEUGhweo+lrQtYuiw==}
@@ -1204,8 +1175,8 @@ packages:
   browser-stdout@1.3.1:
     resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==}
 
-  browserslist@4.24.3:
-    resolution: {integrity: sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==}
+  browserslist@4.24.4:
+    resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==}
     engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
     hasBin: true
 
@@ -1269,8 +1240,8 @@ packages:
   caniuse-api@3.0.0:
     resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==}
 
-  caniuse-lite@1.0.30001690:
-    resolution: {integrity: sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==}
+  caniuse-lite@1.0.30001692:
+    resolution: {integrity: sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A==}
 
   chai-dom@1.12.0:
     resolution: {integrity: sha512-pLP8h6IBR8z1AdeQ+EMcJ7dXPdsax/1Q7gdGZjsnAmSBl3/gItQUYSCo32br1qOy4SlcBjvqId7ilAf3uJ2K1w==}
@@ -1450,8 +1421,8 @@ packages:
     resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==}
     engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'}
 
-  cssstyle@4.1.0:
-    resolution: {integrity: sha512-h66W1URKpBS5YMI/V8PyXvTMFT8SupJ1IzoIV8IeBC/ji8WVmrO8dGlTi+2dh6whmdk6BiKJLD/ZBkhWbcg6nA==}
+  cssstyle@4.2.1:
+    resolution: {integrity: sha512-9+vem03dMXG7gDmZ62uqmRiMRNtinIZ9ZyuF6BdxzfOD+FdN5hretzynkn0ReS2DO2GSw76RWHs0UmJPI2zUjw==}
     engines: {node: '>=18'}
 
   data-uri-to-buffer@4.0.1:
@@ -1503,9 +1474,6 @@ packages:
     resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==}
     engines: {node: '>=6'}
 
-  deep-is@0.1.4:
-    resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
-
   define-data-property@1.1.4:
     resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
     engines: {node: '>= 0.4'}
@@ -1572,8 +1540,8 @@ packages:
   ee-first@1.1.1:
     resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
 
-  electron-to-chromium@1.5.78:
-    resolution: {integrity: sha512-UmwIt7HRKN1rsJfddG5UG7rCTCTAKoS9JeOy/R0zSenAyaZ8SU3RuXlwcratxhdxGRNpk03iq8O7BA3W7ibLVw==}
+  electron-to-chromium@1.5.80:
+    resolution: {integrity: sha512-LTrKpW0AqIuHwmlVNV+cjFYTnXtM9K37OGhpe0ZI10ScPSxqVSryZHIY3WnCS5NSYbBODRTZyhRMS2h5FAEqAw==}
 
   element-internals-polyfill@1.3.12:
     resolution: {integrity: sha512-KW1k+cMGwXlx3X9nqhgmuElAfR/c/ccFt0pG4KpwK++Mx9Y+mPExxJW+jgQnqux/NQrJejgOxxg4Naf3f6y67Q==}
@@ -1659,28 +1627,10 @@ packages:
     engines: {node: '>=6.0'}
     hasBin: true
 
-  eslint-scope@8.2.0:
-    resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==}
-    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
-
-  eslint-visitor-keys@3.4.3:
-    resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
-    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
-
   eslint-visitor-keys@4.2.0:
     resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 
-  eslint@9.17.0:
-    resolution: {integrity: sha512-evtlNcpJg+cZLcnVKwsai8fExnqjGPicK7gnUtlNuzu+Fv9bI0aLpND5T44VLQtoMEnI57LoXO9XAkIXwohKrA==}
-    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
-    hasBin: true
-    peerDependencies:
-      jiti: '*'
-    peerDependenciesMeta:
-      jiti:
-        optional: true
-
   espree@10.3.0:
     resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@@ -1690,14 +1640,6 @@ packages:
     engines: {node: '>=4'}
     hasBin: true
 
-  esquery@1.6.0:
-    resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==}
-    engines: {node: '>=0.10'}
-
-  esrecurse@4.3.0:
-    resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
-    engines: {node: '>=4.0'}
-
   estraverse@5.3.0:
     resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
     engines: {node: '>=4.0'}
@@ -1734,12 +1676,6 @@ packages:
     resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==}
     engines: {node: '>=8.6.0'}
 
-  fast-json-stable-stringify@2.1.0:
-    resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
-
-  fast-levenshtein@2.0.6:
-    resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
-
   fast-printf@1.6.10:
     resolution: {integrity: sha512-GwTgG9O4FVIdShhbVF3JxOgSBY2+ePGsu2V/UONgoCPzF9VY6ZdBMKsHKCYQHZwNk3qNouUolRDsgVxcVA5G1w==}
     engines: {node: '>=10.0'}
@@ -1762,10 +1698,6 @@ packages:
     resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==}
     engines: {node: ^12.20 || >= 14.13}
 
-  file-entry-cache@8.0.0:
-    resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==}
-    engines: {node: '>=16.0.0'}
-
   fill-range@7.1.1:
     resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
     engines: {node: '>=8'}
@@ -1774,25 +1706,18 @@ packages:
     resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==}
     engines: {node: '>= 0.8'}
 
-  find-process@1.4.9:
-    resolution: {integrity: sha512-x+1gcT3k+7ipx8chx1Z7cViSdeQ/RBwDk+6GiWnMTO0+YtGFrahToxarIZM6TzDZ9UFfYPUGpBf/85v5GpBXKA==}
+  find-process@1.4.10:
+    resolution: {integrity: sha512-ncYFnWEIwL7PzmrK1yZtaccN8GhethD37RzBHG6iOZoFYB4vSmLLXfeWJjeN5nMvCJMjOtBvBBF8OgxEcikiZg==}
     hasBin: true
 
   find-up@5.0.0:
     resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
     engines: {node: '>=10'}
 
-  flat-cache@4.0.1:
-    resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==}
-    engines: {node: '>=16'}
-
   flat@5.0.2:
     resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==}
     hasBin: true
 
-  flatted@3.3.2:
-    resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==}
-
   flow-bin@0.247.1:
     resolution: {integrity: sha512-03wwQ5kPW4CYqhXvxTseMs2v6QuVwCtifVkON2UUyDg6Jp1+CaQpLAZK+sFNzQOExKp0Yvoug+fZOUb33ARwHQ==}
     engines: {node: '>=0.10.0'}
@@ -1878,16 +1803,12 @@ packages:
     resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
     engines: {node: '>= 6'}
 
-  glob-parent@6.0.2:
-    resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
-    engines: {node: '>=10.13.0'}
-
   glob@10.4.5:
     resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==}
     hasBin: true
 
-  glob@11.0.0:
-    resolution: {integrity: sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==}
+  glob@11.0.1:
+    resolution: {integrity: sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw==}
     engines: {node: 20 || >=22}
     hasBin: true
 
@@ -1900,10 +1821,6 @@ packages:
     resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==}
     engines: {node: '>=16 || 14 >=14.17'}
 
-  globals@14.0.0:
-    resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==}
-    engines: {node: '>=18'}
-
   globby@13.2.2:
     resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==}
     engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
@@ -1993,10 +1910,6 @@ packages:
     resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==}
     engines: {node: '>=8'}
 
-  imurmurhash@0.1.4:
-    resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
-    engines: {node: '>=0.8.19'}
-
   inflight@1.0.6:
     resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
     deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
@@ -2130,21 +2043,12 @@ packages:
       canvas:
         optional: true
 
-  json-buffer@3.0.1:
-    resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
-
   json-parse-even-better-errors@2.3.1:
     resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
 
-  json-schema-traverse@0.4.1:
-    resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
-
   json-schema-traverse@1.0.0:
     resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==}
 
-  json-stable-stringify-without-jsonify@1.0.1:
-    resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
-
   jsonfile@4.0.0:
     resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==}
 
@@ -2154,9 +2058,6 @@ packages:
   just-extend@6.2.0:
     resolution: {integrity: sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==}
 
-  keyv@4.5.4:
-    resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
-
   kolorist@1.8.0:
     resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==}
 
@@ -2174,10 +2075,6 @@ packages:
     resolution: {integrity: sha512-pgaBuB6wI9DdMSOZBVh2WkcbkAdEG5AUEWuNhtThu6FLIpDbzqzC/fSMmqr/j1wwQyW3SP3KGau7EbzWNkQ/yg==}
     engines: {node: '>=12'}
 
-  levn@0.4.1:
-    resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
-    engines: {node: '>= 0.8.0'}
-
   lilconfig@3.1.3:
     resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==}
     engines: {node: '>=14'}
@@ -2206,9 +2103,6 @@ packages:
   lodash.memoize@4.1.2:
     resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==}
 
-  lodash.merge@4.6.2:
-    resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
-
   lodash.uniq@4.5.0:
     resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==}
 
@@ -2290,9 +2184,6 @@ packages:
   minimatch@3.0.8:
     resolution: {integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==}
 
-  minimatch@3.1.2:
-    resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
-
   minimatch@5.1.6:
     resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==}
     engines: {node: '>=10'}
@@ -2351,9 +2242,6 @@ packages:
     engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
     hasBin: true
 
-  natural-compare@1.4.0:
-    resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
-
   nearley@2.20.1:
     resolution: {integrity: sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==}
     hasBin: true
@@ -2417,10 +2305,6 @@ packages:
   once@1.4.0:
     resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
 
-  optionator@0.9.4:
-    resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
-    engines: {node: '>= 0.8.0'}
-
   p-limit@3.1.0:
     resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
     engines: {node: '>=10'}
@@ -2816,10 +2700,6 @@ packages:
     resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==}
     engines: {node: ^10 || ^12 || >=14}
 
-  prelude-ls@1.2.1:
-    resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
-    engines: {node: '>= 0.8.0'}
-
   pretty-bytes@6.1.1:
     resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==}
     engines: {node: ^14.13.1 || >=16.0.0}
@@ -2936,11 +2816,6 @@ packages:
     resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
     engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
 
-  rimraf@6.0.1:
-    resolution: {integrity: sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==}
-    engines: {node: 20 || >=22}
-    hasBin: true
-
   roarr@7.21.1:
     resolution: {integrity: sha512-3niqt5bXFY1InKU8HKWqqYTYjtrBaxBMnXELXCXUYgtNYGUtZM5rB46HIC430AyacL95iEniGf7RgqsesykLmQ==}
     engines: {node: '>=18.0'}
@@ -2968,6 +2843,9 @@ packages:
   rrweb-cssom@0.7.1:
     resolution: {integrity: sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==}
 
+  rrweb-cssom@0.8.0:
+    resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==}
+
   rtlcss@4.3.0:
     resolution: {integrity: sha512-FI+pHEn7Wc4NqKXMXFM+VAYKEj/mRIcW4h24YVwVtyjI+EqGrLc2Hx/Ny0lrZ21cBWU2goLy36eqMcNj3AQJig==}
     engines: {node: '>=12.0.0'}
@@ -3246,8 +3124,8 @@ packages:
     resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==}
     engines: {node: '>=6'}
 
-  tough-cookie@5.0.0:
-    resolution: {integrity: sha512-FRKsF7cz96xIIeMZ82ehjC3xW2E+O2+v11udrDYewUbszngYhsGa8z6YUMMzO9QJZzzyd0nGGXnML/TReX6W8Q==}
+  tough-cookie@5.1.0:
+    resolution: {integrity: sha512-rvZUv+7MoBYTiDmFPBrhL7Ujx9Sk+q9wwm22x8c8T5IJaR+Wsyc7TNxbVxo84kZoRJZZMazowFLqpankBEQrGg==}
     engines: {node: '>=16'}
 
   tr46@0.0.3:
@@ -3275,10 +3153,6 @@ packages:
     engines: {node: '>=18'}
     hasBin: true
 
-  type-check@0.4.0:
-    resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
-    engines: {node: '>= 0.8.0'}
-
   type-detect@4.0.8:
     resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==}
     engines: {node: '>=4'}
@@ -3294,8 +3168,8 @@ packages:
   typed-query-selector@2.12.0:
     resolution: {integrity: sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==}
 
-  typescript@5.4.2:
-    resolution: {integrity: sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==}
+  typescript@5.7.2:
+    resolution: {integrity: sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==}
     engines: {node: '>=14.17'}
     hasBin: true
 
@@ -3323,8 +3197,8 @@ packages:
     resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==}
     engines: {node: '>= 0.8'}
 
-  update-browserslist-db@1.1.1:
-    resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==}
+  update-browserslist-db@1.1.2:
+    resolution: {integrity: sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==}
     hasBin: true
     peerDependencies:
       browserslist: '>= 4.21.0'
@@ -3507,10 +3381,6 @@ packages:
     engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
     hasBin: true
 
-  word-wrap@1.2.5:
-    resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
-    engines: {node: '>=0.10.0'}
-
   workerpool@6.5.1:
     resolution: {integrity: sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==}
 
@@ -3614,6 +3484,14 @@ packages:
 
 snapshots:
 
+  '@asamuzakjp/css-color@2.8.2':
+    dependencies:
+      '@csstools/css-calc': 2.1.1(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)
+      '@csstools/css-color-parser': 3.0.7(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)
+      '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3)
+      '@csstools/css-tokenizer': 3.0.3
+      lru-cache: 11.0.2
+
   '@babel/code-frame@7.26.2':
     dependencies:
       '@babel/helper-validator-identifier': 7.25.9
@@ -3659,6 +3537,26 @@ snapshots:
   '@biomejs/cli-win32-x64@1.9.2':
     optional: true
 
+  '@csstools/color-helpers@5.0.1': {}
+
+  '@csstools/css-calc@2.1.1(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)':
+    dependencies:
+      '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3)
+      '@csstools/css-tokenizer': 3.0.3
+
+  '@csstools/css-color-parser@3.0.7(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)':
+    dependencies:
+      '@csstools/color-helpers': 5.0.1
+      '@csstools/css-calc': 2.1.1(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)
+      '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3)
+      '@csstools/css-tokenizer': 3.0.3
+
+  '@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3)':
+    dependencies:
+      '@csstools/css-tokenizer': 3.0.3
+
+  '@csstools/css-tokenizer@3.0.3': {}
+
   '@csstools/normalize.css@12.1.1': {}
 
   '@csstools/selector-resolve-nested@3.0.0(postcss-selector-parser@7.0.0)':
@@ -3885,47 +3783,6 @@ snapshots:
   '@esbuild/win32-x64@0.24.2':
     optional: true
 
-  '@eslint-community/eslint-utils@4.4.1(eslint@9.17.0(jiti@1.21.7))':
-    dependencies:
-      eslint: 9.17.0(jiti@1.21.7)
-      eslint-visitor-keys: 3.4.3
-
-  '@eslint-community/regexpp@4.12.1': {}
-
-  '@eslint/config-array@0.19.1':
-    dependencies:
-      '@eslint/object-schema': 2.1.5
-      debug: 4.4.0(supports-color@8.1.1)
-      minimatch: 3.1.2
-    transitivePeerDependencies:
-      - supports-color
-
-  '@eslint/core@0.9.1':
-    dependencies:
-      '@types/json-schema': 7.0.15
-
-  '@eslint/eslintrc@3.2.0':
-    dependencies:
-      ajv: 6.12.6
-      debug: 4.4.0(supports-color@8.1.1)
-      espree: 10.3.0
-      globals: 14.0.0
-      ignore: 5.3.2
-      import-fresh: 3.3.0
-      js-yaml: 4.1.0
-      minimatch: 3.1.2
-      strip-json-comments: 3.1.1
-    transitivePeerDependencies:
-      - supports-color
-
-  '@eslint/js@9.17.0': {}
-
-  '@eslint/object-schema@2.1.5': {}
-
-  '@eslint/plugin-kit@0.2.4':
-    dependencies:
-      levn: 0.4.1
-
   '@floating-ui/core@1.6.9':
     dependencies:
       '@floating-ui/utils': 0.2.9
@@ -3937,19 +3794,6 @@ snapshots:
 
   '@floating-ui/utils@0.2.9': {}
 
-  '@humanfs/core@0.19.1': {}
-
-  '@humanfs/node@0.16.6':
-    dependencies:
-      '@humanfs/core': 0.19.1
-      '@humanwhocodes/retry': 0.3.1
-
-  '@humanwhocodes/module-importer@1.0.1': {}
-
-  '@humanwhocodes/retry@0.3.1': {}
-
-  '@humanwhocodes/retry@0.4.1': {}
-
   '@isaacs/cliui@8.0.2':
     dependencies:
       string-width: 5.1.2
@@ -3983,29 +3827,29 @@ snapshots:
       '@jridgewell/resolve-uri': 3.1.2
       '@jridgewell/sourcemap-codec': 1.5.0
 
-  '@microsoft/api-extractor-model@7.30.1(@types/node@18.19.70)':
+  '@microsoft/api-extractor-model@7.30.2(@types/node@18.19.70)':
     dependencies:
       '@microsoft/tsdoc': 0.15.1
       '@microsoft/tsdoc-config': 0.17.1
-      '@rushstack/node-core-library': 5.10.1(@types/node@18.19.70)
+      '@rushstack/node-core-library': 5.10.2(@types/node@18.19.70)
     transitivePeerDependencies:
       - '@types/node'
 
-  '@microsoft/api-extractor@7.48.1(@types/node@18.19.70)':
+  '@microsoft/api-extractor@7.49.1(@types/node@18.19.70)':
     dependencies:
-      '@microsoft/api-extractor-model': 7.30.1(@types/node@18.19.70)
+      '@microsoft/api-extractor-model': 7.30.2(@types/node@18.19.70)
       '@microsoft/tsdoc': 0.15.1
       '@microsoft/tsdoc-config': 0.17.1
-      '@rushstack/node-core-library': 5.10.1(@types/node@18.19.70)
+      '@rushstack/node-core-library': 5.10.2(@types/node@18.19.70)
       '@rushstack/rig-package': 0.5.3
-      '@rushstack/terminal': 0.14.4(@types/node@18.19.70)
-      '@rushstack/ts-command-line': 4.23.2(@types/node@18.19.70)
+      '@rushstack/terminal': 0.14.5(@types/node@18.19.70)
+      '@rushstack/ts-command-line': 4.23.3(@types/node@18.19.70)
       lodash: 4.17.21
       minimatch: 3.0.8
       resolve: 1.22.10
       semver: 7.5.4
       source-map: 0.6.1
-      typescript: 5.4.2
+      typescript: 5.7.2
     transitivePeerDependencies:
       - '@types/node'
 
@@ -4176,7 +4020,7 @@ snapshots:
     optionalDependencies:
       '@types/node': 18.19.70
 
-  '@rushstack/node-core-library@5.10.1(@types/node@18.19.70)':
+  '@rushstack/node-core-library@5.10.2(@types/node@18.19.70)':
     dependencies:
       ajv: 8.13.0
       ajv-draft-04: 1.0.0(ajv@8.13.0)
@@ -4194,16 +4038,16 @@ snapshots:
       resolve: 1.22.10
       strip-json-comments: 3.1.1
 
-  '@rushstack/terminal@0.14.4(@types/node@18.19.70)':
+  '@rushstack/terminal@0.14.5(@types/node@18.19.70)':
     dependencies:
-      '@rushstack/node-core-library': 5.10.1(@types/node@18.19.70)
+      '@rushstack/node-core-library': 5.10.2(@types/node@18.19.70)
       supports-color: 8.1.1
     optionalDependencies:
       '@types/node': 18.19.70
 
-  '@rushstack/ts-command-line@4.23.2(@types/node@18.19.70)':
+  '@rushstack/ts-command-line@4.23.3(@types/node@18.19.70)':
     dependencies:
-      '@rushstack/terminal': 0.14.4(@types/node@18.19.70)
+      '@rushstack/terminal': 0.14.5(@types/node@18.19.70)
       '@types/argparse': 1.0.38
       argparse: 1.0.10
       string-argv: 0.3.2
@@ -4254,8 +4098,6 @@ snapshots:
 
   '@types/jasmine@3.10.18': {}
 
-  '@types/json-schema@7.0.15': {}
-
   '@types/jsonfile@6.1.4':
     dependencies:
       '@types/node': 18.19.70
@@ -4316,13 +4158,6 @@ snapshots:
     optionalDependencies:
       ajv: 8.13.0
 
-  ajv@6.12.6:
-    dependencies:
-      fast-deep-equal: 3.1.3
-      fast-json-stable-stringify: 2.1.0
-      json-schema-traverse: 0.4.1
-      uri-js: 4.4.1
-
   ajv@8.12.0:
     dependencies:
       fast-deep-equal: 3.1.3
@@ -4384,8 +4219,8 @@ snapshots:
 
   autoprefixer@10.4.20(postcss@8.4.49):
     dependencies:
-      browserslist: 4.24.3
-      caniuse-lite: 1.0.30001690
+      browserslist: 4.24.4
+      caniuse-lite: 1.0.30001692
       fraction.js: 4.3.7
       normalize-range: 0.1.2
       picocolors: 1.1.1
@@ -4400,12 +4235,12 @@ snapshots:
 
   balanced-match@1.0.2: {}
 
-  bare-events@2.5.3:
+  bare-events@2.5.4:
     optional: true
 
   bare-fs@2.3.5:
     dependencies:
-      bare-events: 2.5.3
+      bare-events: 2.5.4
       bare-path: 2.1.3
       bare-stream: 2.6.1
     optional: true
@@ -4446,12 +4281,12 @@ snapshots:
 
   browser-stdout@1.3.1: {}
 
-  browserslist@4.24.3:
+  browserslist@4.24.4:
     dependencies:
-      caniuse-lite: 1.0.30001690
-      electron-to-chromium: 1.5.78
+      caniuse-lite: 1.0.30001692
+      electron-to-chromium: 1.5.80
       node-releases: 2.0.19
-      update-browserslist-db: 1.1.1(browserslist@4.24.3)
+      update-browserslist-db: 1.1.2(browserslist@4.24.4)
 
   btoa@1.2.1: {}
 
@@ -4513,12 +4348,12 @@ snapshots:
 
   caniuse-api@3.0.0:
     dependencies:
-      browserslist: 4.24.3
-      caniuse-lite: 1.0.30001690
+      browserslist: 4.24.4
+      caniuse-lite: 1.0.30001692
       lodash.memoize: 4.1.2
       lodash.uniq: 4.5.0
 
-  caniuse-lite@1.0.30001690: {}
+  caniuse-lite@1.0.30001692: {}
 
   chai-dom@1.12.0(chai@5.1.2):
     dependencies:
@@ -4639,14 +4474,14 @@ snapshots:
 
   convert-source-map@2.0.0: {}
 
-  cosmiconfig@9.0.0(typescript@5.4.2):
+  cosmiconfig@9.0.0(typescript@5.7.2):
     dependencies:
       env-paths: 2.2.1
       import-fresh: 3.3.0
       js-yaml: 4.1.0
       parse-json: 5.2.0
     optionalDependencies:
-      typescript: 5.4.2
+      typescript: 5.7.2
 
   cross-spawn@7.0.6:
     dependencies:
@@ -4684,7 +4519,7 @@ snapshots:
 
   cssnano-preset-default@7.0.6(postcss@8.4.49):
     dependencies:
-      browserslist: 4.24.3
+      browserslist: 4.24.4
       css-declaration-sorter: 7.2.0(postcss@8.4.49)
       cssnano-utils: 5.0.0(postcss@8.4.49)
       postcss: 8.4.49
@@ -4730,9 +4565,10 @@ snapshots:
     dependencies:
       css-tree: 2.2.1
 
-  cssstyle@4.1.0:
+  cssstyle@4.2.1:
     dependencies:
-      rrweb-cssom: 0.7.1
+      '@asamuzakjp/css-color': 2.8.2
+      rrweb-cssom: 0.8.0
 
   data-uri-to-buffer@4.0.1: {}
 
@@ -4763,8 +4599,6 @@ snapshots:
 
   deep-eql@5.0.2: {}
 
-  deep-is@0.1.4: {}
-
   define-data-property@1.1.4:
     dependencies:
       es-define-property: 1.0.1
@@ -4832,7 +4666,7 @@ snapshots:
 
   ee-first@1.1.1: {}
 
-  electron-to-chromium@1.5.78: {}
+  electron-to-chromium@1.5.80: {}
 
   element-internals-polyfill@1.3.12: {}
 
@@ -4973,56 +4807,8 @@ snapshots:
     optionalDependencies:
       source-map: 0.6.1
 
-  eslint-scope@8.2.0:
-    dependencies:
-      esrecurse: 4.3.0
-      estraverse: 5.3.0
-
-  eslint-visitor-keys@3.4.3: {}
-
   eslint-visitor-keys@4.2.0: {}
 
-  eslint@9.17.0(jiti@1.21.7):
-    dependencies:
-      '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0(jiti@1.21.7))
-      '@eslint-community/regexpp': 4.12.1
-      '@eslint/config-array': 0.19.1
-      '@eslint/core': 0.9.1
-      '@eslint/eslintrc': 3.2.0
-      '@eslint/js': 9.17.0
-      '@eslint/plugin-kit': 0.2.4
-      '@humanfs/node': 0.16.6
-      '@humanwhocodes/module-importer': 1.0.1
-      '@humanwhocodes/retry': 0.4.1
-      '@types/estree': 1.0.6
-      '@types/json-schema': 7.0.15
-      ajv: 6.12.6
-      chalk: 4.1.2
-      cross-spawn: 7.0.6
-      debug: 4.4.0(supports-color@8.1.1)
-      escape-string-regexp: 4.0.0
-      eslint-scope: 8.2.0
-      eslint-visitor-keys: 4.2.0
-      espree: 10.3.0
-      esquery: 1.6.0
-      esutils: 2.0.3
-      fast-deep-equal: 3.1.3
-      file-entry-cache: 8.0.0
-      find-up: 5.0.0
-      glob-parent: 6.0.2
-      ignore: 5.3.2
-      imurmurhash: 0.1.4
-      is-glob: 4.0.3
-      json-stable-stringify-without-jsonify: 1.0.1
-      lodash.merge: 4.6.2
-      minimatch: 3.1.2
-      natural-compare: 1.4.0
-      optionator: 0.9.4
-    optionalDependencies:
-      jiti: 1.21.7
-    transitivePeerDependencies:
-      - supports-color
-
   espree@10.3.0:
     dependencies:
       acorn: 8.14.0
@@ -5031,14 +4817,6 @@ snapshots:
 
   esprima@4.0.1: {}
 
-  esquery@1.6.0:
-    dependencies:
-      estraverse: 5.3.0
-
-  esrecurse@4.3.0:
-    dependencies:
-      estraverse: 5.3.0
-
   estraverse@5.3.0: {}
 
   estree-walker@0.6.1: {}
@@ -5081,10 +4859,6 @@ snapshots:
       merge2: 1.4.1
       micromatch: 4.0.8
 
-  fast-json-stable-stringify@2.1.0: {}
-
-  fast-levenshtein@2.0.6: {}
-
   fast-printf@1.6.10: {}
 
   fastq@1.18.0:
@@ -5104,10 +4878,6 @@ snapshots:
       node-domexception: 1.0.0
       web-streams-polyfill: 3.3.3
 
-  file-entry-cache@8.0.0:
-    dependencies:
-      flat-cache: 4.0.1
-
   fill-range@7.1.1:
     dependencies:
       to-regex-range: 5.0.1
@@ -5124,33 +4894,19 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  find-process@1.4.9(jiti@1.21.7):
+  find-process@1.4.10:
     dependencies:
       chalk: 4.1.2
       commander: 12.1.0
-      debug: 4.4.0(supports-color@8.1.1)
-      eslint: 9.17.0(jiti@1.21.7)
-      glob: 11.0.0
       loglevel: 1.9.2
-      rimraf: 6.0.1
-    transitivePeerDependencies:
-      - jiti
-      - supports-color
 
   find-up@5.0.0:
     dependencies:
       locate-path: 6.0.0
       path-exists: 4.0.0
 
-  flat-cache@4.0.1:
-    dependencies:
-      flatted: 3.3.2
-      keyv: 4.5.4
-
   flat@5.0.2: {}
 
-  flatted@3.3.2: {}
-
   flow-bin@0.247.1: {}
 
   for-each@0.3.3:
@@ -5244,10 +5000,6 @@ snapshots:
     dependencies:
       is-glob: 4.0.3
 
-  glob-parent@6.0.2:
-    dependencies:
-      is-glob: 4.0.3
-
   glob@10.4.5:
     dependencies:
       foreground-child: 3.3.0
@@ -5257,7 +5009,7 @@ snapshots:
       package-json-from-dist: 1.0.1
       path-scurry: 1.11.1
 
-  glob@11.0.0:
+  glob@11.0.1:
     dependencies:
       foreground-child: 3.3.0
       jackspeak: 4.0.2
@@ -5281,8 +5033,6 @@ snapshots:
       minipass: 4.2.8
       path-scurry: 1.11.1
 
-  globals@14.0.0: {}
-
   globby@13.2.2:
     dependencies:
       dir-glob: 3.0.1
@@ -5370,8 +5120,6 @@ snapshots:
 
   import-lazy@4.0.0: {}
 
-  imurmurhash@0.1.4: {}
-
   inflight@1.0.6:
     dependencies:
       once: 1.4.0
@@ -5484,7 +5232,7 @@ snapshots:
 
   jsdom@25.0.1:
     dependencies:
-      cssstyle: 4.1.0
+      cssstyle: 4.2.1
       data-urls: 5.0.0
       decimal.js: 10.4.3
       form-data: 4.0.1
@@ -5497,7 +5245,7 @@ snapshots:
       rrweb-cssom: 0.7.1
       saxes: 6.0.0
       symbol-tree: 3.2.4
-      tough-cookie: 5.0.0
+      tough-cookie: 5.1.0
       w3c-xmlserializer: 5.0.0
       webidl-conversions: 7.0.0
       whatwg-encoding: 3.1.1
@@ -5510,16 +5258,10 @@ snapshots:
       - supports-color
       - utf-8-validate
 
-  json-buffer@3.0.1: {}
-
   json-parse-even-better-errors@2.3.1: {}
 
-  json-schema-traverse@0.4.1: {}
-
   json-schema-traverse@1.0.0: {}
 
-  json-stable-stringify-without-jsonify@1.0.1: {}
-
   jsonfile@4.0.0:
     optionalDependencies:
       graceful-fs: 4.2.11
@@ -5532,10 +5274,6 @@ snapshots:
 
   just-extend@6.2.0: {}
 
-  keyv@4.5.4:
-    dependencies:
-      json-buffer: 3.0.1
-
   kolorist@1.8.0: {}
 
   ky-universal@0.10.1(ky@0.27.0)(web-streams-polyfill@3.3.3):
@@ -5548,11 +5286,6 @@ snapshots:
 
   ky@0.27.0: {}
 
-  levn@0.4.1:
-    dependencies:
-      prelude-ls: 1.2.1
-      type-check: 0.4.0
-
   lilconfig@3.1.3: {}
 
   lines-and-columns@1.2.4: {}
@@ -5574,8 +5307,6 @@ snapshots:
 
   lodash.memoize@4.1.2: {}
 
-  lodash.merge@4.6.2: {}
-
   lodash.uniq@4.5.0: {}
 
   lodash@4.17.21: {}
@@ -5644,10 +5375,6 @@ snapshots:
     dependencies:
       brace-expansion: 1.1.11
 
-  minimatch@3.1.2:
-    dependencies:
-      brace-expansion: 1.1.11
-
   minimatch@5.1.6:
     dependencies:
       brace-expansion: 2.0.1
@@ -5707,8 +5434,6 @@ snapshots:
 
   nanoid@3.3.8: {}
 
-  natural-compare@1.4.0: {}
-
   nearley@2.20.1:
     dependencies:
       commander: 2.20.3
@@ -5771,15 +5496,6 @@ snapshots:
     dependencies:
       wrappy: 1.0.2
 
-  optionator@0.9.4:
-    dependencies:
-      deep-is: 0.1.4
-      fast-levenshtein: 2.0.6
-      levn: 0.4.1
-      prelude-ls: 1.2.1
-      type-check: 0.4.0
-      word-wrap: 1.2.5
-
   p-limit@3.1.0:
     dependencies:
       yocto-queue: 0.1.0
@@ -5889,9 +5605,9 @@ snapshots:
 
   possible-typed-array-names@1.0.0: {}
 
-  postcss-browser-comments@6.0.1(browserslist@4.24.3)(postcss@8.4.49):
+  postcss-browser-comments@6.0.1(browserslist@4.24.4)(postcss@8.4.49):
     dependencies:
-      browserslist: 4.24.3
+      browserslist: 4.24.4
       postcss: 8.4.49
 
   postcss-calc@10.1.0(postcss@8.4.49):
@@ -5902,7 +5618,7 @@ snapshots:
 
   postcss-colormin@7.0.2(postcss@8.4.49):
     dependencies:
-      browserslist: 4.24.3
+      browserslist: 4.24.4
       caniuse-api: 3.0.0
       colord: 2.9.3
       postcss: 8.4.49
@@ -5910,7 +5626,7 @@ snapshots:
 
   postcss-convert-values@7.0.4(postcss@8.4.49):
     dependencies:
-      browserslist: 4.24.3
+      browserslist: 4.24.4
       postcss: 8.4.49
       postcss-value-parser: 4.2.0
 
@@ -5966,7 +5682,7 @@ snapshots:
 
   postcss-merge-rules@7.0.4(postcss@8.4.49):
     dependencies:
-      browserslist: 4.24.3
+      browserslist: 4.24.4
       caniuse-api: 3.0.0
       cssnano-utils: 5.0.0(postcss@8.4.49)
       postcss: 8.4.49
@@ -5986,7 +5702,7 @@ snapshots:
 
   postcss-minify-params@7.0.2(postcss@8.4.49):
     dependencies:
-      browserslist: 4.24.3
+      browserslist: 4.24.4
       cssnano-utils: 5.0.0(postcss@8.4.49)
       postcss: 8.4.49
       postcss-value-parser: 4.2.0
@@ -6048,7 +5764,7 @@ snapshots:
 
   postcss-normalize-unicode@7.0.2(postcss@8.4.49):
     dependencies:
-      browserslist: 4.24.3
+      browserslist: 4.24.4
       postcss: 8.4.49
       postcss-value-parser: 4.2.0
 
@@ -6062,12 +5778,12 @@ snapshots:
       postcss: 8.4.49
       postcss-value-parser: 4.2.0
 
-  postcss-normalize@13.0.1(browserslist@4.24.3)(postcss@8.4.49):
+  postcss-normalize@13.0.1(browserslist@4.24.4)(postcss@8.4.49):
     dependencies:
       '@csstools/normalize.css': 12.1.1
-      browserslist: 4.24.3
+      browserslist: 4.24.4
       postcss: 8.4.49
-      postcss-browser-comments: 6.0.1(browserslist@4.24.3)(postcss@8.4.49)
+      postcss-browser-comments: 6.0.1(browserslist@4.24.4)(postcss@8.4.49)
       sanitize.css: 13.0.0
 
   postcss-ordered-values@7.0.1(postcss@8.4.49):
@@ -6078,7 +5794,7 @@ snapshots:
 
   postcss-reduce-initial@7.0.2(postcss@8.4.49):
     dependencies:
-      browserslist: 4.24.3
+      browserslist: 4.24.4
       caniuse-api: 3.0.0
       postcss: 8.4.49
 
@@ -6151,8 +5867,6 @@ snapshots:
       picocolors: 1.1.1
       source-map-js: 1.2.1
 
-  prelude-ls@1.2.1: {}
-
   pretty-bytes@6.1.1: {}
 
   pretty-ms@7.0.1:
@@ -6207,11 +5921,11 @@ snapshots:
       - supports-color
       - utf-8-validate
 
-  puppeteer@23.11.1(typescript@5.4.2):
+  puppeteer@23.11.1(typescript@5.7.2):
     dependencies:
       '@puppeteer/browsers': 2.6.1
       chromium-bidi: 0.11.0(devtools-protocol@0.0.1367902)
-      cosmiconfig: 9.0.0(typescript@5.4.2)
+      cosmiconfig: 9.0.0(typescript@5.7.2)
       devtools-protocol: 0.0.1367902
       puppeteer-core: 23.11.1
       typed-query-selector: 2.12.0
@@ -6278,11 +5992,6 @@ snapshots:
 
   reusify@1.0.4: {}
 
-  rimraf@6.0.1:
-    dependencies:
-      glob: 11.0.0
-      package-json-from-dist: 1.0.1
-
   roarr@7.21.1:
     dependencies:
       fast-printf: 1.6.10
@@ -6334,6 +6043,8 @@ snapshots:
 
   rrweb-cssom@0.7.1: {}
 
+  rrweb-cssom@0.8.0: {}
+
   rtlcss@4.3.0:
     dependencies:
       escalade: 3.2.0
@@ -6516,7 +6227,7 @@ snapshots:
       queue-tick: 1.0.1
       text-decoder: 1.2.3
     optionalDependencies:
-      bare-events: 2.5.3
+      bare-events: 2.5.4
 
   string-argv@0.3.2: {}
 
@@ -6548,7 +6259,7 @@ snapshots:
 
   stylehacks@7.0.4(postcss@8.4.49):
     dependencies:
-      browserslist: 4.24.3
+      browserslist: 4.24.4
       postcss: 8.4.49
       postcss-selector-parser: 6.1.2
 
@@ -6642,7 +6353,7 @@ snapshots:
 
   totalist@3.0.1: {}
 
-  tough-cookie@5.0.0:
+  tough-cookie@5.1.0:
     dependencies:
       tldts: 6.1.71
 
@@ -6667,7 +6378,7 @@ snapshots:
     dependencies:
       chalk: 4.1.2
       chokidar: 3.6.0
-      find-process: 1.4.9(jiti@1.21.7)
+      find-process: 1.4.10
       glob: 9.3.5
       jiti: 1.21.7
       micromatch: 4.0.8
@@ -6680,12 +6391,6 @@ snapshots:
       ts-custom-error: 3.3.1
       yargs: 17.7.2
       zx: 7.2.3
-    transitivePeerDependencies:
-      - supports-color
-
-  type-check@0.4.0:
-    dependencies:
-      prelude-ls: 1.2.1
 
   type-detect@4.0.8: {}
 
@@ -6695,7 +6400,7 @@ snapshots:
 
   typed-query-selector@2.12.0: {}
 
-  typescript@5.4.2: {}
+  typescript@5.7.2: {}
 
   ufo@1.5.4: {}
 
@@ -6715,9 +6420,9 @@ snapshots:
 
   unpipe@1.0.0: {}
 
-  update-browserslist-db@1.1.1(browserslist@4.24.3):
+  update-browserslist-db@1.1.2(browserslist@4.24.4):
     dependencies:
-      browserslist: 4.24.3
+      browserslist: 4.24.4
       escalade: 3.2.0
       picocolors: 1.1.1
 
@@ -6768,7 +6473,7 @@ snapshots:
 
   vite-plugin-dts@1.7.3(@types/node@18.19.70)(rollup@4.30.1)(vite@4.5.5(@types/node@18.19.70)(sugarss@4.0.1(postcss@8.4.49))(terser@5.37.0)):
     dependencies:
-      '@microsoft/api-extractor': 7.48.1(@types/node@18.19.70)
+      '@microsoft/api-extractor': 7.49.1(@types/node@18.19.70)
       '@rollup/pluginutils': 5.1.4(rollup@4.30.1)
       '@rushstack/node-core-library': 3.66.1(@types/node@18.19.70)
       debug: 4.4.0(supports-color@8.1.1)
@@ -6911,8 +6616,6 @@ snapshots:
     dependencies:
       isexe: 2.0.0
 
-  word-wrap@1.2.5: {}
-
   workerpool@6.5.1: {}
 
   wrap-ansi@7.0.0:
diff --git a/source/components/datatable/datatable.mjs b/source/components/datatable/datatable.mjs
index e86a0e3f41e757e91918bb0616c350598049ad57..f9300434160a51274c0bc1a90c7051db25192513 100644
--- a/source/components/datatable/datatable.mjs
+++ b/source/components/datatable/datatable.mjs
@@ -136,7 +136,7 @@ const resizeObserverSymbol = Symbol("resizeObserver");
  * @example /examples/components/datatable/datasource Use a datasource
  * @example /examples/components/datatable/pagination Use pagination
  * @example /examples/components/datatable/filter Filer the data
- * @example /examples/components/datatable/order-by Order the data
+ * @example /examples/components/datatable/order-by Sort data
  * @example /examples/components/datatable/select-rows Select rows
  *
  * @copyright schukai GmbH
@@ -1348,7 +1348,7 @@ function initControlReferences() {
  * @throws {Error} the datasource could not be initialized
  */
 function initOptionsFromArguments() {
-	const options = {};
+	const options = {datasource:{}};
 	const selector = this.getAttribute(ATTRIBUTE_DATASOURCE_SELECTOR);
 
     if (selector) {
diff --git a/source/components/datatable/filter.mjs b/source/components/datatable/filter.mjs
index ecd0bbb5aa85f6cd639577e9cbb1b9fd00bedefb..31be8f99034c9240be07a1874d8c2bb859000991 100644
--- a/source/components/datatable/filter.mjs
+++ b/source/components/datatable/filter.mjs
@@ -12,46 +12,46 @@
  * SPDX-License-Identifier: AGPL-3.0
  */
 
-import { instanceSymbol } from "../../constants.mjs";
+import {instanceSymbol} from "../../constants.mjs";
 import {
-	findTargetElementFromEvent,
-	fireCustomEvent,
+    findTargetElementFromEvent,
+    fireCustomEvent,
 } from "../../dom/events.mjs";
 import {
-	findElementWithIdUpwards,
-	findElementWithSelectorUpwards,
+    findElementWithIdUpwards,
+    findElementWithSelectorUpwards,
 } from "../../dom/util.mjs";
 import {
-	assembleMethodSymbol,
-	CustomElement,
-	getSlottedElements,
-	registerCustomElement,
+    assembleMethodSymbol,
+    CustomElement,
+    getSlottedElements,
+    registerCustomElement,
 } from "../../dom/customelement.mjs";
-import { ID } from "../../types/id.mjs";
-import { Settings } from "./filter/settings.mjs";
-import { FilterStyleSheet } from "./stylesheet/filter.mjs";
-import { getDocument, getWindow } from "../../dom/util.mjs";
-import { getGlobal } from "../../types/global.mjs";
-import { isInstance, isFunction, isObject, isArray } from "../../types/is.mjs";
-import { Host } from "../host/host.mjs";
-import { addAttributeToken } from "../../dom/attributes.mjs";
-import { ATTRIBUTE_ERRORMESSAGE } from "../../dom/constants.mjs";
+import {ID} from "../../types/id.mjs";
+import {Settings} from "./filter/settings.mjs";
+import {FilterStyleSheet} from "./stylesheet/filter.mjs";
+import {getDocument, getWindow} from "../../dom/util.mjs";
+import {getGlobal} from "../../types/global.mjs";
+import {isInstance, isFunction, isObject, isArray} from "../../types/is.mjs";
+import {Host} from "../host/host.mjs";
+import {addAttributeToken} from "../../dom/attributes.mjs";
+import {ATTRIBUTE_ERRORMESSAGE} from "../../dom/constants.mjs";
 import "../form/message-state-button.mjs";
-import { Formatter } from "../../text/formatter.mjs";
-import { generateRangeComparisonExpression } from "../../text/util.mjs";
+import {Formatter} from "../../text/formatter.mjs";
+import {generateRangeComparisonExpression} from "../../text/util.mjs";
 
 import {
-	parseBracketedKeyValueHash,
-	createBracketedKeyValueHash,
+    parseBracketedKeyValueHash,
+    createBracketedKeyValueHash,
 } from "../../text/bracketed-key-value-hash.mjs";
-import { ThemeStyleSheet } from "../stylesheet/theme.mjs";
-import { SpaceStyleSheet } from "../stylesheet/space.mjs";
-import { FormStyleSheet } from "../stylesheet/form.mjs";
+import {ThemeStyleSheet} from "../stylesheet/theme.mjs";
+import {SpaceStyleSheet} from "../stylesheet/space.mjs";
+import {FormStyleSheet} from "../stylesheet/form.mjs";
 
 import {
-	getStoredFilterConfigKey,
-	getFilterConfigKey,
-	parseDateInput,
+    getStoredFilterConfigKey,
+    getFilterConfigKey,
+    parseDateInput,
 } from "./filter/util.mjs";
 
 import "./filter/select.mjs";
@@ -63,9 +63,10 @@ import "../form/toggle-switch.mjs";
 import "../form/context-help.mjs";
 import "../form/context-error.mjs";
 import "../form/message-state-button.mjs";
-import { getLocaleOfDocument } from "../../dom/locale.mjs";
 
-export { Filter };
+import {getLocaleOfDocument} from "../../dom/locale.mjs";
+
+export {Filter};
 
 /**
  * @private
@@ -102,7 +103,7 @@ const filterControlElementSymbol = Symbol("filterControlElement");
  * @type {symbol}
  */
 const filterSaveActionButtonElementSymbol = Symbol(
-	"filterSaveActionButtonElement",
+    "filterSaveActionButtonElement",
 );
 
 /**
@@ -162,222 +163,226 @@ const hashChangeSymbol = Symbol("hashChange");
  * @summary The Filter component is used to show and handle the filter values.
  */
 class Filter extends CustomElement {
-	/**
-	 *
-	 */
-	constructor() {
-		super();
-		this[settingsSymbol] = new Settings();
-
-		// debounce the hash change event if doSearch is called by click the search button
-		this[hashChangeSymbol] = 0;
-	}
-
-	/**
-	 * This method is called by the `instanceof` operator.
-	 * @return {symbol}
-	 */
-	static get [instanceSymbol]() {
-		return Symbol.for("@schukai/monster/components/filter@@instance");
-	}
-
-	/**
-	 *
-	 * @param {string} message
-	 * @return {Filter}
-	 */
-	showFailureMessage(message) {
-		this[searchButtonElementSymbol].setState(
-			"failed",
-			this.getOption("timeouts.message", 4000),
-		);
-		this[searchButtonElementSymbol]
-			.setMessage(message.toString())
-			.showMessage(this.getOption("timeouts.message", 4000));
-		return this;
-	}
-
-	/**
-	 *
-	 * @return {Filter}
-	 */
-	resetFailureMessage() {
-		this[searchButtonElementSymbol].hideMessage();
-		this[searchButtonElementSymbol].removeState();
-		return this;
-	}
-
-	/**
-	 *
-	 * @return {Filter}
-	 */
-	showSuccess() {
-		this[searchButtonElementSymbol].setState(
-			"successful",
-			this.getOption("timeouts.message", 4000),
-		);
-		return this;
-	}
-
-	/**
-	 * To set the options via the HTML tag, the attribute `data-monster-options` must be used.
-	 * @see {@link https://monsterjs.org/en/doc/#configurate-a-monster-control}
-	 *
-	 * The individual configuration values can be found in the table.
-	 *
-	 * @property {Object} templates Template definitions
-	 * @property {string} templates.main Main template
-	 * @property {Object} labels Label definitions
-	 * @property {string} labels.search Search button label
-	 * @property {string} labels.reset Reset button label
-	 * @property {string} labels.save Save button label
-	 * @property {string} labels.filter-name Filter name label
-	 * @property {string} labels.empty-query-and-no-default Empty query and no default query label
-	 * @property {string} labels.query-not-changed Query not changed label
-	 * @property {Object} formatter Formatter definitions
-	 * @property {Object} formatter.marker Marker definitions
-	 * @property {Object} formatter.marker.open Marker open
-	 * @property {Object} formatter.marker.close Marker close
-	 * @property {Object} features Feature definitions
-	 * @property {boolean} features.storedConfig Stored configuration, this replaces the setting `storedConfig.enabled` @since 3.97.0
-	 * @property {Object} storedConfig Stored configuration
-	 * @property {boolean} storedConfig.enabled The store has been enabled, this option will no longer have any effect. @deprecated 20250101
-	 * @property {string} storedConfig.selector Selector
-	 * @property {Object} timeouts Timeout definitions
-	 * @property {number} timeouts.message Message timeout
-	 * @property {Object} queries Query definitions
-	 * @property {Function} queries.wrap Wrap callback
-	 * @property {Function} queries.join Join callback
-	 * @property {string} query Query
-	 * @property {string} defaultQuery Default query
-	 * @property {boolean} eventProcessing Event processing
-	 */
-	get defaults() {
-		return Object.assign({}, super.defaults, {
-			templates: {
-				main: getTemplate(),
-			},
-
-			formatter: {
-				marker: {
-					open: null,
-					close: null,
-				},
-			},
-
-			labels: getTranslations(),
-
-			templateMapping: {
-				"filter-save-label": null,
-				"filter-name-label": name,
-			},
-
-			features: {
-				storedConfig: false,
-			},
-
-			storedConfig: {
-				enabled: true,
-				selector: "",
-			},
-
-			timeouts: {
-				message: 4000,
-			},
-
-			queries: {
-				wrap: (value, definition) => {
-					return value;
-				},
-				join: (queries) => {
-					if (queries.length === 0) {
-						return "";
-					}
-					return queries.join(" AND ");
-				},
-			},
-
-			query: null,
-			defaultQuery: null,
-			eventProcessing: true,
-		});
-	}
-
-	/**
-	 *
-	 * @return {string}
-	 */
-	static getTag() {
-		return "monster-datatable-filter";
-	}
-
-	/**
-	 * @return {FilterButton}
-	 * @fires monster-filter-initialized
-	 */
-	[assembleMethodSymbol]() {
-		this.setOption(
-			"templateMapping.filter-save-label",
-			this.getOption("labels.save"),
-		);
-
-		this.setOption(
-			"templateMapping.filter-name-label",
-			this.getOption("labels.filter-name"),
-		);
-
-		super[assembleMethodSymbol]();
-
-		initControlReferences.call(this);
-		initEventHandler.call(this);
-
-		initFromConfig
-			.call(this)
-			.then(() => {})
-			.catch((error) => {
-				addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, error?.message);
-			})
-			.finally(() => {
-				initFilter.call(this);
-				updateFilterTabs.call(this);
-				doSearch
-					.call(this, { showEffect: false })
-					.then(() => {
-						fireCustomEvent(this, "monster-filter-initialized");
-					})
-					.catch(() => {});
-			});
-	}
-
-	/**
-	 *
-	 */
-	connectedCallback() {
-		super.connectedCallback();
-		getWindow().addEventListener(
-			"hashchange",
-			this[locationChangeHandlerSymbol],
-		);
-	}
-
-	/**
-	 *
-	 */
-	disconnectedCallback() {
-		super.disconnectedCallback();
-
-		getWindow().removeEventListener(
-			"hashchange",
-			this[locationChangeHandlerSymbol],
-		);
-	}
-
-	/**
-	 * @return {Array<CSSStyleSheet>}
-	 */
-	static getCSSStyleSheet() {
-		return [FilterStyleSheet, FormStyleSheet, ThemeStyleSheet, SpaceStyleSheet];
-	}
+    /**
+     *
+     */
+    constructor() {
+        super();
+        this[settingsSymbol] = new Settings();
+
+        // debounce the hash change event if doSearch is called by click the search button
+        this[hashChangeSymbol] = 0;
+    }
+
+    /**
+     * This method is called by the `instanceof` operator.
+     * @return {symbol}
+     */
+    static get [instanceSymbol]() {
+        return Symbol.for("@schukai/monster/components/filter@@instance");
+    }
+
+    /**
+     *
+     * @param {string} message
+     * @return {Filter}
+     */
+    showFailureMessage(message) {
+        this[searchButtonElementSymbol].setState(
+            "failed",
+            this.getOption("timeouts.message", 4000),
+        );
+        this[searchButtonElementSymbol]
+            .setMessage(message.toString())
+            .showMessage(this.getOption("timeouts.message", 4000));
+        return this;
+    }
+
+    /**
+     *
+     * @return {Filter}
+     */
+    resetFailureMessage() {
+        this[searchButtonElementSymbol].hideMessage();
+        this[searchButtonElementSymbol].removeState();
+        return this;
+    }
+
+    /**
+     *
+     * @return {Filter}
+     */
+    showSuccess() {
+        this[searchButtonElementSymbol].setState(
+            "successful",
+            this.getOption("timeouts.message", 4000),
+        );
+        return this;
+    }
+
+    /**
+     * To set the options via the HTML tag, the attribute `data-monster-options` must be used.
+     * @see {@link https://monsterjs.org/en/doc/#configurate-a-monster-control}
+     *
+     * The individual configuration values can be found in the table.
+     *
+     * @property {Object} templates Template definitions
+     * @property {string} templates.main Main template
+     * @property {Object} labels Label definitions
+     * @property {string} labels.search Search button label
+     * @property {string} labels.reset Reset button label
+     * @property {string} labels.save Save button label
+     * @property {string} labels.filter-name Filter name label
+     * @property {string} labels.empty-query-and-no-default Empty query and no default query label
+     * @property {string} labels.query-not-changed Query not changed label
+     * @property {Object} formatter Formatter definitions
+     * @property {Object} formatter.marker Marker definitions
+     * @property {Object} formatter.marker.open Marker open
+     * @property {Object} formatter.marker.close Marker close
+     * @property {Object} features Feature definitions
+     * @property {boolean} features.storedConfig Stored configuration, this replaces the setting `storedConfig.enabled` @since 3.97.0
+     * @property {Object} storedConfig Stored configuration
+     * @property {boolean} storedConfig.enabled The store has been enabled, this option will no longer have any effect. @deprecated 20250101
+     * @property {string} storedConfig.selector Selector
+     * @property {Object} timeouts Timeout definitions
+     * @property {number} timeouts.message Message timeout
+     * @property {Object} queries Query definitions
+     * @property {Function} queries.wrap Wrap callback
+     * @property {Function} queries.join Join callback
+     * @property {string} query Query
+     * @property {string} defaultQuery Default query
+     * @property {boolean} eventProcessing Event processing
+     */
+    get defaults() {
+        return Object.assign({}, super.defaults, {
+            templates: {
+                main: getTemplate(),
+            },
+
+            formatter: {
+                marker: {
+                    open: null,
+                    close: null,
+                },
+            },
+
+            labels: getTranslations(),
+
+            templateMapping: {
+                "filter-save-label": null,
+                "filter-name-label": name,
+            },
+
+            features: {
+                storedConfig: false,
+            },
+
+            storedConfig: {
+                enabled: true,
+                selector: "",
+            },
+
+            timeouts: {
+                message: 4000,
+            },
+
+            queries: {
+                wrap: (value, definition) => {
+                    return value;
+                },
+                join: (queries) => {
+                    if (queries.length === 0) {
+                        return "";
+                    }
+                    return queries.join(" AND ");
+                },
+            },
+
+            query: null,
+            defaultQuery: null,
+            eventProcessing: true,
+        });
+    }
+
+    /**
+     *
+     * @return {string}
+     */
+    static getTag() {
+        return "monster-datatable-filter";
+    }
+
+    /**
+     * @return {FilterButton}
+     * @fires monster-filter-initialized
+     */
+    [assembleMethodSymbol]() {
+        this.setOption(
+            "templateMapping.filter-save-label",
+            this.getOption("labels.save"),
+        );
+
+        this.setOption(
+            "templateMapping.filter-name-label",
+            this.getOption("labels.filter-name"),
+        );
+
+        super[assembleMethodSymbol]();
+
+        initControlReferences.call(this);
+        getWindow().requestAnimationFrame(() => {
+            initEventHandler.call(this);
+        });
+
+        initFromConfig
+            .call(this)
+            .then(() => {
+            })
+            .catch((error) => {
+                addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, error?.message);
+            })
+            .finally(() => {
+                initFilter.call(this);
+                updateFilterTabs.call(this);
+                doSearch
+                    .call(this, {showEffect: false})
+                    .then(() => {
+                        fireCustomEvent(this, "monster-filter-initialized");
+                    })
+                    .catch(() => {
+                    });
+            });
+    }
+
+    /**
+     *
+     */
+    connectedCallback() {
+        super.connectedCallback();
+        getWindow().addEventListener(
+            "hashchange",
+            this[locationChangeHandlerSymbol],
+        );
+    }
+
+    /**
+     *
+     */
+    disconnectedCallback() {
+        super.disconnectedCallback();
+
+        getWindow().removeEventListener(
+            "hashchange",
+            this[locationChangeHandlerSymbol],
+        );
+    }
+
+    /**
+     * @return {Array<CSSStyleSheet>}
+     */
+    static getCSSStyleSheet() {
+        return [FilterStyleSheet, FormStyleSheet, ThemeStyleSheet, SpaceStyleSheet];
+    }
 }
 
 /**
@@ -385,109 +390,109 @@ class Filter extends CustomElement {
  * @returns {object}
  */
 function getTranslations() {
-	const locale = getLocaleOfDocument();
-	switch (locale.language) {
-		case "de":
-			return {
-				search: "Suchen",
-				reset: "Zurücksetzen",
-				save: "Speichern",
-				"filter-name": "Filtername",
-				"empty-query-and-no-default":
-					"Die Abfrage ist leer und es gibt keine Standardabfrage.",
-				"query-not-changed":
-					"Die Suchanfrage hat sich nicht verändert, daher ist keine Suche erforderlich.",
-			};
-		case "fr":
-			return {
-				search: "Chercher",
-				reset: "Réinitialiser",
-				save: "Sauvegarder",
-				"filter-name": "Nom du filtre",
-				"empty-query-and-no-default":
-					"La requête est vide et il n'y a pas de requête par défaut.",
-				"query-not-changed":
-					"La requête de recherche n'a pas changé, donc aucune recherche n'est nécessaire.",
-			};
-		case "sp":
-			return {
-				search: "Buscar",
-				reset: "Restablecer",
-				save: "Guardar",
-				"filter-name": "Nombre del filtro",
-				"empty-query-and-no-default":
-					"La consulta está vacía y no hay una consulta predeterminada.",
-				"query-not-changed":
-					"La solicitud de búsqueda no ha cambiado, por lo que no se requiere búsqueda.",
-			};
-		case "it":
-			return {
-				search: "Cerca",
-				reset: "Reimposta",
-				save: "Salva",
-				"filter-name": "Nome del filtro",
-				"empty-query-and-no-default":
-					"La query è vuota e non c'è una query predefinita.",
-				"query-not-changed":
-					"La richiesta di ricerca non è cambiata, quindi non è necessaria una ricerca.",
-			};
-		case "pl":
-			return {
-				search: "Szukaj",
-				reset: "Resetuj",
-				save: "Zapisz",
-				"filter-name": "Nazwa filtra",
-				"empty-query-and-no-default":
-					"Zapytanie jest puste i nie ma domyślnego zapytania.",
-				"query-not-changed":
-					"Żądanie wyszukiwania nie zmieniło się, więc wyszukiwanie nie jest wymagane.",
-			};
-		case "no":
-			return {
-				search: "Søk",
-				reset: "Tilbakestill",
-				save: "Lagre",
-				"filter-name": "Filternavn",
-				"empty-query-and-no-default":
-					"Spørringen er tom og det er ingen standardspørring.",
-				"query-not-changed":
-					"Søkeforespørselen har ikke endret seg, så ingen søk er nødvendig.",
-			};
-		case "dk":
-			return {
-				search: "Søg",
-				reset: "Nulstil",
-				save: "Gem",
-				"filter-name": "Filternavn",
-				"empty-query-and-no-default":
-					"Forespørgslen er tom og der er ingen standardforespørgsel.",
-				"query-not-changed":
-					"Søgeanmodningen er ikke ændret, så ingen søgning er nødvendig.",
-			};
-		case "sw":
-			return {
-				search: "Sök",
-				reset: "Återställ",
-				save: "Spara",
-				"filter-name": "Filternamn",
-				"empty-query-and-no-default":
-					"Förfrågan är tom och det finns ingen standardförfrågan.",
-				"query-not-changed":
-					"Sökförfrågan har inte ändrats, så ingen sökning krävs.",
-			};
-		default:
-		case "en":
-			return {
-				search: "Search",
-				reset: "Reset",
-				save: "Save",
-				"filter-name": "Filter name",
-				"empty-query-and-no-default":
-					"The query is empty and there is no default query.",
-				"query-not-changed":
-					"The search request has not changed, so no search is required.",
-			};
-	}
+    const locale = getLocaleOfDocument();
+    switch (locale.language) {
+        case "de":
+            return {
+                search: "Suchen",
+                reset: "Zurücksetzen",
+                save: "Speichern",
+                "filter-name": "Filtername",
+                "empty-query-and-no-default":
+                    "Die Abfrage ist leer und es gibt keine Standardabfrage.",
+                "query-not-changed":
+                    "Die Suchanfrage hat sich nicht verändert, daher ist keine Suche erforderlich.",
+            };
+        case "fr":
+            return {
+                search: "Chercher",
+                reset: "Réinitialiser",
+                save: "Sauvegarder",
+                "filter-name": "Nom du filtre",
+                "empty-query-and-no-default":
+                    "La requête est vide et il n'y a pas de requête par défaut.",
+                "query-not-changed":
+                    "La requête de recherche n'a pas changé, donc aucune recherche n'est nécessaire.",
+            };
+        case "sp":
+            return {
+                search: "Buscar",
+                reset: "Restablecer",
+                save: "Guardar",
+                "filter-name": "Nombre del filtro",
+                "empty-query-and-no-default":
+                    "La consulta está vacía y no hay una consulta predeterminada.",
+                "query-not-changed":
+                    "La solicitud de búsqueda no ha cambiado, por lo que no se requiere búsqueda.",
+            };
+        case "it":
+            return {
+                search: "Cerca",
+                reset: "Reimposta",
+                save: "Salva",
+                "filter-name": "Nome del filtro",
+                "empty-query-and-no-default":
+                    "La query è vuota e non c'è una query predefinita.",
+                "query-not-changed":
+                    "La richiesta di ricerca non è cambiata, quindi non è necessaria una ricerca.",
+            };
+        case "pl":
+            return {
+                search: "Szukaj",
+                reset: "Resetuj",
+                save: "Zapisz",
+                "filter-name": "Nazwa filtra",
+                "empty-query-and-no-default":
+                    "Zapytanie jest puste i nie ma domyślnego zapytania.",
+                "query-not-changed":
+                    "Żądanie wyszukiwania nie zmieniło się, więc wyszukiwanie nie jest wymagane.",
+            };
+        case "no":
+            return {
+                search: "Søk",
+                reset: "Tilbakestill",
+                save: "Lagre",
+                "filter-name": "Filternavn",
+                "empty-query-and-no-default":
+                    "Spørringen er tom og det er ingen standardspørring.",
+                "query-not-changed":
+                    "Søkeforespørselen har ikke endret seg, så ingen søk er nødvendig.",
+            };
+        case "dk":
+            return {
+                search: "Søg",
+                reset: "Nulstil",
+                save: "Gem",
+                "filter-name": "Filternavn",
+                "empty-query-and-no-default":
+                    "Forespørgslen er tom og der er ingen standardforespørgsel.",
+                "query-not-changed":
+                    "Søgeanmodningen er ikke ændret, så ingen søgning er nødvendig.",
+            };
+        case "sw":
+            return {
+                search: "Sök",
+                reset: "Återställ",
+                save: "Spara",
+                "filter-name": "Filternamn",
+                "empty-query-and-no-default":
+                    "Förfrågan är tom och det finns ingen standardförfrågan.",
+                "query-not-changed":
+                    "Sökförfrågan har inte ändrats, så ingen sökning krävs.",
+            };
+        default:
+        case "en":
+            return {
+                search: "Search",
+                reset: "Reset",
+                save: "Save",
+                "filter-name": "Filter name",
+                "empty-query-and-no-default":
+                    "The query is empty and there is no default query.",
+                "query-not-changed":
+                    "The search request has not changed, so no search is required.",
+            };
+    }
 }
 
 /**
@@ -495,51 +500,51 @@ function getTranslations() {
  * @return {FilterButton}
  */
 function initControlReferences() {
-	if (!this.shadowRoot) {
-		throw new Error("no shadow-root is defined");
-	}
-
-	this[filterControlElementSymbol] = this.shadowRoot.querySelector(
-		"[data-monster-role=control]",
-	);
-	this[filterSelectElementSymbol] = this.shadowRoot.querySelector(
-		"[data-monster-role=filter-select]",
-	);
-	this[searchButtonElementSymbol] = this.shadowRoot.querySelector(
-		"[data-monster-role=search-button]",
-	);
-	this[resetButtonElementSymbol] = this.shadowRoot.querySelector(
-		"[data-monster-role=reset-button]",
-	);
-
-	this[saveButtonElementSymbol] = this.shadowRoot.querySelector(
-		"[data-monster-role=save-button]",
-	);
-
-	this[filterSaveActionButtonElementSymbol] = this.shadowRoot.querySelector(
-		"[data-monster-role=save-action-button]",
-	);
-
-	this[filterTabElementSymbol] = findElementWithSelectorUpwards(
-		this,
-		this.getOption("storedConfig.selector", ""),
-	);
-
-	return this;
+    if (!this.shadowRoot) {
+        throw new Error("no shadow-root is defined");
+    }
+
+    this[filterControlElementSymbol] = this.shadowRoot.querySelector(
+        "[data-monster-role=control]",
+    );
+    this[filterSelectElementSymbol] = this.shadowRoot.querySelector(
+        "[data-monster-role=filter-select]",
+    );
+    this[searchButtonElementSymbol] = this.shadowRoot.querySelector(
+        "[data-monster-role=search-button]",
+    );
+    this[resetButtonElementSymbol] = this.shadowRoot.querySelector(
+        "[data-monster-role=reset-button]",
+    );
+
+    this[saveButtonElementSymbol] = this.shadowRoot.querySelector(
+        "[data-monster-role=save-button]",
+    );
+
+    this[filterSaveActionButtonElementSymbol] = this.shadowRoot.querySelector(
+        "[data-monster-role=save-action-button]",
+    );
+
+    this[filterTabElementSymbol] = findElementWithSelectorUpwards(
+        this,
+        this.getOption("storedConfig.selector", ""),
+    );
+
+    return this;
 }
 
 function updateFilterSelections() {
-	queueMicrotask(() => {
-		const options = this[settingsSymbol].getOptions();
-		this[filterSelectElementSymbol].setOption("options", options);
-
-		setTimeout(() => {
-			window.requestAnimationFrame(() => {
-				this[filterSelectElementSymbol].value =
-					this[settingsSymbol].getSelected();
-			});
-		}, 0);
-	});
+    queueMicrotask(() => {
+        const options = this[settingsSymbol].getOptions();
+        this[filterSelectElementSymbol].setOption("options", options);
+
+        setTimeout(() => {
+            window.requestAnimationFrame(() => {
+                this[filterSelectElementSymbol].value =
+                    this[settingsSymbol].getSelected();
+            });
+        }, 0);
+    });
 }
 
 /**
@@ -547,64 +552,65 @@ function updateFilterSelections() {
  * @throws {Error} no filter label is defined
  */
 function initFilter() {
-	const storedSetting = this[settingsSymbol];
-	this[settingsSymbol] = new Settings();
-
-	const result = parseBracketedKeyValueHash(getGlobal().location.hash);
-	let valuesFromHash = {};
-	if (isObject(result) && result?.[this.id]) {
-		valuesFromHash = result[this.id];
-	}
-
-	getSlottedElements
-		.call(this, "label[data-monster-label]")
-		.forEach((element) => {
-			const label = element.getAttribute("data-monster-label");
-			if (!label) {
-				addAttributeToken(
-					this,
-					ATTRIBUTE_ERRORMESSAGE,
-					"no filter label is defined",
-				);
-				return;
-			}
-
-			let value = element.id;
-			if (!value) {
-				const prefix = label.replace(/\W/g, "-");
-				prefix.charAt(0).match(/[\d_]/g)?.length ? `f${prefix}` : prefix;
-
-				value = new ID(prefix + "-").toString();
-				element.id = value;
-			}
-
-			let setting = storedSetting.get(value);
-
-			if (setting) {
-				this[settingsSymbol].set(setting);
-			}
-
-			if (valuesFromHash?.[element.id]) {
-				const v = escapeAttributeValue(valuesFromHash[element.id]);
-				const searchInput = element.firstElementChild;
-				try {
-					searchInput.value = v;
-				} catch (error) {}
-			}
-
-			setting = this[settingsSymbol].get(value);
-			let visible = false;
-			if (setting) {
-				setSlotAttribute(element, setting.visible);
-				visible = setting.visible;
-			} else {
-				visible = getVisibilityFromSlotAttribute(element);
-			}
-
-			this[settingsSymbol].set({ value, label, visible });
-		});
-
-	updateFilterSelections.call(this);
+    const storedSetting = this[settingsSymbol];
+    this[settingsSymbol] = new Settings();
+
+    const result = parseBracketedKeyValueHash(getGlobal().location.hash);
+    let valuesFromHash = {};
+    if (isObject(result) && result?.[this.id]) {
+        valuesFromHash = result[this.id];
+    }
+
+    getSlottedElements
+        .call(this, "label[data-monster-label]")
+        .forEach((element) => {
+            const label = element.getAttribute("data-monster-label");
+            if (!label) {
+                addAttributeToken(
+                    this,
+                    ATTRIBUTE_ERRORMESSAGE,
+                    "no filter label is defined",
+                );
+                return;
+            }
+
+            let value = element.id;
+            if (!value) {
+                const prefix = label.replace(/\W/g, "-");
+                prefix.charAt(0).match(/[\d_]/g)?.length ? `f${prefix}` : prefix;
+
+                value = new ID(prefix + "-").toString();
+                element.id = value;
+            }
+
+            let setting = storedSetting.get(value);
+
+            if (setting) {
+                this[settingsSymbol].set(setting);
+            }
+
+            if (valuesFromHash?.[element.id]) {
+                const v = escapeAttributeValue(valuesFromHash[element.id]);
+                const searchInput = element.firstElementChild;
+                try {
+                    searchInput.value = v;
+                } catch (error) {
+                }
+            }
+
+            setting = this[settingsSymbol].get(value);
+            let visible = false;
+            if (setting) {
+                setSlotAttribute(element, setting.visible);
+                visible = setting.visible;
+            } else {
+                visible = getVisibilityFromSlotAttribute(element);
+            }
+
+            this[settingsSymbol].set({value, label, visible});
+        });
+
+    updateFilterSelections.call(this);
 }
 
 /**
@@ -613,16 +619,16 @@ function initFilter() {
  * @return {*}
  */
 function escapeAttributeValue(input) {
-	if (input === undefined || input === null) {
-		return input;
-	}
-
-	return input
-		.replace(/&/g, "&amp;")
-		.replace(/"/g, "&quot;")
-		.replace(/'/g, "&#x27;")
-		.replace(/</g, "&lt;")
-		.replace(/>/g, "&gt;");
+    if (input === undefined || input === null) {
+        return input;
+    }
+
+    return input
+        .replace(/&/g, "&amp;")
+        .replace(/"/g, "&quot;")
+        .replace(/'/g, "&#x27;")
+        .replace(/</g, "&lt;")
+        .replace(/>/g, "&gt;");
 }
 
 /**
@@ -631,9 +637,9 @@ function escapeAttributeValue(input) {
  * @return {boolean}
  */
 function getVisibilityFromSlotAttribute(element) {
-	return !(
-		element.hasAttribute("slot") && element.getAttribute("slot") === "hidden"
-	);
+    return !(
+        element.hasAttribute("slot") && element.getAttribute("slot") === "hidden"
+    );
 }
 
 /**
@@ -642,369 +648,376 @@ function getVisibilityFromSlotAttribute(element) {
  * @param {boolean} visible
  */
 function setSlotAttribute(element, visible) {
-	if (visible) {
-		element.removeAttribute("slot");
-		return;
-	}
+    if (visible) {
+        element.removeAttribute("slot");
+        return;
+    }
 
-	element.setAttribute("slot", "hidden");
+    element.setAttribute("slot", "hidden");
 }
 
 /**
  * @private
  */
 function initEventHandler() {
-	const self = this;
-
-	let lastHash = getGlobal().location.hash;
-	self[locationChangeHandlerSymbol] = () => {
-		if (lastHash === getGlobal().location.hash) {
-			return;
-		}
-
-		/**
-		 * debounce the hash change event if doSearch
-		 * is called by click the search button
-		 */
-		if (self[hashChangeSymbol] > 0) {
-			self[hashChangeSymbol]--;
-			return;
-		}
-
-		initFilter.call(this);
-
-		doSearch
-			.call(self)
-			.then(() => {})
-			.catch((error) => {})
-			.finally(() => {
-				lastHash = getGlobal().location.hash;
-			});
-	};
-
-	/**
-	 * Monster.Components.Form.event:monster-selection-cleared
-	 */
-	if (self[filterSelectElementSymbol]) {
-		self[filterSelectElementSymbol].addEventListener(
-			"monster-selection-cleared",
-			function () {
-				const settings = self[settingsSymbol].getOptions();
-
-				for (const setting of settings) {
-					const filterElement = findElementWithIdUpwards(self, setting.value);
-					if (filterElement) {
-						setSlotAttribute(filterElement, false);
-
-						self[settingsSymbol].set({ value: setting.value, visible: false });
-					}
-				}
-
-				updateConfig.call(self);
-			},
-		);
-
-		self[filterSelectElementSymbol].addEventListener(
-			"monster-changed",
-			function (event) {
-				const filterElement = findElementWithIdUpwards(
-					self,
-					event.detail.value,
-				);
-				if (filterElement) {
-					setSlotAttribute(filterElement, event.detail.checked);
-				}
-
-				self[settingsSymbol].set({
-					value: event.detail.value,
-					visible: event.detail.checked,
-				});
-
-				updateConfig.call(self);
-			},
-		);
-	}
-
-	/** save the current filter */
-	if (self[filterSaveActionButtonElementSymbol]) {
-		self[filterSaveActionButtonElementSymbol].setOption(
-			"actions.click",
-			function (event) {
-				const button = findTargetElementFromEvent(
-					event,
-					"data-monster-role",
-					"save-action-button",
-				);
-				const form = button.closest("[data-monster-role=form]");
-
-				if (!form) {
-					button.setState("failed", self.getOption("timeouts.message", 4000));
-					return;
-				}
-
-				const input = form.querySelector("input[name=filter-name]");
-				if (!input) {
-					button.setState("failed", self.getOption("timeouts.message", 4000));
-					return;
-				}
-
-				const name = input.value;
-				if (!name) {
-					button.setState("failed", self.getOption("timeouts.message", 4000));
-					button.setMessage("Please enter a name").showMessage();
-					return;
-				}
-
-				doSearch
-					.call(self, { showEffect: false })
-					.then(() => {
-						const configKey = getStoredFilterConfigKey.call(self);
-						const host = getDocument().querySelector("monster-host");
-						if (!host) {
-							return;
-						}
-
-						const query = self.getOption("query");
-						if (!query) {
-							button.setState(
-								"failed",
-								self.getOption(
-									"timeouts.message",
-									self.getOption("timeouts.message", 4000),
-								),
-							);
-							button
-								.setMessage("No query found")
-								.showMessage(self.getOption("timeouts.message", 4000));
-							return;
-						}
-
-						host
-							.hasConfig(configKey)
-							.then((hasConfig) => {
-								return new Promise((resolve, reject) => {
-									if (hasConfig) {
-										host.getConfig(configKey).then(resolve).catch(reject);
-										return;
-									}
-									return resolve({});
-								});
-							})
-							.then((config) => {
-								config[name] = query;
-								return host.setConfig(configKey, {
-									...config,
-								});
-							})
-							.then(() => {
-								button.setState(
-									"successful",
-									self.getOption("timeouts.message", 4000),
-								);
-								updateFilterTabs.call(self);
-							})
-							.catch((error) => {
-								button.setState(
-									"failed",
-									self.getOption("timeouts.message", 4000),
-								);
-								button
-									.setMessage(error.message)
-									.showMessage(self.getOption("timeouts.message", 4000));
-							});
-					})
-					.catch((error) => {
-						button.setState("failed", self.getOption("timeouts.message", 4000));
-						const msg = error.message || error;
-						button
-							.setMessage(msg)
-							.showMessage(self.getOption("timeouts.message", 4000));
-					});
-			},
-		);
-	}
-
-	self[searchButtonElementSymbol].setOption("actions.click", () => {
-		self[hashChangeSymbol] = 1;
-
-		doSearch
-			.call(self)
-			.then(() => {})
-			.catch((error) => {});
-	});
-
-	// the reset button should reset the filter and the search query
-	// all input elements should be reset to their default values
-	// which is the empty string. we search for all input elements
-	// in the filter and reset them to their default value
-	self[resetButtonElementSymbol].setOption("actions.click", () => {
-		getSlottedElements
-			.call(self, "label[data-monster-label]")
-			.forEach((element) => {
-				const label = element.getAttribute("data-monster-label");
-				if (!label) {
-					return;
-				}
-
-				const input = element.firstElementChild;
-
-				if (input) {
-					input.value = "";
-				}
-			});
-
-		doSearch
-			.call(self, { showEffect: false })
-			.then(() => {})
-			.catch((e) => addAttributeToken(self, ATTRIBUTE_ERRORMESSAGE, e.message));
-	});
-
-	self.addEventListener("keyup", (event) => {
-		const path = event.composedPath();
-		if (path.length === 0) {
-			return;
-		}
-
-		if (!(path[0] instanceof HTMLInputElement)) {
-			return;
-		}
-
-		if (event.keyCode === 13) {
-			doSearch
-				.call(self, { showEffect: false })
-				.then(() => {})
-				.catch((error) => {});
-		}
-	});
-
-	// tabs
-	const element = this[filterTabElementSymbol];
-	if (element) {
-		initTabEvents.call(this);
-	}
+    const self = this;
+
+    let lastHash = getGlobal().location.hash;
+    self[locationChangeHandlerSymbol] = () => {
+        if (lastHash === getGlobal().location.hash) {
+            return;
+        }
+
+        /**
+         * debounce the hash change event if doSearch
+         * is called by click the search button
+         */
+        if (self[hashChangeSymbol] > 0) {
+            self[hashChangeSymbol]--;
+            return;
+        }
+
+        initFilter.call(this);
+
+        doSearch
+            .call(self)
+            .then(() => {
+            })
+            .catch((error) => {
+            })
+            .finally(() => {
+                lastHash = getGlobal().location.hash;
+            });
+    };
+
+    /**
+     * Monster.Components.Form.event:monster-selection-cleared
+     */
+    if (self[filterSelectElementSymbol]) {
+        self[filterSelectElementSymbol].addEventListener(
+            "monster-selection-cleared",
+            function () {
+                const settings = self[settingsSymbol].getOptions();
+
+                for (const setting of settings) {
+                    const filterElement = findElementWithIdUpwards(self, setting.value);
+                    if (filterElement) {
+                        setSlotAttribute(filterElement, false);
+
+                        self[settingsSymbol].set({value: setting.value, visible: false});
+                    }
+                }
+
+                updateConfig.call(self);
+            },
+        );
+
+        self[filterSelectElementSymbol].addEventListener(
+            "monster-changed",
+            function (event) {
+                const filterElement = findElementWithIdUpwards(
+                    self,
+                    event.detail.value,
+                );
+                if (filterElement) {
+                    setSlotAttribute(filterElement, event.detail.checked);
+                }
+
+                self[settingsSymbol].set({
+                    value: event.detail.value,
+                    visible: event.detail.checked,
+                });
+
+                updateConfig.call(self);
+            },
+        );
+    }
+
+    /** save the current filter */
+    if (self[filterSaveActionButtonElementSymbol]) {
+        self[filterSaveActionButtonElementSymbol].setOption(
+            "actions.click",
+            function (event) {
+                const button = findTargetElementFromEvent(
+                    event,
+                    "data-monster-role",
+                    "save-action-button",
+                );
+                const form = button.closest("[data-monster-role=form]");
+
+                if (!form) {
+                    button.setState("failed", self.getOption("timeouts.message", 4000));
+                    return;
+                }
+
+                const input = form.querySelector("input[name=filter-name]");
+                if (!input) {
+                    button.setState("failed", self.getOption("timeouts.message", 4000));
+                    return;
+                }
+
+                const name = input.value;
+                if (!name) {
+                    button.setState("failed", self.getOption("timeouts.message", 4000));
+                    button.setMessage("Please enter a name").showMessage();
+                    return;
+                }
+
+                doSearch
+                    .call(self, {showEffect: false})
+                    .then(() => {
+                        const configKey = getStoredFilterConfigKey.call(self);
+                        const host = getDocument().querySelector("monster-host");
+                        if (!host) {
+                            return;
+                        }
+
+                        const query = self.getOption("query");
+                        if (!query) {
+                            button.setState(
+                                "failed",
+                                self.getOption(
+                                    "timeouts.message",
+                                    self.getOption("timeouts.message", 4000),
+                                ),
+                            );
+                            button
+                                .setMessage("No query found")
+                                .showMessage(self.getOption("timeouts.message", 4000));
+                            return;
+                        }
+
+                        host
+                            .hasConfig(configKey)
+                            .then((hasConfig) => {
+                                return new Promise((resolve, reject) => {
+                                    if (hasConfig) {
+                                        host.getConfig(configKey).then(resolve).catch(reject);
+                                        return;
+                                    }
+                                    return resolve({});
+                                });
+                            })
+                            .then((config) => {
+                                config[name] = query;
+                                return host.setConfig(configKey, {
+                                    ...config,
+                                });
+                            })
+                            .then(() => {
+                                button.setState(
+                                    "successful",
+                                    self.getOption("timeouts.message", 4000),
+                                );
+                                updateFilterTabs.call(self);
+                            })
+                            .catch((error) => {
+                                button.setState(
+                                    "failed",
+                                    self.getOption("timeouts.message", 4000),
+                                );
+                                button
+                                    .setMessage(error.message)
+                                    .showMessage(self.getOption("timeouts.message", 4000));
+                            });
+                    })
+                    .catch((error) => {
+                        button.setState("failed", self.getOption("timeouts.message", 4000));
+                        const msg = error.message || error;
+                        button
+                            .setMessage(msg)
+                            .showMessage(self.getOption("timeouts.message", 4000));
+                    });
+            },
+        );
+    }
+
+    self[searchButtonElementSymbol].setOption("actions.click", () => {
+        self[hashChangeSymbol] = 1;
+
+        doSearch
+            .call(self)
+            .then(() => {
+            })
+            .catch((error) => {
+            });
+    });
+
+    // the reset button should reset the filter and the search query
+    // all input elements should be reset to their default values
+    // which is the empty string. we search for all input elements
+    // in the filter and reset them to their default value
+    self[resetButtonElementSymbol].setOption("actions.click", () => {
+        getSlottedElements
+            .call(self, "label[data-monster-label]")
+            .forEach((element) => {
+                const label = element.getAttribute("data-monster-label");
+                if (!label) {
+                    return;
+                }
+
+                const input = element.firstElementChild;
+
+                if (input) {
+                    input.value = "";
+                }
+            });
+
+        doSearch
+            .call(self, {showEffect: false})
+            .then(() => {
+            })
+            .catch((e) => addAttributeToken(self, ATTRIBUTE_ERRORMESSAGE, e.message));
+    });
+
+    self.addEventListener("keyup", (event) => {
+        const path = event.composedPath();
+        if (path.length === 0) {
+            return;
+        }
+
+        if (!(path[0] instanceof HTMLInputElement)) {
+            return;
+        }
+
+        if (event.keyCode === 13) {
+            doSearch
+                .call(self, {showEffect: false})
+                .then(() => {
+                })
+                .catch((error) => {
+                });
+        }
+    });
+
+    // tabs
+    const element = this[filterTabElementSymbol];
+    if (element) {
+        initTabEvents.call(this);
+    }
 }
 
 function initTabEvents() {
-	const self = this;
-	this[filterTabElementSymbol].addEventListener(
-		"monster-tab-changed",
-		(event) => {
-			const query = event?.detail?.data?.["data-monster-query"];
-			const q = this.getOption("query");
-			if (query !== q) {
-				this.setOption("query", query);
-			}
-		},
-	);
-
-	this[filterTabElementSymbol].addEventListener(
-		"monster-tab-remove",
-		(event) => {
-			const labels = [];
-			const buttons = this[filterTabElementSymbol].getOption("buttons");
-
-			const keys = ["popper", "standard"];
-			for (let i = 0; i < keys.length; i++) {
-				const key = keys[i];
-
-				for (const button of buttons[key]) {
-					if (button.label !== event.detail.label) {
-						labels.push(button.label);
-					}
-				}
-			}
-
-			const host = findElementWithSelectorUpwards(this, "monster-host");
-			if (!(host && this.id)) {
-				return;
-			}
-
-			const configKey = getStoredFilterConfigKey.call(this);
-			host
-				.hasConfig(configKey)
-				.then((hasConfig) => {
-					if (!hasConfig) {
-						return;
-					}
-
-					return host.getConfig(configKey);
-				})
-				.then((config) => {
-					for (const [name, query] of Object.entries(config)) {
-						if (labels.includes(name)) {
-							continue;
-						}
-
-						delete config[name];
-					}
-
-					return host.setConfig(configKey, {
-						...config,
-					});
-				});
-		},
-	);
+    const self = this;
+    this[filterTabElementSymbol].addEventListener(
+        "monster-tab-changed",
+        (event) => {
+            const query = event?.detail?.data?.["data-monster-query"];
+            const q = this.getOption("query");
+            if (query !== q) {
+                this.setOption("query", query);
+            }
+        },
+    );
+
+    this[filterTabElementSymbol].addEventListener(
+        "monster-tab-remove",
+        (event) => {
+            const labels = [];
+            const buttons = this[filterTabElementSymbol].getOption("buttons");
+
+            const keys = ["popper", "standard"];
+            for (let i = 0; i < keys.length; i++) {
+                const key = keys[i];
+
+                for (const button of buttons[key]) {
+                    if (button.label !== event.detail.label) {
+                        labels.push(button.label);
+                    }
+                }
+            }
+
+            const host = findElementWithSelectorUpwards(this, "monster-host");
+            if (!(host && this.id)) {
+                return;
+            }
+
+            const configKey = getStoredFilterConfigKey.call(this);
+            host
+                .hasConfig(configKey)
+                .then((hasConfig) => {
+                    if (!hasConfig) {
+                        return;
+                    }
+
+                    return host.getConfig(configKey);
+                })
+                .then((config) => {
+                    for (const [name, query] of Object.entries(config)) {
+                        if (labels.includes(name)) {
+                            continue;
+                        }
+
+                        delete config[name];
+                    }
+
+                    return host.setConfig(configKey, {
+                        ...config,
+                    });
+                });
+        },
+    );
 }
 
 /**
  * @private
  */
 function updateFilterTabs() {
-	const element = this[filterTabElementSymbol];
-	if (!element) {
-		return;
-	}
-
-	const host = findElementWithSelectorUpwards(this, "monster-host");
-	if (!(host && this.id)) {
-		return;
-	}
-
-	const configKey = getStoredFilterConfigKey.call(this);
-	host
-		.hasConfig(configKey)
-		.then((hasConfig) => {
-			if (!hasConfig) {
-				return;
-			}
-
-			return host.getConfig(configKey);
-		})
-		.then((config) => {
-			for (const [name, query] of Object.entries(config)) {
-				const found = element.querySelector(
-					`[data-monster-button-label="${name}"]`,
-				);
-				if (found) {
-					continue;
-				}
-
-				if (query === undefined || query === null) {
-					continue;
-				}
-
-				const escapedQuery = escapeAttributeValue(query);
-
-				element.insertAdjacentHTML(
-					"beforeend",
-					`<div data-monster-button-label="${name}"
+    const element = this[filterTabElementSymbol];
+    if (!element) {
+        return;
+    }
+
+    const host = findElementWithSelectorUpwards(this, "monster-host");
+    if (!(host && this.id)) {
+        return;
+    }
+
+    const configKey = getStoredFilterConfigKey.call(this);
+    host
+        .hasConfig(configKey)
+        .then((hasConfig) => {
+            if (!hasConfig) {
+                return;
+            }
+
+            return host.getConfig(configKey);
+        })
+        .then((config) => {
+            for (const [name, query] of Object.entries(config)) {
+                const found = element.querySelector(
+                    `[data-monster-button-label="${name}"]`,
+                );
+                if (found) {
+                    continue;
+                }
+
+                if (query === undefined || query === null) {
+                    continue;
+                }
+
+                const escapedQuery = escapeAttributeValue(query);
+
+                element.insertAdjacentHTML(
+                    "beforeend",
+                    `<div data-monster-button-label="${name}"
              data-monster-removable="true" 
              data-monster-query="${escapedQuery}" data-monster-role="filter-tab" >
              </div>`,
-				);
-			}
-		})
-		.catch((error) => {
-			if (error instanceof Error) {
-				addAttributeToken(
-					this,
-					ATTRIBUTE_ERRORMESSAGE,
-					error.message + " " + error.stack,
-				);
-			} else {
-				addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, error + "");
-			}
-		});
+                );
+            }
+        })
+        .catch((error) => {
+            if (error instanceof Error) {
+                addAttributeToken(
+                    this,
+                    ATTRIBUTE_ERRORMESSAGE,
+                    error.message + " " + error.stack,
+                );
+            } else {
+                addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, error + "");
+            }
+        });
 }
 
 /**
@@ -1012,89 +1025,89 @@ function updateFilterTabs() {
  * @param showEffect
  * @return {Promise}
  */
-function doSearch({ showEffect } = { showEffect: true }) {
-	this.resetFailureMessage();
-
-	if (showEffect) {
-		this[searchButtonElementSymbol].setState(
-			"activity",
-			this.getOption("timeouts.message", 4000),
-		);
-	}
-
-	return collectSearchQueries
-		.call(this)
-		.then((query) => {
-			const buildQuery = buildSearchQuery.call(this, query);
-			if (buildQuery === null) {
-				const msg = this.getOption("labels.empty-query-and-no-default");
-				if (showEffect) {
-					this[searchButtonElementSymbol].removeState();
-					this[searchButtonElementSymbol]
-						.setMessage(msg)
-						.showMessage(this.getOption("timeouts.message", 4000));
-				}
-				return Promise.reject(new Error(msg));
-			}
-
-			if (buildQuery === "" && this.getOption("defaultQuery") === null) {
-				const msg = this.getOption("labels.empty-query-and-no-default");
-
-				if (showEffect) {
-					this[searchButtonElementSymbol].removeState();
-					this[searchButtonElementSymbol]
-						.setMessage(msg)
-						.showMessage(this.getOption("timeouts.message", 4000));
-				}
-
-				return Promise.reject(new Error(msg));
-			}
-
-			if (buildQuery === this.getOption("query")) {
-				const msg = this.getOption("labels.query-not-changed");
-
-				if (showEffect) {
-					this[searchButtonElementSymbol].removeState();
-					this[searchButtonElementSymbol]
-						.setMessage(msg)
-						.showMessage(this.getOption("timeouts.message", 4000));
-				}
-
-				return Promise.reject(new Error(msg));
-			}
-
-			if (showEffect) {
-				this[searchButtonElementSymbol].setState(
-					"activity",
-					this.getOption("timeouts.message", 4000),
-				);
-			}
-
-			this.setOption("query", buildSearchQuery.call(this, query));
-
-			return Promise.resolve();
-		})
-		.catch((error) => {
-			if (error instanceof Error) {
-				addAttributeToken(
-					this,
-					ATTRIBUTE_ERRORMESSAGE,
-					error.message + " " + error.stack,
-				);
-			} else {
-				addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, String(error));
-			}
-
-			if (showEffect) {
-				this[searchButtonElementSymbol].setState(
-					"failed",
-					this.getOption("timeouts.message", 4000),
-				);
-				this[searchButtonElementSymbol].setMessage(error.message).showMessage();
-			}
-
-			return Promise.reject(error);
-		});
+function doSearch({showEffect} = {showEffect: true}) {
+    this.resetFailureMessage();
+
+    if (showEffect) {
+        this[searchButtonElementSymbol].setState(
+            "activity",
+            this.getOption("timeouts.message", 4000),
+        );
+    }
+
+    return collectSearchQueries
+        .call(this)
+        .then((query) => {
+            const buildQuery = buildSearchQuery.call(this, query);
+            if (buildQuery === null) {
+                const msg = this.getOption("labels.empty-query-and-no-default");
+                if (showEffect) {
+                    this[searchButtonElementSymbol].removeState();
+                    this[searchButtonElementSymbol]
+                        .setMessage(msg)
+                        .showMessage(this.getOption("timeouts.message", 4000));
+                }
+                return Promise.reject(new Error(msg));
+            }
+
+            if (buildQuery === "" && this.getOption("defaultQuery") === null) {
+                const msg = this.getOption("labels.empty-query-and-no-default");
+
+                if (showEffect) {
+                    this[searchButtonElementSymbol].removeState();
+                    this[searchButtonElementSymbol]
+                        .setMessage(msg)
+                        .showMessage(this.getOption("timeouts.message", 4000));
+                }
+
+                return Promise.reject(new Error(msg));
+            }
+
+            if (buildQuery === this.getOption("query")) {
+                const msg = this.getOption("labels.query-not-changed");
+
+                if (showEffect) {
+                    this[searchButtonElementSymbol].removeState();
+                    this[searchButtonElementSymbol]
+                        .setMessage(msg)
+                        .showMessage(this.getOption("timeouts.message", 4000));
+                }
+
+                return Promise.reject(new Error(msg));
+            }
+
+            if (showEffect) {
+                this[searchButtonElementSymbol].setState(
+                    "activity",
+                    this.getOption("timeouts.message", 4000),
+                );
+            }
+
+            this.setOption("query", buildSearchQuery.call(this, query));
+
+            return Promise.resolve();
+        })
+        .catch((error) => {
+            if (error instanceof Error) {
+                addAttributeToken(
+                    this,
+                    ATTRIBUTE_ERRORMESSAGE,
+                    error.message + " " + error.stack,
+                );
+            } else {
+                addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, String(error));
+            }
+
+            if (showEffect) {
+                this[searchButtonElementSymbol].setState(
+                    "failed",
+                    this.getOption("timeouts.message", 4000),
+                );
+                this[searchButtonElementSymbol].setMessage(error.message).showMessage();
+            }
+
+            return Promise.reject(error);
+        });
 }
 
 /**
@@ -1103,21 +1116,21 @@ function doSearch({ showEffect } = { showEffect: true }) {
  * @return {*|string}
  */
 function buildSearchQuery(queries) {
-	if (!isArray(queries) || queries.length === 0) {
-		return this.getOption("defaultQuery");
-	}
+    if (!isArray(queries) || queries.length === 0) {
+        return this.getOption("defaultQuery");
+    }
 
-	const joinCallback = this.getOption("queries.join");
-	if (isFunction(joinCallback)) {
-		return joinCallback(queries);
-	}
+    const joinCallback = this.getOption("queries.join");
+    if (isFunction(joinCallback)) {
+        return joinCallback(queries);
+    }
 
-	const q = queries.join(" ").trim();
-	if (q.length === 0) {
-		return this.getOption("defaultQuery");
-	}
+    const q = queries.join(" ").trim();
+    if (q.length === 0) {
+        return this.getOption("defaultQuery");
+    }
 
-	return q;
+    return q;
 }
 
 /**
@@ -1125,107 +1138,107 @@ function buildSearchQuery(queries) {
  * @return {Promise<unknown>}
  */
 function collectSearchQueries() {
-	const currentHash = parseBracketedKeyValueHash(getGlobal().location.hash);
-	const self = this;
-
-	return new Promise((resolve, reject) => {
-		const query = [];
-		const wrapCallback = this.getOption("queries.wrap");
-
-		let hasNoIdError = false;
-
-		getSlottedElements
-			.call(this, "label[data-monster-label]")
-			.forEach((element) => {
-				const label = element.getAttribute("data-monster-label");
-				if (!label) {
-					throw new Error("no filter label is defined");
-				}
-
-				const id = element.id;
-				if (!id) {
-					hasNoIdError = true;
-					return;
-				}
-
-				const visible = getVisibilityFromSlotAttribute(element);
-				if (!visible) {
-					return;
-				}
-
-				let template = element.getAttribute("data-monster-template");
-				if (!template) {
-					template = "${id}=${value}";
-				}
-
-				const controlValue = getControlValuesFromLabel(element);
-				if (!controlValue) {
-					if (controlValue === "" && currentHash?.[this.id]?.[id]) {
-						delete currentHash[this.id][id];
-					}
-
-					return;
-				}
-
-				if (!isObject(currentHash[this.id])) {
-					currentHash[this.id] = {};
-				}
-				currentHash[this.id][id] = controlValue;
-
-				const mapping = {
-					id,
-					value: controlValue,
-					label,
-				};
-
-				const formatter = new Formatter(mapping, {
-					callbacks: {
-						range: (value, key) => {
-							return generateRangeComparisonExpression(value, key, {
-								urlEncode: true,
-								andOp: "AND",
-								orOp: "OR",
-								eqOp: "=",
-								gtOp: ">",
-								ltOp: "<",
-							});
-						},
-						"date-range": (value, key) => {
-							const query = parseDateInput(value, key);
-							if (!query || query === "false") {
-								return "";
-							}
-
-							// return query as url encoded
-							return encodeURIComponent(query);
-						},
-					},
-				});
-
-				if (self.getOption("formatter.marker.open")) {
-					formatter.setMarker(
-						self.getOption("formatter.marker.open"),
-						self.getOption("formatter.marker.close"),
-					);
-				}
-
-				let queryPart = formatter.format(template);
-				if (queryPart) {
-					if (isFunction(wrapCallback)) {
-						queryPart = wrapCallback(queryPart, mapping);
-					}
-					query.push(queryPart);
-				}
-			});
-
-		if (hasNoIdError) {
-			reject(new Error("some or all filter elements have no id"));
-			return;
-		}
-
-		getGlobal().location.hash = createBracketedKeyValueHash(currentHash);
-		resolve(query);
-	});
+    const currentHash = parseBracketedKeyValueHash(getGlobal().location.hash);
+    const self = this;
+
+    return new Promise((resolve, reject) => {
+        const query = [];
+        const wrapCallback = this.getOption("queries.wrap");
+
+        let hasNoIdError = false;
+
+        getSlottedElements
+            .call(this, "label[data-monster-label]")
+            .forEach((element) => {
+                const label = element.getAttribute("data-monster-label");
+                if (!label) {
+                    throw new Error("no filter label is defined");
+                }
+
+                const id = element.id;
+                if (!id) {
+                    hasNoIdError = true;
+                    return;
+                }
+
+                const visible = getVisibilityFromSlotAttribute(element);
+                if (!visible) {
+                    return;
+                }
+
+                let template = element.getAttribute("data-monster-template");
+                if (!template) {
+                    template = "${id}=${value}";
+                }
+
+                const controlValue = getControlValuesFromLabel(element);
+                if (!controlValue) {
+                    if (controlValue === "" && currentHash?.[this.id]?.[id]) {
+                        delete currentHash[this.id][id];
+                    }
+
+                    return;
+                }
+
+                if (!isObject(currentHash[this.id])) {
+                    currentHash[this.id] = {};
+                }
+                currentHash[this.id][id] = controlValue;
+
+                const mapping = {
+                    id,
+                    value: controlValue,
+                    label,
+                };
+
+                const formatter = new Formatter(mapping, {
+                    callbacks: {
+                        range: (value, key) => {
+                            return generateRangeComparisonExpression(value, key, {
+                                urlEncode: true,
+                                andOp: "AND",
+                                orOp: "OR",
+                                eqOp: "=",
+                                gtOp: ">",
+                                ltOp: "<",
+                            });
+                        },
+                        "date-range": (value, key) => {
+                            const query = parseDateInput(value, key);
+                            if (!query || query === "false") {
+                                return "";
+                            }
+
+                            // return query as url encoded
+                            return encodeURIComponent(query);
+                        },
+                    },
+                });
+
+                if (self.getOption("formatter.marker.open")) {
+                    formatter.setMarker(
+                        self.getOption("formatter.marker.open"),
+                        self.getOption("formatter.marker.close"),
+                    );
+                }
+
+                let queryPart = formatter.format(template);
+                if (queryPart) {
+                    if (isFunction(wrapCallback)) {
+                        queryPart = wrapCallback(queryPart, mapping);
+                    }
+                    query.push(queryPart);
+                }
+            });
+
+        if (hasNoIdError) {
+            reject(new Error("some or all filter elements have no id"));
+            return;
+        }
+
+        getGlobal().location.hash = createBracketedKeyValueHash(currentHash);
+        resolve(query);
+    });
 }
 
 /**
@@ -1234,41 +1247,41 @@ function collectSearchQueries() {
  * @return {null|Array|undefined|string}
  */
 function getControlValuesFromLabel(label) {
-	// finde das erste Kind-Element vom type input
-	// wenn es ein input-Element ist, dann @todo
-
-	const foundControl = label.firstElementChild;
-
-	if (foundControl) {
-		if (foundControl.tagName === "INPUT") {
-			if (foundControl.type === "checkbox") {
-				const checkedControls = label.querySelectorAll(
-					`${foundControl}:checked`,
-				);
-				const values = [];
-
-				checkedControls.forEach((checkedControl) => {
-					values.push(checkedControl.value);
-				});
-
-				return values;
-			} else if (foundControl.type === "radio") {
-				const checkedControl = label.querySelector(`${foundControl}:checked`);
-
-				if (checkedControl) {
-					return checkedControl.value;
-				} else {
-					return null;
-				}
-			} else {
-				return foundControl.value;
-			}
-		} else {
-			return foundControl.value;
-		}
-	}
-
-	return null;
+    // finde das erste Kind-Element vom type input
+    // wenn es ein input-Element ist, dann @todo
+
+    const foundControl = label.firstElementChild;
+
+    if (foundControl) {
+        if (foundControl.tagName === "INPUT") {
+            if (foundControl.type === "checkbox") {
+                const checkedControls = label.querySelectorAll(
+                    `${foundControl}:checked`,
+                );
+                const values = [];
+
+                checkedControls.forEach((checkedControl) => {
+                    values.push(checkedControl.value);
+                });
+
+                return values;
+            } else if (foundControl.type === "radio") {
+                const checkedControl = label.querySelector(`${foundControl}:checked`);
+
+                if (checkedControl) {
+                    return checkedControl.value;
+                } else {
+                    return null;
+                }
+            } else {
+                return foundControl.value;
+            }
+        } else {
+            return foundControl.value;
+        }
+    }
+
+    return null;
 }
 
 /**
@@ -1276,60 +1289,60 @@ function getControlValuesFromLabel(label) {
  * @return {Promise<unknown>}
  */
 function initFromConfig() {
-	const host = findElementWithSelectorUpwards(this, "monster-host");
-
-	if (!(isInstance(host, Host) && this.id)) {
-		return Promise.resolve();
-	}
-
-	const configKey = getFilterConfigKey.call(this);
-
-	return new Promise((resolve, reject) => {
-		host
-			.getConfig(configKey)
-			.then((config) => {
-				if ((config && isObject(config)) || isArray(config)) {
-					this[settingsSymbol].setOptions(config);
-				}
-				resolve();
-			})
-			.catch((error) => {
-				if (error === undefined) {
-					resolve();
-					return;
-				}
-
-				// config not written
-				if (error?.message?.match(/is not defined/)) {
-					resolve();
-					return;
-				}
-
-				addAttributeToken(
-					this,
-					ATTRIBUTE_ERRORMESSAGE,
-					error?.message || error,
-				);
-				reject(error);
-			});
-	});
+    const host = findElementWithSelectorUpwards(this, "monster-host");
+
+    if (!(isInstance(host, Host) && this.id)) {
+        return Promise.resolve();
+    }
+
+    const configKey = getFilterConfigKey.call(this);
+
+    return new Promise((resolve, reject) => {
+        host
+            .getConfig(configKey)
+            .then((config) => {
+                if ((config && isObject(config)) || isArray(config)) {
+                    this[settingsSymbol].setOptions(config);
+                }
+                resolve();
+            })
+            .catch((error) => {
+                if (error === undefined) {
+                    resolve();
+                    return;
+                }
+
+                // config not written
+                if (error?.message?.match(/is not defined/)) {
+                    resolve();
+                    return;
+                }
+
+                addAttributeToken(
+                    this,
+                    ATTRIBUTE_ERRORMESSAGE,
+                    error?.message || error,
+                );
+                reject(error);
+            });
+    });
 }
 
 /**
  * @private
  */
 function updateConfig() {
-	const host = findElementWithSelectorUpwards(this, "monster-host");
-	if (!(host && this.id)) {
-		return;
-	}
-	const configKey = getFilterConfigKey.call(this);
-
-	try {
-		host.setConfig(configKey, this[settingsSymbol].getOptions());
-	} catch (error) {
-		addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, error?.message || error);
-	}
+    const host = findElementWithSelectorUpwards(this, "monster-host");
+    if (!(host && this.id)) {
+        return;
+    }
+    const configKey = getFilterConfigKey.call(this);
+
+    try {
+        host.setConfig(configKey, this[settingsSymbol].getOptions());
+    } catch (error) {
+        addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, error?.message || error);
+    }
 }
 
 /**
@@ -1337,8 +1350,8 @@ function updateConfig() {
  * @return {string}
  */
 function getTemplate() {
-	// language=HTML
-	return `
+    // language=HTML
+    return `
         <div data-monster-role="control" part="control">
             <div data-monster-role="container">
                 <div data-monster-role="layout">
diff --git a/source/components/style/form.css b/source/components/style/form.css
index b89f5e0914036248af8fd357902ccaf0311c6611..b60f8e6ba4b054cb3b7ef90d35850af11ce9f6b6 100644
--- a/source/components/style/form.css
+++ b/source/components/style/form.css
@@ -46,3 +46,11 @@ textarea:focus {
 	outline: 1px dashed var(--monster-color-selection-3);
 	outline-offset: 3px;
 }
+
+input[readonly]:not([type="checkbox"]):not([type="radio"]),
+select[readonly],
+textarea[readonly] {
+	background-color: var(--monster-bg-color-primary-2);
+	color: var(--monster-color-primary-2);
+	cursor: default;
+}