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