diff --git a/application/source/dom/constants.mjs b/application/source/dom/constants.mjs
index 432ae76ebcac8f1363b321b256d159bbab018224..cc2770b5c98e45e5f503bd85da335ebe34057590 100644
--- a/application/source/dom/constants.mjs
+++ b/application/source/dom/constants.mjs
@@ -59,6 +59,9 @@ export {
     ATTRIBUTE_HIDDEN,
     objectUpdaterLinkSymbol,
     customElementUpdaterLinkSymbol,
+    optionCallbackName,
+    ATTRIBUTE_SCRIPT_HOST,
+    ATTRIBUTE_OPTION_CALLBACK
 };
 
 /**
@@ -86,6 +89,16 @@ const ATTRIBUTE_PREFIX = "data-monster-";
  */
 const ATTRIBUTE_OPTIONS = `${ATTRIBUTE_PREFIX}options`;
 
+/**
+ * This is name of the attribute to pass the script host to a control
+ *
+ * @memberOf Monster.DOM
+ * @license AGPLv3
+ * @since 3.48.0
+ * @type {string}
+ */
+const ATTRIBUTE_SCRIPT_HOST = `${ATTRIBUTE_PREFIX}script-host`;
+
 /**
  * This is the name of the attribute to pass options to a control
  *
@@ -96,6 +109,26 @@ const ATTRIBUTE_OPTIONS = `${ATTRIBUTE_PREFIX}options`;
  */
 const ATTRIBUTE_OPTIONS_SELECTOR = `${ATTRIBUTE_PREFIX}options-selector`;
 
+/**
+ * This is the name of the attribute to pass the callback to a control
+ *
+ * @memberOf Monster.DOM
+ * @license AGPLv3
+ * @since 3.48.0
+ * @type {string}
+ */
+const ATTRIBUTE_OPTION_CALLBACK = `${ATTRIBUTE_PREFIX}option-callback`;
+
+/**
+ * This is the name of the callback to pass the callback to a control
+ *
+ * @memberOf Monster.DOM
+ * @license AGPLv3
+ * @since 3.48.0
+ * @type {string}
+ */
+const optionCallbackName = `initCustomControlOptionsCallback`;
+
 /**
  * @memberOf Monster.DOM
  * @type {string}
diff --git a/application/source/dom/customelement.mjs b/application/source/dom/customelement.mjs
index 9ce57bfa812b77d25df6591799a5af41fbde428d..0a6b79f0268017eb5e511cf0b59d18e58c3f1147 100644
--- a/application/source/dom/customelement.mjs
+++ b/application/source/dom/customelement.mjs
@@ -5,6 +5,7 @@
  * License text available at https://www.gnu.org/licenses/agpl-3.0.en.html
  */
 
+import {findElementWithIdUpwards} from "./util.mjs";
 import {internalSymbol} from "../constants.mjs";
 import {extend} from "../data/extend.mjs";
 import {Pathfinder} from "../data/pathfinder.mjs";
@@ -22,8 +23,11 @@ import {
     ATTRIBUTE_DISABLED,
     ATTRIBUTE_ERRORMESSAGE,
     ATTRIBUTE_OPTIONS,
+    ATTRIBUTE_OPTION_CALLBACK,
     ATTRIBUTE_OPTIONS_SELECTOR,
+    ATTRIBUTE_SCRIPT_HOST,
     customElementUpdaterLinkSymbol,
+    optionCallbackName
 } from "./constants.mjs";
 import {findDocumentTemplate, Template} from "./template.mjs";
 import {addObjectWithUpdaterToElement} from "./updater.mjs";
@@ -67,6 +71,12 @@ const attributeObserverSymbol = Symbol.for("@schukai/monster/dom/@@attributeObse
  */
 const attributeMutationObserverSymbol = Symbol("@schukai/monster/dom/@@mutationObserver");
 
+/**
+ * @private
+ * @type {symbol}
+ */
+const scriptHostElementSymbol = Symbol("scriptHostElement");
+
 /**
  * HTMLElement
  * @external HTMLElement
@@ -212,6 +222,7 @@ class CustomElement extends HTMLElement {
         });
         this[initMethodSymbol]();
         initOptionObserver.call(this);
+        this[scriptHostElementSymbol] = [];
 
     }
 
@@ -520,6 +531,7 @@ class CustomElement extends HTMLElement {
             self.setOptions(ScriptOptions);
         }
 
+
         if (self.getOption("shadowMode", false) !== false) {
             try {
                 initShadowRoot.call(self);
@@ -541,6 +553,8 @@ class CustomElement extends HTMLElement {
             }
         }
 
+        initFromCallbackHost.call(this);
+
         try {
             nodeList = new Set([...elements, ...getSlottedElements.call(self)]);
         } catch (e) {
@@ -607,7 +621,7 @@ class CustomElement extends HTMLElement {
         const self = this;
 
         if (attrName.startsWith("data-monster-option-")) {
-            setOptionFromAttribute(self, attrName, this[internalSymbol].getSubject()["options"]) 
+            setOptionFromAttribute(self, attrName, this[internalSymbol].getSubject()["options"])
         }
 
         const callback = self[attributeObserverSymbol]?.[attrName];
@@ -641,6 +655,99 @@ class CustomElement extends HTMLElement {
 
         return containChildNode.call(self.shadowRoot, node);
     }
+
+    /**
+     * Calls a callback function if it exists.
+     * 
+     * @param {string} name
+     * @param {*} args
+     * @returns {*}
+     */
+    callCallback(name, args) {
+        const self = this;
+        return callControlCallback.call(self, name, ...args);
+    }
+
+
+}
+
+/**
+ * @param {string} callBackFunctionName
+ * @param {*}  args
+ * @return {any}
+ */
+function callControlCallback(callBackFunctionName, ...args) {
+    const self = this;
+
+    if (!isString(callBackFunctionName) || callBackFunctionName === "") {
+        return;
+    }
+
+    if (callBackFunctionName in self) {
+        return self[callBackFunctionName](self, ...args);
+        
+    }
+
+    if (!self.hasAttribute(ATTRIBUTE_SCRIPT_HOST)) {
+        return;
+    }
+
+    if (self[scriptHostElementSymbol].length === 0) {
+
+        const targetId = self.getAttribute(ATTRIBUTE_SCRIPT_HOST);
+        if (!targetId) {
+            return;
+        }
+
+        const list = targetId.split(",")
+        for (const id of list) {
+            const host = findElementWithIdUpwards(self, targetId);
+            if (!(host instanceof HTMLElement)) {
+                continue;
+            }
+
+            self[scriptHostElementSymbol].push(host);
+        }
+    }
+
+    for (const host of self[scriptHostElementSymbol]) {
+        if (callBackFunctionName in host) {
+            try {
+                return host[callBackFunctionName](self, ...args);
+            } catch (e) {
+                addAttributeToken(self, ATTRIBUTE_ERRORMESSAGE, e.toString());
+            }
+        }
+    }
+
+    addAttributeToken(self, ATTRIBUTE_ERRORMESSAGE, `callback ${callBackFunctionName} not found`);
+
+}
+
+/**
+ * This Function is called when the element is attached to the DOM.
+ *
+ * It looks for the attribute `data-monster-option-callback`. Is this attribute is not set, the default callback
+ * `initCustomControlOptionsCallback` is called.
+ *
+ * The callback is searched in this element and in the host element. If the callback is found, it is called with the
+ * element as parameter.
+ *
+ * The `monster
+ *
+ * @this CustomElement
+ */
+function initFromCallbackHost() {
+    const self = this;
+
+    let callBackFunctionName = optionCallbackName // default callback
+    if (self.hasAttribute(ATTRIBUTE_OPTION_CALLBACK)) {
+        callBackFunctionName = self.getAttribute(ATTRIBUTE_OPTION_CALLBACK);
+    }
+
+    callControlCallback.call(self, callBackFunctionName);
+
+
 }
 
 /**
diff --git a/development/package.json b/development/package.json
index 28037f58c740bcb7bb93a1916db68be8c82ec693..0c4e75bc1004095ad280e50fd1d9ab4e504047ef 100644
--- a/development/package.json
+++ b/development/package.json
@@ -33,14 +33,14 @@
     "crypt": "^0.0.2",
     "cssnano": "^6.0.1",
     "esbuild": "^0.17.18",
-    "flow-bin": "^0.205.0",
+    "flow-bin": "^0.205.1",
     "fs": "0.0.1-security",
     "glob": "^10.2.2",
     "graphviz": "^0.0.9",
     "jsdoc": "^4.0.2",
     "jsdoc-external-example": "github:volker-schukai/jsdoc-external-example",
     "jsdoc-plantuml": "^1.0.3",
-    "jsdom": "^21.1.2",
+    "jsdom": "^22.0.0",
     "jsdom-global": "^3.0.2",
     "mocha": "^10.2.0",
     "node-plantuml": "^0.9.0",
@@ -54,18 +54,18 @@
     "postcss-nesting": "^11.2.2",
     "postcss-normalize": "^10.0.1",
     "postcss-responsive-type": "^1.0.0",
-    "postcss-rtlcss": "^4.0.5",
+    "postcss-rtlcss": "^4.0.6",
     "postcss-strip-units": "^2.0.1",
     "rome": "^12.0.0",
     "sinon": "^15.0.4",
     "url": "^0.11.0",
     "url-exist": "3.0.1",
     "util": "^0.12.5",
-    "vite": "^4.3.3",
+    "vite": "^4.3.5",
     "vite-plugin-banner": "^0.7.0",
     "vite-plugin-list-directory-contents": "^1.4.5",
     "vite-plugin-minify": "^1.5.2",
-    "vite-plugin-mkcert": "^1.14.1",
+    "vite-plugin-mkcert": "^1.15.0",
     "ws": "^8.13.0"
   }
 }
diff --git a/development/pnpm-lock.yaml b/development/pnpm-lock.yaml
index 805e452118dfeeeec49ba7dffe2a76a475b8518c..60681fd7ca66ac79ab008849b9c2afac1ba2bba3 100644
--- a/development/pnpm-lock.yaml
+++ b/development/pnpm-lock.yaml
@@ -41,8 +41,8 @@ devDependencies:
     specifier: ^0.17.18
     version: 0.17.18
   flow-bin:
-    specifier: ^0.205.0
-    version: 0.205.0
+    specifier: ^0.205.1
+    version: 0.205.1
   fs:
     specifier: 0.0.1-security
     version: 0.0.1-security
@@ -62,11 +62,11 @@ devDependencies:
     specifier: ^1.0.3
     version: 1.0.3(jsdoc@4.0.2)
   jsdom:
-    specifier: ^21.1.2
-    version: 21.1.2
+    specifier: ^22.0.0
+    version: 22.0.0
   jsdom-global:
     specifier: ^3.0.2
-    version: 3.0.2(jsdom@21.1.2)
+    version: 3.0.2(jsdom@22.0.0)
   mocha:
     specifier: ^10.2.0
     version: 10.2.0
@@ -104,8 +104,8 @@ devDependencies:
     specifier: ^1.0.0
     version: 1.0.0
   postcss-rtlcss:
-    specifier: ^4.0.5
-    version: 4.0.5(postcss@8.4.23)
+    specifier: ^4.0.6
+    version: 4.0.6(postcss@8.4.23)
   postcss-strip-units:
     specifier: ^2.0.1
     version: 2.0.1
@@ -125,8 +125,8 @@ devDependencies:
     specifier: ^0.12.5
     version: 0.12.5
   vite:
-    specifier: ^4.3.3
-    version: 4.3.3(@types/node@18.16.3)
+    specifier: ^4.3.5
+    version: 4.3.5(@types/node@18.16.4)
   vite-plugin-banner:
     specifier: ^0.7.0
     version: 0.7.0
@@ -135,10 +135,10 @@ devDependencies:
     version: 1.4.5
   vite-plugin-minify:
     specifier: ^1.5.2
-    version: 1.5.2(vite@4.3.3)
+    version: 1.5.2(vite@4.3.5)
   vite-plugin-mkcert:
-    specifier: ^1.14.1
-    version: 1.14.1(vite@4.3.3)
+    specifier: ^1.15.0
+    version: 1.15.0(vite@4.3.5)
   ws:
     specifier: ^8.13.0
     version: 8.13.0
@@ -165,17 +165,17 @@ packages:
     engines: {node: '>=6.9.0'}
     dev: true
 
-  /@babel/core@7.21.5:
-    resolution: {integrity: sha512-9M398B/QH5DlfCOTKDZT1ozXr0x8uBEeFd+dJraGUZGiaNpGCDVGCc14hZexsMblw3XxltJ+6kSvogp9J+5a9g==}
+  /@babel/core@7.21.8:
+    resolution: {integrity: sha512-YeM22Sondbo523Sz0+CirSPnbj9bG3P0CdHcBZdqUuaeOaYEFbOLoGU7lebvGP6P5J/WE9wOn7u7C4J9HvS1xQ==}
     engines: {node: '>=6.9.0'}
     dependencies:
       '@ampproject/remapping': 2.2.1
       '@babel/code-frame': 7.21.4
       '@babel/generator': 7.21.5
-      '@babel/helper-compilation-targets': 7.21.5(@babel/core@7.21.5)
+      '@babel/helper-compilation-targets': 7.21.5(@babel/core@7.21.8)
       '@babel/helper-module-transforms': 7.21.5
       '@babel/helpers': 7.21.5
-      '@babel/parser': 7.21.5
+      '@babel/parser': 7.21.8
       '@babel/template': 7.20.7
       '@babel/traverse': 7.21.5
       '@babel/types': 7.21.5
@@ -198,14 +198,14 @@ packages:
       jsesc: 2.5.2
     dev: true
 
-  /@babel/helper-compilation-targets@7.21.5(@babel/core@7.21.5):
+  /@babel/helper-compilation-targets@7.21.5(@babel/core@7.21.8):
     resolution: {integrity: sha512-1RkbFGUKex4lvsB9yhIfWltJM5cZKUftB2eNajaDv3dCMEp49iBG0K14uH8NnX9IPux2+mK7JGEOB0jn48/J6w==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0
     dependencies:
       '@babel/compat-data': 7.21.7
-      '@babel/core': 7.21.5
+      '@babel/core': 7.21.8
       '@babel/helper-validator-option': 7.21.0
       browserslist: 4.21.5
       lru-cache: 5.1.1
@@ -304,8 +304,8 @@ packages:
       js-tokens: 4.0.0
     dev: true
 
-  /@babel/parser@7.21.5:
-    resolution: {integrity: sha512-J+IxH2IsxV4HbnTrSWgMAQj0UEo61hDA4Ny8h8PCX0MLXiibqHbqIOVneqdocemSBc22VpBKxt4J6FQzy9HarQ==}
+  /@babel/parser@7.21.8:
+    resolution: {integrity: sha512-6zavDGdzG3gUqAdWvlLFfk+36RilI+Pwyuuh7HItyeScCWP3k6i8vKclAQ0bM/0y/Kz/xiwvxhMv9MgTJP5gmA==}
     engines: {node: '>=6.0.0'}
     hasBin: true
     dependencies:
@@ -317,7 +317,7 @@ packages:
     engines: {node: '>=6.9.0'}
     dependencies:
       '@babel/code-frame': 7.21.4
-      '@babel/parser': 7.21.5
+      '@babel/parser': 7.21.8
       '@babel/types': 7.21.5
     dev: true
 
@@ -331,7 +331,7 @@ packages:
       '@babel/helper-function-name': 7.21.0
       '@babel/helper-hoist-variables': 7.18.6
       '@babel/helper-split-export-declaration': 7.18.6
-      '@babel/parser': 7.21.5
+      '@babel/parser': 7.21.8
       '@babel/types': 7.21.5
       debug: 4.3.4(supports-color@8.1.1)
       globals: 11.12.0
@@ -567,7 +567,7 @@ packages:
     resolution: {integrity: sha512-AouQ5I0a9TeRdHSN093WX5yz3ZlMbRyQ1xHn7K4OmXcbsRnS96Biy5Q2sTkqLwwTouAk/SNeWIjzrDZFQHp9Mw==}
     hasBin: true
     dependencies:
-      '@babel/core': 7.21.5
+      '@babel/core': 7.21.8
       globals: 11.12.0
       yargs: 13.3.2
     transitivePeerDependencies:
@@ -586,6 +586,18 @@ packages:
     resolution: {integrity: sha512-TlQiXt/vS5ZwY0V3salvlyQzIzMGZEyw9inmJA25A8heL2kBVENbToiEc64R6ETNf5YHa2lwnc2I7iNHP9SqeQ==}
     dev: true
 
+  /@isaacs/cliui@8.0.2:
+    resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
+    engines: {node: '>=12'}
+    dependencies:
+      string-width: 5.1.2
+      string-width-cjs: /string-width@4.2.3
+      strip-ansi: 7.0.1
+      strip-ansi-cjs: /strip-ansi@6.0.1
+      wrap-ansi: 8.1.0
+      wrap-ansi-cjs: /wrap-ansi@7.0.0
+    dev: true
+
   /@istanbuljs/schema@0.1.3:
     resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==}
     engines: {node: '>=8'}
@@ -639,24 +651,24 @@ packages:
       lodash: 4.17.21
     dev: true
 
-  /@microsoft/api-extractor-model@7.26.7(@types/node@18.16.3):
-    resolution: {integrity: sha512-rx3Tq632VG3ddR74kPuPbv1qmUgO2IuCvn1z16hbNWNS5RhnTQqNPWIm7NVoi6lCh2E7uxzfmdnWXIXiJhM5IQ==}
+  /@microsoft/api-extractor-model@7.26.8(@types/node@18.16.4):
+    resolution: {integrity: sha512-ESj3bBJkiMg/8tS0PW4+2rUgTVwOEfy41idTnFgdbVX+O50bN6S99MV6FIPlCZWCnRDcBfwxRXLdAkOQQ0JqGw==}
     dependencies:
       '@microsoft/tsdoc': 0.14.2
       '@microsoft/tsdoc-config': 0.16.2
-      '@rushstack/node-core-library': 3.58.0(@types/node@18.16.3)
+      '@rushstack/node-core-library': 3.58.0(@types/node@18.16.4)
     transitivePeerDependencies:
       - '@types/node'
     dev: true
 
-  /@microsoft/api-extractor@7.34.7(@types/node@18.16.3):
-    resolution: {integrity: sha512-8CrrYyOBWqc4XFviR1KSuHSlmJjlnC5CVpPkcFB8HXiLABUVaVWFTsOzJIwUU6z8mc4BZPZ8tSGAg/mwFDU31Q==}
+  /@microsoft/api-extractor@7.34.8(@types/node@18.16.4):
+    resolution: {integrity: sha512-2Eh1PlZ8wULtH3kyAWcj62gFtjGKRXrEplsCO54vMLjiav3qet454VpSBXwKkXBenBylZRMk3SMBcpcuJ8RnKQ==}
     hasBin: true
     dependencies:
-      '@microsoft/api-extractor-model': 7.26.7(@types/node@18.16.3)
+      '@microsoft/api-extractor-model': 7.26.8(@types/node@18.16.4)
       '@microsoft/tsdoc': 0.14.2
       '@microsoft/tsdoc-config': 0.16.2
-      '@rushstack/node-core-library': 3.58.0(@types/node@18.16.3)
+      '@rushstack/node-core-library': 3.58.0(@types/node@18.16.4)
       '@rushstack/rig-package': 0.3.18
       '@rushstack/ts-command-line': 4.13.2
       colors: 1.2.5
@@ -918,7 +930,7 @@ packages:
     dev: true
     optional: true
 
-  /@rushstack/node-core-library@3.58.0(@types/node@18.16.3):
+  /@rushstack/node-core-library@3.58.0(@types/node@18.16.4):
     resolution: {integrity: sha512-DHAZ3LTOEq2/EGURznpTJDnB3SNE2CKMDXuviQ6afhru6RykE3QoqXkeyjbpLb5ib5cpIRCPE/wykNe0xmQj3w==}
     peerDependencies:
       '@types/node': '*'
@@ -926,7 +938,7 @@ packages:
       '@types/node':
         optional: true
     dependencies:
-      '@types/node': 18.16.3
+      '@types/node': 18.16.4
       colors: 1.2.5
       fs-extra: 7.0.1
       import-lazy: 4.0.0
@@ -952,33 +964,33 @@ packages:
       string-argv: 0.3.2
     dev: true
 
-  /@sentry-internal/tracing@7.50.0:
-    resolution: {integrity: sha512-4TQ4vN0aMBWsUXfJWk2xbe4x7fKfwCXgXKTtHC/ocwwKM+0EefV5Iw9YFG8IrIQN4vMtuRzktqcs9q0/Sbv7tg==}
+  /@sentry-internal/tracing@7.51.0:
+    resolution: {integrity: sha512-mhXl4B02OQq6/vevjX04OchmQbxPRaLci9vTTPcPcIz/n+wkum29ze35gHcJsPJUesScjd0m19Xou3C8fNnZRA==}
     engines: {node: '>=8'}
     dependencies:
-      '@sentry/core': 7.50.0
-      '@sentry/types': 7.50.0
-      '@sentry/utils': 7.50.0
+      '@sentry/core': 7.51.0
+      '@sentry/types': 7.51.0
+      '@sentry/utils': 7.51.0
       tslib: 1.14.1
     dev: true
 
-  /@sentry/core@7.50.0:
-    resolution: {integrity: sha512-6oD1a3fYs4aiNK7tuJSd88LHjYJAetd7ZK/AfJniU7zWKj4jxIYfO8nhm0qdnhEDs81RcweVDmPhWm3Kwrzzsg==}
+  /@sentry/core@7.51.0:
+    resolution: {integrity: sha512-GgYwlXU8Y1kDEHsJO1Bmr2CNan5BzoNRR0TDBmxRgI/DgTNNSYrXeFDELgPi9/p/0XENeuttzDZ3iYd1nF7meA==}
     engines: {node: '>=8'}
     dependencies:
-      '@sentry/types': 7.50.0
-      '@sentry/utils': 7.50.0
+      '@sentry/types': 7.51.0
+      '@sentry/utils': 7.51.0
       tslib: 1.14.1
     dev: true
 
-  /@sentry/node@7.50.0:
-    resolution: {integrity: sha512-11UJBKoQFMp7f8sbzeO2gENsKIUkVCNBTzuPRib7l2K1HMjSfacXmwwma7ZEs0mc3ofIZ1UYuyONAXmI1lK9cQ==}
+  /@sentry/node@7.51.0:
+    resolution: {integrity: sha512-UHJ0yN3I8hSrythr3/KPewh+xLIdjF6AU+BW3bgsP0ZtztrftrQk9+XnWRIX0p6ZstzoP4F3arkJIXkWfOk5Pg==}
     engines: {node: '>=8'}
     dependencies:
-      '@sentry-internal/tracing': 7.50.0
-      '@sentry/core': 7.50.0
-      '@sentry/types': 7.50.0
-      '@sentry/utils': 7.50.0
+      '@sentry-internal/tracing': 7.51.0
+      '@sentry/core': 7.51.0
+      '@sentry/types': 7.51.0
+      '@sentry/utils': 7.51.0
       cookie: 0.4.2
       https-proxy-agent: 5.0.1
       lru_map: 0.3.3
@@ -987,16 +999,16 @@ packages:
       - supports-color
     dev: true
 
-  /@sentry/types@7.50.0:
-    resolution: {integrity: sha512-Zo9vyI98QNeYT0K0y57Rb4JRWDaPEgmp+QkQ4CRQZFUTWetO5fvPZ4Gb/R7TW16LajuHZlbJBHmvmNj2pkL2kw==}
+  /@sentry/types@7.51.0:
+    resolution: {integrity: sha512-8REzzY0DslDryp6Yxj+tJ4NkXFHulLW9k8dgZV2Qo/0rBDMKir8g0IHYeN8ZBcnWrx2F+6rQb6uN6BjyLZY7Dg==}
     engines: {node: '>=8'}
     dev: true
 
-  /@sentry/utils@7.50.0:
-    resolution: {integrity: sha512-iyPwwC6fwJsiPhH27ZbIiSsY5RaccHBqADS2zEjgKYhmP4P9WGgHRDrvLEnkOjqQyKNb6c0yfmv83n0uxYnolw==}
+  /@sentry/utils@7.51.0:
+    resolution: {integrity: sha512-y5zq4IfZDCm6cg0EQJMghUM4YjZToFni7J5OKopLXKVtc9YtRtkYoFuFqEWm4HBuBwplreiS/KkDQgWn3FVn7A==}
     engines: {node: '>=8'}
     dependencies:
-      '@sentry/types': 7.50.0
+      '@sentry/types': 7.51.0
       tslib: 1.14.1
     dev: true
 
@@ -1080,16 +1092,16 @@ packages:
     resolution: {integrity: sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==}
     dev: true
 
-  /@types/node@18.16.3:
-    resolution: {integrity: sha512-OPs5WnnT1xkCBiuQrZA4+YAV4HEJejmHneyraIaxsbev5yCEr6KMwINNFP9wQeFIw8FWcoTqF3vQsa5CDaI+8Q==}
+  /@types/node@18.16.4:
+    resolution: {integrity: sha512-LUhvPmAKAbgm+p/K11IWszLZVoZDlMF4NRmqbhEzDz/CnCuehPkZXwZbBCKGJsgjnuVejotBwM7B3Scrq4EqDw==}
     dev: true
 
   /@wesbos/code-icons@1.2.4:
     resolution: {integrity: sha512-ZiU0xf7epnCRrLDQIPnFstzoNWDvcUTtKoDU3VhpjsaGRzVClSmsi39c4kHxIOdfxvg4zwdW+goH96xr/vMTQQ==}
     dependencies:
-      '@types/node': 18.16.3
-      vite: 4.3.3(@types/node@18.16.3)
-      vite-plugin-dts: 1.7.3(@types/node@18.16.3)(vite@4.3.3)
+      '@types/node': 18.16.4
+      vite: 4.3.5(@types/node@18.16.4)
+      vite-plugin-dts: 1.7.3(@types/node@18.16.4)(vite@4.3.5)
       vscode-icons-js: 11.6.1
     transitivePeerDependencies:
       - less
@@ -1112,18 +1124,6 @@ packages:
       event-target-shim: 5.0.1
     dev: true
 
-  /acorn-globals@7.0.1:
-    resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==}
-    dependencies:
-      acorn: 8.8.2
-      acorn-walk: 8.2.0
-    dev: true
-
-  /acorn-walk@8.2.0:
-    resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==}
-    engines: {node: '>=0.4.0'}
-    dev: true
-
   /acorn@8.8.2:
     resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==}
     engines: {node: '>=0.4.0'}
@@ -1323,7 +1323,7 @@ packages:
     hasBin: true
     dependencies:
       caniuse-lite: 1.0.30001482
-      electron-to-chromium: 1.4.378
+      electron-to-chromium: 1.4.384
       node-releases: 2.0.10
       update-browserslist-db: 1.0.11(browserslist@4.21.5)
     dev: true
@@ -1618,13 +1618,13 @@ packages:
     resolution: {integrity: sha512-uhipnEEH6SkC176Za0Rt3D7pTV60nTiS2Vn4wZBIQacUtfPBxuTG4dox/jy2yXDCEiFX62gYhehvCIYPudjzFA==}
     hasBin: true
     dependencies:
-      '@babel/core': 7.21.5
+      '@babel/core': 7.21.8
       '@financial-times/js-features-analyser': 0.0.4
       browserslist: 4.21.5
       execa: 4.1.0
       polyfill-library: 3.111.0
       semver: 7.5.0
-      snyk: 1.1150.0
+      snyk: 1.1152.0
       yargs: 15.4.1
     transitivePeerDependencies:
       - supports-color
@@ -1698,7 +1698,7 @@ packages:
       css-declaration-sorter: 6.4.0(postcss@8.4.23)
       cssnano-utils: 4.0.0(postcss@8.4.23)
       postcss: 8.4.23
-      postcss-calc: 9.0.0(postcss@8.4.23)
+      postcss-calc: 9.0.1(postcss@8.4.23)
       postcss-colormin: 6.0.0(postcss@8.4.23)
       postcss-convert-values: 6.0.0(postcss@8.4.23)
       postcss-discard-comments: 6.0.0(postcss@8.4.23)
@@ -1809,10 +1809,6 @@ packages:
       type-detect: 4.0.8
     dev: true
 
-  /deep-is@0.1.4:
-    resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
-    dev: true
-
   /define-properties@1.2.0:
     resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==}
     engines: {node: '>= 0.4'}
@@ -1889,8 +1885,8 @@ packages:
     resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
     dev: true
 
-  /electron-to-chromium@1.4.378:
-    resolution: {integrity: sha512-RfCD26kGStl6+XalfX3DGgt3z2DNwJS5DKRHCpkPq5T/PqpZMPB1moSRXuK9xhkt/sF57LlpzJgNoYl7mO7Z6w==}
+  /electron-to-chromium@1.4.384:
+    resolution: {integrity: sha512-I97q0MmRAAqj53+a8vZsDkEXBZki+ehYAOPzwtQzALip52aEp2+BJqHFtTlsfjoqVZYwPpHC8wM6MbsSZQ/Eqw==}
     dev: true
 
   /emoji-regex@7.0.3:
@@ -1974,39 +1970,10 @@ packages:
     engines: {node: '>=10'}
     dev: true
 
-  /escodegen@2.0.0:
-    resolution: {integrity: sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==}
-    engines: {node: '>=6.0'}
-    hasBin: true
-    dependencies:
-      esprima: 4.0.1
-      estraverse: 5.3.0
-      esutils: 2.0.3
-      optionator: 0.8.3
-    optionalDependencies:
-      source-map: 0.6.1
-    dev: true
-
-  /esprima@4.0.1:
-    resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==}
-    engines: {node: '>=4'}
-    hasBin: true
-    dev: true
-
-  /estraverse@5.3.0:
-    resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
-    engines: {node: '>=4.0'}
-    dev: true
-
   /estree-walker@2.0.2:
     resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
     dev: true
 
-  /esutils@2.0.3:
-    resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
   /event-target-shim@5.0.1:
     resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==}
     engines: {node: '>=6'}
@@ -2046,10 +2013,6 @@ packages:
     resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
     dev: true
 
-  /fast-levenshtein@2.0.6:
-    resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
-    dev: true
-
   /fastq@1.15.0:
     resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==}
     dependencies:
@@ -2099,8 +2062,8 @@ packages:
     hasBin: true
     dev: true
 
-  /flow-bin@0.205.0:
-    resolution: {integrity: sha512-akmM+++RkcIuFbfhhVfFnHNwdyUVjzZHzA9eeepiXm/NP7HUkOTndlX1o6/vjeOjUbDFcsXhvo209n4ZNK5ceA==}
+  /flow-bin@0.205.1:
+    resolution: {integrity: sha512-pGQ/ZFr9hnbhRmc+K3K1Ui9BwDivlesNEd2mZbm5pCnxEUvbbj9nXHlTD4s4qO0k+LBKYLMZzQwBVYyRUE380g==}
     engines: {node: '>=0.10.0'}
     hasBin: true
     dev: true
@@ -2262,7 +2225,7 @@ packages:
     hasBin: true
     dependencies:
       foreground-child: 3.1.1
-      jackspeak: 2.1.4
+      jackspeak: 2.2.0
       minimatch: 9.0.0
       minipass: 5.0.0
       path-scurry: 1.7.0
@@ -2594,11 +2557,11 @@ packages:
       istanbul-lib-report: 3.0.0
     dev: true
 
-  /jackspeak@2.1.4:
-    resolution: {integrity: sha512-7CGd4ZQu5M/FgQLlcgcsY858wf+ukg1ma5M95FACSfC54+88vm594Nv6C3NqWfk8wyK1u+E3SzvVsxr7bwONmg==}
+  /jackspeak@2.2.0:
+    resolution: {integrity: sha512-r5XBrqIJfwRIjRt/Xr5fv9Wh09qyhHfKnYddDlpM+ibRR20qrYActpCAgU6U+d53EOEjzkvxPMVHSlgR7leXrQ==}
     engines: {node: '>=14'}
     dependencies:
-      cliui: github.com/isaacs/cliui/9f97090165675fdda63a79c29bc36bb1033506b0
+      '@isaacs/cliui': 8.0.2
     optionalDependencies:
       '@pkgjs/parseargs': 0.11.0
     dev: true
@@ -2645,7 +2608,7 @@ packages:
     engines: {node: '>=12.0.0'}
     hasBin: true
     dependencies:
-      '@babel/parser': 7.21.5
+      '@babel/parser': 7.21.8
       '@jsdoc/salty': 0.2.5
       '@types/markdown-it': 12.2.3
       bluebird: 3.7.2
@@ -2662,17 +2625,17 @@ packages:
       underscore: 1.13.6
     dev: true
 
-  /jsdom-global@3.0.2(jsdom@21.1.2):
+  /jsdom-global@3.0.2(jsdom@22.0.0):
     resolution: {integrity: sha512-t1KMcBkz/pT5JrvcJbpUR2u/w1kO9jXctaaGJ0vZDzwFnIvGWw9IDSRciT83kIs8Bnw4qpOl8bQK08V01YgMPg==}
     peerDependencies:
       jsdom: '>=10.0.0'
     dependencies:
-      jsdom: 21.1.2
+      jsdom: 22.0.0
     dev: true
 
-  /jsdom@21.1.2:
-    resolution: {integrity: sha512-sCpFmK2jv+1sjff4u7fzft+pUh2KSUbUrEHYHyfSIbGTIcmnjyp83qg6qLwdJ/I3LpTXx33ACxeRL7Lsyc6lGQ==}
-    engines: {node: '>=14'}
+  /jsdom@22.0.0:
+    resolution: {integrity: sha512-p5ZTEb5h+O+iU02t0GfEjAnkdYPrQSkfuTSMkMYyIoMvUNEHsbG0bHHbfXIcfTqD2UfvjQX7mmgiFsyRwGscVw==}
+    engines: {node: '>=16'}
     peerDependencies:
       canvas: ^2.5.0
     peerDependenciesMeta:
@@ -2680,13 +2643,10 @@ packages:
         optional: true
     dependencies:
       abab: 2.0.6
-      acorn: 8.8.2
-      acorn-globals: 7.0.1
       cssstyle: 3.0.0
       data-urls: 4.0.0
       decimal.js: 10.4.3
       domexception: 4.0.0
-      escodegen: 2.0.0
       form-data: 4.0.0
       html-encoding-sniffer: 3.0.0
       http-proxy-agent: 5.0.0
@@ -2785,14 +2745,6 @@ packages:
     engines: {node: '>=12'}
     dev: true
 
-  /levn@0.3.0:
-    resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==}
-    engines: {node: '>= 0.8.0'}
-    dependencies:
-      prelude-ls: 1.1.2
-      type-check: 0.3.2
-    dev: true
-
   /lilconfig@2.1.0:
     resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==}
     engines: {node: '>=10'}
@@ -3210,18 +3162,6 @@ packages:
       mimic-fn: 2.1.0
     dev: true
 
-  /optionator@0.8.3:
-    resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==}
-    engines: {node: '>= 0.8.0'}
-    dependencies:
-      deep-is: 0.1.4
-      fast-levenshtein: 2.0.6
-      levn: 0.3.0
-      prelude-ls: 1.1.2
-      type-check: 0.3.2
-      word-wrap: 1.2.3
-    dev: true
-
   /p-limit@2.3.0:
     resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==}
     engines: {node: '>=6'}
@@ -3377,8 +3317,8 @@ packages:
       postcss: 8.4.23
     dev: true
 
-  /postcss-calc@9.0.0(postcss@8.4.23):
-    resolution: {integrity: sha512-B9BNW/SVh4SMJfoCQ6D9h1Wo7Yjqks7UdbiARJ16J5TIsQn5NEqwMF5joSgOYb26oJPUR5Uv3fCQ/4PvmZWeJQ==}
+  /postcss-calc@9.0.1(postcss@8.4.23):
+    resolution: {integrity: sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==}
     engines: {node: ^14 || ^16 || >=18.0}
     peerDependencies:
       postcss: ^8.2.2
@@ -3742,14 +3682,14 @@ packages:
       postcss: 6.0.23
     dev: true
 
-  /postcss-rtlcss@4.0.5(postcss@8.4.23):
-    resolution: {integrity: sha512-Yh5DKJwiqwSsCV9frm41kHNY+IMiaqS+ERRGNZ7jkYXqtrEwfQoKZG55dUESz8Vq7NJlDefjOiZ3KlQ8Nomsfg==}
+  /postcss-rtlcss@4.0.6(postcss@8.4.23):
+    resolution: {integrity: sha512-YNm6g2Y7Gngqtrpq3GC7cUkzH5Gq7aB+Lw9MSgF9s2ro1BDY7W4zqnd15g2ueatUUpSTg2/F5KDjQoTdjhbAKg==}
     engines: {node: '>=12.0.0'}
     peerDependencies:
-      postcss: ^8.4.6
+      postcss: ^8.4.21
     dependencies:
       postcss: 8.4.23
-      rtlcss: 4.0.0
+      rtlcss: 4.1.0
     dev: true
 
   /postcss-selector-parser@6.0.12:
@@ -3835,11 +3775,6 @@ packages:
       source-map-js: 1.0.2
     dev: true
 
-  /prelude-ls@1.1.2:
-    resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==}
-    engines: {node: '>= 0.8.0'}
-    dev: true
-
   /process-nextick-args@2.0.1:
     resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==}
     dev: true
@@ -3998,8 +3933,8 @@ packages:
       sprintf-js: 1.1.2
     dev: true
 
-  /rollup@3.21.2:
-    resolution: {integrity: sha512-c4vC+JZ3bbF4Kqq2TtM7zSKtSyMybFOjqmomFax3xpfYaPZDZ4iz8NMIuBRMjnXOcKYozw7bC6vhJjiWD6JpzQ==}
+  /rollup@3.21.5:
+    resolution: {integrity: sha512-a4NTKS4u9PusbUJcfF4IMxuqjFzjm6ifj76P54a7cKnvVzJaG12BLVR+hgU2YDGHzyMMQNxLAZWuALsn8q2oQg==}
     engines: {node: '>=14.18.0', npm: '>=8.0.0'}
     hasBin: true
     optionalDependencies:
@@ -4024,8 +3959,8 @@ packages:
     resolution: {integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==}
     dev: true
 
-  /rtlcss@4.0.0:
-    resolution: {integrity: sha512-j6oypPP+mgFwDXL1JkLCtm6U/DQntMUqlv5SOhpgHhdIE+PmBcjrtAHIpXfbIup47kD5Sgja9JDsDF1NNOsBwQ==}
+  /rtlcss@4.1.0:
+    resolution: {integrity: sha512-W+N4hh0nVqVrrn3mRkHakxpB+c9cQ4CRT67O39kgA+1DjyhrdsqyCqIuHXyvWaXn4/835n+oX3fYJCi4+G/06A==}
     engines: {node: '>=12.0.0'}
     hasBin: true
     dependencies:
@@ -4145,13 +4080,13 @@ packages:
       supports-color: 7.2.0
     dev: true
 
-  /snyk@1.1150.0:
-    resolution: {integrity: sha512-jwDKDoR2wEko/NXN8FHsJi+w03R3vK/npImnpYc78SX3eGWSc4WCCvIGM2TsYHbXVvU8HsOr5m2lvAwF3v8rbw==}
+  /snyk@1.1152.0:
+    resolution: {integrity: sha512-4FNlDaBgoNSNX5N4+FpqnQrtgLxM+M91tbN5jgYWKPkAJLipAbuG/KhHIVdzCND4dEVf8vrfU1oL7XaVf6tVdQ==}
     engines: {node: '>=12'}
     hasBin: true
     requiresBuild: true
     dependencies:
-      '@sentry/node': 7.50.0
+      '@sentry/node': 7.51.0
       global-agent: 3.0.0
     transitivePeerDependencies:
       - supports-color
@@ -4426,13 +4361,6 @@ packages:
     resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==}
     dev: true
 
-  /type-check@0.3.2:
-    resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==}
-    engines: {node: '>= 0.8.0'}
-    dependencies:
-      prelude-ls: 1.1.2
-    dev: true
-
   /type-detect@4.0.8:
     resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==}
     engines: {node: '>=4'}
@@ -4560,21 +4488,21 @@ packages:
     resolution: {integrity: sha512-g0cm0wbrR6b6wR8FWtfD1RSDPacdumKEOAnneXv+NpJ9ez+j6rklRv6lMOO+aPf+Y6Zb8OzgIk0FXBZ6h+DeZQ==}
     dev: true
 
-  /vite-plugin-dts@1.7.3(@types/node@18.16.3)(vite@4.3.3):
+  /vite-plugin-dts@1.7.3(@types/node@18.16.4)(vite@4.3.5):
     resolution: {integrity: sha512-u3t45p6fTbzUPMkwYe0ESwuUeiRMlwdPfD3dRyDKUwLe2WmEYcFyVp2o9/ke2EMrM51lQcmNWdV9eLcgjD1/ng==}
     engines: {node: ^14.18.0 || >=16.0.0}
     peerDependencies:
       vite: '>=2.9.0'
     dependencies:
-      '@microsoft/api-extractor': 7.34.7(@types/node@18.16.3)
+      '@microsoft/api-extractor': 7.34.8(@types/node@18.16.4)
       '@rollup/pluginutils': 5.0.2
-      '@rushstack/node-core-library': 3.58.0(@types/node@18.16.3)
+      '@rushstack/node-core-library': 3.58.0(@types/node@18.16.4)
       debug: 4.3.4(supports-color@8.1.1)
       fast-glob: 3.2.12
       fs-extra: 10.1.0
       kolorist: 1.8.0
       ts-morph: 17.0.1
-      vite: 4.3.3(@types/node@18.16.3)
+      vite: 4.3.5(@types/node@18.16.4)
     transitivePeerDependencies:
       - '@types/node'
       - rollup
@@ -4585,8 +4513,8 @@ packages:
     resolution: {integrity: sha512-67Abh1X9rhJq7u9Hxq9CJznM0acAPynvumkQ33wzvigW1aaPfsHNNMnhArABYryXnqASlmiZHpbhYOtDI9KfYw==}
     dependencies:
       '@wesbos/code-icons': 1.2.4
-      vite: 4.3.3(@types/node@18.16.3)
-      vite-plugin-dts: 1.7.3(@types/node@18.16.3)(vite@4.3.3)
+      vite: 4.3.5(@types/node@18.16.4)
+      vite-plugin-dts: 1.7.3(@types/node@18.16.4)(vite@4.3.5)
       vscode-icons-js: 11.6.1
     transitivePeerDependencies:
       - '@types/node'
@@ -4599,17 +4527,17 @@ packages:
       - terser
     dev: true
 
-  /vite-plugin-minify@1.5.2(vite@4.3.3):
+  /vite-plugin-minify@1.5.2(vite@4.3.5):
     resolution: {integrity: sha512-clf3THHlet1jD35y8+mbw/xgACbdUQ1Eyc9zZFiqaxVOZLSC3UbrkOYOG+Nf4cleRjWgb8czbXrnQiWZICVh3Q==}
     peerDependencies:
       vite: '*'
     dependencies:
       html-minifier-terser: 6.1.0
-      vite: 4.3.3(@types/node@18.16.3)
+      vite: 4.3.5(@types/node@18.16.4)
     dev: true
 
-  /vite-plugin-mkcert@1.14.1(vite@4.3.3):
-    resolution: {integrity: sha512-s/TmH62VA3DYXaqX2230PomrHXSRwfYyXur1c8hN5fGEUrT+w9KnXHnurZ53AMSUc/bI7RF6bQ1K5J+hZQTjoQ==}
+  /vite-plugin-mkcert@1.15.0(vite@4.3.5):
+    resolution: {integrity: sha512-0Pz7iExvo7pS2HsxMe6Y/HIrsFJidXN8Sju7tsL1XYQdbUKb/D0L5Wkj3UoGQmbbWZUFf8nHHa0XYbd4FH6ZrA==}
     engines: {node: '>=v16.7.0'}
     peerDependencies:
       vite: '>=3'
@@ -4618,14 +4546,14 @@ packages:
       axios: 1.4.0(debug@4.3.4)
       debug: 4.3.4(supports-color@8.1.1)
       picocolors: 1.0.0
-      vite: 4.3.3(@types/node@18.16.3)
+      vite: 4.3.5(@types/node@18.16.4)
     transitivePeerDependencies:
       - encoding
       - supports-color
     dev: true
 
-  /vite@4.3.3(@types/node@18.16.3):
-    resolution: {integrity: sha512-MwFlLBO4udZXd+VBcezo3u8mC77YQk+ik+fbc0GZWGgzfbPP+8Kf0fldhARqvSYmtIWoAJ5BXPClUbMTlqFxrA==}
+  /vite@4.3.5(@types/node@18.16.4):
+    resolution: {integrity: sha512-0gEnL9wiRFxgz40o/i/eTBwm+NEbpUeTWhzKrZDSdKm6nplj+z4lKz8ANDgildxHm47Vg8EUia0aicKbawUVVA==}
     engines: {node: ^14.18.0 || >=16.0.0}
     hasBin: true
     peerDependencies:
@@ -4649,10 +4577,10 @@ packages:
       terser:
         optional: true
     dependencies:
-      '@types/node': 18.16.3
+      '@types/node': 18.16.4
       esbuild: 0.17.18
       postcss: 8.4.23
-      rollup: 3.21.2
+      rollup: 3.21.5
     optionalDependencies:
       fsevents: 2.3.2
     dev: true
@@ -4745,11 +4673,6 @@ packages:
       isexe: 2.0.0
     dev: true
 
-  /word-wrap@1.2.3:
-    resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
   /workerpool@6.2.1:
     resolution: {integrity: sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==}
     dev: true
@@ -4939,22 +4862,6 @@ packages:
       commander: 9.5.0
     dev: true
 
-  github.com/isaacs/cliui/9f97090165675fdda63a79c29bc36bb1033506b0:
-    resolution: {tarball: https://codeload.github.com/isaacs/cliui/tar.gz/9f97090165675fdda63a79c29bc36bb1033506b0}
-    name: cliui
-    version: 8.0.1
-    engines: {node: '>=12'}
-    prepare: true
-    requiresBuild: true
-    dependencies:
-      string-width: 5.1.2
-      string-width-cjs: /string-width@4.2.3
-      strip-ansi: 7.0.1
-      strip-ansi-cjs: /strip-ansi@6.0.1
-      wrap-ansi: 8.1.0
-      wrap-ansi-cjs: /wrap-ansi@7.0.0
-    dev: true
-
   github.com/volker-schukai/jsdoc-external-example/e039186b531487bd1b1d5e2e1586a396b910c9d9:
     resolution: {tarball: https://codeload.github.com/volker-schukai/jsdoc-external-example/tar.gz/e039186b531487bd1b1d5e2e1586a396b910c9d9}
     name: jsdoc-external-example
diff --git a/development/test/cases/dom/customelement-initfromscripthost.mjs b/development/test/cases/dom/customelement-initfromscripthost.mjs
new file mode 100644
index 0000000000000000000000000000000000000000..f93bb14f4fce1b3b8898750f6a83b25f9c7a3025
--- /dev/null
+++ b/development/test/cases/dom/customelement-initfromscripthost.mjs
@@ -0,0 +1,143 @@
+'use strict';
+
+import chai from "chai"
+// import {internalSymbol} from "../../../../application/source/constants.mjs";
+// import {ATTRIBUTE_OPTIONS} from "../../../../application/source/dom/constants.mjs";
+import {getDocument} from "../../../../application/source/dom/util.mjs";
+// import {ProxyObserver} from "../../../../application/source/types/proxyobserver.mjs";
+// import {addObjectWithUpdaterToElement} from "../../../../application/source/dom/updater.mjs";
+import {chaiDom} from "../../util/chai-dom.mjs";
+import {initJSDOM} from "../../util/jsdom.mjs";
+
+
+let expect = chai.expect;
+chai.use(chaiDom);
+
+// let html1 = `
+//     <div id="scripthost">
+//     </div>
+//    
+//     <div>
+//     <
+// </div>
+// `;
+
+
+// defined in constants.mjs
+// const updaterSymbolKey = "@schukai/monster/dom/custom-element@@options-updater-link"
+// const updaterSymbolSymbol = Symbol.for(updaterSymbolKey);
+
+
+
+describe('DOM', function () {
+
+    let CustomElement, registerCustomElement, TestComponent, document, TestComponent2,assignUpdaterToElement;
+
+    describe('initFromScriptHost()', function () {
+
+        const randomTagNumber = "monster-test"+Math.floor(Math.random() * 1000000);
+        
+        before(function (done) {
+            initJSDOM().then(() => {
+
+                import("../../../../application/source/dom/customelement.mjs").then((m) => {
+
+                    try {
+                        CustomElement = m['CustomElement'];
+                        registerCustomElement = m['registerCustomElement'];
+
+                        TestComponent2 = class extends CustomElement {
+                            static getTag() {
+                                return randomTagNumber;
+                            }
+
+                            /**
+                             *
+                             * @return {Object}
+                             */
+                            get defaults() {
+
+                                return Object.assign({}, super.defaults, {
+                                    test: 0,
+                                    templates: {
+                                        main: '<h1></h1><article><p>test</p><div id="container"></div></article>'
+                                    },
+                                })
+                            }
+
+                        }
+
+                        registerCustomElement(TestComponent2)
+
+                        document = getDocument();
+                        done()
+                    } catch (e) {
+                        done(e);
+                    }
+
+
+                }).catch((e) => {
+                    done(e);
+                });
+
+            });
+        })
+
+        afterEach(() => {
+            let mocks = document.getElementById('mocks');
+            mocks.innerHTML = "";
+        })
+
+        describe('call callback', function () {
+            it('should not found callback and add error attribute', function () {
+
+                let mocks = document.getElementById('mocks');
+                mocks.innerHTML = `<div id="call-back-host"></div><div id="container"></div>`;
+                
+                let control = document.createElement(randomTagNumber);
+                control.setAttribute('data-monster-script-host', "call-back-host");
+                document.getElementById('container').appendChild(control);
+                expect(control.getOption('test')).is.eql(0);
+                expect(control.hasAttribute('data-monster-error')).is.true;
+
+            });
+            
+            it('should found callback initCustomControlOptionsCallback', function () {
+
+                let mocks = document.getElementById('mocks');
+                mocks.innerHTML = `<div id="call-back-host"></div><div id="container"></div>`;
+                
+                const container = document.getElementById('call-back-host');
+                container.initCustomControlOptionsCallback = function (control) {
+                    control.setOption('test', 1);
+                }
+                
+                let control = document.createElement(randomTagNumber);
+                control.setAttribute('data-monster-script-host', "call-back-host");
+                document.getElementById('container').appendChild(control);
+                expect(control.getOption('test')).is.eql(1);
+                expect(control.hasAttribute('data-monster-error')).is.false;
+
+            });
+            
+            it('should found callback initCustomControlOptionsCallback from self', function () {
+
+                let mocks = document.getElementById('mocks');
+                mocks.innerHTML = `<div id="call-back-host"></div><div id="container"></div>`;
+
+                let control = document.createElement(randomTagNumber);
+                expect(control.getOption('test')).is.eql(0);
+                control.initCustomControlOptionsCallback = function (control) {
+                    control.setOption('test', 2);
+                }
+                
+                control.setAttribute('data-monster-script-host', "call-back-host");
+                document.getElementById('container').appendChild(control);
+                expect(control.getOption('test')).is.eql(2);
+                expect(control.hasAttribute('data-monster-error')).is.false;
+
+            });
+        })
+
+    });
+})
\ No newline at end of file