Update the NPM dependencies
authorAlexander Ebert <ebert@woltlab.com>
Wed, 13 Nov 2024 12:08:44 +0000 (13:08 +0100)
committerAlexander Ebert <ebert@woltlab.com>
Wed, 13 Nov 2024 12:08:44 +0000 (13:08 +0100)
package-lock.json
package.json
wcfsetup/install/files/js/3rdParty/focus-trap/focus-trap.umd.min.js
wcfsetup/install/files/js/3rdParty/focus-trap/focus-trap.umd.min.js.map

index 34345ef42ea672c753d205acb5df69769f8a4a11..85c4530e32cd169abb9dd56a7544a4d534ae51a3 100644 (file)
         "@googlemaps/markerclusterer": "2.0.15",
         "@types/facebook-js-sdk": "^3.3.12",
         "@types/google.maps": "^3.58.1",
-        "@types/jquery": "^3.5.30",
+        "@types/jquery": "^3.5.32",
         "@types/pica": "5.1.3",
-        "@types/prismjs": "^1.26.4",
+        "@types/prismjs": "^1.26.5",
         "@types/twitter-for-web": "0.0.6",
-        "@woltlab/editor": "git+https://github.com/WoltLab/editor.git#efa5ffdc4a094c55ef015b29c9d5024649a8ea32",
+        "@woltlab/editor": "git+https://github.com/WoltLab/editor.git#ebd849dd0abb0826fd4c56b29d88a79b45a4f9fb",
         "@woltlab/visual-dom-diff": "git+https://github.com/WoltLab/visual-dom-diff.git#e5b51fce3157d1eda310566fc1f86101341d1fea",
         "@woltlab/zxcvbn": "git+https://github.com/WoltLab/zxcvbn.git#5b582b24e437f1883ccad3c37dae7c3c5f1e7da3",
-        "focus-trap": "^7.6.0",
+        "focus-trap": "^7.6.1",
         "html-parsed-element": "^0.4.1",
-        "perfect-scrollbar": "^1.5.5",
+        "perfect-scrollbar": "^1.5.6",
         "qr-creator": "^1.0.0",
         "reflect-metadata": "^0.2.2",
         "tabbable": "^6.2.0",
         "tslib": "^2.8.1"
       },
       "devDependencies": {
-        "@typescript-eslint/eslint-plugin": "^8.12.2",
-        "@typescript-eslint/parser": "^8.12.2",
+        "@typescript-eslint/eslint-plugin": "^8.14.0",
+        "@typescript-eslint/parser": "^8.14.0",
         "esbuild": "^0.24.0",
-        "eslint": "^9.13.0",
+        "eslint": "^9.14.0",
         "eslint-config-prettier": "^9.1.0",
         "prettier": "^3.3.3",
         "typescript": "^5.6.3"
         "node": ">=0.10.0"
       }
     },
+    "node_modules/@ckeditor/ckeditor5-adapter-ckfinder": {
+      "version": "43.3.1",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-adapter-ckfinder/-/ckeditor5-adapter-ckfinder-43.3.1.tgz",
+      "integrity": "sha512-fOnEq31euR9B/awWZCOc8KfgLwwG4ACtqBhSv7Hu6VOgHa5TKWyWAdhr9ILSiUp7NMfYJoTQStbxcXZIWPqQXQ==",
+      "license": "GPL-2.0-or-later",
+      "dependencies": {
+        "@ckeditor/ckeditor5-core": "43.3.1",
+        "@ckeditor/ckeditor5-upload": "43.3.1",
+        "ckeditor5": "43.3.1"
+      }
+    },
     "node_modules/@ckeditor/ckeditor5-alignment": {
-      "version": "41.3.0",
-      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-alignment/-/ckeditor5-alignment-41.3.0.tgz",
-      "integrity": "sha512-n+4AaxVoHjWvdkGVxCODlQFUGYqpUnQX7FwXD8xb4iXhcWmIhlMM81hTJ0KReJPwBfDxcre1NR+Kn9hWcgQlOg==",
+      "version": "43.3.1",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-alignment/-/ckeditor5-alignment-43.3.1.tgz",
+      "integrity": "sha512-E+04zNdNBFDNgQajrWl8iFQqA1sB29y/XDFFRK+bzhcUaWdMadr88yodjHHdcax8/zI+GzBElCvWGEGchyrL+Q==",
+      "license": "GPL-2.0-or-later",
       "dependencies": {
-        "ckeditor5": "41.3.0"
+        "@ckeditor/ckeditor5-core": "43.3.1",
+        "@ckeditor/ckeditor5-ui": "43.3.1",
+        "@ckeditor/ckeditor5-utils": "43.3.1",
+        "ckeditor5": "43.3.1"
       }
     },
-    "node_modules/@ckeditor/ckeditor5-autosave": {
-      "version": "41.3.0",
-      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-autosave/-/ckeditor5-autosave-41.3.0.tgz",
-      "integrity": "sha512-uSJws3JAYTkz/oxyZpINdfghMMWFqFarfjwsUv90sC1rQgjWq6aBqJaPvtn/sZzLg9wqxdId0DjjRlzp6ggqNA==",
+    "node_modules/@ckeditor/ckeditor5-autoformat": {
+      "version": "43.3.1",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-autoformat/-/ckeditor5-autoformat-43.3.1.tgz",
+      "integrity": "sha512-hSQxIXIObrMfxijMPmz8odOtz/wD5SwuGZWVoF5km3EtRQxZwAcQr1Vjy+VHHPo6PZ+o3YoLP+IHCaULtNobYg==",
+      "license": "GPL-2.0-or-later",
       "dependencies": {
-        "ckeditor5": "41.3.0",
+        "@ckeditor/ckeditor5-core": "43.3.1",
+        "@ckeditor/ckeditor5-engine": "43.3.1",
+        "@ckeditor/ckeditor5-typing": "43.3.1",
+        "@ckeditor/ckeditor5-utils": "43.3.1",
+        "ckeditor5": "43.3.1"
+      }
+    },
+    "node_modules/@ckeditor/ckeditor5-autosave": {
+      "version": "43.3.1",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-autosave/-/ckeditor5-autosave-43.3.1.tgz",
+      "integrity": "sha512-28667m7ea0wBZMb3uIzgipanB4DrDvKn4o+mRUDExlRT8M14vn1u/ILX8ZJy28Rihbg2wPcVh6rP3zoQjcucHw==",
+      "license": "GPL-2.0-or-later",
+      "dependencies": {
+        "@ckeditor/ckeditor5-core": "43.3.1",
+        "@ckeditor/ckeditor5-utils": "43.3.1",
+        "ckeditor5": "43.3.1",
         "lodash-es": "4.17.21"
       }
     },
     "node_modules/@ckeditor/ckeditor5-basic-styles": {
-      "version": "41.3.0",
-      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-basic-styles/-/ckeditor5-basic-styles-41.3.0.tgz",
-      "integrity": "sha512-FSH/pmrApZZqZ83LHXsQkjQK5fRai7UUyqkPBsL/mgTm05/MLgyuoGYTR5+ogRTh05IQV6Wt9aMtRoboAtLCrw==",
+      "version": "43.3.1",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-basic-styles/-/ckeditor5-basic-styles-43.3.1.tgz",
+      "integrity": "sha512-1RBnPmgsIoxPL7wZhId2KsfPujITbEAfzHhi0c6m4kuWlkmcVXYldWvUvCvAUguAznx4LOxhKlp6RdFSPTFTbg==",
+      "license": "GPL-2.0-or-later",
       "dependencies": {
-        "ckeditor5": "41.3.0"
+        "@ckeditor/ckeditor5-core": "43.3.1",
+        "@ckeditor/ckeditor5-typing": "43.3.1",
+        "@ckeditor/ckeditor5-ui": "43.3.1",
+        "ckeditor5": "43.3.1"
       }
     },
     "node_modules/@ckeditor/ckeditor5-block-quote": {
-      "version": "41.3.0",
-      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-block-quote/-/ckeditor5-block-quote-41.3.0.tgz",
-      "integrity": "sha512-md1xncrU4GQRHaJMVtON6F+7cVz+IaqEKtovnODja5CWMIrDfBQ+JMECo3UjGUn1V7nJgF+MUODnUI4+Ns4Ngw==",
+      "version": "43.3.1",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-block-quote/-/ckeditor5-block-quote-43.3.1.tgz",
+      "integrity": "sha512-cgY4GKwMlIVLnhszPoc1ortp+T/s3TLowrwRFtWYxTKSsHWBGFlZUL6oMASPunpXvvJqHcgnKlCMxVSh2VMCkQ==",
+      "license": "GPL-2.0-or-later",
+      "dependencies": {
+        "@ckeditor/ckeditor5-core": "43.3.1",
+        "@ckeditor/ckeditor5-enter": "43.3.1",
+        "@ckeditor/ckeditor5-typing": "43.3.1",
+        "@ckeditor/ckeditor5-ui": "43.3.1",
+        "@ckeditor/ckeditor5-utils": "43.3.1",
+        "ckeditor5": "43.3.1"
+      }
+    },
+    "node_modules/@ckeditor/ckeditor5-ckbox": {
+      "version": "43.3.1",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-ckbox/-/ckeditor5-ckbox-43.3.1.tgz",
+      "integrity": "sha512-KObL9w/QBWJi0lG2zfm+x124Kzd7aVt+UaJHJEwsAPwhZvqM0LCUeR6wwb0oCN6ph5qrCjXoj09z7z8Txk5IwA==",
+      "license": "GPL-2.0-or-later",
+      "dependencies": {
+        "@ckeditor/ckeditor5-core": "43.3.1",
+        "@ckeditor/ckeditor5-engine": "43.3.1",
+        "@ckeditor/ckeditor5-ui": "43.3.1",
+        "@ckeditor/ckeditor5-upload": "43.3.1",
+        "@ckeditor/ckeditor5-utils": "43.3.1",
+        "blurhash": "2.0.5",
+        "ckeditor5": "43.3.1",
+        "lodash-es": "4.17.21"
+      }
+    },
+    "node_modules/@ckeditor/ckeditor5-ckfinder": {
+      "version": "43.3.1",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-ckfinder/-/ckeditor5-ckfinder-43.3.1.tgz",
+      "integrity": "sha512-Yji6c1/0H5fExDcT+NNyQQePx2cd8Ul1Xuko1UVmsLN2Vhi7VIDJjEkCFndJozd8VQqI62Obe1GTyjmapBV5+A==",
+      "license": "GPL-2.0-or-later",
       "dependencies": {
-        "ckeditor5": "41.3.0"
+        "@ckeditor/ckeditor5-core": "43.3.1",
+        "@ckeditor/ckeditor5-ui": "43.3.1",
+        "@ckeditor/ckeditor5-utils": "43.3.1",
+        "ckeditor5": "43.3.1"
       }
     },
     "node_modules/@ckeditor/ckeditor5-clipboard": {
-      "version": "41.3.0",
-      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-clipboard/-/ckeditor5-clipboard-41.3.0.tgz",
-      "integrity": "sha512-ZVCl4L4FggW64DtL5m1RPSKEo6HwkTViu7m+cN6NXT7VAV4SVEvxhL1vYpz/vhBBPZLw6kSELX17fbI3PbIa0g==",
-      "dependencies": {
-        "@ckeditor/ckeditor5-core": "41.3.0",
-        "@ckeditor/ckeditor5-engine": "41.3.0",
-        "@ckeditor/ckeditor5-ui": "41.3.0",
-        "@ckeditor/ckeditor5-utils": "41.3.0",
-        "@ckeditor/ckeditor5-widget": "41.3.0",
+      "version": "43.3.1",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-clipboard/-/ckeditor5-clipboard-43.3.1.tgz",
+      "integrity": "sha512-Ke6fVEy1fF3AWHMtKvF1pAoDYBVOG4q+gDHD8+dcV6KPK1uA/CR0mw6TZsslQQquT4jC79y05IWu2bq1Mxv01w==",
+      "license": "GPL-2.0-or-later",
+      "dependencies": {
+        "@ckeditor/ckeditor5-core": "43.3.1",
+        "@ckeditor/ckeditor5-engine": "43.3.1",
+        "@ckeditor/ckeditor5-ui": "43.3.1",
+        "@ckeditor/ckeditor5-utils": "43.3.1",
+        "@ckeditor/ckeditor5-widget": "43.3.1",
         "lodash-es": "4.17.21"
       }
     },
+    "node_modules/@ckeditor/ckeditor5-cloud-services": {
+      "version": "43.3.1",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-cloud-services/-/ckeditor5-cloud-services-43.3.1.tgz",
+      "integrity": "sha512-JppySF+uWedDXPTVZBsTfZCe3qedDAdWSgw0Ww/qi4/sPFcgf/MaQ0LBHbl2Ii7JlJjng82F1F2kv9Ny/Rkauw==",
+      "license": "GPL-2.0-or-later",
+      "dependencies": {
+        "@ckeditor/ckeditor5-core": "43.3.1",
+        "@ckeditor/ckeditor5-utils": "43.3.1",
+        "ckeditor5": "43.3.1"
+      }
+    },
     "node_modules/@ckeditor/ckeditor5-code-block": {
-      "version": "41.3.0",
-      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-code-block/-/ckeditor5-code-block-41.3.0.tgz",
-      "integrity": "sha512-7W8OCPBn2xzmfaFiPTonelxfi8k2TW2UeMY5chvl+9MmG9dnOwy0z7bIyO7uUzic+4dJxZB77/n9fjQWrWauuA==",
+      "version": "43.3.1",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-code-block/-/ckeditor5-code-block-43.3.1.tgz",
+      "integrity": "sha512-UGhGCPNfFXLua0TmszLSWX6BlkemaPULN1EZ+FBPsUZb757qWWWVWI9GKLmAc4jSPqOv+azU+JAZJzX9bE1oYA==",
+      "license": "GPL-2.0-or-later",
       "dependencies": {
-        "ckeditor5": "41.3.0"
+        "@ckeditor/ckeditor5-clipboard": "43.3.1",
+        "@ckeditor/ckeditor5-core": "43.3.1",
+        "@ckeditor/ckeditor5-engine": "43.3.1",
+        "@ckeditor/ckeditor5-enter": "43.3.1",
+        "@ckeditor/ckeditor5-ui": "43.3.1",
+        "@ckeditor/ckeditor5-utils": "43.3.1",
+        "ckeditor5": "43.3.1"
       }
     },
     "node_modules/@ckeditor/ckeditor5-core": {
-      "version": "41.3.0",
-      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-core/-/ckeditor5-core-41.3.0.tgz",
-      "integrity": "sha512-3K1dQJTawbCJtaytZvIkax8fZjN7lns0IFEbu2MWTBGlXmifiDyRDRJe6/e/0sGSiKGsoBGIky8M0iYzqLbd3g==",
+      "version": "43.3.1",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-core/-/ckeditor5-core-43.3.1.tgz",
+      "integrity": "sha512-6pil2OF4auF3PKrg1Oa86CqC91ZYc+NuHih0ebM0JW/I06d+0smnJg5dw4yN7mKbghbJS8mNrusxA5cf6Hkh6w==",
+      "license": "GPL-2.0-or-later",
+      "dependencies": {
+        "@ckeditor/ckeditor5-engine": "43.3.1",
+        "@ckeditor/ckeditor5-utils": "43.3.1",
+        "@ckeditor/ckeditor5-watchdog": "43.3.1",
+        "lodash-es": "4.17.21"
+      }
+    },
+    "node_modules/@ckeditor/ckeditor5-easy-image": {
+      "version": "43.3.1",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-easy-image/-/ckeditor5-easy-image-43.3.1.tgz",
+      "integrity": "sha512-Cd5NojL0Vfa1SQj6uzbP3oSHvQY5ys2hXF/2jNsYKLePTCybSvGkg5REv1JifM6kSNRH1VXdad7a2LkqvXnCnA==",
+      "license": "GPL-2.0-or-later",
+      "dependencies": {
+        "@ckeditor/ckeditor5-core": "43.3.1",
+        "@ckeditor/ckeditor5-upload": "43.3.1",
+        "@ckeditor/ckeditor5-utils": "43.3.1",
+        "ckeditor5": "43.3.1"
+      }
+    },
+    "node_modules/@ckeditor/ckeditor5-editor-balloon": {
+      "version": "43.3.1",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-editor-balloon/-/ckeditor5-editor-balloon-43.3.1.tgz",
+      "integrity": "sha512-klS1FZG29nJE/XbfRXrXtwYU/9uCFdi7xGbYfaJnmyNt54h46aiquKacosbiffA87Tr5sT3Oqm3dBbNlsU158w==",
+      "license": "GPL-2.0-or-later",
       "dependencies": {
-        "@ckeditor/ckeditor5-engine": "41.3.0",
-        "@ckeditor/ckeditor5-utils": "41.3.0",
+        "@ckeditor/ckeditor5-core": "43.3.1",
+        "@ckeditor/ckeditor5-engine": "43.3.1",
+        "@ckeditor/ckeditor5-ui": "43.3.1",
+        "@ckeditor/ckeditor5-utils": "43.3.1",
+        "ckeditor5": "43.3.1",
         "lodash-es": "4.17.21"
       }
     },
     "node_modules/@ckeditor/ckeditor5-editor-classic": {
-      "version": "41.3.0",
-      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-editor-classic/-/ckeditor5-editor-classic-41.3.0.tgz",
-      "integrity": "sha512-yhs078iq0eSQpZ9+RQAWxSTsJoqYEbGomhlHebjHc9bpsTFFA4T8vcroWTvhRmySEpbHfRnADxQBj0ZGQfyDdA==",
+      "version": "43.3.1",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-editor-classic/-/ckeditor5-editor-classic-43.3.1.tgz",
+      "integrity": "sha512-wjBeXUQBuvz6CmGlb5XncJ9cHE7tozU6eoorycfSTQCzqr5uE57LWTlKclU42w7MgS2ya5V2kLnncr0ZqrZ2Vw==",
+      "license": "GPL-2.0-or-later",
+      "dependencies": {
+        "@ckeditor/ckeditor5-core": "43.3.1",
+        "@ckeditor/ckeditor5-engine": "43.3.1",
+        "@ckeditor/ckeditor5-ui": "43.3.1",
+        "@ckeditor/ckeditor5-utils": "43.3.1",
+        "ckeditor5": "43.3.1",
+        "lodash-es": "4.17.21"
+      }
+    },
+    "node_modules/@ckeditor/ckeditor5-editor-decoupled": {
+      "version": "43.3.1",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-editor-decoupled/-/ckeditor5-editor-decoupled-43.3.1.tgz",
+      "integrity": "sha512-aw2iZ+WCcCu9sUAnsHhsXZWLeVPyiLhZfpZDuEWjPlvsrCfT0RfSuwMcfx7l9PREA09VR8+6MTstm61EG8dmWQ==",
+      "license": "GPL-2.0-or-later",
+      "dependencies": {
+        "@ckeditor/ckeditor5-core": "43.3.1",
+        "@ckeditor/ckeditor5-engine": "43.3.1",
+        "@ckeditor/ckeditor5-ui": "43.3.1",
+        "@ckeditor/ckeditor5-utils": "43.3.1",
+        "ckeditor5": "43.3.1",
+        "lodash-es": "4.17.21"
+      }
+    },
+    "node_modules/@ckeditor/ckeditor5-editor-inline": {
+      "version": "43.3.1",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-editor-inline/-/ckeditor5-editor-inline-43.3.1.tgz",
+      "integrity": "sha512-3iZiWl2aM1bCnS52NeBoAqCVowABhWrBlns27JEGKZ+LNPZroMie7uKuMX3YQGYE2awFnsyP6XofoJtu6CcKCA==",
+      "license": "GPL-2.0-or-later",
       "dependencies": {
-        "ckeditor5": "41.3.0",
+        "@ckeditor/ckeditor5-core": "43.3.1",
+        "@ckeditor/ckeditor5-engine": "43.3.1",
+        "@ckeditor/ckeditor5-ui": "43.3.1",
+        "@ckeditor/ckeditor5-utils": "43.3.1",
+        "ckeditor5": "43.3.1",
+        "lodash-es": "4.17.21"
+      }
+    },
+    "node_modules/@ckeditor/ckeditor5-editor-multi-root": {
+      "version": "43.3.1",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-editor-multi-root/-/ckeditor5-editor-multi-root-43.3.1.tgz",
+      "integrity": "sha512-HDgfTuotrHW91AZ+x+lumwo1tngRRZ87dnHT8kjSRFWAeXPSd2Kw986++Oj9K080+idZaYLF+IutAOqvCT32sw==",
+      "license": "GPL-2.0-or-later",
+      "dependencies": {
+        "@ckeditor/ckeditor5-core": "43.3.1",
+        "@ckeditor/ckeditor5-engine": "43.3.1",
+        "@ckeditor/ckeditor5-ui": "43.3.1",
+        "@ckeditor/ckeditor5-utils": "43.3.1",
+        "ckeditor5": "43.3.1",
         "lodash-es": "4.17.21"
       }
     },
     "node_modules/@ckeditor/ckeditor5-engine": {
-      "version": "41.3.0",
-      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-engine/-/ckeditor5-engine-41.3.0.tgz",
-      "integrity": "sha512-H+t3o5zuoyTzygCP2V/x0WEd2Vn3I1XwJtDbvcXDz1C05dbWf5UUAj/xIsgoIgmOl+HKNVLhPiCjZGXXZhCNzQ==",
+      "version": "43.3.1",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-engine/-/ckeditor5-engine-43.3.1.tgz",
+      "integrity": "sha512-Fkv3ibQLDPVHFH0z4/+gA5wrkPVWOen+Cjv/NecNBeAszZUo+F2j9RwvQ1zHwtGb0RWj3+BWOPgo8jhSe7tFgA==",
+      "license": "GPL-2.0-or-later",
       "dependencies": {
-        "@ckeditor/ckeditor5-utils": "41.3.0",
+        "@ckeditor/ckeditor5-utils": "43.3.1",
         "lodash-es": "4.17.21"
       }
     },
     "node_modules/@ckeditor/ckeditor5-enter": {
-      "version": "41.3.0",
-      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-enter/-/ckeditor5-enter-41.3.0.tgz",
-      "integrity": "sha512-b061fD75nm9KMq/OXa6ilEMk9LJOrLMAst0/kX6ig0q9nE0VSkwkXqVAtCRbliEf0GIqQCjUvm2EoDuFeGWKeQ==",
+      "version": "43.3.1",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-enter/-/ckeditor5-enter-43.3.1.tgz",
+      "integrity": "sha512-xaHnU2RbfYi8ilfN260pB3YDvJ9lE4SfiFQusyRdWkeBo5gDAGBbQY+qCC/hmxkr/yftNZfK+d7Ow93xXtqEwg==",
+      "license": "GPL-2.0-or-later",
       "dependencies": {
-        "@ckeditor/ckeditor5-core": "41.3.0",
-        "@ckeditor/ckeditor5-engine": "41.3.0",
-        "@ckeditor/ckeditor5-utils": "41.3.0"
+        "@ckeditor/ckeditor5-core": "43.3.1",
+        "@ckeditor/ckeditor5-engine": "43.3.1",
+        "@ckeditor/ckeditor5-utils": "43.3.1"
       }
     },
     "node_modules/@ckeditor/ckeditor5-essentials": {
-      "version": "41.3.0",
-      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-essentials/-/ckeditor5-essentials-41.3.0.tgz",
-      "integrity": "sha512-K6RXnNujsaF/m5BYMiEDE6WeGqs3JHnorK5JutsQ+QebqVs3P4nG78NmyFvf42FfgPKrpap2vyWky1M/DVFVOQ==",
-      "dependencies": {
-        "ckeditor5": "41.3.0"
+      "version": "43.3.1",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-essentials/-/ckeditor5-essentials-43.3.1.tgz",
+      "integrity": "sha512-bZtzXhmBz8XF9J4eUxOjURmw0HJPKIqo18a6vNxg07W8z3ouHMb9ke//4z4FF9N/1dbtA7a2+jIACO6WvXrX4A==",
+      "license": "GPL-2.0-or-later",
+      "dependencies": {
+        "@ckeditor/ckeditor5-clipboard": "43.3.1",
+        "@ckeditor/ckeditor5-core": "43.3.1",
+        "@ckeditor/ckeditor5-enter": "43.3.1",
+        "@ckeditor/ckeditor5-select-all": "43.3.1",
+        "@ckeditor/ckeditor5-typing": "43.3.1",
+        "@ckeditor/ckeditor5-ui": "43.3.1",
+        "@ckeditor/ckeditor5-undo": "43.3.1",
+        "ckeditor5": "43.3.1"
+      }
+    },
+    "node_modules/@ckeditor/ckeditor5-find-and-replace": {
+      "version": "43.3.1",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-find-and-replace/-/ckeditor5-find-and-replace-43.3.1.tgz",
+      "integrity": "sha512-U9dyK8yQgxGTUphRbqdUJbvfi5v7zzijCo3Kj51NxyWwOFh7SGReQxHDGn44DmSRold6lg4F1sbXeFdwu1o+WA==",
+      "license": "GPL-2.0-or-later",
+      "dependencies": {
+        "@ckeditor/ckeditor5-core": "43.3.1",
+        "@ckeditor/ckeditor5-ui": "43.3.1",
+        "@ckeditor/ckeditor5-utils": "43.3.1",
+        "ckeditor5": "43.3.1",
+        "lodash-es": "4.17.21"
       }
     },
     "node_modules/@ckeditor/ckeditor5-font": {
-      "version": "41.3.0",
-      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-font/-/ckeditor5-font-41.3.0.tgz",
-      "integrity": "sha512-CfJmS5rURMuCrssYGkqtfAF62YTx5B/lyZfR5d+nCPFSWWNjkVBzvGtR0jyVlLiaL+aaQBRys+s7DcwwVKUdyA==",
+      "version": "43.3.1",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-font/-/ckeditor5-font-43.3.1.tgz",
+      "integrity": "sha512-NOeBtScqMuBLVWFPuW0snleh7rMFkNb006yzDIG6JApnF3Vxi0JLQXub/lPHPgw5srqJ3z159DWT++exoyz/mQ==",
+      "license": "GPL-2.0-or-later",
       "dependencies": {
-        "ckeditor5": "41.3.0"
+        "@ckeditor/ckeditor5-core": "43.3.1",
+        "@ckeditor/ckeditor5-engine": "43.3.1",
+        "@ckeditor/ckeditor5-ui": "43.3.1",
+        "@ckeditor/ckeditor5-utils": "43.3.1",
+        "ckeditor5": "43.3.1"
       }
     },
     "node_modules/@ckeditor/ckeditor5-heading": {
-      "version": "41.3.0",
-      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-heading/-/ckeditor5-heading-41.3.0.tgz",
-      "integrity": "sha512-n8Og5x8IM8+MAFPh87DW/RqopMTJzPiONESt6XzvcHf+BLreImPwIy4abIpHbm1eAaQpv4ojHuMMYWSfOmv2JQ==",
+      "version": "43.3.1",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-heading/-/ckeditor5-heading-43.3.1.tgz",
+      "integrity": "sha512-cc8H027Y2OwvYDGMTbBSzE+oZaiLMZtlUnkgiolMw/OQ59ysONYi+KqyMzBMTuaXrkP3CLM57ZbsVGASQ3IQmQ==",
+      "license": "GPL-2.0-or-later",
       "dependencies": {
-        "ckeditor5": "41.3.0"
+        "@ckeditor/ckeditor5-core": "43.3.1",
+        "@ckeditor/ckeditor5-engine": "43.3.1",
+        "@ckeditor/ckeditor5-paragraph": "43.3.1",
+        "@ckeditor/ckeditor5-ui": "43.3.1",
+        "@ckeditor/ckeditor5-utils": "43.3.1",
+        "ckeditor5": "43.3.1"
       }
     },
     "node_modules/@ckeditor/ckeditor5-highlight": {
-      "version": "41.3.0",
-      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-highlight/-/ckeditor5-highlight-41.3.0.tgz",
-      "integrity": "sha512-eAPb9wSFcm7gHeI1WMIW9ZxJfjMe1AmIoD6o2Ved8bqw8zsMy0b+7+wTUQ1iMHRO7QAVRWg8XZG2kgDPr4Yqsw==",
+      "version": "43.3.1",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-highlight/-/ckeditor5-highlight-43.3.1.tgz",
+      "integrity": "sha512-XVJq1YP4IAaWQBAyY1xlKOfzkpnclUH8zTUPaW3TZUGK5t6W/vFT+KAzYfUp7PdBb+PP8/O47FwKTvIQBkbqFw==",
+      "license": "GPL-2.0-or-later",
       "dependencies": {
-        "ckeditor5": "41.3.0"
+        "@ckeditor/ckeditor5-core": "43.3.1",
+        "@ckeditor/ckeditor5-ui": "43.3.1",
+        "ckeditor5": "43.3.1"
       }
     },
     "node_modules/@ckeditor/ckeditor5-horizontal-line": {
-      "version": "41.3.0",
-      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-horizontal-line/-/ckeditor5-horizontal-line-41.3.0.tgz",
-      "integrity": "sha512-l4MP0uiGOudciUwnpenXOHv0Z3sp606CIxshVbgAuWF8LTEhHOGUaHHRDWI/YnQgmKiolotTan1WYNa1bhULJw==",
+      "version": "43.3.1",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-horizontal-line/-/ckeditor5-horizontal-line-43.3.1.tgz",
+      "integrity": "sha512-zkKe0S9gBXwveBUzUuCBPWyrzHQor/zcMCCX9YQk1StUxtRRsURNvWOoFeoG+Vf5jMGSA2gpnBgIo70WrX4A3A==",
+      "license": "GPL-2.0-or-later",
       "dependencies": {
-        "ckeditor5": "41.3.0"
+        "@ckeditor/ckeditor5-core": "43.3.1",
+        "@ckeditor/ckeditor5-ui": "43.3.1",
+        "@ckeditor/ckeditor5-widget": "43.3.1",
+        "ckeditor5": "43.3.1"
       }
     },
     "node_modules/@ckeditor/ckeditor5-html-embed": {
-      "version": "41.3.0",
-      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-html-embed/-/ckeditor5-html-embed-41.3.0.tgz",
-      "integrity": "sha512-+qFSnhmmGp2QtP4JDq5c4MQS0keKfpBKP2/rZaWYl70539JfhQBJrH+I03dz+881SenNPAqMRxFRoks062gGvw==",
-      "dependencies": {
-        "ckeditor5": "41.3.0"
+      "version": "43.3.1",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-html-embed/-/ckeditor5-html-embed-43.3.1.tgz",
+      "integrity": "sha512-VqIhhPwMgAzmPqjvQUQYaFmCFglkg203W+LSVCwrvgVZ9mVtKbkhwCHBJnLhG7qatar7Gg93bObfAFdAjsaR2A==",
+      "license": "GPL-2.0-or-later",
+      "dependencies": {
+        "@ckeditor/ckeditor5-core": "43.3.1",
+        "@ckeditor/ckeditor5-ui": "43.3.1",
+        "@ckeditor/ckeditor5-utils": "43.3.1",
+        "@ckeditor/ckeditor5-widget": "43.3.1",
+        "ckeditor5": "43.3.1"
+      }
+    },
+    "node_modules/@ckeditor/ckeditor5-html-support": {
+      "version": "43.3.1",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-html-support/-/ckeditor5-html-support-43.3.1.tgz",
+      "integrity": "sha512-cnQ+kCPYH5GiSe5S+13Fr0vuS7DzT4Onx11fvOkssUujtAJ1e/C7hNf5Ehd+SOAgr5IzevutA/+OeR2KHGjIag==",
+      "license": "GPL-2.0-or-later",
+      "dependencies": {
+        "@ckeditor/ckeditor5-core": "43.3.1",
+        "@ckeditor/ckeditor5-engine": "43.3.1",
+        "@ckeditor/ckeditor5-enter": "43.3.1",
+        "@ckeditor/ckeditor5-utils": "43.3.1",
+        "@ckeditor/ckeditor5-widget": "43.3.1",
+        "ckeditor5": "43.3.1",
+        "lodash-es": "4.17.21"
       }
     },
     "node_modules/@ckeditor/ckeditor5-image": {
-      "version": "41.3.0",
-      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-image/-/ckeditor5-image-41.3.0.tgz",
-      "integrity": "sha512-G7vbgtycwW2USQfcbNn3iT7d+/7phKuwwZX7aaDQvFX4ciqeBVDIh9d/v3UYqPhBU5sWA5aILsXwrrM2CimFBw==",
-      "dependencies": {
-        "@ckeditor/ckeditor5-ui": "41.3.0",
-        "ckeditor5": "41.3.0",
+      "version": "43.3.1",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-image/-/ckeditor5-image-43.3.1.tgz",
+      "integrity": "sha512-QgHxZtWpclzQ5SUrh1oMsGFCvjykxge5IKe96iKUyAVrhyQp60RhW8DdAElHnPUg3wwILMYE7cKMphknCxcVkQ==",
+      "license": "GPL-2.0-or-later",
+      "dependencies": {
+        "@ckeditor/ckeditor5-clipboard": "43.3.1",
+        "@ckeditor/ckeditor5-core": "43.3.1",
+        "@ckeditor/ckeditor5-engine": "43.3.1",
+        "@ckeditor/ckeditor5-typing": "43.3.1",
+        "@ckeditor/ckeditor5-ui": "43.3.1",
+        "@ckeditor/ckeditor5-undo": "43.3.1",
+        "@ckeditor/ckeditor5-upload": "43.3.1",
+        "@ckeditor/ckeditor5-utils": "43.3.1",
+        "@ckeditor/ckeditor5-widget": "43.3.1",
+        "ckeditor5": "43.3.1",
         "lodash-es": "4.17.21"
       }
     },
     "node_modules/@ckeditor/ckeditor5-indent": {
-      "version": "41.3.0",
-      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-indent/-/ckeditor5-indent-41.3.0.tgz",
-      "integrity": "sha512-GbqTHvWnLjqlqqxmmC1gO0Tfg6mXjah6TuI/JvRzID1fOwddFKFrBX+bk9LlWz0HlGEouW/aDTihbyE4ODZXXQ==",
+      "version": "43.3.1",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-indent/-/ckeditor5-indent-43.3.1.tgz",
+      "integrity": "sha512-CPU50tumKH7rJ6f9QEB/LHSyzKul9xP/43F1IesvOBWnOkAxQ2QI51oORT5WdKn4B0Z56ojAm48Q/ZUtsef+3w==",
+      "license": "GPL-2.0-or-later",
       "dependencies": {
-        "ckeditor5": "41.3.0"
+        "@ckeditor/ckeditor5-core": "43.3.1",
+        "@ckeditor/ckeditor5-engine": "43.3.1",
+        "@ckeditor/ckeditor5-ui": "43.3.1",
+        "@ckeditor/ckeditor5-utils": "43.3.1",
+        "ckeditor5": "43.3.1"
       }
     },
     "node_modules/@ckeditor/ckeditor5-inspector": {
         "npm": ">=5.7.1"
       }
     },
-    "node_modules/@ckeditor/ckeditor5-link": {
-      "version": "41.3.0",
-      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-link/-/ckeditor5-link-41.3.0.tgz",
-      "integrity": "sha512-JW6Og4lnDsSKjGyL5FKvSU3690oTtu5e/aVNn81NQqZpfczcDvgqjD7fdPwgI4cuvepa+six1N8uEVABjvjtSQ==",
+    "node_modules/@ckeditor/ckeditor5-language": {
+      "version": "43.3.1",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-language/-/ckeditor5-language-43.3.1.tgz",
+      "integrity": "sha512-M7npJRhLoZksnvjZ0fS+6hbAN4RebgZCE2bT9b3Z8Df2Alfy0GJEwJL5aQsYpr+78QFeytTpqzjxXLNLjOyEqA==",
+      "license": "GPL-2.0-or-later",
       "dependencies": {
-        "@ckeditor/ckeditor5-ui": "41.3.0",
-        "ckeditor5": "41.3.0",
+        "@ckeditor/ckeditor5-core": "43.3.1",
+        "@ckeditor/ckeditor5-ui": "43.3.1",
+        "@ckeditor/ckeditor5-utils": "43.3.1",
+        "ckeditor5": "43.3.1"
+      }
+    },
+    "node_modules/@ckeditor/ckeditor5-link": {
+      "version": "43.3.1",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-link/-/ckeditor5-link-43.3.1.tgz",
+      "integrity": "sha512-duTA7harmvZPZ2LbJ8tHnOrhx5lGk6AGavbDzK2xuicMncivm+amrkl/b771uA3Rr6gclHY77ZPcOuVaK+dp/g==",
+      "license": "GPL-2.0-or-later",
+      "dependencies": {
+        "@ckeditor/ckeditor5-clipboard": "43.3.1",
+        "@ckeditor/ckeditor5-core": "43.3.1",
+        "@ckeditor/ckeditor5-engine": "43.3.1",
+        "@ckeditor/ckeditor5-typing": "43.3.1",
+        "@ckeditor/ckeditor5-ui": "43.3.1",
+        "@ckeditor/ckeditor5-utils": "43.3.1",
+        "@ckeditor/ckeditor5-widget": "43.3.1",
+        "ckeditor5": "43.3.1",
         "lodash-es": "4.17.21"
       }
     },
     "node_modules/@ckeditor/ckeditor5-list": {
-      "version": "41.3.0",
-      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-list/-/ckeditor5-list-41.3.0.tgz",
-      "integrity": "sha512-UxdRba5hLkP1Nl/gfbNoivcvXdQYavcgZZl36zO+CCuEgIcP7qcFRhye2oitiGZ1tSJfXD2/JAkkLOITdsKSjg==",
-      "dependencies": {
-        "ckeditor5": "41.3.0"
+      "version": "43.3.1",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-list/-/ckeditor5-list-43.3.1.tgz",
+      "integrity": "sha512-PuR6uJ/SKvaXIgqTO3MUnX+00/xB/TalStiVqZqqG0xlYg47/eb6hul+4fmTPV7ahlJaon6Y3nO49TsPbbhApQ==",
+      "license": "GPL-2.0-or-later",
+      "dependencies": {
+        "@ckeditor/ckeditor5-clipboard": "43.3.1",
+        "@ckeditor/ckeditor5-core": "43.3.1",
+        "@ckeditor/ckeditor5-engine": "43.3.1",
+        "@ckeditor/ckeditor5-enter": "43.3.1",
+        "@ckeditor/ckeditor5-typing": "43.3.1",
+        "@ckeditor/ckeditor5-ui": "43.3.1",
+        "@ckeditor/ckeditor5-utils": "43.3.1",
+        "ckeditor5": "43.3.1"
+      }
+    },
+    "node_modules/@ckeditor/ckeditor5-markdown-gfm": {
+      "version": "43.3.1",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-markdown-gfm/-/ckeditor5-markdown-gfm-43.3.1.tgz",
+      "integrity": "sha512-aVP2FqQP7okSAorQoItcYRbOd0J2O1ubGjtvGGzl3uC5TuKAtlWYWcBfiVTHKxCCtxywPRiEgBxwoGuB5mlwhA==",
+      "license": "GPL-2.0-or-later",
+      "dependencies": {
+        "@ckeditor/ckeditor5-clipboard": "43.3.1",
+        "@ckeditor/ckeditor5-core": "43.3.1",
+        "@ckeditor/ckeditor5-engine": "43.3.1",
+        "ckeditor5": "43.3.1",
+        "marked": "4.0.12",
+        "turndown": "7.2.0",
+        "turndown-plugin-gfm": "1.0.2"
+      }
+    },
+    "node_modules/@ckeditor/ckeditor5-media-embed": {
+      "version": "43.3.1",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-media-embed/-/ckeditor5-media-embed-43.3.1.tgz",
+      "integrity": "sha512-3xMIaH/NTNEKv+lu1cRIIPGgDJgYI1DB+5NMXNVL3UGQkXdqW7PtgFDsOnhQwTAbyKpy+fHDngLb3eZuRdDkKw==",
+      "license": "GPL-2.0-or-later",
+      "dependencies": {
+        "@ckeditor/ckeditor5-clipboard": "43.3.1",
+        "@ckeditor/ckeditor5-core": "43.3.1",
+        "@ckeditor/ckeditor5-engine": "43.3.1",
+        "@ckeditor/ckeditor5-typing": "43.3.1",
+        "@ckeditor/ckeditor5-ui": "43.3.1",
+        "@ckeditor/ckeditor5-undo": "43.3.1",
+        "@ckeditor/ckeditor5-utils": "43.3.1",
+        "@ckeditor/ckeditor5-widget": "43.3.1",
+        "ckeditor5": "43.3.1"
       }
     },
     "node_modules/@ckeditor/ckeditor5-mention": {
-      "version": "41.3.0",
-      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-mention/-/ckeditor5-mention-41.3.0.tgz",
-      "integrity": "sha512-jhXtsm+dw8g9b/Y6xK9LngwdXsRI23YRYjXzJxdlPR92eLB3nLIx1zD8FvqJarfVCTVjrYbp0FPTr3FjjddSuQ==",
-      "dependencies": {
-        "ckeditor5": "41.3.0",
+      "version": "43.3.1",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-mention/-/ckeditor5-mention-43.3.1.tgz",
+      "integrity": "sha512-yrOdynVNOS72RjTjhFHzv3Ofbm0eTBKFhuibxdKFfHtTR0QIqSVB5jU+aW1+Jq5LG73E+9eYtip5paSjkqJMWQ==",
+      "license": "GPL-2.0-or-later",
+      "dependencies": {
+        "@ckeditor/ckeditor5-core": "43.3.1",
+        "@ckeditor/ckeditor5-typing": "43.3.1",
+        "@ckeditor/ckeditor5-ui": "43.3.1",
+        "@ckeditor/ckeditor5-utils": "43.3.1",
+        "ckeditor5": "43.3.1",
         "lodash-es": "4.17.21"
       }
     },
+    "node_modules/@ckeditor/ckeditor5-minimap": {
+      "version": "43.3.1",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-minimap/-/ckeditor5-minimap-43.3.1.tgz",
+      "integrity": "sha512-2b0b4mZtRIHAvN/MFAVeqiGt58TZI7ixLcgJo0MHNesYlIk6v13opDWhQ9oefNe8OwJMkD3fAHMlAcg+fUqA9g==",
+      "license": "GPL-2.0-or-later",
+      "dependencies": {
+        "@ckeditor/ckeditor5-core": "43.3.1",
+        "@ckeditor/ckeditor5-engine": "43.3.1",
+        "@ckeditor/ckeditor5-ui": "43.3.1",
+        "@ckeditor/ckeditor5-utils": "43.3.1",
+        "ckeditor5": "43.3.1"
+      }
+    },
+    "node_modules/@ckeditor/ckeditor5-page-break": {
+      "version": "43.3.1",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-page-break/-/ckeditor5-page-break-43.3.1.tgz",
+      "integrity": "sha512-6AI2GGJveEm/2GESUY01wSPM7AeqHqVuX4Hon20uCAXHYCQkDubOHJ0yV3oFXl7iHeO6Ue2DdlSLayIUXCLoEQ==",
+      "license": "GPL-2.0-or-later",
+      "dependencies": {
+        "@ckeditor/ckeditor5-core": "43.3.1",
+        "@ckeditor/ckeditor5-ui": "43.3.1",
+        "@ckeditor/ckeditor5-widget": "43.3.1",
+        "ckeditor5": "43.3.1"
+      }
+    },
     "node_modules/@ckeditor/ckeditor5-paragraph": {
-      "version": "41.3.0",
-      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-paragraph/-/ckeditor5-paragraph-41.3.0.tgz",
-      "integrity": "sha512-9wcGu99fltVZNq+vn6PEiib+4pERIR8ntDZr+Gi++4jqDEehVbQbaqKRwy/fLCl0JFaRVnmtsRm+iaUnkL3R3Q==",
+      "version": "43.3.1",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-paragraph/-/ckeditor5-paragraph-43.3.1.tgz",
+      "integrity": "sha512-16ry56X+uXuZEzGZwLS8zpX2DtWN/CHHu5pSz0r2VDZ1zUGLsq/MXutotZfzMMjgdED3x4mJRQE+WgiyRrlKDg==",
+      "license": "GPL-2.0-or-later",
       "dependencies": {
-        "@ckeditor/ckeditor5-core": "41.3.0",
-        "@ckeditor/ckeditor5-ui": "41.3.0",
-        "@ckeditor/ckeditor5-utils": "41.3.0"
+        "@ckeditor/ckeditor5-core": "43.3.1",
+        "@ckeditor/ckeditor5-ui": "43.3.1",
+        "@ckeditor/ckeditor5-utils": "43.3.1"
       }
     },
     "node_modules/@ckeditor/ckeditor5-paste-from-office": {
-      "version": "41.3.0",
-      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-paste-from-office/-/ckeditor5-paste-from-office-41.3.0.tgz",
-      "integrity": "sha512-jItJg9tpQxSv3FjH90RSX+bZmqwVlHZcgTRI03rkQlwi+hlneP6Cu8vxRt0zRRbNLxy0gdnk6QpD1vbq/8riHQ==",
+      "version": "43.3.1",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-paste-from-office/-/ckeditor5-paste-from-office-43.3.1.tgz",
+      "integrity": "sha512-LLf1KB11jeYLDpQPq0d2QVPxQxp9kEibPAF4rGD4stPpRx9d+DbwmE59Y5wVASKvYJo+yNpR9CGWsE4ZgjwTWw==",
+      "license": "GPL-2.0-or-later",
       "dependencies": {
-        "ckeditor5": "41.3.0"
+        "@ckeditor/ckeditor5-clipboard": "43.3.1",
+        "@ckeditor/ckeditor5-core": "43.3.1",
+        "@ckeditor/ckeditor5-engine": "43.3.1",
+        "ckeditor5": "43.3.1"
       }
     },
     "node_modules/@ckeditor/ckeditor5-remove-format": {
-      "version": "41.3.0",
-      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-remove-format/-/ckeditor5-remove-format-41.3.0.tgz",
-      "integrity": "sha512-QOeVjT/ct2VLBd3ch4Ua/xjQs/5iXaIMjGidMLWvN8TiOYRq50dyy7ecjS4TPyzeQUVa7jd0fZiXTCjgHYZ2yA==",
+      "version": "43.3.1",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-remove-format/-/ckeditor5-remove-format-43.3.1.tgz",
+      "integrity": "sha512-m7zvvYzHN/HExT0NoILXauVFI/AKQyuzPqqCI/VO1Ft5mLswXGuK6vmO1U10SmGz85etYZjEipKuouf2Anyqxg==",
+      "license": "GPL-2.0-or-later",
       "dependencies": {
-        "ckeditor5": "41.3.0"
+        "@ckeditor/ckeditor5-core": "43.3.1",
+        "@ckeditor/ckeditor5-ui": "43.3.1",
+        "@ckeditor/ckeditor5-utils": "43.3.1",
+        "ckeditor5": "43.3.1"
       }
     },
-    "node_modules/@ckeditor/ckeditor5-select-all": {
-      "version": "41.3.0",
-      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-select-all/-/ckeditor5-select-all-41.3.0.tgz",
-      "integrity": "sha512-w14V7OHVVB9NlO536+NYPvgNk0XCNufO2oxO0B4Tf4iQi6U3LYxyMJwotHDwhJqYVHofLQyeuwFF3Y2N1d1NnQ==",
+    "node_modules/@ckeditor/ckeditor5-restricted-editing": {
+      "version": "43.3.1",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-restricted-editing/-/ckeditor5-restricted-editing-43.3.1.tgz",
+      "integrity": "sha512-L6sA6UrUPy4Q3AzF8yQGsgEadO1IcZv53Ijevk9KuD7dwLF4f9x4ukUFLlGRpoYHPAW/+RpADp2PPegjKHo9QQ==",
+      "license": "GPL-2.0-or-later",
       "dependencies": {
-        "@ckeditor/ckeditor5-core": "41.3.0",
-        "@ckeditor/ckeditor5-ui": "41.3.0",
-        "@ckeditor/ckeditor5-utils": "41.3.0"
+        "@ckeditor/ckeditor5-core": "43.3.1",
+        "@ckeditor/ckeditor5-engine": "43.3.1",
+        "@ckeditor/ckeditor5-ui": "43.3.1",
+        "@ckeditor/ckeditor5-utils": "43.3.1",
+        "ckeditor5": "43.3.1"
+      }
+    },
+    "node_modules/@ckeditor/ckeditor5-select-all": {
+      "version": "43.3.1",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-select-all/-/ckeditor5-select-all-43.3.1.tgz",
+      "integrity": "sha512-oYQ8uF6hmlX7OefpJ0FflvKddAkEffg3fKMT2FAINwqxhX+O7h9RQZ79AiOkTab7HUTIkbhM5AlhFJIXiX0Z7Q==",
+      "license": "GPL-2.0-or-later",
+      "dependencies": {
+        "@ckeditor/ckeditor5-core": "43.3.1",
+        "@ckeditor/ckeditor5-ui": "43.3.1",
+        "@ckeditor/ckeditor5-utils": "43.3.1"
+      }
+    },
+    "node_modules/@ckeditor/ckeditor5-show-blocks": {
+      "version": "43.3.1",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-show-blocks/-/ckeditor5-show-blocks-43.3.1.tgz",
+      "integrity": "sha512-o+IhZnjMmoF2qd4l1GqQqroeIEA29QAIOYfvrdMKZGrzVGmjbvwyNkbJRyZlAYhZqX8tLDPaPGn0tl+onhWtzw==",
+      "license": "GPL-2.0-or-later",
+      "dependencies": {
+        "@ckeditor/ckeditor5-core": "43.3.1",
+        "@ckeditor/ckeditor5-ui": "43.3.1",
+        "ckeditor5": "43.3.1"
+      }
+    },
+    "node_modules/@ckeditor/ckeditor5-source-editing": {
+      "version": "43.3.1",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-source-editing/-/ckeditor5-source-editing-43.3.1.tgz",
+      "integrity": "sha512-Pq7WthQAiKa3A3q82bHqNRjQ/xlOpSX9kZHLm+CDH8XACxZbBF6Unz4JPR9zJRuQxkoFs314DM/PG6pPZQgXXA==",
+      "license": "GPL-2.0-or-later",
+      "dependencies": {
+        "@ckeditor/ckeditor5-core": "43.3.1",
+        "@ckeditor/ckeditor5-theme-lark": "43.3.1",
+        "@ckeditor/ckeditor5-ui": "43.3.1",
+        "@ckeditor/ckeditor5-utils": "43.3.1",
+        "ckeditor5": "43.3.1"
+      }
+    },
+    "node_modules/@ckeditor/ckeditor5-special-characters": {
+      "version": "43.3.1",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-special-characters/-/ckeditor5-special-characters-43.3.1.tgz",
+      "integrity": "sha512-3iwrtISndl5hc+/LuSXht69xqkEv95zg8Qxv+ovREA3pvtgt5u9O0t7ELcmUeTTEs/hJkF2FDplIYQj5zIvO+g==",
+      "license": "GPL-2.0-or-later",
+      "dependencies": {
+        "@ckeditor/ckeditor5-core": "43.3.1",
+        "@ckeditor/ckeditor5-typing": "43.3.1",
+        "@ckeditor/ckeditor5-ui": "43.3.1",
+        "@ckeditor/ckeditor5-utils": "43.3.1",
+        "ckeditor5": "43.3.1"
+      }
+    },
+    "node_modules/@ckeditor/ckeditor5-style": {
+      "version": "43.3.1",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-style/-/ckeditor5-style-43.3.1.tgz",
+      "integrity": "sha512-2+ATPa5y4ZUkak5xFTTDeUPhuCAYB4OPNt/QjMvrQjpEwXoWDJ4f8GqR9oFFsqEGMm65GrUp/xIQW8WRH43Kng==",
+      "license": "GPL-2.0-or-later",
+      "dependencies": {
+        "@ckeditor/ckeditor5-core": "43.3.1",
+        "@ckeditor/ckeditor5-typing": "43.3.1",
+        "@ckeditor/ckeditor5-ui": "43.3.1",
+        "@ckeditor/ckeditor5-utils": "43.3.1",
+        "ckeditor5": "43.3.1",
+        "lodash-es": "4.17.21"
       }
     },
     "node_modules/@ckeditor/ckeditor5-table": {
-      "version": "41.3.0",
-      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-table/-/ckeditor5-table-41.3.0.tgz",
-      "integrity": "sha512-0oz7gP2TTRPZy3sss3TKoJ9Kpf9/mmQgH17VTMotF2CKJbPZdP7m8NciFH5CPqRuWZZKMCXn02pZyqhA+U+7HA==",
-      "dependencies": {
-        "ckeditor5": "41.3.0",
+      "version": "43.3.1",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-table/-/ckeditor5-table-43.3.1.tgz",
+      "integrity": "sha512-Qr3GkKELnG1EY7Bu9dGQBkGTqhVnygeHKDCTEG9m218shYsI5L6jFftGUzWmJzMpm3hNFkyYv+1YWaIoqfRzIQ==",
+      "license": "GPL-2.0-or-later",
+      "dependencies": {
+        "@ckeditor/ckeditor5-clipboard": "43.3.1",
+        "@ckeditor/ckeditor5-core": "43.3.1",
+        "@ckeditor/ckeditor5-engine": "43.3.1",
+        "@ckeditor/ckeditor5-ui": "43.3.1",
+        "@ckeditor/ckeditor5-utils": "43.3.1",
+        "@ckeditor/ckeditor5-widget": "43.3.1",
+        "ckeditor5": "43.3.1",
         "lodash-es": "4.17.21"
       }
     },
     "node_modules/@ckeditor/ckeditor5-theme-lark": {
-      "version": "41.3.0",
-      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-theme-lark/-/ckeditor5-theme-lark-41.3.0.tgz",
-      "integrity": "sha512-WKlgqDhajGkxakQ/ub45g4Zo5JoP3SCAlLsRQoiosm63twEoGlIB4F/zYJpSc1GtdZQf/dPFKYpE1mcr6wBc/A==",
+      "version": "43.3.1",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-theme-lark/-/ckeditor5-theme-lark-43.3.1.tgz",
+      "integrity": "sha512-kAgeGx66jT31FFYwAoc43oX5ehQtiYE57OJWlPTXrDXxyq0Y+LYFW2/bp4UVYdZK+OKv9dp1Do3VQfxJoGzFjg==",
+      "license": "GPL-2.0-or-later",
       "dependencies": {
-        "@ckeditor/ckeditor5-ui": "41.3.0"
+        "@ckeditor/ckeditor5-ui": "43.3.1"
       }
     },
     "node_modules/@ckeditor/ckeditor5-typing": {
-      "version": "41.3.0",
-      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-typing/-/ckeditor5-typing-41.3.0.tgz",
-      "integrity": "sha512-xboj4s3GcG+pwOYZeVUle8RkRE+De7OsejnzcwCwx+wJ2PkOwbSyVdXQIdRq+DSPxfISGjyFXGinSWiUx0taJg==",
-      "dependencies": {
-        "@ckeditor/ckeditor5-core": "41.3.0",
-        "@ckeditor/ckeditor5-engine": "41.3.0",
-        "@ckeditor/ckeditor5-utils": "41.3.0",
+      "version": "43.3.1",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-typing/-/ckeditor5-typing-43.3.1.tgz",
+      "integrity": "sha512-sK45GlrOHqWOphVnzDKe3kofVJGhSRk34UQJnyXgMN+35QJqypnJeBYBnnHWL8+nK0S4zk9oQO3PuiRH6gg/WQ==",
+      "license": "GPL-2.0-or-later",
+      "dependencies": {
+        "@ckeditor/ckeditor5-core": "43.3.1",
+        "@ckeditor/ckeditor5-engine": "43.3.1",
+        "@ckeditor/ckeditor5-utils": "43.3.1",
         "lodash-es": "4.17.21"
       }
     },
     "node_modules/@ckeditor/ckeditor5-ui": {
-      "version": "41.3.0",
-      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-ui/-/ckeditor5-ui-41.3.0.tgz",
-      "integrity": "sha512-F/zDk3584klgeoP2VyQmXn4cx0ekkfB8JD8JpqVNPAcLlw6HRdP9zhSTc9fDkA8QGnRIA/M0cXm3qXYS1Vms0Q==",
-      "dependencies": {
-        "@ckeditor/ckeditor5-core": "41.3.0",
-        "@ckeditor/ckeditor5-utils": "41.3.0",
+      "version": "43.3.1",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-ui/-/ckeditor5-ui-43.3.1.tgz",
+      "integrity": "sha512-dbR4FK6mCkI89h4Joyf1PZt0Xsq0N+sZg05Z6BpYz6GS9U35C7J9bHxN469dvaIc8bJws4eYJ5x+St3LcvlduQ==",
+      "license": "GPL-2.0-or-later",
+      "dependencies": {
+        "@ckeditor/ckeditor5-core": "43.3.1",
+        "@ckeditor/ckeditor5-engine": "43.3.1",
+        "@ckeditor/ckeditor5-utils": "43.3.1",
         "color-convert": "2.0.1",
         "color-parse": "1.4.2",
         "lodash-es": "4.17.21",
       }
     },
     "node_modules/@ckeditor/ckeditor5-undo": {
-      "version": "41.3.0",
-      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-undo/-/ckeditor5-undo-41.3.0.tgz",
-      "integrity": "sha512-o9zNt8joLzepvoR4eFtA7wklmi7PaA94iHk6QqE0xYL0y6qhwH+RharJRfftMaYAEUTRK4LeVXY6tjRmV5QRXQ==",
+      "version": "43.3.1",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-undo/-/ckeditor5-undo-43.3.1.tgz",
+      "integrity": "sha512-UxrWPlHzL/DKuxp4R5mlQvy995Ozehh5hQxY5yvL285Dzv6PY5pk627Wv/qS8AyfLMyVNiFO9bDWBIcT9igQRA==",
+      "license": "GPL-2.0-or-later",
       "dependencies": {
-        "@ckeditor/ckeditor5-core": "41.3.0",
-        "@ckeditor/ckeditor5-engine": "41.3.0",
-        "@ckeditor/ckeditor5-ui": "41.3.0"
+        "@ckeditor/ckeditor5-core": "43.3.1",
+        "@ckeditor/ckeditor5-engine": "43.3.1",
+        "@ckeditor/ckeditor5-ui": "43.3.1"
       }
     },
     "node_modules/@ckeditor/ckeditor5-upload": {
-      "version": "41.3.0",
-      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-upload/-/ckeditor5-upload-41.3.0.tgz",
-      "integrity": "sha512-ya7251S5oyqYzYNK4Ioz8L6Z4Dp93FItmm3uBAoEyWV0t0F0HeFpX+iWDTi9tfw6OgzZ8B0jPb6WYiAnrw2V3g==",
+      "version": "43.3.1",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-upload/-/ckeditor5-upload-43.3.1.tgz",
+      "integrity": "sha512-uOEhCgqgiK4V/CnbnuwHU/NUOG4ioQE5KUUtVmRG2xjQKg5C1uIT2dig+wnKw8vOdwVTMD2hVt7/OC/whQuheQ==",
+      "license": "GPL-2.0-or-later",
       "dependencies": {
-        "@ckeditor/ckeditor5-core": "41.3.0",
-        "@ckeditor/ckeditor5-utils": "41.3.0"
+        "@ckeditor/ckeditor5-core": "43.3.1",
+        "@ckeditor/ckeditor5-utils": "43.3.1"
       }
     },
     "node_modules/@ckeditor/ckeditor5-utils": {
-      "version": "41.3.0",
-      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-utils/-/ckeditor5-utils-41.3.0.tgz",
-      "integrity": "sha512-MhsmTLklzwmMo7JFEVqul8eFOX3pD91mF8XfxH3qOb/GPxMmN0cCLVkY+W/WE/YCr5HZcWym3v0rVnUjqGZ6jQ==",
+      "version": "43.3.1",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-utils/-/ckeditor5-utils-43.3.1.tgz",
+      "integrity": "sha512-4CyM3AP+DcfuPuw+zceI3UTh3HcusnvFVeRPPw6j3Qe29/jadZYsdvkdo9KsDaiwgx0ctooKCuY9SfAcd/CZNQ==",
+      "license": "GPL-2.0-or-later",
       "dependencies": {
+        "@ckeditor/ckeditor5-ui": "43.3.1",
         "lodash-es": "4.17.21"
       }
     },
     "node_modules/@ckeditor/ckeditor5-watchdog": {
-      "version": "41.3.0",
-      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-watchdog/-/ckeditor5-watchdog-41.3.0.tgz",
-      "integrity": "sha512-TVROhUR5hHy+2cbbuRc/+EO9xFcC8z/tWcMwOGlRIIwLJUu5GXWiCInF+wV0sG7IYdGIEEoOiTPiHzOSQSt5lQ==",
+      "version": "43.3.1",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-watchdog/-/ckeditor5-watchdog-43.3.1.tgz",
+      "integrity": "sha512-d9gh0QIrrImIe2SFLo/IBLdpgC9REVkvUTv//qLbUaM2ffBboMnpJYPAB/hgl8ev4lkDvCrivlGjc/80COfGTQ==",
+      "license": "GPL-2.0-or-later",
       "dependencies": {
         "lodash-es": "4.17.21"
       }
     },
     "node_modules/@ckeditor/ckeditor5-widget": {
-      "version": "41.3.0",
-      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-widget/-/ckeditor5-widget-41.3.0.tgz",
-      "integrity": "sha512-Cf0C6+G3LP4fZnPMmuCo1TknsGoikb7sz0MgW+16h1UGmNu5QpyOH9oGnHeDbeVFKyR4Ld0Li9Kw9+oJL9g6OA==",
-      "dependencies": {
-        "@ckeditor/ckeditor5-core": "41.3.0",
-        "@ckeditor/ckeditor5-engine": "41.3.0",
-        "@ckeditor/ckeditor5-enter": "41.3.0",
-        "@ckeditor/ckeditor5-typing": "41.3.0",
-        "@ckeditor/ckeditor5-ui": "41.3.0",
-        "@ckeditor/ckeditor5-utils": "41.3.0",
+      "version": "43.3.1",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-widget/-/ckeditor5-widget-43.3.1.tgz",
+      "integrity": "sha512-0naXUVC6BFLnuj3lu5aTfRxmqV6py9+zqGHdJJZ0x8uSg9qcfUCLEQvA59bqzNteRya/lZeZhYKj8IcGnbB1oA==",
+      "license": "GPL-2.0-or-later",
+      "dependencies": {
+        "@ckeditor/ckeditor5-core": "43.3.1",
+        "@ckeditor/ckeditor5-engine": "43.3.1",
+        "@ckeditor/ckeditor5-enter": "43.3.1",
+        "@ckeditor/ckeditor5-typing": "43.3.1",
+        "@ckeditor/ckeditor5-ui": "43.3.1",
+        "@ckeditor/ckeditor5-utils": "43.3.1",
+        "lodash-es": "4.17.21"
+      }
+    },
+    "node_modules/@ckeditor/ckeditor5-word-count": {
+      "version": "43.3.1",
+      "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-word-count/-/ckeditor5-word-count-43.3.1.tgz",
+      "integrity": "sha512-W0Ic7y4/ePVqW22pHuXv5HRAbaDJFO13rUqyTZqU2H2ExZdMbJN6eT/UVhnO1XvKs/+jdKGO3LGWXt9QmmtkhA==",
+      "license": "GPL-2.0-or-later",
+      "dependencies": {
+        "@ckeditor/ckeditor5-core": "43.3.1",
+        "@ckeditor/ckeditor5-ui": "43.3.1",
+        "@ckeditor/ckeditor5-utils": "43.3.1",
+        "ckeditor5": "43.3.1",
         "lodash-es": "4.17.21"
       }
     },
       }
     },
     "node_modules/@eslint-community/regexpp": {
-      "version": "4.11.1",
-      "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz",
-      "integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==",
+      "version": "4.12.1",
+      "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz",
+      "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==",
       "dev": true,
       "license": "MIT",
       "engines": {
       }
     },
     "node_modules/@eslint/js": {
-      "version": "9.13.0",
-      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.13.0.tgz",
-      "integrity": "sha512-IFLyoY4d72Z5y/6o/BazFBezupzI/taV8sGumxTAVw3lXG9A6md1Dc34T9s1FoD/an9pJH8RHbAxsaEbBed9lA==",
+      "version": "9.14.0",
+      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.14.0.tgz",
+      "integrity": "sha512-pFoEtFWCPyDOl+C6Ift+wC7Ro89otjigCf5vcuWqWgqNSQbRrpjSvdeE6ofLz4dHmyxD5f7gIdGT4+p36L6Twg==",
       "dev": true,
       "license": "MIT",
       "engines": {
         "url": "https://github.com/sponsors/nzakas"
       }
     },
+    "node_modules/@mixmark-io/domino": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/@mixmark-io/domino/-/domino-2.2.0.tgz",
+      "integrity": "sha512-Y28PR25bHXUg88kCV7nivXrP2Nj2RueZ3/l/jdx6J9f8J4nsEGcgX0Qe6lt7Pa+J79+kPiJU3LguR6O/6zrLOw==",
+      "license": "BSD-2-Clause"
+    },
     "node_modules/@nodelib/fs.scandir": {
       "version": "2.1.5",
       "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
       "integrity": "sha512-X9QTSvGJ0nCfMzYOnaVs/k6/4L+7F5uCS+4iUmkLEls6J9S/Phv+m/i3mDeyc49ZBgwab3EFO1HEoBY7k98EGQ=="
     },
     "node_modules/@types/jquery": {
-      "version": "3.5.30",
-      "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.30.tgz",
-      "integrity": "sha512-nbWKkkyb919DOUxjmRVk8vwtDb0/k8FKncmUKFi+NY+QXqWltooxTrswvz4LspQwxvLdvzBN1TImr6cw3aQx2A==",
+      "version": "3.5.32",
+      "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.32.tgz",
+      "integrity": "sha512-b9Xbf4CkMqS02YH8zACqN1xzdxc3cO735Qe5AbSUFmyOiaWAbcpqh9Wna+Uk0vgACvoQHpWDg2rGdHkYPLmCiQ==",
       "license": "MIT",
       "dependencies": {
         "@types/sizzle": "*"
       "license": "MIT"
     },
     "node_modules/@types/prismjs": {
-      "version": "1.26.4",
-      "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.4.tgz",
-      "integrity": "sha512-rlAnzkW2sZOjbqZ743IHUhFcvzaGbqijwOu8QZnZCjfQzBqFE3s4lOTJEsxikImav9uzz/42I+O7YUs1mWgMlg==",
+      "version": "1.26.5",
+      "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.5.tgz",
+      "integrity": "sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==",
       "license": "MIT"
     },
     "node_modules/@types/sizzle": {
       "integrity": "sha512-3NoqvZC2W5gAC5DZbTpCeJ251vGQmgcWIHQJGq2J240HY6ErQ9aWKkwfoKJlHLx+A83WPNTZ9+3cd2ILxbvr1w=="
     },
     "node_modules/@typescript-eslint/eslint-plugin": {
-      "version": "8.13.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.13.0.tgz",
-      "integrity": "sha512-nQtBLiZYMUPkclSeC3id+x4uVd1SGtHuElTxL++SfP47jR0zfkZBJHc+gL4qPsgTuypz0k8Y2GheaDYn6Gy3rg==",
+      "version": "8.14.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.14.0.tgz",
+      "integrity": "sha512-tqp8H7UWFaZj0yNO6bycd5YjMwxa6wIHOLZvWPkidwbgLCsBMetQoGj7DPuAlWa2yGO3H48xmPwjhsSPPCGU5w==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@eslint-community/regexpp": "^4.10.0",
-        "@typescript-eslint/scope-manager": "8.13.0",
-        "@typescript-eslint/type-utils": "8.13.0",
-        "@typescript-eslint/utils": "8.13.0",
-        "@typescript-eslint/visitor-keys": "8.13.0",
+        "@typescript-eslint/scope-manager": "8.14.0",
+        "@typescript-eslint/type-utils": "8.14.0",
+        "@typescript-eslint/utils": "8.14.0",
+        "@typescript-eslint/visitor-keys": "8.14.0",
         "graphemer": "^1.4.0",
         "ignore": "^5.3.1",
         "natural-compare": "^1.4.0",
       }
     },
     "node_modules/@typescript-eslint/parser": {
-      "version": "8.13.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.13.0.tgz",
-      "integrity": "sha512-w0xp+xGg8u/nONcGw1UXAr6cjCPU1w0XVyBs6Zqaj5eLmxkKQAByTdV/uGgNN5tVvN/kKpoQlP2cL7R+ajZZIQ==",
+      "version": "8.14.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.14.0.tgz",
+      "integrity": "sha512-2p82Yn9juUJq0XynBXtFCyrBDb6/dJombnz6vbo6mgQEtWHfvHbQuEa9kAOVIt1c9YFwi7H6WxtPj1kg+80+RA==",
       "dev": true,
       "license": "BSD-2-Clause",
       "dependencies": {
-        "@typescript-eslint/scope-manager": "8.13.0",
-        "@typescript-eslint/types": "8.13.0",
-        "@typescript-eslint/typescript-estree": "8.13.0",
-        "@typescript-eslint/visitor-keys": "8.13.0",
+        "@typescript-eslint/scope-manager": "8.14.0",
+        "@typescript-eslint/types": "8.14.0",
+        "@typescript-eslint/typescript-estree": "8.14.0",
+        "@typescript-eslint/visitor-keys": "8.14.0",
         "debug": "^4.3.4"
       },
       "engines": {
       }
     },
     "node_modules/@typescript-eslint/scope-manager": {
-      "version": "8.13.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.13.0.tgz",
-      "integrity": "sha512-XsGWww0odcUT0gJoBZ1DeulY1+jkaHUciUq4jKNv4cpInbvvrtDoyBH9rE/n2V29wQJPk8iCH1wipra9BhmiMA==",
+      "version": "8.14.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.14.0.tgz",
+      "integrity": "sha512-aBbBrnW9ARIDn92Zbo7rguLnqQ/pOrUguVpbUwzOhkFg2npFDwTgPGqFqE0H5feXcOoJOfX3SxlJaKEVtq54dw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/types": "8.13.0",
-        "@typescript-eslint/visitor-keys": "8.13.0"
+        "@typescript-eslint/types": "8.14.0",
+        "@typescript-eslint/visitor-keys": "8.14.0"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
       }
     },
     "node_modules/@typescript-eslint/type-utils": {
-      "version": "8.13.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.13.0.tgz",
-      "integrity": "sha512-Rqnn6xXTR316fP4D2pohZenJnp+NwQ1mo7/JM+J1LWZENSLkJI8ID8QNtlvFeb0HnFSK94D6q0cnMX6SbE5/vA==",
+      "version": "8.14.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.14.0.tgz",
+      "integrity": "sha512-Xcz9qOtZuGusVOH5Uk07NGs39wrKkf3AxlkK79RBK6aJC1l03CobXjJbwBPSidetAOV+5rEVuiT1VSBUOAsanQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/typescript-estree": "8.13.0",
-        "@typescript-eslint/utils": "8.13.0",
+        "@typescript-eslint/typescript-estree": "8.14.0",
+        "@typescript-eslint/utils": "8.14.0",
         "debug": "^4.3.4",
         "ts-api-utils": "^1.3.0"
       },
       }
     },
     "node_modules/@typescript-eslint/types": {
-      "version": "8.13.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.13.0.tgz",
-      "integrity": "sha512-4cyFErJetFLckcThRUFdReWJjVsPCqyBlJTi6IDEpc1GWCIIZRFxVppjWLIMcQhNGhdWJJRYFHpHoDWvMlDzng==",
+      "version": "8.14.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.14.0.tgz",
+      "integrity": "sha512-yjeB9fnO/opvLJFAsPNYlKPnEM8+z4og09Pk504dkqonT02AyL5Z9SSqlE0XqezS93v6CXn49VHvB2G7XSsl0g==",
       "dev": true,
       "license": "MIT",
       "engines": {
       }
     },
     "node_modules/@typescript-eslint/typescript-estree": {
-      "version": "8.13.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.13.0.tgz",
-      "integrity": "sha512-v7SCIGmVsRK2Cy/LTLGN22uea6SaUIlpBcO/gnMGT/7zPtxp90bphcGf4fyrCQl3ZtiBKqVTG32hb668oIYy1g==",
+      "version": "8.14.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.14.0.tgz",
+      "integrity": "sha512-OPXPLYKGZi9XS/49rdaCbR5j/S14HazviBlUQFvSKz3npr3NikF+mrgK7CFVur6XEt95DZp/cmke9d5i3vtVnQ==",
       "dev": true,
       "license": "BSD-2-Clause",
       "dependencies": {
-        "@typescript-eslint/types": "8.13.0",
-        "@typescript-eslint/visitor-keys": "8.13.0",
+        "@typescript-eslint/types": "8.14.0",
+        "@typescript-eslint/visitor-keys": "8.14.0",
         "debug": "^4.3.4",
         "fast-glob": "^3.3.2",
         "is-glob": "^4.0.3",
       }
     },
     "node_modules/@typescript-eslint/utils": {
-      "version": "8.13.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.13.0.tgz",
-      "integrity": "sha512-A1EeYOND6Uv250nybnLZapeXpYMl8tkzYUxqmoKAWnI4sei3ihf2XdZVd+vVOmHGcp3t+P7yRrNsyyiXTvShFQ==",
+      "version": "8.14.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.14.0.tgz",
+      "integrity": "sha512-OGqj6uB8THhrHj0Fk27DcHPojW7zKwKkPmHXHvQ58pLYp4hy8CSUdTKykKeh+5vFqTTVmjz0zCOOPKRovdsgHA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@eslint-community/eslint-utils": "^4.4.0",
-        "@typescript-eslint/scope-manager": "8.13.0",
-        "@typescript-eslint/types": "8.13.0",
-        "@typescript-eslint/typescript-estree": "8.13.0"
+        "@typescript-eslint/scope-manager": "8.14.0",
+        "@typescript-eslint/types": "8.14.0",
+        "@typescript-eslint/typescript-estree": "8.14.0"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
       }
     },
     "node_modules/@typescript-eslint/visitor-keys": {
-      "version": "8.13.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.13.0.tgz",
-      "integrity": "sha512-7N/+lztJqH4Mrf0lb10R/CbI1EaAMMGyF5y0oJvFoAhafwgiRA7TXyd8TFn8FC8k5y2dTsYogg238qavRGNnlw==",
+      "version": "8.14.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.14.0.tgz",
+      "integrity": "sha512-vG0XZo8AdTH9OE6VFRwAZldNc7qtJ/6NLGWak+BtENuEUXGZgFpihILPiBvKXvJ2nFu27XNGC6rKiwuaoMbYzQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/types": "8.13.0",
+        "@typescript-eslint/types": "8.14.0",
         "eslint-visitor-keys": "^3.4.3"
       },
       "engines": {
       }
     },
     "node_modules/@woltlab/editor": {
-      "resolved": "git+ssh://git@github.com/WoltLab/editor.git#efa5ffdc4a094c55ef015b29c9d5024649a8ea32",
-      "integrity": "sha512-R5ymdCAZ62OHkEwsqDEErzJA8r8JxDvBmNvNfxYB2cTzs8JJ/3ZRq3kYPLvCL2HnlY1S/i9eReYwlJdTx2+oaQ==",
-      "dependencies": {
-        "@ckeditor/ckeditor5-alignment": "^41.3.0",
-        "@ckeditor/ckeditor5-autosave": "^41.3.0",
-        "@ckeditor/ckeditor5-basic-styles": "^41.3.0",
-        "@ckeditor/ckeditor5-block-quote": "^41.3.0",
-        "@ckeditor/ckeditor5-code-block": "^41.3.0",
-        "@ckeditor/ckeditor5-editor-classic": "^41.3.0",
-        "@ckeditor/ckeditor5-engine": "^41.3.0",
-        "@ckeditor/ckeditor5-essentials": "^41.3.0",
-        "@ckeditor/ckeditor5-font": "^41.3.0",
-        "@ckeditor/ckeditor5-heading": "^41.3.0",
-        "@ckeditor/ckeditor5-highlight": "^41.3.0",
-        "@ckeditor/ckeditor5-horizontal-line": "^41.3.0",
-        "@ckeditor/ckeditor5-html-embed": "^41.3.0",
-        "@ckeditor/ckeditor5-image": "^41.3.0",
-        "@ckeditor/ckeditor5-indent": "^41.3.0",
-        "@ckeditor/ckeditor5-link": "^41.3.0",
-        "@ckeditor/ckeditor5-list": "^41.3.0",
-        "@ckeditor/ckeditor5-mention": "^41.3.0",
-        "@ckeditor/ckeditor5-paragraph": "^41.3.0",
-        "@ckeditor/ckeditor5-paste-from-office": "^41.3.0",
-        "@ckeditor/ckeditor5-remove-format": "^41.3.0",
-        "@ckeditor/ckeditor5-table": "^41.3.0",
-        "@ckeditor/ckeditor5-theme-lark": "^41.3.0",
-        "@ckeditor/ckeditor5-ui": "^41.3.0",
-        "@ckeditor/ckeditor5-undo": "^41.3.0",
-        "@ckeditor/ckeditor5-utils": "^41.3.0",
-        "@ckeditor/ckeditor5-widget": "^41.3.0"
+      "resolved": "git+ssh://git@github.com/WoltLab/editor.git#ebd849dd0abb0826fd4c56b29d88a79b45a4f9fb",
+      "integrity": "sha512-f7hv0XvBN5IbS3Az1ROHUJ9yRrBJXxlsult2uhYcF+MHm7QwS30ZX7ERCKm1vtCZ0FQ+N/ttiqKiYaPgwSrX3A==",
+      "dependencies": {
+        "@ckeditor/ckeditor5-alignment": "^43.3.1",
+        "@ckeditor/ckeditor5-autosave": "^43.3.1",
+        "@ckeditor/ckeditor5-basic-styles": "^43.3.1",
+        "@ckeditor/ckeditor5-block-quote": "^43.3.1",
+        "@ckeditor/ckeditor5-code-block": "^43.3.1",
+        "@ckeditor/ckeditor5-editor-classic": "^43.3.1",
+        "@ckeditor/ckeditor5-engine": "^43.3.1",
+        "@ckeditor/ckeditor5-essentials": "^43.3.1",
+        "@ckeditor/ckeditor5-font": "^43.3.1",
+        "@ckeditor/ckeditor5-heading": "^43.3.1",
+        "@ckeditor/ckeditor5-highlight": "^43.3.1",
+        "@ckeditor/ckeditor5-horizontal-line": "^43.3.1",
+        "@ckeditor/ckeditor5-html-embed": "^43.3.1",
+        "@ckeditor/ckeditor5-image": "^43.3.1",
+        "@ckeditor/ckeditor5-indent": "^43.3.1",
+        "@ckeditor/ckeditor5-link": "^43.3.1",
+        "@ckeditor/ckeditor5-list": "^43.3.1",
+        "@ckeditor/ckeditor5-mention": "^43.3.1",
+        "@ckeditor/ckeditor5-paragraph": "^43.3.1",
+        "@ckeditor/ckeditor5-paste-from-office": "^43.3.1",
+        "@ckeditor/ckeditor5-remove-format": "^43.3.1",
+        "@ckeditor/ckeditor5-table": "^43.3.1",
+        "@ckeditor/ckeditor5-theme-lark": "^43.3.1",
+        "@ckeditor/ckeditor5-ui": "^43.3.1",
+        "@ckeditor/ckeditor5-undo": "^43.3.1",
+        "@ckeditor/ckeditor5-utils": "^43.3.1",
+        "@ckeditor/ckeditor5-widget": "^43.3.1"
       }
     },
     "node_modules/@woltlab/visual-dom-diff": {
       "dev": true,
       "license": "MIT"
     },
+    "node_modules/blurhash": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/blurhash/-/blurhash-2.0.5.tgz",
+      "integrity": "sha512-cRygWd7kGBQO3VEhPiTgq4Wc43ctsM+o46urrmPOiuAe+07fzlSB9OJVdpgDL0jPqXUVQ9ht7aq7kxOeJHRK+w==",
+      "license": "MIT"
+    },
     "node_modules/brace-expansion": {
       "version": "1.1.11",
       "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
       }
     },
     "node_modules/ckeditor5": {
-      "version": "41.3.0",
-      "resolved": "https://registry.npmjs.org/ckeditor5/-/ckeditor5-41.3.0.tgz",
-      "integrity": "sha512-H9+Gv9DZQHxiPjaaWo0FHFeYBDWv0Je9WvudLyLaCwh9FVVEZNcPqVmxe55M1mIdQJSXNn8Q663orct09pqdfw==",
-      "dependencies": {
-        "@ckeditor/ckeditor5-clipboard": "41.3.0",
-        "@ckeditor/ckeditor5-core": "41.3.0",
-        "@ckeditor/ckeditor5-engine": "41.3.0",
-        "@ckeditor/ckeditor5-enter": "41.3.0",
-        "@ckeditor/ckeditor5-paragraph": "41.3.0",
-        "@ckeditor/ckeditor5-select-all": "41.3.0",
-        "@ckeditor/ckeditor5-typing": "41.3.0",
-        "@ckeditor/ckeditor5-ui": "41.3.0",
-        "@ckeditor/ckeditor5-undo": "41.3.0",
-        "@ckeditor/ckeditor5-upload": "41.3.0",
-        "@ckeditor/ckeditor5-utils": "41.3.0",
-        "@ckeditor/ckeditor5-watchdog": "41.3.0",
-        "@ckeditor/ckeditor5-widget": "41.3.0"
+      "version": "43.3.1",
+      "resolved": "https://registry.npmjs.org/ckeditor5/-/ckeditor5-43.3.1.tgz",
+      "integrity": "sha512-ZZ6nIdlr9rCCp21o9d5/mVUeVPwpQKEVxkeq1MU/Jax1w8U6rnMiQWxB954Ky/HNjhZ1v1ll2+VRzb7XA+1emA==",
+      "license": "GPL-2.0-or-later",
+      "dependencies": {
+        "@ckeditor/ckeditor5-adapter-ckfinder": "43.3.1",
+        "@ckeditor/ckeditor5-alignment": "43.3.1",
+        "@ckeditor/ckeditor5-autoformat": "43.3.1",
+        "@ckeditor/ckeditor5-autosave": "43.3.1",
+        "@ckeditor/ckeditor5-basic-styles": "43.3.1",
+        "@ckeditor/ckeditor5-block-quote": "43.3.1",
+        "@ckeditor/ckeditor5-ckbox": "43.3.1",
+        "@ckeditor/ckeditor5-ckfinder": "43.3.1",
+        "@ckeditor/ckeditor5-clipboard": "43.3.1",
+        "@ckeditor/ckeditor5-cloud-services": "43.3.1",
+        "@ckeditor/ckeditor5-code-block": "43.3.1",
+        "@ckeditor/ckeditor5-core": "43.3.1",
+        "@ckeditor/ckeditor5-easy-image": "43.3.1",
+        "@ckeditor/ckeditor5-editor-balloon": "43.3.1",
+        "@ckeditor/ckeditor5-editor-classic": "43.3.1",
+        "@ckeditor/ckeditor5-editor-decoupled": "43.3.1",
+        "@ckeditor/ckeditor5-editor-inline": "43.3.1",
+        "@ckeditor/ckeditor5-editor-multi-root": "43.3.1",
+        "@ckeditor/ckeditor5-engine": "43.3.1",
+        "@ckeditor/ckeditor5-enter": "43.3.1",
+        "@ckeditor/ckeditor5-essentials": "43.3.1",
+        "@ckeditor/ckeditor5-find-and-replace": "43.3.1",
+        "@ckeditor/ckeditor5-font": "43.3.1",
+        "@ckeditor/ckeditor5-heading": "43.3.1",
+        "@ckeditor/ckeditor5-highlight": "43.3.1",
+        "@ckeditor/ckeditor5-horizontal-line": "43.3.1",
+        "@ckeditor/ckeditor5-html-embed": "43.3.1",
+        "@ckeditor/ckeditor5-html-support": "43.3.1",
+        "@ckeditor/ckeditor5-image": "43.3.1",
+        "@ckeditor/ckeditor5-indent": "43.3.1",
+        "@ckeditor/ckeditor5-language": "43.3.1",
+        "@ckeditor/ckeditor5-link": "43.3.1",
+        "@ckeditor/ckeditor5-list": "43.3.1",
+        "@ckeditor/ckeditor5-markdown-gfm": "43.3.1",
+        "@ckeditor/ckeditor5-media-embed": "43.3.1",
+        "@ckeditor/ckeditor5-mention": "43.3.1",
+        "@ckeditor/ckeditor5-minimap": "43.3.1",
+        "@ckeditor/ckeditor5-page-break": "43.3.1",
+        "@ckeditor/ckeditor5-paragraph": "43.3.1",
+        "@ckeditor/ckeditor5-paste-from-office": "43.3.1",
+        "@ckeditor/ckeditor5-remove-format": "43.3.1",
+        "@ckeditor/ckeditor5-restricted-editing": "43.3.1",
+        "@ckeditor/ckeditor5-select-all": "43.3.1",
+        "@ckeditor/ckeditor5-show-blocks": "43.3.1",
+        "@ckeditor/ckeditor5-source-editing": "43.3.1",
+        "@ckeditor/ckeditor5-special-characters": "43.3.1",
+        "@ckeditor/ckeditor5-style": "43.3.1",
+        "@ckeditor/ckeditor5-table": "43.3.1",
+        "@ckeditor/ckeditor5-theme-lark": "43.3.1",
+        "@ckeditor/ckeditor5-typing": "43.3.1",
+        "@ckeditor/ckeditor5-ui": "43.3.1",
+        "@ckeditor/ckeditor5-undo": "43.3.1",
+        "@ckeditor/ckeditor5-upload": "43.3.1",
+        "@ckeditor/ckeditor5-utils": "43.3.1",
+        "@ckeditor/ckeditor5-watchdog": "43.3.1",
+        "@ckeditor/ckeditor5-widget": "43.3.1",
+        "@ckeditor/ckeditor5-word-count": "43.3.1"
       }
     },
     "node_modules/color-convert": {
       "version": "1.4.2",
       "resolved": "https://registry.npmjs.org/color-parse/-/color-parse-1.4.2.tgz",
       "integrity": "sha512-RI7s49/8yqDj3fECFZjUI1Yi0z/Gq1py43oNJivAIIDSyJiOZLfYCRQEgn8HEVAj++PcRe8AnL2XF0fRJ3BTnA==",
+      "license": "MIT",
       "dependencies": {
         "color-name": "^1.0.0"
       }
       }
     },
     "node_modules/eslint": {
-      "version": "9.13.0",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.13.0.tgz",
-      "integrity": "sha512-EYZK6SX6zjFHST/HRytOdA/zE72Cq/bfw45LSyuwrdvcclb/gqV8RRQxywOBEWO2+WDpva6UZa4CcDeJKzUCFA==",
+      "version": "9.14.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.14.0.tgz",
+      "integrity": "sha512-c2FHsVBr87lnUtjP4Yhvk4yEhKrQavGafRA/Se1ouse8PfbfC/Qh9Mxa00yWsZRlqeUB9raXip0aiiUZkgnr9g==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@eslint-community/eslint-utils": "^4.2.0",
-        "@eslint-community/regexpp": "^4.11.0",
+        "@eslint-community/regexpp": "^4.12.1",
         "@eslint/config-array": "^0.18.0",
         "@eslint/core": "^0.7.0",
         "@eslint/eslintrc": "^3.1.0",
-        "@eslint/js": "9.13.0",
+        "@eslint/js": "9.14.0",
         "@eslint/plugin-kit": "^0.2.0",
-        "@humanfs/node": "^0.16.5",
+        "@humanfs/node": "^0.16.6",
         "@humanwhocodes/module-importer": "^1.0.1",
-        "@humanwhocodes/retry": "^0.3.1",
+        "@humanwhocodes/retry": "^0.4.0",
         "@types/estree": "^1.0.6",
         "@types/json-schema": "^7.0.15",
         "ajv": "^6.12.4",
         "cross-spawn": "^7.0.2",
         "debug": "^4.3.2",
         "escape-string-regexp": "^4.0.0",
-        "eslint-scope": "^8.1.0",
-        "eslint-visitor-keys": "^4.1.0",
-        "espree": "^10.2.0",
+        "eslint-scope": "^8.2.0",
+        "eslint-visitor-keys": "^4.2.0",
+        "espree": "^10.3.0",
         "esquery": "^1.5.0",
         "esutils": "^2.0.2",
         "fast-deep-equal": "^3.1.3",
         "url": "https://opencollective.com/eslint"
       }
     },
+    "node_modules/eslint/node_modules/@humanwhocodes/retry": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz",
+      "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "node": ">=18.18"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/nzakas"
+      }
+    },
     "node_modules/eslint/node_modules/eslint-visitor-keys": {
       "version": "4.2.0",
       "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz",
       "license": "ISC"
     },
     "node_modules/focus-trap": {
-      "version": "7.6.0",
-      "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.6.0.tgz",
-      "integrity": "sha512-1td0l3pMkWJLFipobUcGaf+5DTY4PLDDrcqoSaKP8ediO/CoWCCYk/fT/Y2A4e6TNB+Sh6clRJCjOPPnKoNHnQ==",
+      "version": "7.6.1",
+      "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.6.1.tgz",
+      "integrity": "sha512-nB8y4nQl8PshahLpGKZOq1sb0xrMVFSn6at7u/qOsBZTlZRzaapISGENcB6mOkoezbClZyiMwEF/dGY8AZ00rA==",
       "license": "MIT",
       "dependencies": {
         "tabbable": "^6.2.0"
     "node_modules/lodash-es": {
       "version": "4.17.21",
       "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz",
-      "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="
+      "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==",
+      "license": "MIT"
     },
     "node_modules/lodash.merge": {
       "version": "4.6.2",
       "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
       "dev": true
     },
+    "node_modules/marked": {
+      "version": "4.0.12",
+      "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.12.tgz",
+      "integrity": "sha512-hgibXWrEDNBWgGiK18j/4lkS6ihTe9sxtV4Q1OQppb/0zzyPSzoFANBa5MfsG/zgsWklmNnhm0XACZOH/0HBiQ==",
+      "license": "MIT",
+      "bin": {
+        "marked": "bin/marked.js"
+      },
+      "engines": {
+        "node": ">= 12"
+      }
+    },
     "node_modules/merge2": {
       "version": "1.4.1",
       "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
       }
     },
     "node_modules/perfect-scrollbar": {
-      "version": "1.5.5",
-      "resolved": "https://registry.npmjs.org/perfect-scrollbar/-/perfect-scrollbar-1.5.5.tgz",
-      "integrity": "sha512-dzalfutyP3e/FOpdlhVryN4AJ5XDVauVWxybSkLZmakFE2sS3y3pc4JnSprw8tGmHvkaG5Edr5T7LBTZ+WWU2g=="
+      "version": "1.5.6",
+      "resolved": "https://registry.npmjs.org/perfect-scrollbar/-/perfect-scrollbar-1.5.6.tgz",
+      "integrity": "sha512-rixgxw3SxyJbCaSpo1n35A/fwI1r2rdwMKOTCg/AcG+xOEyZcE8UHVjpZMFCVImzsFoCZeJTT+M/rdEIQYO2nw==",
+      "license": "MIT"
     },
     "node_modules/picomatch": {
       "version": "2.3.1",
       "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
       "license": "0BSD"
     },
+    "node_modules/turndown": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/turndown/-/turndown-7.2.0.tgz",
+      "integrity": "sha512-eCZGBN4nNNqM9Owkv9HAtWRYfLA4h909E/WGAWWBpmB275ehNhZyk87/Tpvjbp0jjNl9XwCsbe6bm6CqFsgD+A==",
+      "license": "MIT",
+      "dependencies": {
+        "@mixmark-io/domino": "^2.2.0"
+      }
+    },
+    "node_modules/turndown-plugin-gfm": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/turndown-plugin-gfm/-/turndown-plugin-gfm-1.0.2.tgz",
+      "integrity": "sha512-vwz9tfvF7XN/jE0dGoBei3FXWuvll78ohzCZQuOb+ZjWrs3a0XhQVomJEb2Qh4VHTPNRO4GPZh0V7VRbiWwkRg==",
+      "license": "MIT"
+    },
     "node_modules/type-check": {
       "version": "0.4.0",
       "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
     "node_modules/vanilla-colorful": {
       "version": "0.7.2",
       "resolved": "https://registry.npmjs.org/vanilla-colorful/-/vanilla-colorful-0.7.2.tgz",
-      "integrity": "sha512-z2YZusTFC6KnLERx1cgoIRX2CjPRP0W75N+3CC6gbvdX5Ch47rZkEMGO2Xnf+IEmi3RiFLxS18gayMA27iU7Kg=="
+      "integrity": "sha512-z2YZusTFC6KnLERx1cgoIRX2CjPRP0W75N+3CC6gbvdX5Ch47rZkEMGO2Xnf+IEmi3RiFLxS18gayMA27iU7Kg==",
+      "license": "MIT"
     },
     "node_modules/which": {
       "version": "2.0.2",
index ce774e24d87810deb770fabb38cdb2a1e526f77a..a1e5b43099de5f20ddfa00c81b1d517891ccdb19 100644 (file)
@@ -4,10 +4,10 @@
     "bundle-web-components": "npx esbuild ts/WoltLabSuite/WebComponent/index.ts --minify --bundle --watch --outfile=wcfsetup/install/files/js/WoltLabSuite/WebComponent.min.js"
   },
   "devDependencies": {
-    "@typescript-eslint/eslint-plugin": "^8.12.2",
-    "@typescript-eslint/parser": "^8.12.2",
+    "@typescript-eslint/eslint-plugin": "^8.14.0",
+    "@typescript-eslint/parser": "^8.14.0",
     "esbuild": "^0.24.0",
-    "eslint": "^9.13.0",
+    "eslint": "^9.14.0",
     "eslint-config-prettier": "^9.1.0",
     "prettier": "^3.3.3",
     "typescript": "^5.6.3"
     "@googlemaps/markerclusterer": "2.0.15",
     "@types/facebook-js-sdk": "^3.3.12",
     "@types/google.maps": "^3.58.1",
-    "@types/jquery": "^3.5.30",
+    "@types/jquery": "^3.5.32",
     "@types/pica": "5.1.3",
-    "@types/prismjs": "^1.26.4",
+    "@types/prismjs": "^1.26.5",
     "@types/twitter-for-web": "0.0.6",
     "@woltlab/editor": "git+https://github.com/WoltLab/editor.git#ebd849dd0abb0826fd4c56b29d88a79b45a4f9fb",
     "@woltlab/visual-dom-diff": "git+https://github.com/WoltLab/visual-dom-diff.git#e5b51fce3157d1eda310566fc1f86101341d1fea",
     "@woltlab/zxcvbn": "git+https://github.com/WoltLab/zxcvbn.git#5b582b24e437f1883ccad3c37dae7c3c5f1e7da3",
-    "focus-trap": "^7.6.0",
+    "focus-trap": "^7.6.1",
     "html-parsed-element": "^0.4.1",
-    "perfect-scrollbar": "^1.5.5",
+    "perfect-scrollbar": "^1.5.6",
     "qr-creator": "^1.0.0",
     "reflect-metadata": "^0.2.2",
     "tabbable": "^6.2.0",
index b3f5c62ccf8f503362550a4ed9004149edcb73d6..dc052c6025dfc846e2143bbef16e9334c711bac7 100644 (file)
@@ -1,6 +1,6 @@
 /*!
-* focus-trap 7.6.0
+* focus-trap 7.6.1
 * @license MIT, https://github.com/focus-trap/focus-trap/blob/master/LICENSE
 */
-!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("tabbable")):"function"==typeof define&&define.amd?define(["exports","tabbable"],t):(e="undefined"!=typeof globalThis?globalThis:e||self,function(){var n=e.focusTrap,o=e.focusTrap={};t(o,e.tabbable),o.noConflict=function(){return e.focusTrap=n,o}}())}(this,(function(e,t){"use strict";function n(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var o=n.call(e,t||"default");if("object"!=typeof o)return o;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function a(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}var r=function(e,t){if(e.length>0){var n=e[e.length-1];n!==t&&n.pause()}var o=e.indexOf(t);-1===o||e.splice(o,1),e.push(t)},i=function(e,t){var n=e.indexOf(t);-1!==n&&e.splice(n,1),e.length>0&&e[e.length-1].unpause()},u=function(e){return"Tab"===(null==e?void 0:e.key)||9===(null==e?void 0:e.keyCode)},c=function(e){return u(e)&&!e.shiftKey},s=function(e){return u(e)&&e.shiftKey},l=function(e){return setTimeout(e,0)},b=function(e,t){var n=-1;return e.every((function(e,o){return!t(e)||(n=o,!1)})),n},d=function(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),o=1;o<t;o++)n[o-1]=arguments[o];return"function"==typeof e?e.apply(void 0,n):e},f=function(e){return e.target.shadowRoot&&"function"==typeof e.composedPath?e.composedPath()[0]:e.target},v=[];e.createFocusTrap=function(e,n){var o,p=(null==n?void 0:n.document)||document,m=(null==n?void 0:n.trapStack)||v,y=a({returnFocusOnDeactivate:!0,escapeDeactivates:!0,delayInitialFocus:!0,isKeyForward:c,isKeyBackward:s},n),h={containers:[],containerGroups:[],tabbableGroups:[],nodeFocusedBeforeActivation:null,mostRecentlyFocusedNode:null,active:!1,paused:!1,delayInitialFocusTimer:void 0,recentNavEvent:void 0},w=function(e,t,n){return e&&void 0!==e[t]?e[t]:y[n||t]},g=function(e,t){var n="function"==typeof(null==t?void 0:t.composedPath)?t.composedPath():void 0;return h.containerGroups.findIndex((function(t){var o=t.container,a=t.tabbableNodes;return o.contains(e)||(null==n?void 0:n.includes(o))||a.find((function(t){return t===e}))}))},T=function(e){var t=y[e];if("function"==typeof t){for(var n=arguments.length,o=new Array(n>1?n-1:0),a=1;a<n;a++)o[a-1]=arguments[a];t=t.apply(void 0,o)}if(!0===t&&(t=void 0),!t){if(void 0===t||!1===t)return t;throw new Error("`".concat(e,"` was specified but was not a node, or did not return a node"))}var r=t;if("string"==typeof t&&!(r=p.querySelector(t)))throw new Error("`".concat(e,"` as selector refers to no known node"));return r},F=function(){var e=T("initialFocus");if(!1===e)return!1;if(void 0===e||!t.isFocusable(e,y.tabbableOptions))if(g(p.activeElement)>=0)e=p.activeElement;else{var n=h.tabbableGroups[0];e=n&&n.firstTabbableNode||T("fallbackFocus")}if(!e)throw new Error("Your focus-trap needs to have at least one focusable element");return e},N=function(){if(h.containerGroups=h.containers.map((function(e){var n=t.tabbable(e,y.tabbableOptions),o=t.focusable(e,y.tabbableOptions),a=n.length>0?n[0]:void 0,r=n.length>0?n[n.length-1]:void 0,i=o.find((function(e){return t.isTabbable(e)})),u=o.slice().reverse().find((function(e){return t.isTabbable(e)})),c=!!n.find((function(e){return t.getTabIndex(e)>0}));return{container:e,tabbableNodes:n,focusableNodes:o,posTabIndexesFound:c,firstTabbableNode:a,lastTabbableNode:r,firstDomTabbableNode:i,lastDomTabbableNode:u,nextTabbableNode:function(e){var a=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],r=n.indexOf(e);return r<0?a?o.slice(o.indexOf(e)+1).find((function(e){return t.isTabbable(e)})):o.slice(0,o.indexOf(e)).reverse().find((function(e){return t.isTabbable(e)})):n[r+(a?1:-1)]}}})),h.tabbableGroups=h.containerGroups.filter((function(e){return e.tabbableNodes.length>0})),h.tabbableGroups.length<=0&&!T("fallbackFocus"))throw new Error("Your focus-trap must have at least one container with at least one tabbable node in it at all times");if(h.containerGroups.find((function(e){return e.posTabIndexesFound}))&&h.containerGroups.length>1)throw new Error("At least one node with a positive tabindex was found in one of your focus-trap's multiple containers. Positive tabindexes are only supported in single-container focus-traps.")},O=function(e){var t=e.activeElement;if(t)return t.shadowRoot&&null!==t.shadowRoot.activeElement?O(t.shadowRoot):t},E=function(e){!1!==e&&e!==O(document)&&(e&&e.focus?(e.focus({preventScroll:!!y.preventScroll}),h.mostRecentlyFocusedNode=e,function(e){return e.tagName&&"input"===e.tagName.toLowerCase()&&"function"==typeof e.select}(e)&&e.select()):E(F()))},k=function(e){var t=T("setReturnFocus",e);return t||!1!==t&&e},P=function(e){var n=e.target,o=e.event,a=e.isBackward,r=void 0!==a&&a;n=n||f(o),N();var i=null;if(h.tabbableGroups.length>0){var c=g(n,o),s=c>=0?h.containerGroups[c]:void 0;if(c<0)i=r?h.tabbableGroups[h.tabbableGroups.length-1].lastTabbableNode:h.tabbableGroups[0].firstTabbableNode;else if(r){var l=b(h.tabbableGroups,(function(e){var t=e.firstTabbableNode;return n===t}));if(l<0&&(s.container===n||t.isFocusable(n,y.tabbableOptions)&&!t.isTabbable(n,y.tabbableOptions)&&!s.nextTabbableNode(n,!1))&&(l=c),l>=0){var d=0===l?h.tabbableGroups.length-1:l-1,v=h.tabbableGroups[d];i=t.getTabIndex(n)>=0?v.lastTabbableNode:v.lastDomTabbableNode}else u(o)||(i=s.nextTabbableNode(n,!1))}else{var p=b(h.tabbableGroups,(function(e){var t=e.lastTabbableNode;return n===t}));if(p<0&&(s.container===n||t.isFocusable(n,y.tabbableOptions)&&!t.isTabbable(n,y.tabbableOptions)&&!s.nextTabbableNode(n))&&(p=c),p>=0){var m=p===h.tabbableGroups.length-1?0:p+1,w=h.tabbableGroups[m];i=t.getTabIndex(n)>=0?w.firstTabbableNode:w.firstDomTabbableNode}else u(o)||(i=s.nextTabbableNode(n))}}else i=T("fallbackFocus");return i},D=function(e){var t=f(e);g(t,e)>=0||(d(y.clickOutsideDeactivates,e)?o.deactivate({returnFocus:y.returnFocusOnDeactivate}):d(y.allowOutsideClick,e)||e.preventDefault())},x=function(e){var n=f(e),o=g(n,e)>=0;if(o||n instanceof Document)o&&(h.mostRecentlyFocusedNode=n);else{var a;e.stopImmediatePropagation();var r=!0;if(h.mostRecentlyFocusedNode)if(t.getTabIndex(h.mostRecentlyFocusedNode)>0){var i=g(h.mostRecentlyFocusedNode),u=h.containerGroups[i].tabbableNodes;if(u.length>0){var c=u.findIndex((function(e){return e===h.mostRecentlyFocusedNode}));c>=0&&(y.isKeyForward(h.recentNavEvent)?c+1<u.length&&(a=u[c+1],r=!1):c-1>=0&&(a=u[c-1],r=!1))}}else h.containerGroups.some((function(e){return e.tabbableNodes.some((function(e){return t.getTabIndex(e)>0}))}))||(r=!1);else r=!1;r&&(a=P({target:h.mostRecentlyFocusedNode,isBackward:y.isKeyBackward(h.recentNavEvent)})),E(a||(h.mostRecentlyFocusedNode||F()))}h.recentNavEvent=void 0},G=function(e){(y.isKeyForward(e)||y.isKeyBackward(e))&&function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];h.recentNavEvent=e;var n=P({event:e,isBackward:t});n&&(u(e)&&e.preventDefault(),E(n))}(e,y.isKeyBackward(e))},R=function(e){var t;"Escape"!==(null==(t=e)?void 0:t.key)&&"Esc"!==(null==t?void 0:t.key)&&27!==(null==t?void 0:t.keyCode)||!1===d(y.escapeDeactivates,e)||(e.preventDefault(),o.deactivate())},I=function(e){var t=f(e);g(t,e)>=0||d(y.clickOutsideDeactivates,e)||d(y.allowOutsideClick,e)||(e.preventDefault(),e.stopImmediatePropagation())},j=function(){if(h.active)return r(m,o),h.delayInitialFocusTimer=y.delayInitialFocus?l((function(){E(F())})):E(F()),p.addEventListener("focusin",x,!0),p.addEventListener("mousedown",D,{capture:!0,passive:!1}),p.addEventListener("touchstart",D,{capture:!0,passive:!1}),p.addEventListener("click",I,{capture:!0,passive:!1}),p.addEventListener("keydown",G,{capture:!0,passive:!1}),p.addEventListener("keydown",R),o},L=function(){if(h.active)return p.removeEventListener("focusin",x,!0),p.removeEventListener("mousedown",D,!0),p.removeEventListener("touchstart",D,!0),p.removeEventListener("click",I,!0),p.removeEventListener("keydown",G,!0),p.removeEventListener("keydown",R),o},B="undefined"!=typeof window&&"MutationObserver"in window?new MutationObserver((function(e){e.some((function(e){return Array.from(e.removedNodes).some((function(e){return e===h.mostRecentlyFocusedNode}))}))&&E(F())})):void 0,C=function(){B&&(B.disconnect(),h.active&&!h.paused&&h.containers.map((function(e){B.observe(e,{subtree:!0,childList:!0})})))};return(o={get active(){return h.active},get paused(){return h.paused},activate:function(e){if(h.active)return this;var t=w(e,"onActivate"),n=w(e,"onPostActivate"),o=w(e,"checkCanFocusTrap");o||N(),h.active=!0,h.paused=!1,h.nodeFocusedBeforeActivation=p.activeElement,null==t||t();var a=function(){o&&N(),j(),C(),null==n||n()};return o?(o(h.containers.concat()).then(a,a),this):(a(),this)},deactivate:function(e){if(!h.active)return this;var t=a({onDeactivate:y.onDeactivate,onPostDeactivate:y.onPostDeactivate,checkCanReturnFocus:y.checkCanReturnFocus},e);clearTimeout(h.delayInitialFocusTimer),h.delayInitialFocusTimer=void 0,L(),h.active=!1,h.paused=!1,C(),i(m,o);var n=w(t,"onDeactivate"),r=w(t,"onPostDeactivate"),u=w(t,"checkCanReturnFocus"),c=w(t,"returnFocus","returnFocusOnDeactivate");null==n||n();var s=function(){l((function(){c&&E(k(h.nodeFocusedBeforeActivation)),null==r||r()}))};return c&&u?(u(k(h.nodeFocusedBeforeActivation)).then(s,s),this):(s(),this)},pause:function(e){if(h.paused||!h.active)return this;var t=w(e,"onPause"),n=w(e,"onPostPause");return h.paused=!0,null==t||t(),L(),C(),null==n||n(),this},unpause:function(e){if(!h.paused||!h.active)return this;var t=w(e,"onUnpause"),n=w(e,"onPostUnpause");return h.paused=!1,null==t||t(),N(),j(),C(),null==n||n(),this},updateContainerElements:function(e){var t=[].concat(e).filter(Boolean);return h.containers=t.map((function(e){return"string"==typeof e?p.querySelector(e):e})),h.active&&N(),C(),this}}).updateContainerElements(e),o},Object.defineProperty(e,"__esModule",{value:!0})}));
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("tabbable")):"function"==typeof define&&define.amd?define(["exports","tabbable"],t):(e="undefined"!=typeof globalThis?globalThis:e||self,function(){var n=e.focusTrap,o=e.focusTrap={};t(o,e.tabbable),o.noConflict=function(){return e.focusTrap=n,o}}())}(this,(function(e,t){"use strict";function n(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=Array(t);n<t;n++)o[n]=e[n];return o}function o(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var o=n.call(e,t||"default");if("object"!=typeof o)return o;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function a(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?r(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):r(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e){return function(e){if(Array.isArray(e))return n(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(e){if("string"==typeof e)return n(e,t);var o={}.toString.call(e).slice(8,-1);return"Object"===o&&e.constructor&&(o=e.constructor.name),"Map"===o||"Set"===o?Array.from(e):"Arguments"===o||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(o)?n(e,t):void 0}}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}var u=function(e,t){if(e.length>0){var n=e[e.length-1];n!==t&&n.pause()}var o=e.indexOf(t);-1===o||e.splice(o,1),e.push(t)},c=function(e,t){var n=e.indexOf(t);-1!==n&&e.splice(n,1),e.length>0&&e[e.length-1].unpause()},s=function(e){return"Tab"===(null==e?void 0:e.key)||9===(null==e?void 0:e.keyCode)},l=function(e){return s(e)&&!e.shiftKey},b=function(e){return s(e)&&e.shiftKey},d=function(e){return setTimeout(e,0)},f=function(e,t){var n=-1;return e.every((function(e,o){return!t(e)||(n=o,!1)})),n},v=function(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),o=1;o<t;o++)n[o-1]=arguments[o];return"function"==typeof e?e.apply(void 0,n):e},p=function(e){return e.target.shadowRoot&&"function"==typeof e.composedPath?e.composedPath()[0]:e.target},m=[];e.createFocusTrap=function(e,n){var o,r=(null==n?void 0:n.document)||document,y=(null==n?void 0:n.trapStack)||m,h=a({returnFocusOnDeactivate:!0,escapeDeactivates:!0,delayInitialFocus:!0,isKeyForward:l,isKeyBackward:b},n),w={containers:[],containerGroups:[],tabbableGroups:[],nodeFocusedBeforeActivation:null,mostRecentlyFocusedNode:null,active:!1,paused:!1,delayInitialFocusTimer:void 0,recentNavEvent:void 0},g=function(e,t,n){return e&&void 0!==e[t]?e[t]:h[n||t]},T=function(e,t){var n="function"==typeof(null==t?void 0:t.composedPath)?t.composedPath():void 0;return w.containerGroups.findIndex((function(t){var o=t.container,r=t.tabbableNodes;return o.contains(e)||(null==n?void 0:n.includes(o))||r.find((function(t){return t===e}))}))},F=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.hasFallback,o=void 0!==n&&n,a=t.params,u=void 0===a?[]:a,c=h[e];if("function"==typeof c&&(c=c.apply(void 0,i(u))),!0===c&&(c=void 0),!c){if(void 0===c||!1===c)return c;throw new Error("`".concat(e,"` was specified but was not a node, or did not return a node"))}var s=c;if("string"==typeof c){try{s=r.querySelector(c)}catch(t){throw new Error("`".concat(e,'` appears to be an invalid selector; error="').concat(t.message,'"'))}if(!s&&!o)throw new Error("`".concat(e,"` as selector refers to no known node"))}return s},N=function(){var e=F("initialFocus",{hasFallback:!0});if(!1===e)return!1;if(void 0===e||e&&!t.isFocusable(e,h.tabbableOptions))if(T(r.activeElement)>=0)e=r.activeElement;else{var n=w.tabbableGroups[0];e=n&&n.firstTabbableNode||F("fallbackFocus")}else null===e&&(e=F("fallbackFocus"));if(!e)throw new Error("Your focus-trap needs to have at least one focusable element");return e},O=function(){if(w.containerGroups=w.containers.map((function(e){var n=t.tabbable(e,h.tabbableOptions),o=t.focusable(e,h.tabbableOptions),r=n.length>0?n[0]:void 0,a=n.length>0?n[n.length-1]:void 0,i=o.find((function(e){return t.isTabbable(e)})),u=o.slice().reverse().find((function(e){return t.isTabbable(e)})),c=!!n.find((function(e){return t.getTabIndex(e)>0}));return{container:e,tabbableNodes:n,focusableNodes:o,posTabIndexesFound:c,firstTabbableNode:r,lastTabbableNode:a,firstDomTabbableNode:i,lastDomTabbableNode:u,nextTabbableNode:function(e){var r=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],a=n.indexOf(e);return a<0?r?o.slice(o.indexOf(e)+1).find((function(e){return t.isTabbable(e)})):o.slice(0,o.indexOf(e)).reverse().find((function(e){return t.isTabbable(e)})):n[a+(r?1:-1)]}}})),w.tabbableGroups=w.containerGroups.filter((function(e){return e.tabbableNodes.length>0})),w.tabbableGroups.length<=0&&!F("fallbackFocus"))throw new Error("Your focus-trap must have at least one container with at least one tabbable node in it at all times");if(w.containerGroups.find((function(e){return e.posTabIndexesFound}))&&w.containerGroups.length>1)throw new Error("At least one node with a positive tabindex was found in one of your focus-trap's multiple containers. Positive tabindexes are only supported in single-container focus-traps.")},E=function(e){var t=e.activeElement;if(t)return t.shadowRoot&&null!==t.shadowRoot.activeElement?E(t.shadowRoot):t},k=function(e){!1!==e&&e!==E(document)&&(e&&e.focus?(e.focus({preventScroll:!!h.preventScroll}),w.mostRecentlyFocusedNode=e,function(e){return e.tagName&&"input"===e.tagName.toLowerCase()&&"function"==typeof e.select}(e)&&e.select()):k(N()))},D=function(e){var t=F("setReturnFocus",{params:[e]});return t||!1!==t&&e},P=function(e){var n=e.target,o=e.event,r=e.isBackward,a=void 0!==r&&r;n=n||p(o),O();var i=null;if(w.tabbableGroups.length>0){var u=T(n,o),c=u>=0?w.containerGroups[u]:void 0;if(u<0)i=a?w.tabbableGroups[w.tabbableGroups.length-1].lastTabbableNode:w.tabbableGroups[0].firstTabbableNode;else if(a){var l=f(w.tabbableGroups,(function(e){var t=e.firstTabbableNode;return n===t}));if(l<0&&(c.container===n||t.isFocusable(n,h.tabbableOptions)&&!t.isTabbable(n,h.tabbableOptions)&&!c.nextTabbableNode(n,!1))&&(l=u),l>=0){var b=0===l?w.tabbableGroups.length-1:l-1,d=w.tabbableGroups[b];i=t.getTabIndex(n)>=0?d.lastTabbableNode:d.lastDomTabbableNode}else s(o)||(i=c.nextTabbableNode(n,!1))}else{var v=f(w.tabbableGroups,(function(e){var t=e.lastTabbableNode;return n===t}));if(v<0&&(c.container===n||t.isFocusable(n,h.tabbableOptions)&&!t.isTabbable(n,h.tabbableOptions)&&!c.nextTabbableNode(n))&&(v=u),v>=0){var m=v===w.tabbableGroups.length-1?0:v+1,y=w.tabbableGroups[m];i=t.getTabIndex(n)>=0?y.firstTabbableNode:y.firstDomTabbableNode}else s(o)||(i=c.nextTabbableNode(n))}}else i=F("fallbackFocus");return i},x=function(e){var t=p(e);T(t,e)>=0||(v(h.clickOutsideDeactivates,e)?o.deactivate({returnFocus:h.returnFocusOnDeactivate}):v(h.allowOutsideClick,e)||e.preventDefault())},G=function(e){var n=p(e),o=T(n,e)>=0;if(o||n instanceof Document)o&&(w.mostRecentlyFocusedNode=n);else{var r;e.stopImmediatePropagation();var a=!0;if(w.mostRecentlyFocusedNode)if(t.getTabIndex(w.mostRecentlyFocusedNode)>0){var i=T(w.mostRecentlyFocusedNode),u=w.containerGroups[i].tabbableNodes;if(u.length>0){var c=u.findIndex((function(e){return e===w.mostRecentlyFocusedNode}));c>=0&&(h.isKeyForward(w.recentNavEvent)?c+1<u.length&&(r=u[c+1],a=!1):c-1>=0&&(r=u[c-1],a=!1))}}else w.containerGroups.some((function(e){return e.tabbableNodes.some((function(e){return t.getTabIndex(e)>0}))}))||(a=!1);else a=!1;a&&(r=P({target:w.mostRecentlyFocusedNode,isBackward:h.isKeyBackward(w.recentNavEvent)})),k(r||(w.mostRecentlyFocusedNode||N()))}w.recentNavEvent=void 0},I=function(e){(h.isKeyForward(e)||h.isKeyBackward(e))&&function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];w.recentNavEvent=e;var n=P({event:e,isBackward:t});n&&(s(e)&&e.preventDefault(),k(n))}(e,h.isKeyBackward(e))},R=function(e){var t;"Escape"!==(null==(t=e)?void 0:t.key)&&"Esc"!==(null==t?void 0:t.key)&&27!==(null==t?void 0:t.keyCode)||!1===v(h.escapeDeactivates,e)||(e.preventDefault(),o.deactivate())},j=function(e){var t=p(e);T(t,e)>=0||v(h.clickOutsideDeactivates,e)||v(h.allowOutsideClick,e)||(e.preventDefault(),e.stopImmediatePropagation())},A=function(){if(w.active)return u(y,o),w.delayInitialFocusTimer=h.delayInitialFocus?d((function(){k(N())})):k(N()),r.addEventListener("focusin",G,!0),r.addEventListener("mousedown",x,{capture:!0,passive:!1}),r.addEventListener("touchstart",x,{capture:!0,passive:!1}),r.addEventListener("click",j,{capture:!0,passive:!1}),r.addEventListener("keydown",I,{capture:!0,passive:!1}),r.addEventListener("keydown",R),o},L=function(){if(w.active)return r.removeEventListener("focusin",G,!0),r.removeEventListener("mousedown",x,!0),r.removeEventListener("touchstart",x,!0),r.removeEventListener("click",j,!0),r.removeEventListener("keydown",I,!0),r.removeEventListener("keydown",R),o},S="undefined"!=typeof window&&"MutationObserver"in window?new MutationObserver((function(e){e.some((function(e){return Array.from(e.removedNodes).some((function(e){return e===w.mostRecentlyFocusedNode}))}))&&k(N())})):void 0,C=function(){S&&(S.disconnect(),w.active&&!w.paused&&w.containers.map((function(e){S.observe(e,{subtree:!0,childList:!0})})))};return(o={get active(){return w.active},get paused(){return w.paused},activate:function(e){if(w.active)return this;var t=g(e,"onActivate"),n=g(e,"onPostActivate"),o=g(e,"checkCanFocusTrap");o||O(),w.active=!0,w.paused=!1,w.nodeFocusedBeforeActivation=r.activeElement,null==t||t();var a=function(){o&&O(),A(),C(),null==n||n()};return o?(o(w.containers.concat()).then(a,a),this):(a(),this)},deactivate:function(e){if(!w.active)return this;var t=a({onDeactivate:h.onDeactivate,onPostDeactivate:h.onPostDeactivate,checkCanReturnFocus:h.checkCanReturnFocus},e);clearTimeout(w.delayInitialFocusTimer),w.delayInitialFocusTimer=void 0,L(),w.active=!1,w.paused=!1,C(),c(y,o);var n=g(t,"onDeactivate"),r=g(t,"onPostDeactivate"),i=g(t,"checkCanReturnFocus"),u=g(t,"returnFocus","returnFocusOnDeactivate");null==n||n();var s=function(){d((function(){u&&k(D(w.nodeFocusedBeforeActivation)),null==r||r()}))};return u&&i?(i(D(w.nodeFocusedBeforeActivation)).then(s,s),this):(s(),this)},pause:function(e){if(w.paused||!w.active)return this;var t=g(e,"onPause"),n=g(e,"onPostPause");return w.paused=!0,null==t||t(),L(),C(),null==n||n(),this},unpause:function(e){if(!w.paused||!w.active)return this;var t=g(e,"onUnpause"),n=g(e,"onPostUnpause");return w.paused=!1,null==t||t(),O(),A(),C(),null==n||n(),this},updateContainerElements:function(e){var t=[].concat(e).filter(Boolean);return w.containers=t.map((function(e){return"string"==typeof e?r.querySelector(e):e})),w.active&&O(),C(),this}}).updateContainerElements(e),o}}));
 //# sourceMappingURL=focus-trap.umd.min.js.map
index 12f0a78521e349b6f44cac6127f959d0053b2a2a..2dffc2fc3e32f5001d3a27d9b5a6565c3cfd7ee1 100644 (file)
@@ -1 +1 @@
-{"version":3,"file":"focus-trap.umd.min.js","sources":["../index.js"],"sourcesContent":["import {\n  tabbable,\n  focusable,\n  isFocusable,\n  isTabbable,\n  getTabIndex,\n} from 'tabbable';\n\nconst activeFocusTraps = {\n  activateTrap(trapStack, trap) {\n    if (trapStack.length > 0) {\n      const activeTrap = trapStack[trapStack.length - 1];\n      if (activeTrap !== trap) {\n        activeTrap.pause();\n      }\n    }\n\n    const trapIndex = trapStack.indexOf(trap);\n    if (trapIndex === -1) {\n      trapStack.push(trap);\n    } else {\n      // move this existing trap to the front of the queue\n      trapStack.splice(trapIndex, 1);\n      trapStack.push(trap);\n    }\n  },\n\n  deactivateTrap(trapStack, trap) {\n    const trapIndex = trapStack.indexOf(trap);\n    if (trapIndex !== -1) {\n      trapStack.splice(trapIndex, 1);\n    }\n\n    if (trapStack.length > 0) {\n      trapStack[trapStack.length - 1].unpause();\n    }\n  },\n};\n\nconst isSelectableInput = function (node) {\n  return (\n    node.tagName &&\n    node.tagName.toLowerCase() === 'input' &&\n    typeof node.select === 'function'\n  );\n};\n\nconst isEscapeEvent = function (e) {\n  return e?.key === 'Escape' || e?.key === 'Esc' || e?.keyCode === 27;\n};\n\nconst isTabEvent = function (e) {\n  return e?.key === 'Tab' || e?.keyCode === 9;\n};\n\n// checks for TAB by default\nconst isKeyForward = function (e) {\n  return isTabEvent(e) && !e.shiftKey;\n};\n\n// checks for SHIFT+TAB by default\nconst isKeyBackward = function (e) {\n  return isTabEvent(e) && e.shiftKey;\n};\n\nconst delay = function (fn) {\n  return setTimeout(fn, 0);\n};\n\n// Array.find/findIndex() are not supported on IE; this replicates enough\n//  of Array.findIndex() for our needs\nconst findIndex = function (arr, fn) {\n  let idx = -1;\n\n  arr.every(function (value, i) {\n    if (fn(value)) {\n      idx = i;\n      return false; // break\n    }\n\n    return true; // next\n  });\n\n  return idx;\n};\n\n/**\n * Get an option's value when it could be a plain value, or a handler that provides\n *  the value.\n * @param {*} value Option's value to check.\n * @param {...*} [params] Any parameters to pass to the handler, if `value` is a function.\n * @returns {*} The `value`, or the handler's returned value.\n */\nconst valueOrHandler = function (value, ...params) {\n  return typeof value === 'function' ? value(...params) : value;\n};\n\nconst getActualTarget = function (event) {\n  // NOTE: If the trap is _inside_ a shadow DOM, event.target will always be the\n  //  shadow host. However, event.target.composedPath() will be an array of\n  //  nodes \"clicked\" from inner-most (the actual element inside the shadow) to\n  //  outer-most (the host HTML document). If we have access to composedPath(),\n  //  then use its first element; otherwise, fall back to event.target (and\n  //  this only works for an _open_ shadow DOM; otherwise,\n  //  composedPath()[0] === event.target always).\n  return event.target.shadowRoot && typeof event.composedPath === 'function'\n    ? event.composedPath()[0]\n    : event.target;\n};\n\n// NOTE: this must be _outside_ `createFocusTrap()` to make sure all traps in this\n//  current instance use the same stack if `userOptions.trapStack` isn't specified\nconst internalTrapStack = [];\n\nconst createFocusTrap = function (elements, userOptions) {\n  // SSR: a live trap shouldn't be created in this type of environment so this\n  //  should be safe code to execute if the `document` option isn't specified\n  const doc = userOptions?.document || document;\n\n  const trapStack = userOptions?.trapStack || internalTrapStack;\n\n  const config = {\n    returnFocusOnDeactivate: true,\n    escapeDeactivates: true,\n    delayInitialFocus: true,\n    isKeyForward,\n    isKeyBackward,\n    ...userOptions,\n  };\n\n  const state = {\n    // containers given to createFocusTrap()\n    // @type {Array<HTMLElement>}\n    containers: [],\n\n    // list of objects identifying tabbable nodes in `containers` in the trap\n    // NOTE: it's possible that a group has no tabbable nodes if nodes get removed while the trap\n    //  is active, but the trap should never get to a state where there isn't at least one group\n    //  with at least one tabbable node in it (that would lead to an error condition that would\n    //  result in an error being thrown)\n    // @type {Array<{\n    //   container: HTMLElement,\n    //   tabbableNodes: Array<HTMLElement>, // empty if none\n    //   focusableNodes: Array<HTMLElement>, // empty if none\n    //   posTabIndexesFound: boolean,\n    //   firstTabbableNode: HTMLElement|undefined,\n    //   lastTabbableNode: HTMLElement|undefined,\n    //   firstDomTabbableNode: HTMLElement|undefined,\n    //   lastDomTabbableNode: HTMLElement|undefined,\n    //   nextTabbableNode: (node: HTMLElement, forward: boolean) => HTMLElement|undefined\n    // }>}\n    containerGroups: [], // same order/length as `containers` list\n\n    // references to objects in `containerGroups`, but only those that actually have\n    //  tabbable nodes in them\n    // NOTE: same order as `containers` and `containerGroups`, but __not necessarily__\n    //  the same length\n    tabbableGroups: [],\n\n    nodeFocusedBeforeActivation: null,\n    mostRecentlyFocusedNode: null,\n    active: false,\n    paused: false,\n\n    // timer ID for when delayInitialFocus is true and initial focus in this trap\n    //  has been delayed during activation\n    delayInitialFocusTimer: undefined,\n\n    // the most recent KeyboardEvent for the configured nav key (typically [SHIFT+]TAB), if any\n    recentNavEvent: undefined,\n  };\n\n  let trap; // eslint-disable-line prefer-const -- some private functions reference it, and its methods reference private functions, so we must declare here and define later\n\n  /**\n   * Gets a configuration option value.\n   * @param {Object|undefined} configOverrideOptions If true, and option is defined in this set,\n   *  value will be taken from this object. Otherwise, value will be taken from base configuration.\n   * @param {string} optionName Name of the option whose value is sought.\n   * @param {string|undefined} [configOptionName] Name of option to use __instead of__ `optionName`\n   *  IIF `configOverrideOptions` is not defined. Otherwise, `optionName` is used.\n   */\n  const getOption = (configOverrideOptions, optionName, configOptionName) => {\n    return configOverrideOptions &&\n      configOverrideOptions[optionName] !== undefined\n      ? configOverrideOptions[optionName]\n      : config[configOptionName || optionName];\n  };\n\n  /**\n   * Finds the index of the container that contains the element.\n   * @param {HTMLElement} element\n   * @param {Event} [event] If available, and `element` isn't directly found in any container,\n   *  the event's composed path is used to see if includes any known trap containers in the\n   *  case where the element is inside a Shadow DOM.\n   * @returns {number} Index of the container in either `state.containers` or\n   *  `state.containerGroups` (the order/length of these lists are the same); -1\n   *  if the element isn't found.\n   */\n  const findContainerIndex = function (element, event) {\n    const composedPath =\n      typeof event?.composedPath === 'function'\n        ? event.composedPath()\n        : undefined;\n    // NOTE: search `containerGroups` because it's possible a group contains no tabbable\n    //  nodes, but still contains focusable nodes (e.g. if they all have `tabindex=-1`)\n    //  and we still need to find the element in there\n    return state.containerGroups.findIndex(\n      ({ container, tabbableNodes }) =>\n        container.contains(element) ||\n        // fall back to explicit tabbable search which will take into consideration any\n        //  web components if the `tabbableOptions.getShadowRoot` option was used for\n        //  the trap, enabling shadow DOM support in tabbable (`Node.contains()` doesn't\n        //  look inside web components even if open)\n        composedPath?.includes(container) ||\n        tabbableNodes.find((node) => node === element)\n    );\n  };\n\n  /**\n   * Gets the node for the given option, which is expected to be an option that\n   *  can be either a DOM node, a string that is a selector to get a node, `false`\n   *  (if a node is explicitly NOT given), or a function that returns any of these\n   *  values.\n   * @param {string} optionName\n   * @returns {undefined | false | HTMLElement | SVGElement} Returns\n   *  `undefined` if the option is not specified; `false` if the option\n   *  resolved to `false` (node explicitly not given); otherwise, the resolved\n   *  DOM node.\n   * @throws {Error} If the option is set, not `false`, and is not, or does not\n   *  resolve to a node.\n   */\n  const getNodeForOption = function (optionName, ...params) {\n    let optionValue = config[optionName];\n\n    if (typeof optionValue === 'function') {\n      optionValue = optionValue(...params);\n    }\n\n    if (optionValue === true) {\n      optionValue = undefined; // use default value\n    }\n\n    if (!optionValue) {\n      if (optionValue === undefined || optionValue === false) {\n        return optionValue;\n      }\n      // else, empty string (invalid), null (invalid), 0 (invalid)\n\n      throw new Error(\n        `\\`${optionName}\\` was specified but was not a node, or did not return a node`\n      );\n    }\n\n    let node = optionValue; // could be HTMLElement, SVGElement, or non-empty string at this point\n\n    if (typeof optionValue === 'string') {\n      node = doc.querySelector(optionValue); // resolve to node, or null if fails\n      if (!node) {\n        throw new Error(\n          `\\`${optionName}\\` as selector refers to no known node`\n        );\n      }\n    }\n\n    return node;\n  };\n\n  const getInitialFocusNode = function () {\n    let node = getNodeForOption('initialFocus');\n\n    // false explicitly indicates we want no initialFocus at all\n    if (node === false) {\n      return false;\n    }\n\n    if (node === undefined || !isFocusable(node, config.tabbableOptions)) {\n      // option not specified nor focusable: use fallback options\n      if (findContainerIndex(doc.activeElement) >= 0) {\n        node = doc.activeElement;\n      } else {\n        const firstTabbableGroup = state.tabbableGroups[0];\n        const firstTabbableNode =\n          firstTabbableGroup && firstTabbableGroup.firstTabbableNode;\n\n        // NOTE: `fallbackFocus` option function cannot return `false` (not supported)\n        node = firstTabbableNode || getNodeForOption('fallbackFocus');\n      }\n    }\n\n    if (!node) {\n      throw new Error(\n        'Your focus-trap needs to have at least one focusable element'\n      );\n    }\n\n    return node;\n  };\n\n  const updateTabbableNodes = function () {\n    state.containerGroups = state.containers.map((container) => {\n      const tabbableNodes = tabbable(container, config.tabbableOptions);\n\n      // NOTE: if we have tabbable nodes, we must have focusable nodes; focusable nodes\n      //  are a superset of tabbable nodes since nodes with negative `tabindex` attributes\n      //  are focusable but not tabbable\n      const focusableNodes = focusable(container, config.tabbableOptions);\n\n      const firstTabbableNode =\n        tabbableNodes.length > 0 ? tabbableNodes[0] : undefined;\n      const lastTabbableNode =\n        tabbableNodes.length > 0\n          ? tabbableNodes[tabbableNodes.length - 1]\n          : undefined;\n\n      const firstDomTabbableNode = focusableNodes.find((node) =>\n        isTabbable(node)\n      );\n      const lastDomTabbableNode = focusableNodes\n        .slice()\n        .reverse()\n        .find((node) => isTabbable(node));\n\n      const posTabIndexesFound = !!tabbableNodes.find(\n        (node) => getTabIndex(node) > 0\n      );\n\n      return {\n        container,\n        tabbableNodes,\n        focusableNodes,\n\n        /** True if at least one node with positive `tabindex` was found in this container. */\n        posTabIndexesFound,\n\n        /** First tabbable node in container, __tabindex__ order; `undefined` if none. */\n        firstTabbableNode,\n        /** Last tabbable node in container, __tabindex__ order; `undefined` if none. */\n        lastTabbableNode,\n\n        // NOTE: DOM order is NOT NECESSARILY \"document position\" order, but figuring that out\n        //  would require more than just https://developer.mozilla.org/en-US/docs/Web/API/Node/compareDocumentPosition\n        //  because that API doesn't work with Shadow DOM as well as it should (@see\n        //  https://github.com/whatwg/dom/issues/320) and since this first/last is only needed, so far,\n        //  to address an edge case related to positive tabindex support, this seems like a much easier,\n        //  \"close enough most of the time\" alternative for positive tabindexes which should generally\n        //  be avoided anyway...\n        /** First tabbable node in container, __DOM__ order; `undefined` if none. */\n        firstDomTabbableNode,\n        /** Last tabbable node in container, __DOM__ order; `undefined` if none. */\n        lastDomTabbableNode,\n\n        /**\n         * Finds the __tabbable__ node that follows the given node in the specified direction,\n         *  in this container, if any.\n         * @param {HTMLElement} node\n         * @param {boolean} [forward] True if going in forward tab order; false if going\n         *  in reverse.\n         * @returns {HTMLElement|undefined} The next tabbable node, if any.\n         */\n        nextTabbableNode(node, forward = true) {\n          const nodeIdx = tabbableNodes.indexOf(node);\n          if (nodeIdx < 0) {\n            // either not tabbable nor focusable, or was focused but not tabbable (negative tabindex):\n            //  since `node` should at least have been focusable, we assume that's the case and mimic\n            //  what browsers do, which is set focus to the next node in __document position order__,\n            //  regardless of positive tabindexes, if any -- and for reasons explained in the NOTE\n            //  above related to `firstDomTabbable` and `lastDomTabbable` properties, we fall back to\n            //  basic DOM order\n            if (forward) {\n              return focusableNodes\n                .slice(focusableNodes.indexOf(node) + 1)\n                .find((el) => isTabbable(el));\n            }\n\n            return focusableNodes\n              .slice(0, focusableNodes.indexOf(node))\n              .reverse()\n              .find((el) => isTabbable(el));\n          }\n\n          return tabbableNodes[nodeIdx + (forward ? 1 : -1)];\n        },\n      };\n    });\n\n    state.tabbableGroups = state.containerGroups.filter(\n      (group) => group.tabbableNodes.length > 0\n    );\n\n    // throw if no groups have tabbable nodes and we don't have a fallback focus node either\n    if (\n      state.tabbableGroups.length <= 0 &&\n      !getNodeForOption('fallbackFocus') // returning false not supported for this option\n    ) {\n      throw new Error(\n        'Your focus-trap must have at least one container with at least one tabbable node in it at all times'\n      );\n    }\n\n    // NOTE: Positive tabindexes are only properly supported in single-container traps because\n    //  doing it across multiple containers where tabindexes could be all over the place\n    //  would require Tabbable to support multiple containers, would require additional\n    //  specialized Shadow DOM support, and would require Tabbable's multi-container support\n    //  to look at those containers in document position order rather than user-provided\n    //  order (as they are treated in Focus-trap, for legacy reasons). See discussion on\n    //  https://github.com/focus-trap/focus-trap/issues/375 for more details.\n    if (\n      state.containerGroups.find((g) => g.posTabIndexesFound) &&\n      state.containerGroups.length > 1\n    ) {\n      throw new Error(\n        \"At least one node with a positive tabindex was found in one of your focus-trap's multiple containers. Positive tabindexes are only supported in single-container focus-traps.\"\n      );\n    }\n  };\n\n  /**\n   * Gets the current activeElement. If it's a web-component and has open shadow-root\n   * it will recursively search inside shadow roots for the \"true\" activeElement.\n   *\n   * @param {Document | ShadowRoot} el\n   *\n   * @returns {HTMLElement} The element that currently has the focus\n   **/\n  const getActiveElement = function (el) {\n    const activeElement = el.activeElement;\n\n    if (!activeElement) {\n      return;\n    }\n\n    if (\n      activeElement.shadowRoot &&\n      activeElement.shadowRoot.activeElement !== null\n    ) {\n      return getActiveElement(activeElement.shadowRoot);\n    }\n\n    return activeElement;\n  };\n\n  const tryFocus = function (node) {\n    if (node === false) {\n      return;\n    }\n\n    if (node === getActiveElement(document)) {\n      return;\n    }\n\n    if (!node || !node.focus) {\n      tryFocus(getInitialFocusNode());\n      return;\n    }\n\n    node.focus({ preventScroll: !!config.preventScroll });\n    // NOTE: focus() API does not trigger focusIn event so set MRU node manually\n    state.mostRecentlyFocusedNode = node;\n\n    if (isSelectableInput(node)) {\n      node.select();\n    }\n  };\n\n  const getReturnFocusNode = function (previousActiveElement) {\n    const node = getNodeForOption('setReturnFocus', previousActiveElement);\n    return node ? node : node === false ? false : previousActiveElement;\n  };\n\n  /**\n   * Finds the next node (in either direction) where focus should move according to a\n   *  keyboard focus-in event.\n   * @param {Object} params\n   * @param {Node} [params.target] Known target __from which__ to navigate, if any.\n   * @param {KeyboardEvent|FocusEvent} [params.event] Event to use if `target` isn't known (event\n   *  will be used to determine the `target`). Ignored if `target` is specified.\n   * @param {boolean} [params.isBackward] True if focus should move backward.\n   * @returns {Node|undefined} The next node, or `undefined` if a next node couldn't be\n   *  determined given the current state of the trap.\n   */\n  const findNextNavNode = function ({ target, event, isBackward = false }) {\n    target = target || getActualTarget(event);\n    updateTabbableNodes();\n\n    let destinationNode = null;\n\n    if (state.tabbableGroups.length > 0) {\n      // make sure the target is actually contained in a group\n      // NOTE: the target may also be the container itself if it's focusable\n      //  with tabIndex='-1' and was given initial focus\n      const containerIndex = findContainerIndex(target, event);\n      const containerGroup =\n        containerIndex >= 0 ? state.containerGroups[containerIndex] : undefined;\n\n      if (containerIndex < 0) {\n        // target not found in any group: quite possible focus has escaped the trap,\n        //  so bring it back into...\n        if (isBackward) {\n          // ...the last node in the last group\n          destinationNode =\n            state.tabbableGroups[state.tabbableGroups.length - 1]\n              .lastTabbableNode;\n        } else {\n          // ...the first node in the first group\n          destinationNode = state.tabbableGroups[0].firstTabbableNode;\n        }\n      } else if (isBackward) {\n        // REVERSE\n\n        // is the target the first tabbable node in a group?\n        let startOfGroupIndex = findIndex(\n          state.tabbableGroups,\n          ({ firstTabbableNode }) => target === firstTabbableNode\n        );\n\n        if (\n          startOfGroupIndex < 0 &&\n          (containerGroup.container === target ||\n            (isFocusable(target, config.tabbableOptions) &&\n              !isTabbable(target, config.tabbableOptions) &&\n              !containerGroup.nextTabbableNode(target, false)))\n        ) {\n          // an exception case where the target is either the container itself, or\n          //  a non-tabbable node that was given focus (i.e. tabindex is negative\n          //  and user clicked on it or node was programmatically given focus)\n          //  and is not followed by any other tabbable node, in which\n          //  case, we should handle shift+tab as if focus were on the container's\n          //  first tabbable node, and go to the last tabbable node of the LAST group\n          startOfGroupIndex = containerIndex;\n        }\n\n        if (startOfGroupIndex >= 0) {\n          // YES: then shift+tab should go to the last tabbable node in the\n          //  previous group (and wrap around to the last tabbable node of\n          //  the LAST group if it's the first tabbable node of the FIRST group)\n          const destinationGroupIndex =\n            startOfGroupIndex === 0\n              ? state.tabbableGroups.length - 1\n              : startOfGroupIndex - 1;\n\n          const destinationGroup = state.tabbableGroups[destinationGroupIndex];\n\n          destinationNode =\n            getTabIndex(target) >= 0\n              ? destinationGroup.lastTabbableNode\n              : destinationGroup.lastDomTabbableNode;\n        } else if (!isTabEvent(event)) {\n          // user must have customized the nav keys so we have to move focus manually _within_\n          //  the active group: do this based on the order determined by tabbable()\n          destinationNode = containerGroup.nextTabbableNode(target, false);\n        }\n      } else {\n        // FORWARD\n\n        // is the target the last tabbable node in a group?\n        let lastOfGroupIndex = findIndex(\n          state.tabbableGroups,\n          ({ lastTabbableNode }) => target === lastTabbableNode\n        );\n\n        if (\n          lastOfGroupIndex < 0 &&\n          (containerGroup.container === target ||\n            (isFocusable(target, config.tabbableOptions) &&\n              !isTabbable(target, config.tabbableOptions) &&\n              !containerGroup.nextTabbableNode(target)))\n        ) {\n          // an exception case where the target is the container itself, or\n          //  a non-tabbable node that was given focus (i.e. tabindex is negative\n          //  and user clicked on it or node was programmatically given focus)\n          //  and is not followed by any other tabbable node, in which\n          //  case, we should handle tab as if focus were on the container's\n          //  last tabbable node, and go to the first tabbable node of the FIRST group\n          lastOfGroupIndex = containerIndex;\n        }\n\n        if (lastOfGroupIndex >= 0) {\n          // YES: then tab should go to the first tabbable node in the next\n          //  group (and wrap around to the first tabbable node of the FIRST\n          //  group if it's the last tabbable node of the LAST group)\n          const destinationGroupIndex =\n            lastOfGroupIndex === state.tabbableGroups.length - 1\n              ? 0\n              : lastOfGroupIndex + 1;\n\n          const destinationGroup = state.tabbableGroups[destinationGroupIndex];\n\n          destinationNode =\n            getTabIndex(target) >= 0\n              ? destinationGroup.firstTabbableNode\n              : destinationGroup.firstDomTabbableNode;\n        } else if (!isTabEvent(event)) {\n          // user must have customized the nav keys so we have to move focus manually _within_\n          //  the active group: do this based on the order determined by tabbable()\n          destinationNode = containerGroup.nextTabbableNode(target);\n        }\n      }\n    } else {\n      // no groups available\n      // NOTE: the fallbackFocus option does not support returning false to opt-out\n      destinationNode = getNodeForOption('fallbackFocus');\n    }\n\n    return destinationNode;\n  };\n\n  // This needs to be done on mousedown and touchstart instead of click\n  // so that it precedes the focus event.\n  const checkPointerDown = function (e) {\n    const target = getActualTarget(e);\n\n    if (findContainerIndex(target, e) >= 0) {\n      // allow the click since it ocurred inside the trap\n      return;\n    }\n\n    if (valueOrHandler(config.clickOutsideDeactivates, e)) {\n      // immediately deactivate the trap\n      trap.deactivate({\n        // NOTE: by setting `returnFocus: false`, deactivate() will do nothing,\n        //  which will result in the outside click setting focus to the node\n        //  that was clicked (and if not focusable, to \"nothing\"); by setting\n        //  `returnFocus: true`, we'll attempt to re-focus the node originally-focused\n        //  on activation (or the configured `setReturnFocus` node), whether the\n        //  outside click was on a focusable node or not\n        returnFocus: config.returnFocusOnDeactivate,\n      });\n      return;\n    }\n\n    // This is needed for mobile devices.\n    // (If we'll only let `click` events through,\n    // then on mobile they will be blocked anyways if `touchstart` is blocked.)\n    if (valueOrHandler(config.allowOutsideClick, e)) {\n      // allow the click outside the trap to take place\n      return;\n    }\n\n    // otherwise, prevent the click\n    e.preventDefault();\n  };\n\n  // In case focus escapes the trap for some strange reason, pull it back in.\n  // NOTE: the focusIn event is NOT cancelable, so if focus escapes, it may cause unexpected\n  //  scrolling if the node that got focused was out of view; there's nothing we can do to\n  //  prevent that from happening by the time we discover that focus escaped\n  const checkFocusIn = function (event) {\n    const target = getActualTarget(event);\n    const targetContained = findContainerIndex(target, event) >= 0;\n\n    // In Firefox when you Tab out of an iframe the Document is briefly focused.\n    if (targetContained || target instanceof Document) {\n      if (targetContained) {\n        state.mostRecentlyFocusedNode = target;\n      }\n    } else {\n      // escaped! pull it back in to where it just left\n      event.stopImmediatePropagation();\n\n      // focus will escape if the MRU node had a positive tab index and user tried to nav forward;\n      //  it will also escape if the MRU node had a 0 tab index and user tried to nav backward\n      //  toward a node with a positive tab index\n      let nextNode; // next node to focus, if we find one\n      let navAcrossContainers = true;\n      if (state.mostRecentlyFocusedNode) {\n        if (getTabIndex(state.mostRecentlyFocusedNode) > 0) {\n          // MRU container index must be >=0 otherwise we wouldn't have it as an MRU node...\n          const mruContainerIdx = findContainerIndex(\n            state.mostRecentlyFocusedNode\n          );\n          // there MAY not be any tabbable nodes in the container if there are at least 2 containers\n          //  and the MRU node is focusable but not tabbable (focus-trap requires at least 1 container\n          //  with at least one tabbable node in order to function, so this could be the other container\n          //  with nothing tabbable in it)\n          const { tabbableNodes } = state.containerGroups[mruContainerIdx];\n          if (tabbableNodes.length > 0) {\n            // MRU tab index MAY not be found if the MRU node is focusable but not tabbable\n            const mruTabIdx = tabbableNodes.findIndex(\n              (node) => node === state.mostRecentlyFocusedNode\n            );\n            if (mruTabIdx >= 0) {\n              if (config.isKeyForward(state.recentNavEvent)) {\n                if (mruTabIdx + 1 < tabbableNodes.length) {\n                  nextNode = tabbableNodes[mruTabIdx + 1];\n                  navAcrossContainers = false;\n                }\n                // else, don't wrap within the container as focus should move to next/previous\n                //  container\n              } else {\n                if (mruTabIdx - 1 >= 0) {\n                  nextNode = tabbableNodes[mruTabIdx - 1];\n                  navAcrossContainers = false;\n                }\n                // else, don't wrap within the container as focus should move to next/previous\n                //  container\n              }\n              // else, don't find in container order without considering direction too\n            }\n          }\n          // else, no tabbable nodes in that container (which means we must have at least one other\n          //  container with at least one tabbable node in it, otherwise focus-trap would've thrown\n          //  an error the last time updateTabbableNodes() was run): find next node among all known\n          //  containers\n        } else {\n          // check to see if there's at least one tabbable node with a positive tab index inside\n          //  the trap because focus seems to escape when navigating backward from a tabbable node\n          //  with tabindex=0 when this is the case (instead of wrapping to the tabbable node with\n          //  the greatest positive tab index like it should)\n          if (\n            !state.containerGroups.some((g) =>\n              g.tabbableNodes.some((n) => getTabIndex(n) > 0)\n            )\n          ) {\n            // no containers with tabbable nodes with positive tab indexes which means the focus\n            //  escaped for some other reason and we should just execute the fallback to the\n            //  MRU node or initial focus node, if any\n            navAcrossContainers = false;\n          }\n        }\n      } else {\n        // no MRU node means we're likely in some initial condition when the trap has just\n        //  been activated and initial focus hasn't been given yet, in which case we should\n        //  fall through to trying to focus the initial focus node, which is what should\n        //  happen below at this point in the logic\n        navAcrossContainers = false;\n      }\n\n      if (navAcrossContainers) {\n        nextNode = findNextNavNode({\n          // move FROM the MRU node, not event-related node (which will be the node that is\n          //  outside the trap causing the focus escape we're trying to fix)\n          target: state.mostRecentlyFocusedNode,\n          isBackward: config.isKeyBackward(state.recentNavEvent),\n        });\n      }\n\n      if (nextNode) {\n        tryFocus(nextNode);\n      } else {\n        tryFocus(state.mostRecentlyFocusedNode || getInitialFocusNode());\n      }\n    }\n\n    state.recentNavEvent = undefined; // clear\n  };\n\n  // Hijack key nav events on the first and last focusable nodes of the trap,\n  // in order to prevent focus from escaping. If it escapes for even a\n  // moment it can end up scrolling the page and causing confusion so we\n  // kind of need to capture the action at the keydown phase.\n  const checkKeyNav = function (event, isBackward = false) {\n    state.recentNavEvent = event;\n\n    const destinationNode = findNextNavNode({ event, isBackward });\n    if (destinationNode) {\n      if (isTabEvent(event)) {\n        // since tab natively moves focus, we wouldn't have a destination node unless we\n        //  were on the edge of a container and had to move to the next/previous edge, in\n        //  which case we want to prevent default to keep the browser from moving focus\n        //  to where it normally would\n        event.preventDefault();\n      }\n      tryFocus(destinationNode);\n    }\n    // else, let the browser take care of [shift+]tab and move the focus\n  };\n\n  const checkTabKey = function (event) {\n    if (config.isKeyForward(event) || config.isKeyBackward(event)) {\n      checkKeyNav(event, config.isKeyBackward(event));\n    }\n  };\n\n  // we use a different event phase for the Escape key to allow canceling the event and checking for this in escapeDeactivates\n  const checkEscapeKey = function (event) {\n    if (\n      isEscapeEvent(event) &&\n      valueOrHandler(config.escapeDeactivates, event) !== false\n    ) {\n      event.preventDefault();\n      trap.deactivate();\n    }\n  };\n\n  const checkClick = function (e) {\n    const target = getActualTarget(e);\n\n    if (findContainerIndex(target, e) >= 0) {\n      return;\n    }\n\n    if (valueOrHandler(config.clickOutsideDeactivates, e)) {\n      return;\n    }\n\n    if (valueOrHandler(config.allowOutsideClick, e)) {\n      return;\n    }\n\n    e.preventDefault();\n    e.stopImmediatePropagation();\n  };\n\n  //\n  // EVENT LISTENERS\n  //\n\n  const addListeners = function () {\n    if (!state.active) {\n      return;\n    }\n\n    // There can be only one listening focus trap at a time\n    activeFocusTraps.activateTrap(trapStack, trap);\n\n    // Delay ensures that the focused element doesn't capture the event\n    // that caused the focus trap activation.\n    state.delayInitialFocusTimer = config.delayInitialFocus\n      ? delay(function () {\n          tryFocus(getInitialFocusNode());\n        })\n      : tryFocus(getInitialFocusNode());\n\n    doc.addEventListener('focusin', checkFocusIn, true);\n    doc.addEventListener('mousedown', checkPointerDown, {\n      capture: true,\n      passive: false,\n    });\n    doc.addEventListener('touchstart', checkPointerDown, {\n      capture: true,\n      passive: false,\n    });\n    doc.addEventListener('click', checkClick, {\n      capture: true,\n      passive: false,\n    });\n    doc.addEventListener('keydown', checkTabKey, {\n      capture: true,\n      passive: false,\n    });\n    doc.addEventListener('keydown', checkEscapeKey);\n\n    return trap;\n  };\n\n  const removeListeners = function () {\n    if (!state.active) {\n      return;\n    }\n\n    doc.removeEventListener('focusin', checkFocusIn, true);\n    doc.removeEventListener('mousedown', checkPointerDown, true);\n    doc.removeEventListener('touchstart', checkPointerDown, true);\n    doc.removeEventListener('click', checkClick, true);\n    doc.removeEventListener('keydown', checkTabKey, true);\n    doc.removeEventListener('keydown', checkEscapeKey);\n\n    return trap;\n  };\n\n  //\n  // MUTATION OBSERVER\n  //\n\n  const checkDomRemoval = function (mutations) {\n    const isFocusedNodeRemoved = mutations.some(function (mutation) {\n      const removedNodes = Array.from(mutation.removedNodes);\n      return removedNodes.some(function (node) {\n        return node === state.mostRecentlyFocusedNode;\n      });\n    });\n\n    // If the currently focused is removed then browsers will move focus to the\n    // <body> element. If this happens, try to move focus back into the trap.\n    if (isFocusedNodeRemoved) {\n      tryFocus(getInitialFocusNode());\n    }\n  };\n\n  // Use MutationObserver - if supported - to detect if focused node is removed\n  // from the DOM.\n  const mutationObserver =\n    typeof window !== 'undefined' && 'MutationObserver' in window\n      ? new MutationObserver(checkDomRemoval)\n      : undefined;\n\n  const updateObservedNodes = function () {\n    if (!mutationObserver) {\n      return;\n    }\n\n    mutationObserver.disconnect();\n    if (state.active && !state.paused) {\n      state.containers.map(function (container) {\n        mutationObserver.observe(container, {\n          subtree: true,\n          childList: true,\n        });\n      });\n    }\n  };\n\n  //\n  // TRAP DEFINITION\n  //\n\n  trap = {\n    get active() {\n      return state.active;\n    },\n\n    get paused() {\n      return state.paused;\n    },\n\n    activate(activateOptions) {\n      if (state.active) {\n        return this;\n      }\n\n      const onActivate = getOption(activateOptions, 'onActivate');\n      const onPostActivate = getOption(activateOptions, 'onPostActivate');\n      const checkCanFocusTrap = getOption(activateOptions, 'checkCanFocusTrap');\n\n      if (!checkCanFocusTrap) {\n        updateTabbableNodes();\n      }\n\n      state.active = true;\n      state.paused = false;\n      state.nodeFocusedBeforeActivation = doc.activeElement;\n\n      onActivate?.();\n\n      const finishActivation = () => {\n        if (checkCanFocusTrap) {\n          updateTabbableNodes();\n        }\n        addListeners();\n        updateObservedNodes();\n        onPostActivate?.();\n      };\n\n      if (checkCanFocusTrap) {\n        checkCanFocusTrap(state.containers.concat()).then(\n          finishActivation,\n          finishActivation\n        );\n        return this;\n      }\n\n      finishActivation();\n      return this;\n    },\n\n    deactivate(deactivateOptions) {\n      if (!state.active) {\n        return this;\n      }\n\n      const options = {\n        onDeactivate: config.onDeactivate,\n        onPostDeactivate: config.onPostDeactivate,\n        checkCanReturnFocus: config.checkCanReturnFocus,\n        ...deactivateOptions,\n      };\n\n      clearTimeout(state.delayInitialFocusTimer); // noop if undefined\n      state.delayInitialFocusTimer = undefined;\n\n      removeListeners();\n      state.active = false;\n      state.paused = false;\n      updateObservedNodes();\n\n      activeFocusTraps.deactivateTrap(trapStack, trap);\n\n      const onDeactivate = getOption(options, 'onDeactivate');\n      const onPostDeactivate = getOption(options, 'onPostDeactivate');\n      const checkCanReturnFocus = getOption(options, 'checkCanReturnFocus');\n      const returnFocus = getOption(\n        options,\n        'returnFocus',\n        'returnFocusOnDeactivate'\n      );\n\n      onDeactivate?.();\n\n      const finishDeactivation = () => {\n        delay(() => {\n          if (returnFocus) {\n            tryFocus(getReturnFocusNode(state.nodeFocusedBeforeActivation));\n          }\n          onPostDeactivate?.();\n        });\n      };\n\n      if (returnFocus && checkCanReturnFocus) {\n        checkCanReturnFocus(\n          getReturnFocusNode(state.nodeFocusedBeforeActivation)\n        ).then(finishDeactivation, finishDeactivation);\n        return this;\n      }\n\n      finishDeactivation();\n      return this;\n    },\n\n    pause(pauseOptions) {\n      if (state.paused || !state.active) {\n        return this;\n      }\n\n      const onPause = getOption(pauseOptions, 'onPause');\n      const onPostPause = getOption(pauseOptions, 'onPostPause');\n\n      state.paused = true;\n      onPause?.();\n\n      removeListeners();\n      updateObservedNodes();\n\n      onPostPause?.();\n      return this;\n    },\n\n    unpause(unpauseOptions) {\n      if (!state.paused || !state.active) {\n        return this;\n      }\n\n      const onUnpause = getOption(unpauseOptions, 'onUnpause');\n      const onPostUnpause = getOption(unpauseOptions, 'onPostUnpause');\n\n      state.paused = false;\n      onUnpause?.();\n\n      updateTabbableNodes();\n      addListeners();\n      updateObservedNodes();\n\n      onPostUnpause?.();\n      return this;\n    },\n\n    updateContainerElements(containerElements) {\n      const elementsAsArray = [].concat(containerElements).filter(Boolean);\n\n      state.containers = elementsAsArray.map((element) =>\n        typeof element === 'string' ? doc.querySelector(element) : element\n      );\n\n      if (state.active) {\n        updateTabbableNodes();\n      }\n\n      updateObservedNodes();\n\n      return this;\n    },\n  };\n\n  // initialize container elements\n  trap.updateContainerElements(elements);\n\n  return trap;\n};\n\nexport { createFocusTrap };\n"],"names":["activeFocusTraps","trapStack","trap","length","activeTrap","pause","trapIndex","indexOf","splice","push","unpause","isTabEvent","e","key","keyCode","isKeyForward","shiftKey","isKeyBackward","delay","fn","setTimeout","findIndex","arr","idx","every","value","i","valueOrHandler","_len","arguments","params","Array","_key","apply","getActualTarget","event","target","shadowRoot","composedPath","internalTrapStack","elements","userOptions","doc","document","config","_objectSpread","returnFocusOnDeactivate","escapeDeactivates","delayInitialFocus","state","containers","containerGroups","tabbableGroups","nodeFocusedBeforeActivation","mostRecentlyFocusedNode","active","paused","delayInitialFocusTimer","undefined","recentNavEvent","getOption","configOverrideOptions","optionName","configOptionName","findContainerIndex","element","_ref","container","tabbableNodes","contains","includes","find","node","getNodeForOption","optionValue","_len2","_key2","Error","concat","querySelector","getInitialFocusNode","isFocusable","tabbableOptions","activeElement","firstTabbableGroup","firstTabbableNode","updateTabbableNodes","map","tabbable","focusableNodes","focusable","lastTabbableNode","firstDomTabbableNode","isTabbable","lastDomTabbableNode","slice","reverse","posTabIndexesFound","getTabIndex","nextTabbableNode","forward","nodeIdx","el","filter","group","g","getActiveElement","tryFocus","focus","preventScroll","tagName","toLowerCase","select","isSelectableInput","getReturnFocusNode","previousActiveElement","findNextNavNode","_ref2","_ref2$isBackward","isBackward","destinationNode","containerIndex","containerGroup","startOfGroupIndex","_ref3","destinationGroupIndex","destinationGroup","lastOfGroupIndex","_ref4","checkPointerDown","clickOutsideDeactivates","deactivate","returnFocus","allowOutsideClick","preventDefault","checkFocusIn","targetContained","Document","nextNode","stopImmediatePropagation","navAcrossContainers","mruContainerIdx","mruTabIdx","some","n","checkTabKey","checkKeyNav","checkEscapeKey","checkClick","addListeners","addEventListener","capture","passive","removeListeners","removeEventListener","mutationObserver","window","MutationObserver","mutations","mutation","from","removedNodes","updateObservedNodes","disconnect","observe","subtree","childList","activate","activateOptions","this","onActivate","onPostActivate","checkCanFocusTrap","finishActivation","then","deactivateOptions","options","onDeactivate","onPostDeactivate","checkCanReturnFocus","clearTimeout","finishDeactivation","pauseOptions","onPause","onPostPause","unpauseOptions","onUnpause","onPostUnpause","updateContainerElements","containerElements","elementsAsArray","Boolean"],"mappings":";;;;+2CAQA,IAAMA,WACSC,EAAWC,GACtB,GAAID,EAAUE,OAAS,EAAG,CACxB,IAAMC,EAAaH,EAAUA,EAAUE,OAAS,GAC5CC,IAAeF,GACjBE,EAAWC,OAEf,CAEA,IAAMC,EAAYL,EAAUM,QAAQL,IACjB,IAAfI,GAIFL,EAAUO,OAAOF,EAAW,GAH5BL,EAAUQ,KAAKP,EAMlB,EAjBGF,WAmBWC,EAAWC,GACxB,IAAMI,EAAYL,EAAUM,QAAQL,IACjB,IAAfI,GACFL,EAAUO,OAAOF,EAAW,GAG1BL,EAAUE,OAAS,GACrBF,EAAUA,EAAUE,OAAS,GAAGO,SAEpC,EAeIC,EAAa,SAAUC,GAC3B,MAAkB,SAAXA,eAAAA,EAAGC,MAAgC,KAAfD,aAAC,EAADA,EAAGE,QAChC,EAGMC,EAAe,SAAUH,GAC7B,OAAOD,EAAWC,KAAOA,EAAEI,QAC7B,EAGMC,EAAgB,SAAUL,GAC9B,OAAOD,EAAWC,IAAMA,EAAEI,QAC5B,EAEME,EAAQ,SAAUC,GACtB,OAAOC,WAAWD,EAAI,EACxB,EAIME,EAAY,SAAUC,EAAKH,GAC/B,IAAII,GAAO,EAWX,OATAD,EAAIE,OAAM,SAAUC,EAAOC,GACzB,OAAIP,EAAGM,KACLF,EAAMG,GACC,EAIX,IAEOH,CACT,EASMI,EAAiB,SAAUF,GAAkB,IAAAG,IAAAA,EAAAC,UAAA1B,OAAR2B,MAAMC,MAAAH,EAAAA,EAAAA,OAAAI,EAAA,EAAAA,EAAAJ,EAAAI,IAANF,EAAME,EAAAH,GAAAA,UAAAG,GAC/C,MAAwB,mBAAVP,EAAuBA,EAAKQ,WAAIH,EAAAA,GAAUL,CAC1D,EAEMS,EAAkB,SAAUC,GAQhC,OAAOA,EAAMC,OAAOC,YAA4C,mBAAvBF,EAAMG,aAC3CH,EAAMG,eAAe,GACrBH,EAAMC,MACZ,EAIMG,EAAoB,qBAEF,SAAUC,EAAUC,GAG1C,IAuDIvC,EAvDEwC,GAAMD,aAAW,EAAXA,EAAaE,WAAYA,SAE/B1C,GAAYwC,aAAW,EAAXA,EAAaxC,YAAasC,EAEtCK,EAAMC,EAAA,CACVC,yBAAyB,EACzBC,mBAAmB,EACnBC,mBAAmB,EACnBjC,aAAAA,EACAE,cAAAA,GACGwB,GAGCQ,EAAQ,CAGZC,WAAY,GAkBZC,gBAAiB,GAMjBC,eAAgB,GAEhBC,4BAA6B,KAC7BC,wBAAyB,KACzBC,QAAQ,EACRC,QAAQ,EAIRC,4BAAwBC,EAGxBC,oBAAgBD,GAaZE,EAAY,SAACC,EAAuBC,EAAYC,GACpD,OAAOF,QACiCH,IAAtCG,EAAsBC,GACpBD,EAAsBC,GACtBlB,EAAOmB,GAAoBD,IAa3BE,EAAqB,SAAUC,EAAS9B,GAC5C,IAAMG,EAC2B,mBAAxBH,eAAAA,EAAOG,cACVH,EAAMG,oBACNoB,EAIN,OAAOT,EAAME,gBAAgB9B,WAC3B,SAAA6C,GAAA,IAAGC,EAASD,EAATC,UAAWC,EAAaF,EAAbE,cAAa,OACzBD,EAAUE,SAASJ,KAKnB3B,aAAAA,EAAAA,EAAcgC,SAASH,KACvBC,EAAcG,MAAK,SAACC,GAAI,OAAKA,IAASP,IAAQ,KAiB9CQ,EAAmB,SAAUX,GACjC,IAAIY,EAAc9B,EAAOkB,GAEzB,GAA2B,mBAAhBY,EAA4B,CAAA,IAAAC,IAAAA,EAAA9C,UAAA1B,OAHS2B,MAAMC,MAAA4C,EAAAA,EAAAA,OAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAAN9C,EAAM8C,EAAA/C,GAAAA,UAAA+C,GAIpDF,EAAcA,EAAWzC,WAAA,EAAIH,EAC/B,CAMA,IAJoB,IAAhB4C,IACFA,OAAchB,IAGXgB,EAAa,CAChB,QAAoBhB,IAAhBgB,IAA6C,IAAhBA,EAC/B,OAAOA,EAIT,MAAM,IAAIG,MAAK,IAAAC,OACRhB,kEAET,CAEA,IAAIU,EAAOE,EAEX,GAA2B,iBAAhBA,KACTF,EAAO9B,EAAIqC,cAAcL,IAEvB,MAAM,IAAIG,MAAK,IAAAC,OACRhB,4CAKX,OAAOU,GAGHQ,EAAsB,WAC1B,IAAIR,EAAOC,EAAiB,gBAG5B,IAAa,IAATD,EACF,OAAO,EAGT,QAAad,IAATc,IAAuBS,EAAAA,YAAYT,EAAM5B,EAAOsC,iBAElD,GAAIlB,EAAmBtB,EAAIyC,gBAAkB,EAC3CX,EAAO9B,EAAIyC,kBACN,CACL,IAAMC,EAAqBnC,EAAMG,eAAe,GAKhDoB,EAHEY,GAAsBA,EAAmBC,mBAGfZ,EAAiB,gBAC/C,CAGF,IAAKD,EACH,MAAM,IAAIK,MACR,gEAIJ,OAAOL,GAGHc,EAAsB,WA4F1B,GA3FArC,EAAME,gBAAkBF,EAAMC,WAAWqC,KAAI,SAACpB,GAC5C,IAAMC,EAAgBoB,EAAQA,SAACrB,EAAWvB,EAAOsC,iBAK3CO,EAAiBC,EAASA,UAACvB,EAAWvB,EAAOsC,iBAE7CG,EACJjB,EAAcjE,OAAS,EAAIiE,EAAc,QAAKV,EAC1CiC,EACJvB,EAAcjE,OAAS,EACnBiE,EAAcA,EAAcjE,OAAS,QACrCuD,EAEAkC,EAAuBH,EAAelB,MAAK,SAACC,GAAI,OACpDqB,EAAAA,WAAWrB,EAAK,IAEZsB,EAAsBL,EACzBM,QACAC,UACAzB,MAAK,SAACC,GAAI,OAAKqB,EAAAA,WAAWrB,MAEvByB,IAAuB7B,EAAcG,MACzC,SAACC,GAAI,OAAK0B,EAAWA,YAAC1B,GAAQ,CAAC,IAGjC,MAAO,CACLL,UAAAA,EACAC,cAAAA,EACAqB,eAAAA,EAGAQ,mBAAAA,EAGAZ,kBAAAA,EAEAM,iBAAAA,EAUAC,qBAAAA,EAEAE,oBAAAA,EAUAK,iBAAAA,SAAiB3B,GAAsB,IAAhB4B,IAAOvE,UAAA1B,OAAA,QAAAuD,IAAA7B,UAAA,KAAAA,UAAA,GACtBwE,EAAUjC,EAAc7D,QAAQiE,GACtC,OAAI6B,EAAU,EAORD,EACKX,EACJM,MAAMN,EAAelF,QAAQiE,GAAQ,GACrCD,MAAK,SAAC+B,GAAE,OAAKT,EAAAA,WAAWS,MAGtBb,EACJM,MAAM,EAAGN,EAAelF,QAAQiE,IAChCwB,UACAzB,MAAK,SAAC+B,GAAE,OAAKT,EAAAA,WAAWS,MAGtBlC,EAAciC,GAAWD,EAAU,GAAK,GACjD,EAEJ,IAEAnD,EAAMG,eAAiBH,EAAME,gBAAgBoD,QAC3C,SAACC,GAAK,OAAKA,EAAMpC,cAAcjE,OAAS,CAAC,IAKzC8C,EAAMG,eAAejD,QAAU,IAC9BsE,EAAiB,iBAElB,MAAM,IAAII,MACR,uGAWJ,GACE5B,EAAME,gBAAgBoB,MAAK,SAACkC,GAAC,OAAKA,EAAER,kBAAmB,KACvDhD,EAAME,gBAAgBhD,OAAS,EAE/B,MAAM,IAAI0E,MACR,kLAaA6B,EAAmB,SAAUJ,GACjC,IAAMnB,EAAgBmB,EAAGnB,cAEzB,GAAKA,EAIL,OACEA,EAAc9C,YAC6B,OAA3C8C,EAAc9C,WAAW8C,cAElBuB,EAAiBvB,EAAc9C,YAGjC8C,GAGHwB,EAAW,SAAUnC,IACZ,IAATA,GAIAA,IAASkC,EAAiB/D,YAIzB6B,GAASA,EAAKoC,OAKnBpC,EAAKoC,MAAM,CAAEC,gBAAiBjE,EAAOiE,gBAErC5D,EAAMK,wBAA0BkB,EAnaV,SAAUA,GAClC,OACEA,EAAKsC,SAC0B,UAA/BtC,EAAKsC,QAAQC,eACU,mBAAhBvC,EAAKwC,MAEhB,CA+ZQC,CAAkBzC,IACpBA,EAAKwC,UATLL,EAAS3B,OAaPkC,EAAqB,SAAUC,GACnC,IAAM3C,EAAOC,EAAiB,iBAAkB0C,GAChD,OAAO3C,IAAuB,IAATA,GAAyB2C,GAc1CC,EAAkB,SAAHC,GAAoD,IAArCjF,EAAMiF,EAANjF,OAAQD,EAAKkF,EAALlF,MAAKmF,EAAAD,EAAEE,WAAAA,OAAa,IAAHD,GAAQA,EACnElF,EAASA,GAAUF,EAAgBC,GACnCmD,IAEA,IAAIkC,EAAkB,KAEtB,GAAIvE,EAAMG,eAAejD,OAAS,EAAG,CAInC,IAAMsH,EAAiBzD,EAAmB5B,EAAQD,GAC5CuF,EACJD,GAAkB,EAAIxE,EAAME,gBAAgBsE,QAAkB/D,EAEhE,GAAI+D,EAAiB,EAKjBD,EAFED,EAGAtE,EAAMG,eAAeH,EAAMG,eAAejD,OAAS,GAChDwF,iBAGa1C,EAAMG,eAAe,GAAGiC,uBAEvC,GAAIkC,EAAY,CAIrB,IAAII,EAAoBtG,EACtB4B,EAAMG,gBACN,SAAAwE,GAAA,IAAGvC,EAAiBuC,EAAjBvC,kBAAiB,OAAOjD,IAAWiD,CAAiB,IAmBzD,GAfEsC,EAAoB,IACnBD,EAAevD,YAAc/B,GAC3B6C,cAAY7C,EAAQQ,EAAOsC,mBACzBW,EAAAA,WAAWzD,EAAQQ,EAAOsC,mBAC1BwC,EAAevB,iBAAiB/D,GAAQ,MAQ7CuF,EAAoBF,GAGlBE,GAAqB,EAAG,CAI1B,IAAME,EACkB,IAAtBF,EACI1E,EAAMG,eAAejD,OAAS,EAC9BwH,EAAoB,EAEpBG,EAAmB7E,EAAMG,eAAeyE,GAE9CL,EACEtB,EAAAA,YAAY9D,IAAW,EACnB0F,EAAiBnC,iBACjBmC,EAAiBhC,mBACzB,MAAYnF,EAAWwB,KAGrBqF,EAAkBE,EAAevB,iBAAiB/D,GAAQ,GAE9D,KAAO,CAIL,IAAI2F,EAAmB1G,EACrB4B,EAAMG,gBACN,SAAA4E,GAAA,IAAGrC,EAAgBqC,EAAhBrC,iBAAgB,OAAOvD,IAAWuD,CAAgB,IAmBvD,GAfEoC,EAAmB,IAClBL,EAAevD,YAAc/B,GAC3B6C,EAAWA,YAAC7C,EAAQQ,EAAOsC,mBACzBW,aAAWzD,EAAQQ,EAAOsC,mBAC1BwC,EAAevB,iBAAiB/D,MAQrC2F,EAAmBN,GAGjBM,GAAoB,EAAG,CAIzB,IAAMF,EACJE,IAAqB9E,EAAMG,eAAejD,OAAS,EAC/C,EACA4H,EAAmB,EAEnBD,EAAmB7E,EAAMG,eAAeyE,GAE9CL,EACEtB,EAAAA,YAAY9D,IAAW,EACnB0F,EAAiBzC,kBACjByC,EAAiBlC,oBACzB,MAAYjF,EAAWwB,KAGrBqF,EAAkBE,EAAevB,iBAAiB/D,GAEtD,CACF,MAGEoF,EAAkB/C,EAAiB,iBAGrC,OAAO+C,GAKHS,EAAmB,SAAUrH,GACjC,IAAMwB,EAASF,EAAgBtB,GAE3BoD,EAAmB5B,EAAQxB,IAAM,IAKjCe,EAAeiB,EAAOsF,wBAAyBtH,GAEjDV,EAAKiI,WAAW,CAOdC,YAAaxF,EAAOE,0BAQpBnB,EAAeiB,EAAOyF,kBAAmBzH,IAM7CA,EAAE0H,mBAOEC,EAAe,SAAUpG,GAC7B,IAAMC,EAASF,EAAgBC,GACzBqG,EAAkBxE,EAAmB5B,EAAQD,IAAU,EAG7D,GAAIqG,GAAmBpG,aAAkBqG,SACnCD,IACFvF,EAAMK,wBAA0BlB,OAE7B,CAOL,IAAIsG,EALJvG,EAAMwG,2BAMN,IAAIC,GAAsB,EAC1B,GAAI3F,EAAMK,wBACR,GAAI4C,cAAYjD,EAAMK,yBAA2B,EAAG,CAElD,IAAMuF,EAAkB7E,EACtBf,EAAMK,yBAMAc,EAAkBnB,EAAME,gBAAgB0F,GAAxCzE,cACR,GAAIA,EAAcjE,OAAS,EAAG,CAE5B,IAAM2I,EAAY1E,EAAc/C,WAC9B,SAACmD,GAAI,OAAKA,IAASvB,EAAMK,uBAAuB,IAE9CwF,GAAa,IACXlG,EAAO7B,aAAakC,EAAMU,gBACxBmF,EAAY,EAAI1E,EAAcjE,SAChCuI,EAAWtE,EAAc0E,EAAY,GACrCF,GAAsB,GAKpBE,EAAY,GAAK,IACnBJ,EAAWtE,EAAc0E,EAAY,GACrCF,GAAsB,GAO9B,CAKF,MAMK3F,EAAME,gBAAgB4F,MAAK,SAACtC,GAAC,OAC5BA,EAAErC,cAAc2E,MAAK,SAACC,GAAC,OAAK9C,EAAWA,YAAC8C,GAAK,IAAE,MAMjDJ,GAAsB,QAQ1BA,GAAsB,EAGpBA,IACFF,EAAWtB,EAAgB,CAGzBhF,OAAQa,EAAMK,wBACdiE,WAAY3E,EAAO3B,cAAcgC,EAAMU,mBAKzCgD,EADE+B,IAGOzF,EAAMK,yBAA2B0B,KAE9C,CAEA/B,EAAMU,oBAAiBD,GAwBnBuF,EAAc,SAAU9G,IACxBS,EAAO7B,aAAaoB,IAAUS,EAAO3B,cAAckB,KAlBrC,SAAUA,GAA2B,IAApBoF,EAAU1F,UAAA1B,OAAA,QAAAuD,IAAA7B,UAAA,IAAAA,UAAA,GAC7CoB,EAAMU,eAAiBxB,EAEvB,IAAMqF,EAAkBJ,EAAgB,CAAEjF,MAAAA,EAAOoF,WAAAA,IAC7CC,IACE7G,EAAWwB,IAKbA,EAAMmG,iBAER3B,EAASa,IAOT0B,CAAY/G,EAAOS,EAAO3B,cAAckB,KAKtCgH,EAAiB,SAAUhH,GAxtBb,IAAUvB,EACZ,YAAXA,OADuBA,EA0tBZuB,QAztBXvB,EAAAA,EAAGC,MAA+B,SAAXD,aAAAA,EAAAA,EAAGC,MAAgC,MAAfD,aAAAA,EAAAA,EAAGE,WA0tBG,IAApDa,EAAeiB,EAAOG,kBAAmBZ,KAEzCA,EAAMmG,iBACNpI,EAAKiI,eAIHiB,EAAa,SAAUxI,GAC3B,IAAMwB,EAASF,EAAgBtB,GAE3BoD,EAAmB5B,EAAQxB,IAAM,GAIjCe,EAAeiB,EAAOsF,wBAAyBtH,IAI/Ce,EAAeiB,EAAOyF,kBAAmBzH,KAI7CA,EAAE0H,iBACF1H,EAAE+H,6BAOEU,EAAe,WACnB,GAAKpG,EAAMM,OAkCX,OA7BAvD,EAA8BC,EAAWC,GAIzC+C,EAAMQ,uBAAyBb,EAAOI,kBAClC9B,GAAM,WACJyF,EAAS3B,IACX,IACA2B,EAAS3B,KAEbtC,EAAI4G,iBAAiB,UAAWf,GAAc,GAC9C7F,EAAI4G,iBAAiB,YAAarB,EAAkB,CAClDsB,SAAS,EACTC,SAAS,IAEX9G,EAAI4G,iBAAiB,aAAcrB,EAAkB,CACnDsB,SAAS,EACTC,SAAS,IAEX9G,EAAI4G,iBAAiB,QAASF,EAAY,CACxCG,SAAS,EACTC,SAAS,IAEX9G,EAAI4G,iBAAiB,UAAWL,EAAa,CAC3CM,SAAS,EACTC,SAAS,IAEX9G,EAAI4G,iBAAiB,UAAWH,GAEzBjJ,GAGHuJ,EAAkB,WACtB,GAAKxG,EAAMM,OAWX,OAPAb,EAAIgH,oBAAoB,UAAWnB,GAAc,GACjD7F,EAAIgH,oBAAoB,YAAazB,GAAkB,GACvDvF,EAAIgH,oBAAoB,aAAczB,GAAkB,GACxDvF,EAAIgH,oBAAoB,QAASN,GAAY,GAC7C1G,EAAIgH,oBAAoB,UAAWT,GAAa,GAChDvG,EAAIgH,oBAAoB,UAAWP,GAE5BjJ,GAwBHyJ,EACc,oBAAXC,QAA0B,qBAAsBA,OACnD,IAAIC,kBAnBc,SAAUC,GACHA,EAAUf,MAAK,SAAUgB,GAEpD,OADqBhI,MAAMiI,KAAKD,EAASE,cACrBlB,MAAK,SAAUvE,GACjC,OAAOA,IAASvB,EAAMK,uBACxB,GACF,KAKEqD,EAAS3B,aASPtB,EAEAwG,EAAsB,WACrBP,IAILA,EAAiBQ,aACblH,EAAMM,SAAWN,EAAMO,QACzBP,EAAMC,WAAWqC,KAAI,SAAUpB,GAC7BwF,EAAiBS,QAAQjG,EAAW,CAClCkG,SAAS,EACTC,WAAW,GAEf,MAuKJ,OA/JApK,EAAO,CACL,UAAIqD,GACF,OAAON,EAAMM,MACd,EAED,UAAIC,GACF,OAAOP,EAAMO,MACd,EAED+G,SAAAA,SAASC,GACP,GAAIvH,EAAMM,OACR,OAAOkH,KAGT,IAAMC,EAAa9G,EAAU4G,EAAiB,cACxCG,EAAiB/G,EAAU4G,EAAiB,kBAC5CI,EAAoBhH,EAAU4G,EAAiB,qBAEhDI,GACHtF,IAGFrC,EAAMM,QAAS,EACfN,EAAMO,QAAS,EACfP,EAAMI,4BAA8BX,EAAIyC,cAExCuF,SAAAA,IAEA,IAAMG,EAAmB,WACnBD,GACFtF,IAEF+D,IACAa,IACAS,SAAAA,KAGF,OAAIC,GACFA,EAAkB3H,EAAMC,WAAW4B,UAAUgG,KAC3CD,EACAA,GAEKJ,OAGTI,IACOJ,KACR,EAEDtC,WAAAA,SAAW4C,GACT,IAAK9H,EAAMM,OACT,OAAOkH,KAGT,IAAMO,EAAOnI,EAAA,CACXoI,aAAcrI,EAAOqI,aACrBC,iBAAkBtI,EAAOsI,iBACzBC,oBAAqBvI,EAAOuI,qBACzBJ,GAGLK,aAAanI,EAAMQ,wBACnBR,EAAMQ,4BAAyBC,EAE/B+F,IACAxG,EAAMM,QAAS,EACfN,EAAMO,QAAS,EACf0G,IAEAlK,EAAgCC,EAAWC,GAE3C,IAAM+K,EAAerH,EAAUoH,EAAS,gBAClCE,EAAmBtH,EAAUoH,EAAS,oBACtCG,EAAsBvH,EAAUoH,EAAS,uBACzC5C,EAAcxE,EAClBoH,EACA,cACA,2BAGFC,SAAAA,IAEA,IAAMI,EAAqB,WACzBnK,GAAM,WACAkH,GACFzB,EAASO,EAAmBjE,EAAMI,8BAEpC6H,SAAAA,GACF,KAGF,OAAI9C,GAAe+C,GACjBA,EACEjE,EAAmBjE,EAAMI,8BACzByH,KAAKO,EAAoBA,GACpBZ,OAGTY,IACOZ,KACR,EAEDpK,MAAAA,SAAMiL,GACJ,GAAIrI,EAAMO,SAAWP,EAAMM,OACzB,OAAOkH,KAGT,IAAMc,EAAU3H,EAAU0H,EAAc,WAClCE,EAAc5H,EAAU0H,EAAc,eAS5C,OAPArI,EAAMO,QAAS,EACf+H,SAAAA,IAEA9B,IACAS,IAEAsB,SAAAA,IACOf,IACR,EAED/J,QAAAA,SAAQ+K,GACN,IAAKxI,EAAMO,SAAWP,EAAMM,OAC1B,OAAOkH,KAGT,IAAMiB,EAAY9H,EAAU6H,EAAgB,aACtCE,EAAgB/H,EAAU6H,EAAgB,iBAUhD,OARAxI,EAAMO,QAAS,EACfkI,SAAAA,IAEApG,IACA+D,IACAa,IAEAyB,SAAAA,IACOlB,IACR,EAEDmB,wBAAAA,SAAwBC,GACtB,IAAMC,EAAkB,GAAGhH,OAAO+G,GAAmBtF,OAAOwF,SAY5D,OAVA9I,EAAMC,WAAa4I,EAAgBvG,KAAI,SAACtB,GAAO,MAC1B,iBAAZA,EAAuBvB,EAAIqC,cAAcd,GAAWA,CAAO,IAGhEhB,EAAMM,QACR+B,IAGF4E,IAEOO,IACT,IAIGmB,wBAAwBpJ,GAEtBtC,CACT"}
\ No newline at end of file
+{"version":3,"file":"focus-trap.umd.min.js","sources":["../index.js"],"sourcesContent":["import {\n  tabbable,\n  focusable,\n  isFocusable,\n  isTabbable,\n  getTabIndex,\n} from 'tabbable';\n\nconst activeFocusTraps = {\n  activateTrap(trapStack, trap) {\n    if (trapStack.length > 0) {\n      const activeTrap = trapStack[trapStack.length - 1];\n      if (activeTrap !== trap) {\n        activeTrap.pause();\n      }\n    }\n\n    const trapIndex = trapStack.indexOf(trap);\n    if (trapIndex === -1) {\n      trapStack.push(trap);\n    } else {\n      // move this existing trap to the front of the queue\n      trapStack.splice(trapIndex, 1);\n      trapStack.push(trap);\n    }\n  },\n\n  deactivateTrap(trapStack, trap) {\n    const trapIndex = trapStack.indexOf(trap);\n    if (trapIndex !== -1) {\n      trapStack.splice(trapIndex, 1);\n    }\n\n    if (trapStack.length > 0) {\n      trapStack[trapStack.length - 1].unpause();\n    }\n  },\n};\n\nconst isSelectableInput = function (node) {\n  return (\n    node.tagName &&\n    node.tagName.toLowerCase() === 'input' &&\n    typeof node.select === 'function'\n  );\n};\n\nconst isEscapeEvent = function (e) {\n  return e?.key === 'Escape' || e?.key === 'Esc' || e?.keyCode === 27;\n};\n\nconst isTabEvent = function (e) {\n  return e?.key === 'Tab' || e?.keyCode === 9;\n};\n\n// checks for TAB by default\nconst isKeyForward = function (e) {\n  return isTabEvent(e) && !e.shiftKey;\n};\n\n// checks for SHIFT+TAB by default\nconst isKeyBackward = function (e) {\n  return isTabEvent(e) && e.shiftKey;\n};\n\nconst delay = function (fn) {\n  return setTimeout(fn, 0);\n};\n\n// Array.find/findIndex() are not supported on IE; this replicates enough\n//  of Array.findIndex() for our needs\nconst findIndex = function (arr, fn) {\n  let idx = -1;\n\n  arr.every(function (value, i) {\n    if (fn(value)) {\n      idx = i;\n      return false; // break\n    }\n\n    return true; // next\n  });\n\n  return idx;\n};\n\n/**\n * Get an option's value when it could be a plain value, or a handler that provides\n *  the value.\n * @param {*} value Option's value to check.\n * @param {...*} [params] Any parameters to pass to the handler, if `value` is a function.\n * @returns {*} The `value`, or the handler's returned value.\n */\nconst valueOrHandler = function (value, ...params) {\n  return typeof value === 'function' ? value(...params) : value;\n};\n\nconst getActualTarget = function (event) {\n  // NOTE: If the trap is _inside_ a shadow DOM, event.target will always be the\n  //  shadow host. However, event.target.composedPath() will be an array of\n  //  nodes \"clicked\" from inner-most (the actual element inside the shadow) to\n  //  outer-most (the host HTML document). If we have access to composedPath(),\n  //  then use its first element; otherwise, fall back to event.target (and\n  //  this only works for an _open_ shadow DOM; otherwise,\n  //  composedPath()[0] === event.target always).\n  return event.target.shadowRoot && typeof event.composedPath === 'function'\n    ? event.composedPath()[0]\n    : event.target;\n};\n\n// NOTE: this must be _outside_ `createFocusTrap()` to make sure all traps in this\n//  current instance use the same stack if `userOptions.trapStack` isn't specified\nconst internalTrapStack = [];\n\nconst createFocusTrap = function (elements, userOptions) {\n  // SSR: a live trap shouldn't be created in this type of environment so this\n  //  should be safe code to execute if the `document` option isn't specified\n  const doc = userOptions?.document || document;\n\n  const trapStack = userOptions?.trapStack || internalTrapStack;\n\n  const config = {\n    returnFocusOnDeactivate: true,\n    escapeDeactivates: true,\n    delayInitialFocus: true,\n    isKeyForward,\n    isKeyBackward,\n    ...userOptions,\n  };\n\n  const state = {\n    // containers given to createFocusTrap()\n    // @type {Array<HTMLElement>}\n    containers: [],\n\n    // list of objects identifying tabbable nodes in `containers` in the trap\n    // NOTE: it's possible that a group has no tabbable nodes if nodes get removed while the trap\n    //  is active, but the trap should never get to a state where there isn't at least one group\n    //  with at least one tabbable node in it (that would lead to an error condition that would\n    //  result in an error being thrown)\n    // @type {Array<{\n    //   container: HTMLElement,\n    //   tabbableNodes: Array<HTMLElement>, // empty if none\n    //   focusableNodes: Array<HTMLElement>, // empty if none\n    //   posTabIndexesFound: boolean,\n    //   firstTabbableNode: HTMLElement|undefined,\n    //   lastTabbableNode: HTMLElement|undefined,\n    //   firstDomTabbableNode: HTMLElement|undefined,\n    //   lastDomTabbableNode: HTMLElement|undefined,\n    //   nextTabbableNode: (node: HTMLElement, forward: boolean) => HTMLElement|undefined\n    // }>}\n    containerGroups: [], // same order/length as `containers` list\n\n    // references to objects in `containerGroups`, but only those that actually have\n    //  tabbable nodes in them\n    // NOTE: same order as `containers` and `containerGroups`, but __not necessarily__\n    //  the same length\n    tabbableGroups: [],\n\n    nodeFocusedBeforeActivation: null,\n    mostRecentlyFocusedNode: null,\n    active: false,\n    paused: false,\n\n    // timer ID for when delayInitialFocus is true and initial focus in this trap\n    //  has been delayed during activation\n    delayInitialFocusTimer: undefined,\n\n    // the most recent KeyboardEvent for the configured nav key (typically [SHIFT+]TAB), if any\n    recentNavEvent: undefined,\n  };\n\n  let trap; // eslint-disable-line prefer-const -- some private functions reference it, and its methods reference private functions, so we must declare here and define later\n\n  /**\n   * Gets a configuration option value.\n   * @param {Object|undefined} configOverrideOptions If true, and option is defined in this set,\n   *  value will be taken from this object. Otherwise, value will be taken from base configuration.\n   * @param {string} optionName Name of the option whose value is sought.\n   * @param {string|undefined} [configOptionName] Name of option to use __instead of__ `optionName`\n   *  IIF `configOverrideOptions` is not defined. Otherwise, `optionName` is used.\n   */\n  const getOption = (configOverrideOptions, optionName, configOptionName) => {\n    return configOverrideOptions &&\n      configOverrideOptions[optionName] !== undefined\n      ? configOverrideOptions[optionName]\n      : config[configOptionName || optionName];\n  };\n\n  /**\n   * Finds the index of the container that contains the element.\n   * @param {HTMLElement} element\n   * @param {Event} [event] If available, and `element` isn't directly found in any container,\n   *  the event's composed path is used to see if includes any known trap containers in the\n   *  case where the element is inside a Shadow DOM.\n   * @returns {number} Index of the container in either `state.containers` or\n   *  `state.containerGroups` (the order/length of these lists are the same); -1\n   *  if the element isn't found.\n   */\n  const findContainerIndex = function (element, event) {\n    const composedPath =\n      typeof event?.composedPath === 'function'\n        ? event.composedPath()\n        : undefined;\n    // NOTE: search `containerGroups` because it's possible a group contains no tabbable\n    //  nodes, but still contains focusable nodes (e.g. if they all have `tabindex=-1`)\n    //  and we still need to find the element in there\n    return state.containerGroups.findIndex(\n      ({ container, tabbableNodes }) =>\n        container.contains(element) ||\n        // fall back to explicit tabbable search which will take into consideration any\n        //  web components if the `tabbableOptions.getShadowRoot` option was used for\n        //  the trap, enabling shadow DOM support in tabbable (`Node.contains()` doesn't\n        //  look inside web components even if open)\n        composedPath?.includes(container) ||\n        tabbableNodes.find((node) => node === element)\n    );\n  };\n\n  /**\n   * Gets the node for the given option, which is expected to be an option that\n   *  can be either a DOM node, a string that is a selector to get a node, `false`\n   *  (if a node is explicitly NOT given), or a function that returns any of these\n   *  values.\n   * @param {string} optionName\n   * @param {Object} options\n   * @param {boolean} [options.hasFallback] True if the option could be a selector string\n   *  and the option allows for a fallback scenario in the case where the selector is\n   *  valid but does not match a node (i.e. the queried node doesn't exist in the DOM).\n   * @param {Array} [options.params] Params to pass to the option if it's a function.\n   * @returns {undefined | null | false | HTMLElement | SVGElement} Returns\n   *  `undefined` if the option is not specified; `null` if the option didn't resolve\n   *  to a node but `options.hasFallback=true`, `false` if the option resolved to `false`\n   *  (node explicitly not given); otherwise, the resolved DOM node.\n   * @throws {Error} If the option is set, not `false`, and is not, or does not\n   *  resolve to a node, unless the option is a selector string and `options.hasFallback=true`.\n   */\n  const getNodeForOption = function (\n    optionName,\n    { hasFallback = false, params = [] } = {}\n  ) {\n    let optionValue = config[optionName];\n\n    if (typeof optionValue === 'function') {\n      optionValue = optionValue(...params);\n    }\n\n    if (optionValue === true) {\n      optionValue = undefined; // use default value\n    }\n\n    if (!optionValue) {\n      if (optionValue === undefined || optionValue === false) {\n        return optionValue;\n      }\n      // else, empty string (invalid), null (invalid), 0 (invalid)\n\n      throw new Error(\n        `\\`${optionName}\\` was specified but was not a node, or did not return a node`\n      );\n    }\n\n    let node = optionValue; // could be HTMLElement, SVGElement, or non-empty string at this point\n\n    if (typeof optionValue === 'string') {\n      try {\n        node = doc.querySelector(optionValue); // resolve to node, or null if fails\n      } catch (err) {\n        throw new Error(\n          `\\`${optionName}\\` appears to be an invalid selector; error=\"${err.message}\"`\n        );\n      }\n\n      if (!node) {\n        if (!hasFallback) {\n          throw new Error(\n            `\\`${optionName}\\` as selector refers to no known node`\n          );\n        }\n        // else, `node` MUST be `null` because that's what `Document.querySelector()` returns\n        //  if the selector is valid but doesn't match anything\n      }\n    }\n\n    return node;\n  };\n\n  const getInitialFocusNode = function () {\n    let node = getNodeForOption('initialFocus', { hasFallback: true });\n\n    // false explicitly indicates we want no initialFocus at all\n    if (node === false) {\n      return false;\n    }\n\n    if (\n      node === undefined ||\n      (node && !isFocusable(node, config.tabbableOptions))\n    ) {\n      // option not specified nor focusable: use fallback options\n      if (findContainerIndex(doc.activeElement) >= 0) {\n        node = doc.activeElement;\n      } else {\n        const firstTabbableGroup = state.tabbableGroups[0];\n        const firstTabbableNode =\n          firstTabbableGroup && firstTabbableGroup.firstTabbableNode;\n\n        // NOTE: `fallbackFocus` option function cannot return `false` (not supported)\n        node = firstTabbableNode || getNodeForOption('fallbackFocus');\n      }\n    } else if (node === null) {\n      // option is a VALID selector string that doesn't yield a node: use the `fallbackFocus`\n      //  option instead of the default behavior when the option isn't specified at all\n      node = getNodeForOption('fallbackFocus');\n    }\n\n    if (!node) {\n      throw new Error(\n        'Your focus-trap needs to have at least one focusable element'\n      );\n    }\n\n    return node;\n  };\n\n  const updateTabbableNodes = function () {\n    state.containerGroups = state.containers.map((container) => {\n      const tabbableNodes = tabbable(container, config.tabbableOptions);\n\n      // NOTE: if we have tabbable nodes, we must have focusable nodes; focusable nodes\n      //  are a superset of tabbable nodes since nodes with negative `tabindex` attributes\n      //  are focusable but not tabbable\n      const focusableNodes = focusable(container, config.tabbableOptions);\n\n      const firstTabbableNode =\n        tabbableNodes.length > 0 ? tabbableNodes[0] : undefined;\n      const lastTabbableNode =\n        tabbableNodes.length > 0\n          ? tabbableNodes[tabbableNodes.length - 1]\n          : undefined;\n\n      const firstDomTabbableNode = focusableNodes.find((node) =>\n        isTabbable(node)\n      );\n      const lastDomTabbableNode = focusableNodes\n        .slice()\n        .reverse()\n        .find((node) => isTabbable(node));\n\n      const posTabIndexesFound = !!tabbableNodes.find(\n        (node) => getTabIndex(node) > 0\n      );\n\n      return {\n        container,\n        tabbableNodes,\n        focusableNodes,\n\n        /** True if at least one node with positive `tabindex` was found in this container. */\n        posTabIndexesFound,\n\n        /** First tabbable node in container, __tabindex__ order; `undefined` if none. */\n        firstTabbableNode,\n        /** Last tabbable node in container, __tabindex__ order; `undefined` if none. */\n        lastTabbableNode,\n\n        // NOTE: DOM order is NOT NECESSARILY \"document position\" order, but figuring that out\n        //  would require more than just https://developer.mozilla.org/en-US/docs/Web/API/Node/compareDocumentPosition\n        //  because that API doesn't work with Shadow DOM as well as it should (@see\n        //  https://github.com/whatwg/dom/issues/320) and since this first/last is only needed, so far,\n        //  to address an edge case related to positive tabindex support, this seems like a much easier,\n        //  \"close enough most of the time\" alternative for positive tabindexes which should generally\n        //  be avoided anyway...\n        /** First tabbable node in container, __DOM__ order; `undefined` if none. */\n        firstDomTabbableNode,\n        /** Last tabbable node in container, __DOM__ order; `undefined` if none. */\n        lastDomTabbableNode,\n\n        /**\n         * Finds the __tabbable__ node that follows the given node in the specified direction,\n         *  in this container, if any.\n         * @param {HTMLElement} node\n         * @param {boolean} [forward] True if going in forward tab order; false if going\n         *  in reverse.\n         * @returns {HTMLElement|undefined} The next tabbable node, if any.\n         */\n        nextTabbableNode(node, forward = true) {\n          const nodeIdx = tabbableNodes.indexOf(node);\n          if (nodeIdx < 0) {\n            // either not tabbable nor focusable, or was focused but not tabbable (negative tabindex):\n            //  since `node` should at least have been focusable, we assume that's the case and mimic\n            //  what browsers do, which is set focus to the next node in __document position order__,\n            //  regardless of positive tabindexes, if any -- and for reasons explained in the NOTE\n            //  above related to `firstDomTabbable` and `lastDomTabbable` properties, we fall back to\n            //  basic DOM order\n            if (forward) {\n              return focusableNodes\n                .slice(focusableNodes.indexOf(node) + 1)\n                .find((el) => isTabbable(el));\n            }\n\n            return focusableNodes\n              .slice(0, focusableNodes.indexOf(node))\n              .reverse()\n              .find((el) => isTabbable(el));\n          }\n\n          return tabbableNodes[nodeIdx + (forward ? 1 : -1)];\n        },\n      };\n    });\n\n    state.tabbableGroups = state.containerGroups.filter(\n      (group) => group.tabbableNodes.length > 0\n    );\n\n    // throw if no groups have tabbable nodes and we don't have a fallback focus node either\n    if (\n      state.tabbableGroups.length <= 0 &&\n      !getNodeForOption('fallbackFocus') // returning false not supported for this option\n    ) {\n      throw new Error(\n        'Your focus-trap must have at least one container with at least one tabbable node in it at all times'\n      );\n    }\n\n    // NOTE: Positive tabindexes are only properly supported in single-container traps because\n    //  doing it across multiple containers where tabindexes could be all over the place\n    //  would require Tabbable to support multiple containers, would require additional\n    //  specialized Shadow DOM support, and would require Tabbable's multi-container support\n    //  to look at those containers in document position order rather than user-provided\n    //  order (as they are treated in Focus-trap, for legacy reasons). See discussion on\n    //  https://github.com/focus-trap/focus-trap/issues/375 for more details.\n    if (\n      state.containerGroups.find((g) => g.posTabIndexesFound) &&\n      state.containerGroups.length > 1\n    ) {\n      throw new Error(\n        \"At least one node with a positive tabindex was found in one of your focus-trap's multiple containers. Positive tabindexes are only supported in single-container focus-traps.\"\n      );\n    }\n  };\n\n  /**\n   * Gets the current activeElement. If it's a web-component and has open shadow-root\n   * it will recursively search inside shadow roots for the \"true\" activeElement.\n   *\n   * @param {Document | ShadowRoot} el\n   *\n   * @returns {HTMLElement} The element that currently has the focus\n   **/\n  const getActiveElement = function (el) {\n    const activeElement = el.activeElement;\n\n    if (!activeElement) {\n      return;\n    }\n\n    if (\n      activeElement.shadowRoot &&\n      activeElement.shadowRoot.activeElement !== null\n    ) {\n      return getActiveElement(activeElement.shadowRoot);\n    }\n\n    return activeElement;\n  };\n\n  const tryFocus = function (node) {\n    if (node === false) {\n      return;\n    }\n\n    if (node === getActiveElement(document)) {\n      return;\n    }\n\n    if (!node || !node.focus) {\n      tryFocus(getInitialFocusNode());\n      return;\n    }\n\n    node.focus({ preventScroll: !!config.preventScroll });\n    // NOTE: focus() API does not trigger focusIn event so set MRU node manually\n    state.mostRecentlyFocusedNode = node;\n\n    if (isSelectableInput(node)) {\n      node.select();\n    }\n  };\n\n  const getReturnFocusNode = function (previousActiveElement) {\n    const node = getNodeForOption('setReturnFocus', {\n      params: [previousActiveElement],\n    });\n    return node ? node : node === false ? false : previousActiveElement;\n  };\n\n  /**\n   * Finds the next node (in either direction) where focus should move according to a\n   *  keyboard focus-in event.\n   * @param {Object} params\n   * @param {Node} [params.target] Known target __from which__ to navigate, if any.\n   * @param {KeyboardEvent|FocusEvent} [params.event] Event to use if `target` isn't known (event\n   *  will be used to determine the `target`). Ignored if `target` is specified.\n   * @param {boolean} [params.isBackward] True if focus should move backward.\n   * @returns {Node|undefined} The next node, or `undefined` if a next node couldn't be\n   *  determined given the current state of the trap.\n   */\n  const findNextNavNode = function ({ target, event, isBackward = false }) {\n    target = target || getActualTarget(event);\n    updateTabbableNodes();\n\n    let destinationNode = null;\n\n    if (state.tabbableGroups.length > 0) {\n      // make sure the target is actually contained in a group\n      // NOTE: the target may also be the container itself if it's focusable\n      //  with tabIndex='-1' and was given initial focus\n      const containerIndex = findContainerIndex(target, event);\n      const containerGroup =\n        containerIndex >= 0 ? state.containerGroups[containerIndex] : undefined;\n\n      if (containerIndex < 0) {\n        // target not found in any group: quite possible focus has escaped the trap,\n        //  so bring it back into...\n        if (isBackward) {\n          // ...the last node in the last group\n          destinationNode =\n            state.tabbableGroups[state.tabbableGroups.length - 1]\n              .lastTabbableNode;\n        } else {\n          // ...the first node in the first group\n          destinationNode = state.tabbableGroups[0].firstTabbableNode;\n        }\n      } else if (isBackward) {\n        // REVERSE\n\n        // is the target the first tabbable node in a group?\n        let startOfGroupIndex = findIndex(\n          state.tabbableGroups,\n          ({ firstTabbableNode }) => target === firstTabbableNode\n        );\n\n        if (\n          startOfGroupIndex < 0 &&\n          (containerGroup.container === target ||\n            (isFocusable(target, config.tabbableOptions) &&\n              !isTabbable(target, config.tabbableOptions) &&\n              !containerGroup.nextTabbableNode(target, false)))\n        ) {\n          // an exception case where the target is either the container itself, or\n          //  a non-tabbable node that was given focus (i.e. tabindex is negative\n          //  and user clicked on it or node was programmatically given focus)\n          //  and is not followed by any other tabbable node, in which\n          //  case, we should handle shift+tab as if focus were on the container's\n          //  first tabbable node, and go to the last tabbable node of the LAST group\n          startOfGroupIndex = containerIndex;\n        }\n\n        if (startOfGroupIndex >= 0) {\n          // YES: then shift+tab should go to the last tabbable node in the\n          //  previous group (and wrap around to the last tabbable node of\n          //  the LAST group if it's the first tabbable node of the FIRST group)\n          const destinationGroupIndex =\n            startOfGroupIndex === 0\n              ? state.tabbableGroups.length - 1\n              : startOfGroupIndex - 1;\n\n          const destinationGroup = state.tabbableGroups[destinationGroupIndex];\n\n          destinationNode =\n            getTabIndex(target) >= 0\n              ? destinationGroup.lastTabbableNode\n              : destinationGroup.lastDomTabbableNode;\n        } else if (!isTabEvent(event)) {\n          // user must have customized the nav keys so we have to move focus manually _within_\n          //  the active group: do this based on the order determined by tabbable()\n          destinationNode = containerGroup.nextTabbableNode(target, false);\n        }\n      } else {\n        // FORWARD\n\n        // is the target the last tabbable node in a group?\n        let lastOfGroupIndex = findIndex(\n          state.tabbableGroups,\n          ({ lastTabbableNode }) => target === lastTabbableNode\n        );\n\n        if (\n          lastOfGroupIndex < 0 &&\n          (containerGroup.container === target ||\n            (isFocusable(target, config.tabbableOptions) &&\n              !isTabbable(target, config.tabbableOptions) &&\n              !containerGroup.nextTabbableNode(target)))\n        ) {\n          // an exception case where the target is the container itself, or\n          //  a non-tabbable node that was given focus (i.e. tabindex is negative\n          //  and user clicked on it or node was programmatically given focus)\n          //  and is not followed by any other tabbable node, in which\n          //  case, we should handle tab as if focus were on the container's\n          //  last tabbable node, and go to the first tabbable node of the FIRST group\n          lastOfGroupIndex = containerIndex;\n        }\n\n        if (lastOfGroupIndex >= 0) {\n          // YES: then tab should go to the first tabbable node in the next\n          //  group (and wrap around to the first tabbable node of the FIRST\n          //  group if it's the last tabbable node of the LAST group)\n          const destinationGroupIndex =\n            lastOfGroupIndex === state.tabbableGroups.length - 1\n              ? 0\n              : lastOfGroupIndex + 1;\n\n          const destinationGroup = state.tabbableGroups[destinationGroupIndex];\n\n          destinationNode =\n            getTabIndex(target) >= 0\n              ? destinationGroup.firstTabbableNode\n              : destinationGroup.firstDomTabbableNode;\n        } else if (!isTabEvent(event)) {\n          // user must have customized the nav keys so we have to move focus manually _within_\n          //  the active group: do this based on the order determined by tabbable()\n          destinationNode = containerGroup.nextTabbableNode(target);\n        }\n      }\n    } else {\n      // no groups available\n      // NOTE: the fallbackFocus option does not support returning false to opt-out\n      destinationNode = getNodeForOption('fallbackFocus');\n    }\n\n    return destinationNode;\n  };\n\n  // This needs to be done on mousedown and touchstart instead of click\n  // so that it precedes the focus event.\n  const checkPointerDown = function (e) {\n    const target = getActualTarget(e);\n\n    if (findContainerIndex(target, e) >= 0) {\n      // allow the click since it ocurred inside the trap\n      return;\n    }\n\n    if (valueOrHandler(config.clickOutsideDeactivates, e)) {\n      // immediately deactivate the trap\n      trap.deactivate({\n        // NOTE: by setting `returnFocus: false`, deactivate() will do nothing,\n        //  which will result in the outside click setting focus to the node\n        //  that was clicked (and if not focusable, to \"nothing\"); by setting\n        //  `returnFocus: true`, we'll attempt to re-focus the node originally-focused\n        //  on activation (or the configured `setReturnFocus` node), whether the\n        //  outside click was on a focusable node or not\n        returnFocus: config.returnFocusOnDeactivate,\n      });\n      return;\n    }\n\n    // This is needed for mobile devices.\n    // (If we'll only let `click` events through,\n    // then on mobile they will be blocked anyways if `touchstart` is blocked.)\n    if (valueOrHandler(config.allowOutsideClick, e)) {\n      // allow the click outside the trap to take place\n      return;\n    }\n\n    // otherwise, prevent the click\n    e.preventDefault();\n  };\n\n  // In case focus escapes the trap for some strange reason, pull it back in.\n  // NOTE: the focusIn event is NOT cancelable, so if focus escapes, it may cause unexpected\n  //  scrolling if the node that got focused was out of view; there's nothing we can do to\n  //  prevent that from happening by the time we discover that focus escaped\n  const checkFocusIn = function (event) {\n    const target = getActualTarget(event);\n    const targetContained = findContainerIndex(target, event) >= 0;\n\n    // In Firefox when you Tab out of an iframe the Document is briefly focused.\n    if (targetContained || target instanceof Document) {\n      if (targetContained) {\n        state.mostRecentlyFocusedNode = target;\n      }\n    } else {\n      // escaped! pull it back in to where it just left\n      event.stopImmediatePropagation();\n\n      // focus will escape if the MRU node had a positive tab index and user tried to nav forward;\n      //  it will also escape if the MRU node had a 0 tab index and user tried to nav backward\n      //  toward a node with a positive tab index\n      let nextNode; // next node to focus, if we find one\n      let navAcrossContainers = true;\n      if (state.mostRecentlyFocusedNode) {\n        if (getTabIndex(state.mostRecentlyFocusedNode) > 0) {\n          // MRU container index must be >=0 otherwise we wouldn't have it as an MRU node...\n          const mruContainerIdx = findContainerIndex(\n            state.mostRecentlyFocusedNode\n          );\n          // there MAY not be any tabbable nodes in the container if there are at least 2 containers\n          //  and the MRU node is focusable but not tabbable (focus-trap requires at least 1 container\n          //  with at least one tabbable node in order to function, so this could be the other container\n          //  with nothing tabbable in it)\n          const { tabbableNodes } = state.containerGroups[mruContainerIdx];\n          if (tabbableNodes.length > 0) {\n            // MRU tab index MAY not be found if the MRU node is focusable but not tabbable\n            const mruTabIdx = tabbableNodes.findIndex(\n              (node) => node === state.mostRecentlyFocusedNode\n            );\n            if (mruTabIdx >= 0) {\n              if (config.isKeyForward(state.recentNavEvent)) {\n                if (mruTabIdx + 1 < tabbableNodes.length) {\n                  nextNode = tabbableNodes[mruTabIdx + 1];\n                  navAcrossContainers = false;\n                }\n                // else, don't wrap within the container as focus should move to next/previous\n                //  container\n              } else {\n                if (mruTabIdx - 1 >= 0) {\n                  nextNode = tabbableNodes[mruTabIdx - 1];\n                  navAcrossContainers = false;\n                }\n                // else, don't wrap within the container as focus should move to next/previous\n                //  container\n              }\n              // else, don't find in container order without considering direction too\n            }\n          }\n          // else, no tabbable nodes in that container (which means we must have at least one other\n          //  container with at least one tabbable node in it, otherwise focus-trap would've thrown\n          //  an error the last time updateTabbableNodes() was run): find next node among all known\n          //  containers\n        } else {\n          // check to see if there's at least one tabbable node with a positive tab index inside\n          //  the trap because focus seems to escape when navigating backward from a tabbable node\n          //  with tabindex=0 when this is the case (instead of wrapping to the tabbable node with\n          //  the greatest positive tab index like it should)\n          if (\n            !state.containerGroups.some((g) =>\n              g.tabbableNodes.some((n) => getTabIndex(n) > 0)\n            )\n          ) {\n            // no containers with tabbable nodes with positive tab indexes which means the focus\n            //  escaped for some other reason and we should just execute the fallback to the\n            //  MRU node or initial focus node, if any\n            navAcrossContainers = false;\n          }\n        }\n      } else {\n        // no MRU node means we're likely in some initial condition when the trap has just\n        //  been activated and initial focus hasn't been given yet, in which case we should\n        //  fall through to trying to focus the initial focus node, which is what should\n        //  happen below at this point in the logic\n        navAcrossContainers = false;\n      }\n\n      if (navAcrossContainers) {\n        nextNode = findNextNavNode({\n          // move FROM the MRU node, not event-related node (which will be the node that is\n          //  outside the trap causing the focus escape we're trying to fix)\n          target: state.mostRecentlyFocusedNode,\n          isBackward: config.isKeyBackward(state.recentNavEvent),\n        });\n      }\n\n      if (nextNode) {\n        tryFocus(nextNode);\n      } else {\n        tryFocus(state.mostRecentlyFocusedNode || getInitialFocusNode());\n      }\n    }\n\n    state.recentNavEvent = undefined; // clear\n  };\n\n  // Hijack key nav events on the first and last focusable nodes of the trap,\n  // in order to prevent focus from escaping. If it escapes for even a\n  // moment it can end up scrolling the page and causing confusion so we\n  // kind of need to capture the action at the keydown phase.\n  const checkKeyNav = function (event, isBackward = false) {\n    state.recentNavEvent = event;\n\n    const destinationNode = findNextNavNode({ event, isBackward });\n    if (destinationNode) {\n      if (isTabEvent(event)) {\n        // since tab natively moves focus, we wouldn't have a destination node unless we\n        //  were on the edge of a container and had to move to the next/previous edge, in\n        //  which case we want to prevent default to keep the browser from moving focus\n        //  to where it normally would\n        event.preventDefault();\n      }\n      tryFocus(destinationNode);\n    }\n    // else, let the browser take care of [shift+]tab and move the focus\n  };\n\n  const checkTabKey = function (event) {\n    if (config.isKeyForward(event) || config.isKeyBackward(event)) {\n      checkKeyNav(event, config.isKeyBackward(event));\n    }\n  };\n\n  // we use a different event phase for the Escape key to allow canceling the event and checking for this in escapeDeactivates\n  const checkEscapeKey = function (event) {\n    if (\n      isEscapeEvent(event) &&\n      valueOrHandler(config.escapeDeactivates, event) !== false\n    ) {\n      event.preventDefault();\n      trap.deactivate();\n    }\n  };\n\n  const checkClick = function (e) {\n    const target = getActualTarget(e);\n\n    if (findContainerIndex(target, e) >= 0) {\n      return;\n    }\n\n    if (valueOrHandler(config.clickOutsideDeactivates, e)) {\n      return;\n    }\n\n    if (valueOrHandler(config.allowOutsideClick, e)) {\n      return;\n    }\n\n    e.preventDefault();\n    e.stopImmediatePropagation();\n  };\n\n  //\n  // EVENT LISTENERS\n  //\n\n  const addListeners = function () {\n    if (!state.active) {\n      return;\n    }\n\n    // There can be only one listening focus trap at a time\n    activeFocusTraps.activateTrap(trapStack, trap);\n\n    // Delay ensures that the focused element doesn't capture the event\n    // that caused the focus trap activation.\n    state.delayInitialFocusTimer = config.delayInitialFocus\n      ? delay(function () {\n          tryFocus(getInitialFocusNode());\n        })\n      : tryFocus(getInitialFocusNode());\n\n    doc.addEventListener('focusin', checkFocusIn, true);\n    doc.addEventListener('mousedown', checkPointerDown, {\n      capture: true,\n      passive: false,\n    });\n    doc.addEventListener('touchstart', checkPointerDown, {\n      capture: true,\n      passive: false,\n    });\n    doc.addEventListener('click', checkClick, {\n      capture: true,\n      passive: false,\n    });\n    doc.addEventListener('keydown', checkTabKey, {\n      capture: true,\n      passive: false,\n    });\n    doc.addEventListener('keydown', checkEscapeKey);\n\n    return trap;\n  };\n\n  const removeListeners = function () {\n    if (!state.active) {\n      return;\n    }\n\n    doc.removeEventListener('focusin', checkFocusIn, true);\n    doc.removeEventListener('mousedown', checkPointerDown, true);\n    doc.removeEventListener('touchstart', checkPointerDown, true);\n    doc.removeEventListener('click', checkClick, true);\n    doc.removeEventListener('keydown', checkTabKey, true);\n    doc.removeEventListener('keydown', checkEscapeKey);\n\n    return trap;\n  };\n\n  //\n  // MUTATION OBSERVER\n  //\n\n  const checkDomRemoval = function (mutations) {\n    const isFocusedNodeRemoved = mutations.some(function (mutation) {\n      const removedNodes = Array.from(mutation.removedNodes);\n      return removedNodes.some(function (node) {\n        return node === state.mostRecentlyFocusedNode;\n      });\n    });\n\n    // If the currently focused is removed then browsers will move focus to the\n    // <body> element. If this happens, try to move focus back into the trap.\n    if (isFocusedNodeRemoved) {\n      tryFocus(getInitialFocusNode());\n    }\n  };\n\n  // Use MutationObserver - if supported - to detect if focused node is removed\n  // from the DOM.\n  const mutationObserver =\n    typeof window !== 'undefined' && 'MutationObserver' in window\n      ? new MutationObserver(checkDomRemoval)\n      : undefined;\n\n  const updateObservedNodes = function () {\n    if (!mutationObserver) {\n      return;\n    }\n\n    mutationObserver.disconnect();\n    if (state.active && !state.paused) {\n      state.containers.map(function (container) {\n        mutationObserver.observe(container, {\n          subtree: true,\n          childList: true,\n        });\n      });\n    }\n  };\n\n  //\n  // TRAP DEFINITION\n  //\n\n  trap = {\n    get active() {\n      return state.active;\n    },\n\n    get paused() {\n      return state.paused;\n    },\n\n    activate(activateOptions) {\n      if (state.active) {\n        return this;\n      }\n\n      const onActivate = getOption(activateOptions, 'onActivate');\n      const onPostActivate = getOption(activateOptions, 'onPostActivate');\n      const checkCanFocusTrap = getOption(activateOptions, 'checkCanFocusTrap');\n\n      if (!checkCanFocusTrap) {\n        updateTabbableNodes();\n      }\n\n      state.active = true;\n      state.paused = false;\n      state.nodeFocusedBeforeActivation = doc.activeElement;\n\n      onActivate?.();\n\n      const finishActivation = () => {\n        if (checkCanFocusTrap) {\n          updateTabbableNodes();\n        }\n        addListeners();\n        updateObservedNodes();\n        onPostActivate?.();\n      };\n\n      if (checkCanFocusTrap) {\n        checkCanFocusTrap(state.containers.concat()).then(\n          finishActivation,\n          finishActivation\n        );\n        return this;\n      }\n\n      finishActivation();\n      return this;\n    },\n\n    deactivate(deactivateOptions) {\n      if (!state.active) {\n        return this;\n      }\n\n      const options = {\n        onDeactivate: config.onDeactivate,\n        onPostDeactivate: config.onPostDeactivate,\n        checkCanReturnFocus: config.checkCanReturnFocus,\n        ...deactivateOptions,\n      };\n\n      clearTimeout(state.delayInitialFocusTimer); // noop if undefined\n      state.delayInitialFocusTimer = undefined;\n\n      removeListeners();\n      state.active = false;\n      state.paused = false;\n      updateObservedNodes();\n\n      activeFocusTraps.deactivateTrap(trapStack, trap);\n\n      const onDeactivate = getOption(options, 'onDeactivate');\n      const onPostDeactivate = getOption(options, 'onPostDeactivate');\n      const checkCanReturnFocus = getOption(options, 'checkCanReturnFocus');\n      const returnFocus = getOption(\n        options,\n        'returnFocus',\n        'returnFocusOnDeactivate'\n      );\n\n      onDeactivate?.();\n\n      const finishDeactivation = () => {\n        delay(() => {\n          if (returnFocus) {\n            tryFocus(getReturnFocusNode(state.nodeFocusedBeforeActivation));\n          }\n          onPostDeactivate?.();\n        });\n      };\n\n      if (returnFocus && checkCanReturnFocus) {\n        checkCanReturnFocus(\n          getReturnFocusNode(state.nodeFocusedBeforeActivation)\n        ).then(finishDeactivation, finishDeactivation);\n        return this;\n      }\n\n      finishDeactivation();\n      return this;\n    },\n\n    pause(pauseOptions) {\n      if (state.paused || !state.active) {\n        return this;\n      }\n\n      const onPause = getOption(pauseOptions, 'onPause');\n      const onPostPause = getOption(pauseOptions, 'onPostPause');\n\n      state.paused = true;\n      onPause?.();\n\n      removeListeners();\n      updateObservedNodes();\n\n      onPostPause?.();\n      return this;\n    },\n\n    unpause(unpauseOptions) {\n      if (!state.paused || !state.active) {\n        return this;\n      }\n\n      const onUnpause = getOption(unpauseOptions, 'onUnpause');\n      const onPostUnpause = getOption(unpauseOptions, 'onPostUnpause');\n\n      state.paused = false;\n      onUnpause?.();\n\n      updateTabbableNodes();\n      addListeners();\n      updateObservedNodes();\n\n      onPostUnpause?.();\n      return this;\n    },\n\n    updateContainerElements(containerElements) {\n      const elementsAsArray = [].concat(containerElements).filter(Boolean);\n\n      state.containers = elementsAsArray.map((element) =>\n        typeof element === 'string' ? doc.querySelector(element) : element\n      );\n\n      if (state.active) {\n        updateTabbableNodes();\n      }\n\n      updateObservedNodes();\n\n      return this;\n    },\n  };\n\n  // initialize container elements\n  trap.updateContainerElements(elements);\n\n  return trap;\n};\n\nexport { createFocusTrap };\n"],"names":["activeFocusTraps","trapStack","trap","length","activeTrap","pause","trapIndex","indexOf","splice","push","unpause","isTabEvent","e","key","keyCode","isKeyForward","shiftKey","isKeyBackward","delay","fn","setTimeout","findIndex","arr","idx","every","value","i","valueOrHandler","_len","arguments","params","Array","_key","apply","getActualTarget","event","target","shadowRoot","composedPath","internalTrapStack","elements","userOptions","doc","document","config","_objectSpread","returnFocusOnDeactivate","escapeDeactivates","delayInitialFocus","state","containers","containerGroups","tabbableGroups","nodeFocusedBeforeActivation","mostRecentlyFocusedNode","active","paused","delayInitialFocusTimer","undefined","recentNavEvent","getOption","configOverrideOptions","optionName","configOptionName","findContainerIndex","element","_ref","container","tabbableNodes","contains","includes","find","node","getNodeForOption","_ref2","_ref2$hasFallback","hasFallback","_ref2$params","optionValue","_toConsumableArray","Error","concat","querySelector","err","message","getInitialFocusNode","isFocusable","tabbableOptions","activeElement","firstTabbableGroup","firstTabbableNode","updateTabbableNodes","map","tabbable","focusableNodes","focusable","lastTabbableNode","firstDomTabbableNode","isTabbable","lastDomTabbableNode","slice","reverse","posTabIndexesFound","getTabIndex","nextTabbableNode","forward","nodeIdx","el","filter","group","g","getActiveElement","tryFocus","focus","preventScroll","tagName","toLowerCase","select","isSelectableInput","getReturnFocusNode","previousActiveElement","findNextNavNode","_ref3","_ref3$isBackward","isBackward","destinationNode","containerIndex","containerGroup","startOfGroupIndex","_ref4","destinationGroupIndex","destinationGroup","lastOfGroupIndex","_ref5","checkPointerDown","clickOutsideDeactivates","deactivate","returnFocus","allowOutsideClick","preventDefault","checkFocusIn","targetContained","Document","nextNode","stopImmediatePropagation","navAcrossContainers","mruContainerIdx","mruTabIdx","some","n","checkTabKey","checkKeyNav","checkEscapeKey","checkClick","addListeners","addEventListener","capture","passive","removeListeners","removeEventListener","mutationObserver","window","MutationObserver","mutations","mutation","from","removedNodes","updateObservedNodes","disconnect","observe","subtree","childList","activate","activateOptions","this","onActivate","onPostActivate","checkCanFocusTrap","finishActivation","then","deactivateOptions","options","onDeactivate","onPostDeactivate","checkCanReturnFocus","clearTimeout","finishDeactivation","pauseOptions","onPause","onPostPause","unpauseOptions","onUnpause","onPostUnpause","updateContainerElements","containerElements","elementsAsArray","Boolean"],"mappings":"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"}
\ No newline at end of file