From 2101998812a1829ce248bb62fe50c98074fd115c Mon Sep 17 00:00:00 2001 From: "translatewiki.net" Date: Mon, 15 Apr 2024 14:13:27 +0200 Subject: [PATCH 001/254] Localisation updates from https://translatewiki.net. --- i18n/ja.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/i18n/ja.json b/i18n/ja.json index b246728cc..d48656ca1 100644 --- a/i18n/ja.json +++ b/i18n/ja.json @@ -6,10 +6,12 @@ "MathXplore", "Shirayuki", "Tamaki Wakita", + "Waki285", "バレロン" ] }, "citizen-skin-desc": "美しく、便利で、レスポンシブなMediaWikiスキン。当初は[https://starcitizen.tools/ Star Citizen Wiki]のために作成された。", + "citizen-prefs-talkpage": "[[mw:Skin_talk:Citizen|議論]]", "citizen.css": "/* ここに記述したCSSは、すべてのCitizen外装利用者に読み込まれます */", "citizen-drawer-toggle": "メニューを切り替える", "citizen-usermenu-toggle": "個人設定を切り替える", @@ -32,7 +34,7 @@ "citizen-search-editpage": "編集またはページを作成", "citizen-search-empty-desc": "入力して検索する", "citizen-search-noresults-title": "$1に関する結果はありません", - "citizen-search-noresults-desc": "以下のオプションを試す", + "citizen-search-noresults-desc": "上記のオプションを試す", "citizen-tagline-ns-talk": "{{SUBJECTPAGENAME}}の議論ページ", "citizen-tagline-ns-project": "{{SITENAME}}に関する情報", "citizen-tagline-ns-file": "{{SITENAME}}のファイル", From 7e6af16cc81477d42355a5bf76b2c605f1a660f8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Apr 2024 01:07:36 -0400 Subject: [PATCH 002/254] chore(deps-dev): bump stylelint-config-recess-order from 5.0.0 to 5.0.1 (#827) Bumps [stylelint-config-recess-order](https://github.com/stormwarning/stylelint-config-recess-order) from 5.0.0 to 5.0.1. - [Release notes](https://github.com/stormwarning/stylelint-config-recess-order/releases) - [Changelog](https://github.com/stormwarning/stylelint-config-recess-order/blob/main/CHANGELOG.md) - [Commits](https://github.com/stormwarning/stylelint-config-recess-order/compare/v5.0.0...v5.0.1) --- updated-dependencies: - dependency-name: stylelint-config-recess-order dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5166d1b83..6dd9b526a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,7 +17,7 @@ "husky": "^9.0.11", "standard-version": "^9.5.0", "stylelint": "^16.3.1", - "stylelint-config-recess-order": "^5.0.0", + "stylelint-config-recess-order": "^5.0.1", "stylelint-config-wikimedia": "0.16.1", "stylelint-order": "^6.0.3", "svgo": "3.2.0" @@ -5937,9 +5937,9 @@ } }, "node_modules/stylelint-config-recess-order": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/stylelint-config-recess-order/-/stylelint-config-recess-order-5.0.0.tgz", - "integrity": "sha512-D+/Got844O96No2mj/H2NhLjj555iKAy/Mea+JCerfKB9TBKQW3/IudSVkTCxE4QiRDLldfH15x6FH1D1Anjhw==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/stylelint-config-recess-order/-/stylelint-config-recess-order-5.0.1.tgz", + "integrity": "sha512-rKbGkoa3h0rINrGln9TFVowvSCLgPJC5O0EuPiqlqWcJMb1lImEtXktcjFCVz+hwtSUiHD3ijJc3vP9muFOgJg==", "dev": true, "dependencies": { "stylelint-order": "^6.0.4" diff --git a/package.json b/package.json index b74a22fee..0af5d21c8 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "husky": "^9.0.11", "standard-version": "^9.5.0", "stylelint": "^16.3.1", - "stylelint-config-recess-order": "^5.0.0", + "stylelint-config-recess-order": "^5.0.1", "stylelint-config-wikimedia": "0.16.1", "stylelint-order": "^6.0.3", "svgo": "3.2.0" From cc9781551397730c72d92b894af418763f393272 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Apr 2024 01:07:42 -0400 Subject: [PATCH 003/254] chore(deps-dev): bump @commitlint/cli from 19.2.1 to 19.2.2 (#825) Bumps [@commitlint/cli](https://github.com/conventional-changelog/commitlint/tree/HEAD/@commitlint/cli) from 19.2.1 to 19.2.2. - [Release notes](https://github.com/conventional-changelog/commitlint/releases) - [Changelog](https://github.com/conventional-changelog/commitlint/blob/master/@commitlint/cli/CHANGELOG.md) - [Commits](https://github.com/conventional-changelog/commitlint/commits/v19.2.2/@commitlint/cli) --- updated-dependencies: - dependency-name: "@commitlint/cli" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 24 ++++++++++++------------ package.json | 2 +- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6dd9b526a..8223140f8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,7 +8,7 @@ "name": "Citizen", "version": "2.11.1", "devDependencies": { - "@commitlint/cli": "^19.2.1", + "@commitlint/cli": "^19.2.2", "@commitlint/config-conventional": "^19.1.0", "@wikimedia/types-wikimedia": "0.4.2", "devmoji": "^2.3.0", @@ -139,13 +139,13 @@ } }, "node_modules/@commitlint/cli": { - "version": "19.2.1", - "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-19.2.1.tgz", - "integrity": "sha512-cbkYUJsLqRomccNxvoJTyv5yn0bSy05BBizVyIcLACkRbVUqYorC351Diw/XFSWC/GtpwiwT2eOvQgFZa374bg==", + "version": "19.2.2", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-19.2.2.tgz", + "integrity": "sha512-P8cbOHfg2PQRzfICLSrzUVOCVMqjEZ8Hlth6mtJ4yOEjT47Q5PbIGymgX3rLVylNw+3IAT2Djn9IJ2wHbXFzBg==", "dev": true, "dependencies": { "@commitlint/format": "^19.0.3", - "@commitlint/lint": "^19.1.0", + "@commitlint/lint": "^19.2.2", "@commitlint/load": "^19.2.0", "@commitlint/read": "^19.2.1", "@commitlint/types": "^19.0.3", @@ -271,9 +271,9 @@ } }, "node_modules/@commitlint/is-ignored": { - "version": "19.0.3", - "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-19.0.3.tgz", - "integrity": "sha512-MqDrxJaRSVSzCbPsV6iOKG/Lt52Y+PVwFVexqImmYYFhe51iVJjK2hRhOG2jUAGiUHk4jpdFr0cZPzcBkSzXDQ==", + "version": "19.2.2", + "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-19.2.2.tgz", + "integrity": "sha512-eNX54oXMVxncORywF4ZPFtJoBm3Tvp111tg1xf4zWXGfhBPKpfKG6R+G3G4v5CPlRROXpAOpQ3HMhA9n1Tck1g==", "dev": true, "dependencies": { "@commitlint/types": "^19.0.3", @@ -284,12 +284,12 @@ } }, "node_modules/@commitlint/lint": { - "version": "19.1.0", - "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-19.1.0.tgz", - "integrity": "sha512-ESjaBmL/9cxm+eePyEr6SFlBUIYlYpI80n+Ltm7IA3MAcrmiP05UMhJdAD66sO8jvo8O4xdGn/1Mt2G5VzfZKw==", + "version": "19.2.2", + "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-19.2.2.tgz", + "integrity": "sha512-xrzMmz4JqwGyKQKTpFzlN0dx0TAiT7Ran1fqEBgEmEj+PU98crOFtysJgY+QdeSagx6EDRigQIXJVnfrI0ratA==", "dev": true, "dependencies": { - "@commitlint/is-ignored": "^19.0.3", + "@commitlint/is-ignored": "^19.2.2", "@commitlint/parse": "^19.0.3", "@commitlint/rules": "^19.0.3", "@commitlint/types": "^19.0.3" diff --git a/package.json b/package.json index 0af5d21c8..5beab3c0b 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "release:major": "standard-version --release-as major" }, "devDependencies": { - "@commitlint/cli": "^19.2.1", + "@commitlint/cli": "^19.2.2", "@commitlint/config-conventional": "^19.1.0", "@wikimedia/types-wikimedia": "0.4.2", "devmoji": "^2.3.0", From f19808038c4741ecda84cf42c2e88d702495a759 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Apr 2024 01:10:27 -0400 Subject: [PATCH 004/254] chore(deps-dev): bump @commitlint/config-conventional (#824) Bumps [@commitlint/config-conventional](https://github.com/conventional-changelog/commitlint/tree/HEAD/@commitlint/config-conventional) from 19.1.0 to 19.2.2. - [Release notes](https://github.com/conventional-changelog/commitlint/releases) - [Changelog](https://github.com/conventional-changelog/commitlint/blob/master/@commitlint/config-conventional/CHANGELOG.md) - [Commits](https://github.com/conventional-changelog/commitlint/commits/v19.2.2/@commitlint/config-conventional) --- updated-dependencies: - dependency-name: "@commitlint/config-conventional" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8223140f8..18ff19966 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "2.11.1", "devDependencies": { "@commitlint/cli": "^19.2.2", - "@commitlint/config-conventional": "^19.1.0", + "@commitlint/config-conventional": "^19.2.2", "@wikimedia/types-wikimedia": "0.4.2", "devmoji": "^2.3.0", "eslint-config-wikimedia": "0.27.0", @@ -160,9 +160,9 @@ } }, "node_modules/@commitlint/config-conventional": { - "version": "19.1.0", - "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-19.1.0.tgz", - "integrity": "sha512-KIKD2xrp6Uuk+dcZVj3++MlzIr/Su6zLE8crEDQCZNvWHNQSeeGbzOlNtsR32TUy6H3JbP7nWgduAHCaiGQ6EA==", + "version": "19.2.2", + "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-19.2.2.tgz", + "integrity": "sha512-mLXjsxUVLYEGgzbxbxicGPggDuyWNkf25Ht23owXIH+zV2pv1eJuzLK3t1gDY5Gp6pxdE60jZnWUY5cvgL3ufw==", "dev": true, "dependencies": { "@commitlint/types": "^19.0.3", diff --git a/package.json b/package.json index 5beab3c0b..a13d40231 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ }, "devDependencies": { "@commitlint/cli": "^19.2.2", - "@commitlint/config-conventional": "^19.1.0", + "@commitlint/config-conventional": "^19.2.2", "@wikimedia/types-wikimedia": "0.4.2", "devmoji": "^2.3.0", "eslint-config-wikimedia": "0.27.0", From 5cfa21b86a80748b299051372a46087f2903ab1a Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Tue, 16 Apr 2024 01:16:28 -0400 Subject: [PATCH 005/254] =?UTF-8?q?chore(dev):=20=F0=9F=94=A7=20use=20styl?= =?UTF-8?q?elint=20v15?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit stylelint-config-wikimedia requires stylelint v15 and does not work with v16. --- package-lock.json | 3540 +++++++++++++++++++++++++++------------------ package.json | 4 +- 2 files changed, 2122 insertions(+), 1422 deletions(-) diff --git a/package-lock.json b/package-lock.json index 18ff19966..3596baa14 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,8 +16,8 @@ "grunt-banana-checker": "0.11.1", "husky": "^9.0.11", "standard-version": "^9.5.0", - "stylelint": "^16.3.1", - "stylelint-config-recess-order": "^5.0.1", + "stylelint": "15.11.0", + "stylelint-config-recess-order": "4.6.0", "stylelint-config-wikimedia": "0.16.1", "stylelint-order": "^6.0.3", "svgo": "3.2.0" @@ -33,12 +33,13 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", + "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", "dev": true, "dependencies": { - "@babel/highlight": "^7.16.7" + "@babel/highlight": "^7.24.2", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" @@ -54,14 +55,15 @@ } }, "node_modules/@babel/highlight": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.9.tgz", - "integrity": "sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg==", + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", + "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" @@ -105,13 +107,13 @@ "node_modules/@babel/highlight/node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, "node_modules/@babel/highlight/node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "engines": { "node": ">=0.8.0" @@ -120,7 +122,7 @@ "node_modules/@babel/highlight/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "engines": { "node": ">=4" @@ -172,18 +174,6 @@ "node": ">=v18" } }, - "node_modules/@commitlint/config-conventional/node_modules/conventional-changelog-conventionalcommits": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-7.0.2.tgz", - "integrity": "sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==", - "dev": true, - "dependencies": { - "compare-func": "^2.0.0" - }, - "engines": { - "node": ">=16" - } - }, "node_modules/@commitlint/config-validator": { "version": "19.0.3", "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-19.0.3.tgz", @@ -197,28 +187,6 @@ "node": ">=v18" } }, - "node_modules/@commitlint/config-validator/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@commitlint/config-validator/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, "node_modules/@commitlint/ensure": { "version": "19.0.3", "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-19.0.3.tgz", @@ -258,18 +226,6 @@ "node": ">=v18" } }, - "node_modules/@commitlint/format/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/@commitlint/is-ignored": { "version": "19.2.2", "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-19.2.2.tgz", @@ -319,44 +275,6 @@ "node": ">=v18" } }, - "node_modules/@commitlint/load/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@commitlint/load/node_modules/cosmiconfig": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", - "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", - "dev": true, - "dependencies": { - "env-paths": "^2.2.1", - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, "node_modules/@commitlint/message": { "version": "19.0.0", "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-19.0.0.tgz", @@ -380,81 +298,6 @@ "node": ">=v18" } }, - "node_modules/@commitlint/parse/node_modules/conventional-changelog-angular": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz", - "integrity": "sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==", - "dev": true, - "dependencies": { - "compare-func": "^2.0.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/@commitlint/parse/node_modules/conventional-commits-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz", - "integrity": "sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==", - "dev": true, - "dependencies": { - "is-text-path": "^2.0.0", - "JSONStream": "^1.3.5", - "meow": "^12.0.1", - "split2": "^4.0.0" - }, - "bin": { - "conventional-commits-parser": "cli.mjs" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/@commitlint/parse/node_modules/is-text-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-2.0.0.tgz", - "integrity": "sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==", - "dev": true, - "dependencies": { - "text-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@commitlint/parse/node_modules/meow": { - "version": "12.1.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz", - "integrity": "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==", - "dev": true, - "engines": { - "node": ">=16.10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@commitlint/parse/node_modules/split2": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", - "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", - "dev": true, - "engines": { - "node": ">= 10.x" - } - }, - "node_modules/@commitlint/parse/node_modules/text-extensions": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-2.4.0.tgz", - "integrity": "sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@commitlint/read": { "version": "19.2.1", "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-19.2.1.tgz", @@ -471,56 +314,6 @@ "node": ">=v18" } }, - "node_modules/@commitlint/read/node_modules/dargs": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-8.1.0.tgz", - "integrity": "sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@commitlint/read/node_modules/git-raw-commits": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-4.0.0.tgz", - "integrity": "sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==", - "dev": true, - "dependencies": { - "dargs": "^8.0.0", - "meow": "^12.0.1", - "split2": "^4.0.0" - }, - "bin": { - "git-raw-commits": "cli.mjs" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/@commitlint/read/node_modules/meow": { - "version": "12.1.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz", - "integrity": "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==", - "dev": true, - "engines": { - "node": ">=16.10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@commitlint/read/node_modules/split2": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", - "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", - "dev": true, - "engines": { - "node": ">= 10.x" - } - }, "node_modules/@commitlint/resolve-extends": { "version": "19.1.0", "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-19.1.0.tgz", @@ -575,140 +368,45 @@ "node": ">=v18" } }, - "node_modules/@commitlint/top-level/node_modules/find-up": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-7.0.0.tgz", - "integrity": "sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==", + "node_modules/@commitlint/types": { + "version": "19.0.3", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-19.0.3.tgz", + "integrity": "sha512-tpyc+7i6bPG9mvaBbtKUeghfyZSDgWquIDfMgqYtTbmZ9Y9VzEm2je9EYcQ0aoz5o7NvGS+rcDec93yO08MHYA==", "dev": true, "dependencies": { - "locate-path": "^7.2.0", - "path-exists": "^5.0.0", - "unicorn-magic": "^0.1.0" + "@types/conventional-commits-parser": "^5.0.0", + "chalk": "^5.3.0" }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=v18" } }, - "node_modules/@commitlint/top-level/node_modules/locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "node_modules/@csstools/css-parser-algorithms": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.6.1.tgz", + "integrity": "sha512-ubEkAaTfVZa+WwGhs5jbo5Xfqpeaybr/RvWzvFxRs4jfq16wH8l8Ty/QEEpINxll4xhuGfdMbipRyz5QZh9+FA==", "dev": true, - "dependencies": { - "p-locate": "^6.0.0" - }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": "^14 || ^16 || >=18" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@csstools/css-tokenizer": "^2.2.4" } }, - "node_modules/@commitlint/top-level/node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@commitlint/top-level/node_modules/p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", - "dev": true, - "dependencies": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@commitlint/top-level/node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/@commitlint/top-level/node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@commitlint/types": { - "version": "19.0.3", - "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-19.0.3.tgz", - "integrity": "sha512-tpyc+7i6bPG9mvaBbtKUeghfyZSDgWquIDfMgqYtTbmZ9Y9VzEm2je9EYcQ0aoz5o7NvGS+rcDec93yO08MHYA==", - "dev": true, - "dependencies": { - "@types/conventional-commits-parser": "^5.0.0", - "chalk": "^5.3.0" - }, - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/types/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@csstools/css-parser-algorithms": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.6.1.tgz", - "integrity": "sha512-ubEkAaTfVZa+WwGhs5jbo5Xfqpeaybr/RvWzvFxRs4jfq16wH8l8Ty/QEEpINxll4xhuGfdMbipRyz5QZh9+FA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "@csstools/css-tokenizer": "^2.2.4" - } - }, - "node_modules/@csstools/css-tokenizer": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.2.4.tgz", - "integrity": "sha512-PuWRAewQLbDhGeTvFuq2oClaSCKPIBmHyIobCV39JHRYN0byDcUWJl5baPeNUcqrjtdMNqFooE0FGl31I3JOqw==", + "node_modules/@csstools/css-tokenizer": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.2.4.tgz", + "integrity": "sha512-PuWRAewQLbDhGeTvFuq2oClaSCKPIBmHyIobCV39JHRYN0byDcUWJl5baPeNUcqrjtdMNqFooE0FGl31I3JOqw==", "dev": true, "funding": [ { @@ -748,9 +446,9 @@ } }, "node_modules/@csstools/selector-specificity": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.0.2.tgz", - "integrity": "sha512-RpHaZ1h9LE7aALeQXmXrJkRG84ZxIsctEN2biEUmFyKpzFM3zZ35eUMcIzZFsw/2olQE6v69+esEqU2f1MKycg==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.0.3.tgz", + "integrity": "sha512-KEPNw4+WW5AVEIyzC80rTbWEUatTW2lXpN8+8ILC8PiPeWPjwUzrPZDIOZ2wwqDmeqOYTdSGyL3+vE5GC3FB3Q==", "dev": true, "funding": [ { @@ -769,16 +467,6 @@ "postcss-selector-parser": "^6.0.13" } }, - "node_modules/@dual-bundle/import-meta-resolve": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.0.0.tgz", - "integrity": "sha512-ZKXyJeFAzcpKM2kk8ipoGIPUqx9BX52omTGnfwjJvxOCaZTM2wtDK7zN0aIgPRbT9XYAlha0HtmZ+XKteuh0Gw==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/@es-joy/jsdoccomment": { "version": "0.42.0", "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.42.0.tgz", @@ -840,6 +528,28 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, "node_modules/@eslint/js": { "version": "8.57.0", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", @@ -877,9 +587,9 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", - "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", "dev": true }, "node_modules/@hutson/parse-repository-url": { @@ -891,106 +601,10 @@ "node": ">=6.9.0" } }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, "node_modules/@mdn/browser-compat-data": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-5.4.0.tgz", - "integrity": "sha512-FrVirpbyDueB9IPP2sDS3G4vil0XWQuJhqsoWuBiqvojtr/+nfIQmpmkztyuWGUWmRJC0MMa1xK26LP2RQPtOQ==", + "version": "5.5.21", + "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-5.5.21.tgz", + "integrity": "sha512-M+KqctZP6J3kIHI+SwQMPbjUM510ex690NRBm0jlFwJ+TNvvuHcp3vCEzUzwtVj5RWEuTROgy5U++3XnN1Przg==", "dev": true }, "node_modules/@nodelib/fs.scandir": { @@ -1028,16 +642,6 @@ "node": ">= 8" } }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=14" - } - }, "node_modules/@trysound/sax": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", @@ -1069,24 +673,24 @@ "dev": true }, "node_modules/@types/minimist": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", - "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", "dev": true }, "node_modules/@types/node": { - "version": "20.11.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.21.tgz", - "integrity": "sha512-/ySDLGscFPNasfqStUuWWPfL78jompfIoVzLJPVVAHBh6rpG68+pI2Gk+fNLeI8/f1yPYL4s46EleVIc20F1Ow==", + "version": "20.12.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz", + "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==", "dev": true, "dependencies": { "undici-types": "~5.26.4" } }, "node_modules/@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", "dev": true }, "node_modules/@types/semver": { @@ -1230,9 +834,9 @@ "dev": true }, "node_modules/acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -1253,18 +857,18 @@ "node_modules/add-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", - "integrity": "sha1-anmQQ3ynNtXhKI25K9MmbV9csqo=", + "integrity": "sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==", "dev": true }, "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", "uri-js": "^4.2.2" }, "funding": { @@ -1323,7 +927,7 @@ "node_modules/array-ify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", - "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=", + "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", "dev": true }, "node_modules/array-union": { @@ -1336,12 +940,12 @@ } }, "node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/ast-metadata-inferer": { @@ -1371,7 +975,7 @@ "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", "dev": true }, "node_modules/brace-expansion": { @@ -1429,9 +1033,9 @@ } }, "node_modules/browserslist-config-wikimedia": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/browserslist-config-wikimedia/-/browserslist-config-wikimedia-0.5.0.tgz", - "integrity": "sha512-t+tvSnTeVhVF2lNRxoAlE51/ZCfUs5SNNZUnWu2N8xXOGMPTMyKk5l4mayvDdm+5L8oqmnALU+TjnN2Z+ZTCTw==", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/browserslist-config-wikimedia/-/browserslist-config-wikimedia-0.6.1.tgz", + "integrity": "sha512-F3O+12ud7ZwBaiB/RZIMGDgz3nEuXz8RhtdPB4Lkd/WVP5Vy77EqBWRMz4vJ64x8LTTH3BOaHCD2ZuUcgShqyQ==", "dev": true }, "node_modules/buffer-from": { @@ -1453,9 +1057,9 @@ } }, "node_modules/builtins": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", - "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.1.0.tgz", + "integrity": "sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==", "dev": true, "dependencies": { "semver": "^7.0.0" @@ -1497,9 +1101,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001603", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001603.tgz", - "integrity": "sha512-iL2iSS0eDILMb9n5yKQoTBim9jMZ0Yrk8g0N9K7UzYyWnfIKzXBZD5ngpM37ZcL/cv0Mli8XtVMRYMQAfFpi5Q==", + "version": "1.0.30001610", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001610.tgz", + "integrity": "sha512-QFutAY4NgaelojVMjY63o6XlZyORPaLfyMnsl3HgnWdJUcX6K0oaJymHjH8PT5Gk7sTm8rvC/c5COUQKXqmOMA==", "dev": true, "funding": [ { @@ -1517,16 +1121,12 @@ ] }, "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, "engines": { - "node": ">=10" + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" @@ -1569,14 +1169,17 @@ } }, "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "dependencies": { "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", + "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" } }, "node_modules/color-convert": { @@ -1634,7 +1237,7 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, "node_modules/concat-stream": { @@ -1675,16 +1278,15 @@ } }, "node_modules/conventional-changelog-angular": { - "version": "5.0.13", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", - "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz", + "integrity": "sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==", "dev": true, "dependencies": { - "compare-func": "^2.0.0", - "q": "^1.5.1" + "compare-func": "^2.0.0" }, "engines": { - "node": ">=10" + "node": ">=16" } }, "node_modules/conventional-changelog-atom": { @@ -1718,17 +1320,15 @@ "dev": true }, "node_modules/conventional-changelog-conventionalcommits": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.6.3.tgz", - "integrity": "sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-7.0.2.tgz", + "integrity": "sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==", "dev": true, "dependencies": { - "compare-func": "^2.0.0", - "lodash": "^4.17.15", - "q": "^1.5.1" + "compare-func": "^2.0.0" }, "engines": { - "node": ">=10" + "node": ">=16" } }, "node_modules/conventional-changelog-core": { @@ -1756,10 +1356,39 @@ "node": ">=10" } }, - "node_modules/conventional-changelog-core/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "node_modules/conventional-changelog-core/node_modules/conventional-commits-parser": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", + "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", + "dev": true, + "dependencies": { + "is-text-path": "^1.0.1", + "JSONStream": "^1.0.4", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + }, + "bin": { + "conventional-commits-parser": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-core/node_modules/dargs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", + "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/conventional-changelog-core/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", "dev": true, "dependencies": { "locate-path": "^2.0.0" @@ -1768,16 +1397,53 @@ "node": ">=4" } }, + "node_modules/conventional-changelog-core/node_modules/git-raw-commits": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz", + "integrity": "sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==", + "dev": true, + "dependencies": { + "dargs": "^7.0.0", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + }, + "bin": { + "git-raw-commits": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/conventional-changelog-core/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-core/node_modules/is-text-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", + "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", + "dev": true, + "dependencies": { + "text-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } }, "node_modules/conventional-changelog-core/node_modules/locate-path": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", "dev": true, "dependencies": { "p-locate": "^2.0.0", @@ -1787,6 +1453,193 @@ "node": ">=4" } }, + "node_modules/conventional-changelog-core/node_modules/meow": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", + "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", + "dev": true, + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/conventional-changelog-core/node_modules/meow/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/conventional-changelog-core/node_modules/meow/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/conventional-changelog-core/node_modules/meow/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/conventional-changelog-core/node_modules/meow/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/conventional-changelog-core/node_modules/meow/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/conventional-changelog-core/node_modules/meow/node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/conventional-changelog-core/node_modules/meow/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/conventional-changelog-core/node_modules/meow/node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/conventional-changelog-core/node_modules/meow/node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/conventional-changelog-core/node_modules/meow/node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/conventional-changelog-core/node_modules/meow/node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/conventional-changelog-core/node_modules/meow/node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/conventional-changelog-core/node_modules/meow/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/conventional-changelog-core/node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/conventional-changelog-core/node_modules/p-limit": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", @@ -1802,7 +1655,7 @@ "node_modules/conventional-changelog-core/node_modules/p-locate": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", "dev": true, "dependencies": { "p-limit": "^1.1.0" @@ -1814,7 +1667,7 @@ "node_modules/conventional-changelog-core/node_modules/path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", "dev": true, "engines": { "node": ">=4" @@ -1835,7 +1688,7 @@ "node_modules/conventional-changelog-core/node_modules/pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", "dev": true, "engines": { "node": ">=4" @@ -1868,6 +1721,12 @@ "node": ">=4" } }, + "node_modules/conventional-changelog-core/node_modules/read-pkg/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, "node_modules/conventional-changelog-core/node_modules/read-pkg/node_modules/normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -1880,7 +1739,7 @@ "validate-npm-package-license": "^3.0.1" } }, - "node_modules/conventional-changelog-core/node_modules/semver": { + "node_modules/conventional-changelog-core/node_modules/read-pkg/node_modules/semver": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", @@ -1889,10 +1748,49 @@ "semver": "bin/semver" } }, - "node_modules/conventional-changelog-ember": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-2.0.9.tgz", - "integrity": "sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==", + "node_modules/conventional-changelog-core/node_modules/split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "dev": true, + "dependencies": { + "readable-stream": "^3.0.0" + } + }, + "node_modules/conventional-changelog-core/node_modules/text-extensions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", + "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/conventional-changelog-core/node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/conventional-changelog-core/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-ember": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-2.0.9.tgz", + "integrity": "sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==", "dev": true, "dependencies": { "q": "^1.5.1" @@ -1910,138 +1808,402 @@ "q": "^1.5.1" }, "engines": { - "node": ">=10" + "node": ">=10" + } + }, + "node_modules/conventional-changelog-express": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-2.0.6.tgz", + "integrity": "sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==", + "dev": true, + "dependencies": { + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-jquery": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-3.0.11.tgz", + "integrity": "sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==", + "dev": true, + "dependencies": { + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-jshint": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-2.0.9.tgz", + "integrity": "sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==", + "dev": true, + "dependencies": { + "compare-func": "^2.0.0", + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-preset-loader": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz", + "integrity": "sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-writer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz", + "integrity": "sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==", + "dev": true, + "dependencies": { + "conventional-commits-filter": "^2.0.7", + "dateformat": "^3.0.0", + "handlebars": "^4.7.7", + "json-stringify-safe": "^5.0.1", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "semver": "^6.0.0", + "split": "^1.0.0", + "through2": "^4.0.0" + }, + "bin": { + "conventional-changelog-writer": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-writer/node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-writer/node_modules/meow": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", + "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", + "dev": true, + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/conventional-changelog-writer/node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-writer/node_modules/normalize-package-data/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-writer/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/conventional-changelog-writer/node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/conventional-changelog-writer/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog/node_modules/conventional-changelog-angular": { + "version": "5.0.13", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", + "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", + "dev": true, + "dependencies": { + "compare-func": "^2.0.0", + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog/node_modules/conventional-changelog-conventionalcommits": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.6.3.tgz", + "integrity": "sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==", + "dev": true, + "dependencies": { + "compare-func": "^2.0.0", + "lodash": "^4.17.15", + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-commits-filter": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", + "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", + "dev": true, + "dependencies": { + "lodash.ismatch": "^4.4.0", + "modify-values": "^1.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-commits-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz", + "integrity": "sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==", + "dev": true, + "dependencies": { + "is-text-path": "^2.0.0", + "JSONStream": "^1.3.5", + "meow": "^12.0.1", + "split2": "^4.0.0" + }, + "bin": { + "conventional-commits-parser": "cli.mjs" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/conventional-recommended-bump": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-6.1.0.tgz", + "integrity": "sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw==", + "dev": true, + "dependencies": { + "concat-stream": "^2.0.0", + "conventional-changelog-preset-loader": "^2.3.4", + "conventional-commits-filter": "^2.0.7", + "conventional-commits-parser": "^3.2.0", + "git-raw-commits": "^2.0.8", + "git-semver-tags": "^4.1.1", + "meow": "^8.0.0", + "q": "^1.5.1" + }, + "bin": { + "conventional-recommended-bump": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-recommended-bump/node_modules/conventional-commits-parser": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", + "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", + "dev": true, + "dependencies": { + "is-text-path": "^1.0.1", + "JSONStream": "^1.0.4", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + }, + "bin": { + "conventional-commits-parser": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-recommended-bump/node_modules/dargs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", + "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", + "dev": true, + "engines": { + "node": ">=8" } }, - "node_modules/conventional-changelog-express": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-2.0.6.tgz", - "integrity": "sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==", + "node_modules/conventional-recommended-bump/node_modules/git-raw-commits": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz", + "integrity": "sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==", "dev": true, "dependencies": { - "q": "^1.5.1" + "dargs": "^7.0.0", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + }, + "bin": { + "git-raw-commits": "cli.js" }, "engines": { "node": ">=10" } }, - "node_modules/conventional-changelog-jquery": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-3.0.11.tgz", - "integrity": "sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==", + "node_modules/conventional-recommended-bump/node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dev": true, "dependencies": { - "q": "^1.5.1" + "lru-cache": "^6.0.0" }, "engines": { "node": ">=10" } }, - "node_modules/conventional-changelog-jshint": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-2.0.9.tgz", - "integrity": "sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==", + "node_modules/conventional-recommended-bump/node_modules/is-text-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", + "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", "dev": true, "dependencies": { - "compare-func": "^2.0.0", - "q": "^1.5.1" + "text-extensions": "^1.0.0" }, "engines": { - "node": ">=10" + "node": ">=0.10.0" } }, - "node_modules/conventional-changelog-preset-loader": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz", - "integrity": "sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==", + "node_modules/conventional-recommended-bump/node_modules/meow": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", + "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", "dev": true, + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/conventional-changelog-writer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz", - "integrity": "sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==", + "node_modules/conventional-recommended-bump/node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", "dev": true, "dependencies": { - "conventional-commits-filter": "^2.0.7", - "dateformat": "^3.0.0", - "handlebars": "^4.7.7", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "semver": "^6.0.0", - "split": "^1.0.0", - "through2": "^4.0.0" - }, - "bin": { - "conventional-changelog-writer": "cli.js" + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" }, "engines": { "node": ">=10" } }, - "node_modules/conventional-changelog-writer/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/conventional-recommended-bump/node_modules/split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", "dev": true, - "bin": { - "semver": "bin/semver.js" + "dependencies": { + "readable-stream": "^3.0.0" } }, - "node_modules/conventional-commits-filter": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", - "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", + "node_modules/conventional-recommended-bump/node_modules/text-extensions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", + "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", "dev": true, - "dependencies": { - "lodash.ismatch": "^4.4.0", - "modify-values": "^1.0.0" - }, "engines": { - "node": ">=10" + "node": ">=0.10" } }, - "node_modules/conventional-commits-parser": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", - "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", + "node_modules/conventional-recommended-bump/node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", "dev": true, - "dependencies": { - "is-text-path": "^1.0.1", - "JSONStream": "^1.0.4", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" - }, - "bin": { - "conventional-commits-parser": "cli.js" - }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/conventional-recommended-bump": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-6.1.0.tgz", - "integrity": "sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw==", + "node_modules/conventional-recommended-bump/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true, - "dependencies": { - "concat-stream": "^2.0.0", - "conventional-changelog-preset-loader": "^2.3.4", - "conventional-commits-filter": "^2.0.7", - "conventional-commits-parser": "^3.2.0", - "git-raw-commits": "^2.0.8", - "git-semver-tags": "^4.1.1", - "meow": "^8.0.0", - "q": "^1.5.1" - }, - "bin": { - "conventional-recommended-bump": "cli.js" - }, "engines": { "node": ">=10" } @@ -2066,15 +2228,15 @@ "dev": true }, "node_modules/cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", "dev": true, "dependencies": { + "env-paths": "^2.2.1", "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" + "parse-json": "^5.2.0" }, "engines": { "node": ">=14" @@ -2219,17 +2381,16 @@ "dev": true }, "node_modules/css-tree": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", - "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", "dev": true, "dependencies": { - "mdn-data": "2.0.28", + "mdn-data": "2.0.30", "source-map-js": "^1.0.1" }, "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", - "npm": ">=7.0.0" + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" } }, "node_modules/css-what": { @@ -2269,13 +2430,36 @@ "npm": ">=7.0.0" } }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "dev": true + }, "node_modules/dargs": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", - "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-8.1.0.tgz", + "integrity": "sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==", "dev": true, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/dateformat": { @@ -2307,16 +2491,16 @@ "node_modules/decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", "dev": true, "dependencies": { "decamelize": "^1.1.0", @@ -2324,12 +2508,15 @@ }, "engines": { "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/decamelize-keys/node_modules/map-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", "dev": true, "engines": { "node": ">=0.10.0" @@ -2373,6 +2560,22 @@ "devmoji": "bin/devmoji.js" } }, + "node_modules/devmoji/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -2421,6 +2624,17 @@ "node": ">=10" } }, + "node_modules/doiuse/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, "node_modules/doiuse/node_modules/source-map": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", @@ -2448,6 +2662,15 @@ "node": ">=10" } }, + "node_modules/doiuse/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/dom-serializer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", @@ -2462,18 +2685,6 @@ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, - "node_modules/dom-serializer/node_modules/entities": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", - "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", - "dev": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "node_modules/domelementtype": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", @@ -2502,14 +2713,14 @@ } }, "node_modules/domutils": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", - "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", "dev": true, "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", - "domhandler": "^5.0.1" + "domhandler": "^5.0.3" }, "funding": { "url": "https://github.com/fb55/domutils?sponsor=1" @@ -2604,7 +2815,7 @@ "node_modules/dotgitignore/node_modules/path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", "dev": true, "engines": { "node": ">=4" @@ -2637,16 +2848,10 @@ "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", "dev": true }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, "node_modules/electron-to-chromium": { - "version": "1.4.722", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.722.tgz", - "integrity": "sha512-5nLE0TWFFpZ80Crhtp4pIp8LXCztjYX41yUcV6b+bKR2PqzjskTMOOlBi1VjBHlvHwS+4gar7kNKOrsbsewEZQ==", + "version": "1.4.737", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.737.tgz", + "integrity": "sha512-QvLTxaLHKdy5YxvixAw/FfHq2eWLUL9KvsPjp0aHK1gI5d3EDuDgITkvj0nFO2c6zUY3ZqVAJQiBYyQP9tQpfw==", "dev": true }, "node_modules/emoji-regex": { @@ -2655,6 +2860,18 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/env-paths": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", @@ -2674,9 +2891,9 @@ } }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "dev": true, "engines": { "node": ">=6" @@ -2789,12 +3006,6 @@ "eslint-plugin-yml": "^1.13.2" } }, - "node_modules/eslint-config-wikimedia/node_modules/browserslist-config-wikimedia": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/browserslist-config-wikimedia/-/browserslist-config-wikimedia-0.6.1.tgz", - "integrity": "sha512-F3O+12ud7ZwBaiB/RZIMGDgz3nEuXz8RhtdPB4Lkd/WVP5Vy77EqBWRMz4vJ64x8LTTH3BOaHCD2ZuUcgShqyQ==", - "dev": true - }, "node_modules/eslint-plugin-compat": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-4.2.0.tgz", @@ -2816,6 +3027,88 @@ "eslint": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/eslint-plugin-compat/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-plugin-compat/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-plugin-compat/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-plugin-compat/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-plugin-compat/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint-plugin-compat/node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/eslint-plugin-es-x": { "version": "7.6.0", "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.6.0.tgz", @@ -2884,16 +3177,6 @@ "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" } }, - "node_modules/eslint-plugin-jsdoc/node_modules/spdx-expression-parse": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz", - "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==", - "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, "node_modules/eslint-plugin-json-es": { "version": "1.5.7", "resolved": "https://registry.npmjs.org/eslint-plugin-json-es/-/eslint-plugin-json-es-1.5.7.tgz", @@ -2921,9 +3204,9 @@ } }, "node_modules/eslint-plugin-mocha": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.4.1.tgz", - "integrity": "sha512-G85ALUgKaLzuEuHhoW3HVRgPTmia6njQC3qCG6CEvA8/Ja9PDZnRZOuzekMki+HaViEQXINuYsmhp5WR5/4MfA==", + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.4.2.tgz", + "integrity": "sha512-cur4dVYnSEWTBwdqIBQFxa/9siAhesu0TX+lbJ4ClE9j0eNMNe6BSx3vkFFNz6tGoveyMyELFXa30f3fvuAVDg==", "dev": true, "dependencies": { "eslint-utils": "^3.0.0", @@ -3030,9 +3313,9 @@ } }, "node_modules/eslint-plugin-vue": { - "version": "9.24.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.24.0.tgz", - "integrity": "sha512-9SkJMvF8NGMT9aQCwFc5rj8Wo1XWSMSHk36i7ZwdI614BU7sIOR28ZjuFPKp8YGymZN12BSEbiSwa7qikp+PBw==", + "version": "9.25.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.25.0.tgz", + "integrity": "sha512-tDWlx14bVe6Bs+Nnh3IGrD+hb11kf2nukfm6jLsmJIhmiRQ1SUaksvwY9U5MvPB0pcrg0QK0xapQkfITs3RKOA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", @@ -3048,7 +3331,7 @@ "node": "^14.17.0 || >=16.0.0" }, "peerDependencies": { - "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0" + "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0" } }, "node_modules/eslint-plugin-wdio": { @@ -3061,9 +3344,9 @@ } }, "node_modules/eslint-plugin-yml": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-1.13.2.tgz", - "integrity": "sha512-1i71VhmsG5UxE41rIJmJjhlTTxYy7upAY5Hqj8AdBc7rfJzRIZr3a2spuOS8+N7ZDCWsHAWY3J6lzQNQHDv6Uw==", + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-1.14.0.tgz", + "integrity": "sha512-ESUpgYPOcAYQO9czugcX5OqRvn/ydDVwGCPXY4YjPqc09rHaUVUA6IE6HLQys4rXk/S+qx3EwTd1wHCwam/OWQ==", "dev": true, "dependencies": { "debug": "^4.3.2", @@ -3137,6 +3420,126 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/espree": { "version": "9.6.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", @@ -3262,7 +3665,7 @@ "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, "node_modules/fastest-levenshtein": { @@ -3275,9 +3678,9 @@ } }, "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -3301,7 +3704,7 @@ "node_modules/figures/node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "engines": { "node": ">=0.8.0" @@ -3332,16 +3735,17 @@ } }, "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-7.0.0.tgz", + "integrity": "sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==", "dev": true, "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "locate-path": "^7.2.0", + "path-exists": "^5.0.0", + "unicorn-magic": "^0.1.0" }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -3362,31 +3766,15 @@ } }, "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", "dev": true }, - "node_modules/foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, "node_modules/function-bind": { @@ -3425,16 +3813,39 @@ "node": ">=6.9.0" } }, + "node_modules/get-pkg-repo/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/get-pkg-repo/node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/get-pkg-repo/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "dev": true }, "node_modules/get-pkg-repo/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, "dependencies": { "core-util-is": "~1.0.0", @@ -3489,6 +3900,15 @@ "node": ">=10" } }, + "node_modules/get-pkg-repo/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/get-stream": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", @@ -3514,28 +3934,26 @@ } }, "node_modules/git-raw-commits": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz", - "integrity": "sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-4.0.0.tgz", + "integrity": "sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==", "dev": true, "dependencies": { - "dargs": "^7.0.0", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" + "dargs": "^8.0.0", + "meow": "^12.0.1", + "split2": "^4.0.0" }, "bin": { - "git-raw-commits": "cli.js" + "git-raw-commits": "cli.mjs" }, "engines": { - "node": ">=10" + "node": ">=16" } }, "node_modules/git-remote-origin-url": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", - "integrity": "sha1-UoJlna4hBxRaERJhEq0yFuxfpl8=", + "integrity": "sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==", "dev": true, "dependencies": { "gitconfiglocal": "^1.0.0", @@ -3561,6 +3979,73 @@ "node": ">=10" } }, + "node_modules/git-semver-tags/node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/git-semver-tags/node_modules/meow": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", + "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", + "dev": true, + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/git-semver-tags/node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/git-semver-tags/node_modules/normalize-package-data/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/git-semver-tags/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -3570,25 +4055,52 @@ "semver": "bin/semver.js" } }, + "node_modules/git-semver-tags/node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/git-semver-tags/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/gitconfiglocal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", - "integrity": "sha1-QdBF84UaXqiPA/JMocYXgRRGS5s=", + "integrity": "sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==", "dev": true, "dependencies": { "ini": "^1.3.2" } }, + "node_modules/gitconfiglocal/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" }, @@ -3626,15 +4138,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/global-directory/node_modules/ini": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", - "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, "node_modules/global-modules": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", @@ -3661,6 +4164,12 @@ "node": ">=6" } }, + "node_modules/global-prefix/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, "node_modules/global-prefix/node_modules/which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -3711,13 +4220,13 @@ "node_modules/globjoin": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", - "integrity": "sha1-L0SUrIkZ43Z8XLtpHp9GMyQoXUM=", + "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==", "dev": true }, "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, "node_modules/graphemer": { @@ -3739,13 +4248,13 @@ } }, "node_modules/handlebars": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", - "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", "dev": true, "dependencies": { "minimist": "^1.2.5", - "neo-async": "^2.6.0", + "neo-async": "^2.6.2", "source-map": "^0.6.1", "wordwrap": "^1.0.0" }, @@ -3778,9 +4287,9 @@ } }, "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, "dependencies": { "function-bind": "^1.1.2" @@ -3790,16 +4299,10 @@ } }, "node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true }, "node_modules/html-tags": { "version": "3.3.1", @@ -3814,9 +4317,9 @@ } }, "node_modules/htmlparser2": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", - "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", "dev": true, "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", @@ -3827,21 +4330,9 @@ ], "dependencies": { "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", + "domhandler": "^5.0.3", "domutils": "^3.0.1", - "entities": "^4.3.0" - } - }, - "node_modules/htmlparser2/node_modules/entities": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.1.tgz", - "integrity": "sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==", - "dev": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "entities": "^4.4.0" } }, "node_modules/human-signals": { @@ -3924,7 +4415,7 @@ "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, "engines": { "node": ">=0.8.19" @@ -3942,7 +4433,7 @@ "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dev": true, "dependencies": { "once": "^1.3.0", @@ -3956,15 +4447,18 @@ "dev": true }, "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", + "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true }, "node_modules/is-builtin-module": { @@ -3997,7 +4491,7 @@ "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, "engines": { "node": ">=0.10.0" @@ -4054,7 +4548,7 @@ "node_modules/is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", "dev": true, "engines": { "node": ">=0.10.0" @@ -4082,15 +4576,15 @@ } }, "node_modules/is-text-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", - "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-2.0.0.tgz", + "integrity": "sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==", "dev": true, "dependencies": { - "text-extensions": "^1.0.0" + "text-extensions": "^2.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/isarray": { @@ -4102,27 +4596,9 @@ "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, - "node_modules/jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, "node_modules/jiti": { "version": "1.21.0", "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", @@ -4190,27 +4666,27 @@ "dev": true }, "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, "node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "dev": true }, "node_modules/jsonparse": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", "dev": true, "engines": [ "node >= 0.2.0" @@ -4251,9 +4727,9 @@ } }, "node_modules/known-css-properties": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.27.0.tgz", - "integrity": "sha512-uMCj6+hZYDoffuvAJjFAPz56E9uoowFHmTkqRtRq5WyC5Q6Cu/fTZKNQpX/RbzChBYLLl3lo8CjFZBAZXq9qFg==", + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.29.0.tgz", + "integrity": "sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==", "dev": true }, "node_modules/ldjson-stream": { @@ -4325,7 +4801,7 @@ "node_modules/load-json-file": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", "dev": true, "dependencies": { "graceful-fs": "^4.1.2", @@ -4340,7 +4816,7 @@ "node_modules/load-json-file/node_modules/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", "dev": true, "dependencies": { "error-ex": "^1.3.1", @@ -4353,22 +4829,22 @@ "node_modules/load-json-file/node_modules/pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", "dev": true, "dependencies": { - "p-locate": "^5.0.0" + "p-locate": "^6.0.0" }, "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -4389,7 +4865,7 @@ "node_modules/lodash.ismatch": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", - "integrity": "sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc=", + "integrity": "sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==", "dev": true }, "node_modules/lodash.isplainobject": { @@ -4462,68 +4938,43 @@ }, "engines": { "node": ">=10" - } - }, - "node_modules/map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mathml-tag-names": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", - "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/mdn-data": { - "version": "2.0.28", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", - "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", - "dev": true - }, - "node_modules/meow": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", - "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", - "dev": true, - "dependencies": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - }, - "engines": { - "node": ">=10" + } + }, + "node_modules/map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "dev": true, + "engines": { + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/meow/node_modules/type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "node_modules/mathml-tag-names": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", + "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "dev": true + }, + "node_modules/meow": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz", + "integrity": "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==", "dev": true, "engines": { - "node": ">=10" + "node": ">=16.10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -4613,13 +5064,13 @@ "node": ">= 6" } }, - "node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "node_modules/minimist-options/node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", "dev": true, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=0.10.0" } }, "node_modules/modify-values": { @@ -4656,15 +5107,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/multimatch/node_modules/arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/nanoid": { "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", @@ -4686,7 +5128,7 @@ "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, "node_modules/neo-async": { @@ -4702,18 +5144,24 @@ "dev": true }, "node_modules/normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, "dependencies": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", "validate-npm-package-license": "^3.0.1" - }, - "engines": { - "node": ">=10" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" } }, "node_modules/normalize-path": { @@ -4767,7 +5215,7 @@ "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, "dependencies": { "wrappy": "1" @@ -4806,30 +5254,30 @@ } }, "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", "dev": true, "dependencies": { - "yocto-queue": "^0.1.0" + "yocto-queue": "^1.0.0" }, "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", "dev": true, "dependencies": { - "p-limit": "^3.0.2" + "p-limit": "^4.0.0" }, "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -4838,7 +5286,7 @@ "node_modules/p-try": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", "dev": true, "engines": { "node": ">=4" @@ -4875,18 +5323,18 @@ } }, "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", "dev": true, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, "engines": { "node": ">=0.10.0" @@ -4907,31 +5355,6 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, - "node_modules/path-scurry": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", - "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", - "dev": true, - "dependencies": { - "lru-cache": "^9.1.1 || ^10.0.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", - "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } - }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -4962,7 +5385,7 @@ "node_modules/pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true, "engines": { "node": ">=0.10.0" @@ -5021,9 +5444,9 @@ } }, "node_modules/postcss-html/node_modules/js-tokens": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-8.0.0.tgz", - "integrity": "sha512-PC7MzqInq9OqKyTXfIvQNcjMkODJYC8A17kAaQgeW79yfhqTWSOfjHYQ2mDDcwJ96Iibtwkfh0C7R/OvqPlgVA==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-8.0.3.tgz", + "integrity": "sha512-UfJMcSJc+SEXEl9lH/VLHSZbThQyLpw1vLO1Lb+j4RWDvG3N2f7yj3PVQA3cmkTBNldJ9eFnM+xEXxHIXrYiJw==", "dev": true }, "node_modules/postcss-less": { @@ -5041,13 +5464,13 @@ "node_modules/postcss-media-query-parser": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", - "integrity": "sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ=", + "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", "dev": true }, "node_modules/postcss-resolve-nested-selector": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz", - "integrity": "sha1-Kcy8fDfe36wwTp//C/FZaz9qDk4=", + "integrity": "sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==", "dev": true }, "node_modules/postcss-safe-parser": { @@ -5110,9 +5533,9 @@ "dev": true }, "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, "engines": { "node": ">=6" @@ -5121,7 +5544,7 @@ "node_modules/q": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", "dev": true, "engines": { "node": ">=0.6.0", @@ -5256,6 +5679,15 @@ "node": ">=6" } }, + "node_modules/read-pkg-up/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/read-pkg-up/node_modules/type-fest": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", @@ -5265,33 +5697,6 @@ "node": ">=8" } }, - "node_modules/read-pkg/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/read-pkg/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, "node_modules/read-pkg/node_modules/type-fest": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", @@ -5302,9 +5707,9 @@ } }, "node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, "dependencies": { "inherits": "^2.0.3", @@ -5361,7 +5766,7 @@ "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, "engines": { "node": ">=0.10.0" @@ -5590,25 +5995,35 @@ } }, "node_modules/spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dev": true, "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, + "node_modules/spdx-correct/node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", "dev": true }, "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz", + "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==", "dev": true, "dependencies": { "spdx-exceptions": "^2.1.0", @@ -5616,9 +6031,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", - "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz", + "integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==", "dev": true }, "node_modules/split": { @@ -5634,12 +6049,12 @@ } }, "node_modules/split2": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", - "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", "dev": true, - "dependencies": { - "readable-stream": "^3.0.0" + "engines": { + "node": ">= 10.x" } }, "node_modules/standard-version": { @@ -5682,51 +6097,146 @@ "node": ">=4" } }, - "node_modules/standard-version/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/standard-version/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/standard-version/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/standard-version/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/standard-version/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/standard-version/node_modules/conventional-changelog-conventionalcommits": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.6.3.tgz", + "integrity": "sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==", + "dev": true, + "dependencies": { + "compare-func": "^2.0.0", + "lodash": "^4.17.15", + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/standard-version/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/standard-version/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/standard-version/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/standard-version/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "p-locate": "^5.0.0" }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/standard-version/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/standard-version/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "dependencies": { - "color-name": "1.1.3" + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/standard-version/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "node_modules/standard-version/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "node_modules/standard-version/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, "engines": { - "node": ">=0.8.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/standard-version/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "node_modules/standard-version/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/standard-version/node_modules/supports-color": { @@ -5759,6 +6269,27 @@ "node": ">=10" } }, + "node_modules/standard-version/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/standard-version/node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -5782,25 +6313,11 @@ "node": ">=8" } }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/stringify-package": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/stringify-package/-/stringify-package-1.0.1.tgz", "integrity": "sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg==", + "deprecated": "This module is not used anymore, and has been replaced by @npmcli/package-json", "dev": true }, "node_modules/strip-ansi": { @@ -5815,23 +6332,10 @@ "node": ">=8" } }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, "engines": { "node": ">=4" @@ -5876,50 +6380,51 @@ "node_modules/style-search": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz", - "integrity": "sha1-eVjHk+R+MuB9K1yv5cC/jhLneQI=", + "integrity": "sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==", "dev": true }, "node_modules/stylelint": { - "version": "16.3.1", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.3.1.tgz", - "integrity": "sha512-/JOwQnBvxEKOT2RtNgGpBVXnCSMBgKOL2k7w0K52htwCyJls4+cHvc4YZgXlVoAZS9QJd2DgYAiRnja96pTgxw==", + "version": "15.11.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.11.0.tgz", + "integrity": "sha512-78O4c6IswZ9TzpcIiQJIN49K3qNoXTM8zEJzhaTE/xRTCZswaovSEVIa/uwbOltZrk16X4jAxjaOhzz/hTm1Kw==", "dev": true, "dependencies": { - "@csstools/css-parser-algorithms": "^2.6.1", - "@csstools/css-tokenizer": "^2.2.4", - "@csstools/media-query-list-parser": "^2.1.9", - "@csstools/selector-specificity": "^3.0.2", - "@dual-bundle/import-meta-resolve": "^4.0.0", + "@csstools/css-parser-algorithms": "^2.3.1", + "@csstools/css-tokenizer": "^2.2.0", + "@csstools/media-query-list-parser": "^2.1.4", + "@csstools/selector-specificity": "^3.0.0", "balanced-match": "^2.0.0", "colord": "^2.9.3", - "cosmiconfig": "^9.0.0", + "cosmiconfig": "^8.2.0", "css-functions-list": "^3.2.1", "css-tree": "^2.3.1", "debug": "^4.3.4", - "fast-glob": "^3.3.2", + "fast-glob": "^3.3.1", "fastest-levenshtein": "^1.0.16", - "file-entry-cache": "^8.0.0", + "file-entry-cache": "^7.0.0", "global-modules": "^2.0.0", "globby": "^11.1.0", "globjoin": "^0.1.4", "html-tags": "^3.3.1", - "ignore": "^5.3.1", + "ignore": "^5.2.4", + "import-lazy": "^4.0.0", "imurmurhash": "^0.1.4", "is-plain-object": "^5.0.0", - "known-css-properties": "^0.30.0", + "known-css-properties": "^0.29.0", "mathml-tag-names": "^2.1.3", - "meow": "^13.2.0", + "meow": "^10.1.5", "micromatch": "^4.0.5", "normalize-path": "^3.0.0", "picocolors": "^1.0.0", - "postcss": "^8.4.38", + "postcss": "^8.4.28", "postcss-resolve-nested-selector": "^0.1.1", - "postcss-safe-parser": "^7.0.0", - "postcss-selector-parser": "^6.0.16", + "postcss-safe-parser": "^6.0.0", + "postcss-selector-parser": "^6.0.13", "postcss-value-parser": "^4.2.0", "resolve-from": "^5.0.0", "string-width": "^4.2.3", - "strip-ansi": "^7.1.0", + "strip-ansi": "^6.0.1", + "style-search": "^0.1.0", "supports-hyperlinks": "^3.0.0", "svg-tags": "^1.0.0", "table": "^6.8.1", @@ -5929,7 +6434,7 @@ "stylelint": "bin/stylelint.mjs" }, "engines": { - "node": ">=18.12.0" + "node": "^14.13.1 || >=16.0.0" }, "funding": { "type": "opencollective", @@ -5937,15 +6442,27 @@ } }, "node_modules/stylelint-config-recess-order": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/stylelint-config-recess-order/-/stylelint-config-recess-order-5.0.1.tgz", - "integrity": "sha512-rKbGkoa3h0rINrGln9TFVowvSCLgPJC5O0EuPiqlqWcJMb1lImEtXktcjFCVz+hwtSUiHD3ijJc3vP9muFOgJg==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recess-order/-/stylelint-config-recess-order-4.6.0.tgz", + "integrity": "sha512-V76fhv3YtcNXh/hyAuAdSzi5FmcrG54Mp2AThJ3D/PTMTSYzUPd7GIhP6z9mTqnRhmkk6YTfcu/JWB8h+Yrcaw==", "dev": true, "dependencies": { - "stylelint-order": "^6.0.4" + "stylelint-order": "6.x" + }, + "peerDependencies": { + "stylelint": ">=15" + } + }, + "node_modules/stylelint-config-recommended": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-13.0.0.tgz", + "integrity": "sha512-EH+yRj6h3GAe/fRiyaoO2F9l9Tgg50AOFhaszyfov9v6ayXJ1IkSHwTxd7lB48FmOeSGDPLjatjO11fJpmarkQ==", + "dev": true, + "engines": { + "node": "^14.13.1 || >=16.0.0" }, "peerDependencies": { - "stylelint": ">=16" + "stylelint": "^15.10.0" } }, "node_modules/stylelint-config-wikimedia": { @@ -5972,6 +6489,12 @@ "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", "dev": true }, + "node_modules/stylelint-config-wikimedia/node_modules/browserslist-config-wikimedia": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/browserslist-config-wikimedia/-/browserslist-config-wikimedia-0.5.0.tgz", + "integrity": "sha512-t+tvSnTeVhVF2lNRxoAlE51/ZCfUs5SNNZUnWu2N8xXOGMPTMyKk5l4mayvDdm+5L8oqmnALU+TjnN2Z+ZTCTw==", + "dev": true + }, "node_modules/stylelint-config-wikimedia/node_modules/camelcase": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", @@ -6002,17 +6525,30 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/stylelint-config-wikimedia/node_modules/css-tree": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", - "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "node_modules/stylelint-config-wikimedia/node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", "dev": true, "dependencies": { - "mdn-data": "2.0.30", - "source-map-js": "^1.0.1" + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" }, "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/stylelint-config-wikimedia/node_modules/decamelize": { @@ -6027,6 +6563,34 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/stylelint-config-wikimedia/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stylelint-config-wikimedia/node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/stylelint-config-wikimedia/node_modules/indent-string": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", @@ -6039,38 +6603,107 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/stylelint-config-wikimedia/node_modules/mdn-data": { - "version": "2.0.30", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", - "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "node_modules/stylelint-config-wikimedia/node_modules/known-css-properties": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.27.0.tgz", + "integrity": "sha512-uMCj6+hZYDoffuvAJjFAPz56E9uoowFHmTkqRtRq5WyC5Q6Cu/fTZKNQpX/RbzChBYLLl3lo8CjFZBAZXq9qFg==", "dev": true }, - "node_modules/stylelint-config-wikimedia/node_modules/meow": { - "version": "10.1.5", - "resolved": "https://registry.npmjs.org/meow/-/meow-10.1.5.tgz", - "integrity": "sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==", + "node_modules/stylelint-config-wikimedia/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stylelint-config-wikimedia/node_modules/meow": { + "version": "10.1.5", + "resolved": "https://registry.npmjs.org/meow/-/meow-10.1.5.tgz", + "integrity": "sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==", + "dev": true, + "dependencies": { + "@types/minimist": "^1.2.2", + "camelcase-keys": "^7.0.0", + "decamelize": "^5.0.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.2", + "read-pkg-up": "^8.0.0", + "redent": "^4.0.0", + "trim-newlines": "^4.0.2", + "type-fest": "^1.2.2", + "yargs-parser": "^20.2.9" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stylelint-config-wikimedia/node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stylelint-config-wikimedia/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stylelint-config-wikimedia/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "dependencies": { - "@types/minimist": "^1.2.2", - "camelcase-keys": "^7.0.0", - "decamelize": "^5.0.0", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.2", - "read-pkg-up": "^8.0.0", - "redent": "^4.0.0", - "trim-newlines": "^4.0.2", - "type-fest": "^1.2.2", - "yargs-parser": "^20.2.9" + "p-limit": "^3.0.2" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/stylelint-config-wikimedia/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/stylelint-config-wikimedia/node_modules/quick-lru": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", @@ -6207,19 +6840,52 @@ "url": "https://opencollective.com/stylelint" } }, - "node_modules/stylelint-config-wikimedia/node_modules/stylelint-config-recommended": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-13.0.0.tgz", - "integrity": "sha512-EH+yRj6h3GAe/fRiyaoO2F9l9Tgg50AOFhaszyfov9v6ayXJ1IkSHwTxd7lB48FmOeSGDPLjatjO11fJpmarkQ==", + "node_modules/stylelint-config-wikimedia/node_modules/trim-newlines": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-4.1.1.tgz", + "integrity": "sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==", "dev": true, "engines": { - "node": "^14.13.1 || >=16.0.0" + "node": ">=12" }, - "peerDependencies": { - "stylelint": "^15.10.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stylelint-config-wikimedia/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stylelint-config-wikimedia/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" } }, - "node_modules/stylelint-config-wikimedia/node_modules/stylelint-no-unsupported-browser-features": { + "node_modules/stylelint-config-wikimedia/node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stylelint-no-unsupported-browser-features": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/stylelint-no-unsupported-browser-features/-/stylelint-no-unsupported-browser-features-6.1.0.tgz", "integrity": "sha512-3Taj+z9PjIiY6cz4hg3eN8Khue3kMm9lPXYuEvdjAFXDK20uQo2NocJaWN6anIKclYlwrpkBAS9W/KV3qPTWsw==", @@ -6236,10 +6902,24 @@ "stylelint": "^14.0.0||^15.0.0" } }, - "node_modules/stylelint-config-wikimedia/node_modules/stylelint-stylistic": { + "node_modules/stylelint-order": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/stylelint-order/-/stylelint-order-6.0.4.tgz", + "integrity": "sha512-0UuKo4+s1hgQ/uAxlYU4h0o0HS4NiQDud0NAUNI0aa8FJdmYHA5ZZTFHiV5FpmE3071e9pZx5j0QpVJW5zOCUA==", + "dev": true, + "dependencies": { + "postcss": "^8.4.32", + "postcss-sorting": "^8.0.2" + }, + "peerDependencies": { + "stylelint": "^14.0.0 || ^15.0.0 || ^16.0.1" + } + }, + "node_modules/stylelint-stylistic": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/stylelint-stylistic/-/stylelint-stylistic-0.4.3.tgz", "integrity": "sha512-WphmneK3MRrm5ixvRPWy7+c9+EQUh0FPvNMXW/N9VD85vyqtpxUejpD+mxubVVht0fRgidcqBxtW3s3tU2Ujhw==", + "deprecated": "This package has been deprecated in favor of @stylistic/stylelint-plugin", "dev": true, "dependencies": { "is-plain-object": "^5.0.0", @@ -6252,11 +6932,35 @@ "stylelint": "^15.0.0" } }, - "node_modules/stylelint-config-wikimedia/node_modules/trim-newlines": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-4.1.1.tgz", - "integrity": "sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==", + "node_modules/stylelint/node_modules/balanced-match": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz", + "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", + "dev": true + }, + "node_modules/stylelint/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stylelint/node_modules/camelcase-keys": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-7.0.2.tgz", + "integrity": "sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==", "dev": true, + "dependencies": { + "camelcase": "^6.3.0", + "map-obj": "^4.1.0", + "quick-lru": "^5.1.1", + "type-fest": "^1.2.1" + }, "engines": { "node": ">=12" }, @@ -6264,10 +6968,36 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/stylelint-config-wikimedia/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "node_modules/stylelint/node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dev": true, + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/stylelint/node_modules/decamelize": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-5.0.1.tgz", + "integrity": "sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==", "dev": true, "engines": { "node": ">=10" @@ -6276,235 +7006,274 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/stylelint-order": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/stylelint-order/-/stylelint-order-6.0.4.tgz", - "integrity": "sha512-0UuKo4+s1hgQ/uAxlYU4h0o0HS4NiQDud0NAUNI0aa8FJdmYHA5ZZTFHiV5FpmE3071e9pZx5j0QpVJW5zOCUA==", + "node_modules/stylelint/node_modules/file-entry-cache": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-7.0.2.tgz", + "integrity": "sha512-TfW7/1iI4Cy7Y8L6iqNdZQVvdXn0f8B4QcIXmkIbtTIe/Okm/nSlHb4IwGzRVOd3WfSieCgvf5cMzEfySAIl0g==", "dev": true, "dependencies": { - "postcss": "^8.4.32", - "postcss-sorting": "^8.0.2" + "flat-cache": "^3.2.0" }, - "peerDependencies": { - "stylelint": "^14.0.0 || ^15.0.0 || ^16.0.1" + "engines": { + "node": ">=12.0.0" } }, - "node_modules/stylelint/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "node_modules/stylelint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, "engines": { - "node": ">=12" + "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/stylelint/node_modules/balanced-match": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz", - "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", - "dev": true + "node_modules/stylelint/node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } }, - "node_modules/stylelint/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "node_modules/stylelint/node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stylelint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "dependencies": { - "balanced-match": "^1.0.0" + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/stylelint/node_modules/brace-expansion/node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "node_modules/stylelint/node_modules/meow": { + "version": "10.1.5", + "resolved": "https://registry.npmjs.org/meow/-/meow-10.1.5.tgz", + "integrity": "sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==", + "dev": true, + "dependencies": { + "@types/minimist": "^1.2.2", + "camelcase-keys": "^7.0.0", + "decamelize": "^5.0.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.2", + "read-pkg-up": "^8.0.0", + "redent": "^4.0.0", + "trim-newlines": "^4.0.2", + "type-fest": "^1.2.2", + "yargs-parser": "^20.2.9" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/stylelint/node_modules/cosmiconfig": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", - "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "node_modules/stylelint/node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stylelint/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "dependencies": { - "env-paths": "^2.2.1", - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0" + "yocto-queue": "^0.1.0" }, "engines": { - "node": ">=14" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/stylelint/node_modules/css-tree": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", - "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "node_modules/stylelint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "dependencies": { - "mdn-data": "2.0.30", - "source-map-js": "^1.0.1" + "p-limit": "^3.0.2" }, "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/stylelint/node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "node_modules/stylelint/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, - "dependencies": { - "flat-cache": "^4.0.0" - }, "engines": { - "node": ">=16.0.0" + "node": ">=8" } }, - "node_modules/stylelint/node_modules/flat-cache": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.0.tgz", - "integrity": "sha512-EryKbCE/wxpxKniQlyas6PY1I9vwtF3uCBweX+N8KYTCn3Y12RTGtQAJ/bd5pl7kxUAc8v/R3Ake/N17OZiFqA==", + "node_modules/stylelint/node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stylelint/node_modules/read-pkg": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-6.0.0.tgz", + "integrity": "sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==", "dev": true, "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4", - "rimraf": "^5.0.5" + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^3.0.2", + "parse-json": "^5.2.0", + "type-fest": "^1.0.1" }, "engines": { - "node": ">=16" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/stylelint/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "node_modules/stylelint/node_modules/read-pkg-up": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-8.0.0.tgz", + "integrity": "sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==", "dev": true, "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" + "find-up": "^5.0.0", + "read-pkg": "^6.0.0", + "type-fest": "^1.0.1" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/stylelint/node_modules/known-css-properties": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.30.0.tgz", - "integrity": "sha512-VSWXYUnsPu9+WYKkfmJyLKtIvaRJi1kXUqVmBACORXZQxT5oZDsoZ2vQP+bQFDnWtpI/4eq3MLoRMjI2fnLzTQ==", - "dev": true - }, - "node_modules/stylelint/node_modules/mdn-data": { - "version": "2.0.30", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", - "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", - "dev": true - }, - "node_modules/stylelint/node_modules/meow": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", - "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", + "node_modules/stylelint/node_modules/redent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-4.0.0.tgz", + "integrity": "sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==", "dev": true, + "dependencies": { + "indent-string": "^5.0.0", + "strip-indent": "^4.0.0" + }, "engines": { - "node": ">=18" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/stylelint/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "node_modules/stylelint/node_modules/strip-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", + "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", "dev": true, "dependencies": { - "brace-expansion": "^2.0.1" + "min-indent": "^1.0.1" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/stylelint/node_modules/postcss-safe-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.0.tgz", - "integrity": "sha512-ovehqRNVCpuFzbXoTb4qLtyzK3xn3t/CUBxOs8LsnQjQrShaB4lKiHoVqY8ANaC0hBMHq5QVWk77rwGklFUDrg==", + "node_modules/stylelint/node_modules/trim-newlines": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-4.1.1.tgz", + "integrity": "sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss-safe-parser" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], "engines": { - "node": ">=18.0" + "node": ">=12" }, - "peerDependencies": { - "postcss": "^8.4.31" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/stylelint/node_modules/rimraf": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz", - "integrity": "sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==", + "node_modules/stylelint/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", "dev": true, - "dependencies": { - "glob": "^10.3.7" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, "engines": { - "node": ">=14" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/stylelint/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "node_modules/stylelint/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, "engines": { - "node": ">=12" + "node": ">=10" + } + }, + "node_modules/stylelint/node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/supports-color": { @@ -6547,7 +7316,7 @@ "node_modules/svg-tags": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", - "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=", + "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", "dev": true }, "node_modules/svgo": { @@ -6575,29 +7344,10 @@ "url": "https://opencollective.com/svgo" } }, - "node_modules/svgo/node_modules/css-tree": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", - "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", - "dev": true, - "dependencies": { - "mdn-data": "2.0.30", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" - } - }, - "node_modules/svgo/node_modules/mdn-data": { - "version": "2.0.30", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", - "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", - "dev": true - }, "node_modules/table": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", - "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", + "version": "6.8.2", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.2.tgz", + "integrity": "sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==", "dev": true, "dependencies": { "ajv": "^8.0.1", @@ -6610,47 +7360,28 @@ "node": ">=10.0.0" } }, - "node_modules/table/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/table/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, "node_modules/text-extensions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", - "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-2.4.0.tgz", + "integrity": "sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==", "dev": true, "engines": { - "node": ">=0.10" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "dev": true }, "node_modules/through2": { @@ -6737,13 +7468,13 @@ "node_modules/typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", "dev": true }, "node_modules/typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", "dev": true, "peer": true, "bin": { @@ -6755,9 +7486,9 @@ } }, "node_modules/uglify-js": { - "version": "3.15.5", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.15.5.tgz", - "integrity": "sha512-hNM5q5GbBRB5xB+PMqVRcgYe4c8jbyZ1pzZhS6jbq54/4F2gFK869ZheiE5A8/t+W5jtTNpWef/5Q9zk639FNQ==", + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", "dev": true, "optional": true, "bin": { @@ -6837,7 +7568,7 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true }, "node_modules/validate-npm-package-license": { @@ -6850,6 +7581,16 @@ "spdx-expression-parse": "^3.0.0" } }, + "node_modules/validate-npm-package-license/node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, "node_modules/vue-eslint-parser": { "version": "9.4.2", "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.2.tgz", @@ -6892,7 +7633,7 @@ "node_modules/wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", "dev": true }, "node_modules/wrap-ansi": { @@ -6912,28 +7653,10 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, "node_modules/write-file-atomic": { @@ -7030,29 +7753,6 @@ } }, "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs/node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs/node_modules/yargs-parser": { "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", @@ -7062,12 +7762,12 @@ } }, "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", "dev": true, "engines": { - "node": ">=10" + "node": ">=12.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" diff --git a/package.json b/package.json index a13d40231..f23099006 100644 --- a/package.json +++ b/package.json @@ -25,8 +25,8 @@ "grunt-banana-checker": "0.11.1", "husky": "^9.0.11", "standard-version": "^9.5.0", - "stylelint": "^16.3.1", - "stylelint-config-recess-order": "^5.0.1", + "stylelint": "15.11.0", + "stylelint-config-recess-order": "4.6.0", "stylelint-config-wikimedia": "0.16.1", "stylelint-order": "^6.0.3", "svgo": "3.2.0" From f650af06a272045db86f7d5812ce1a19e8e6d7f7 Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Tue, 16 Apr 2024 01:23:19 -0400 Subject: [PATCH 006/254] =?UTF-8?q?chore(dev):=20=F0=9F=94=A7=20disable=20?= =?UTF-8?q?selector-class-pattern=20stylelint=20rule?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A lot of extension skinstyles are violating that, will re-enable it later --- .stylelintrc.json | 1 + 1 file changed, 1 insertion(+) diff --git a/.stylelintrc.json b/.stylelintrc.json index c855fdb47..1ee0673d8 100644 --- a/.stylelintrc.json +++ b/.stylelintrc.json @@ -9,6 +9,7 @@ ], "rules": { "font-weight-notation": null, + "selector-class-pattern": null, "selector-max-id": null, "no-descending-specificity": null, "declaration-no-important": null, From 11566de6b6f7c0b20fca6cee411f3a048b543527 Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Tue, 16 Apr 2024 01:28:45 -0400 Subject: [PATCH 007/254] =?UTF-8?q?style(css):=20=F0=9F=8E=A8=20re-apply?= =?UTF-8?q?=20stylelint=20fixes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mediawiki.skin.variables.less | 2 +- .../skins.citizen.styles/common/common.less | 1 + .../components/ContentFooter.less | 2 +- .../components/TableOfContents.less | 2 +- .../skinning/content.tables.less | 4 +- .../Echo/ext.echo.styles.alert.less | 14 ++--- .../Scribunto/ext.scribunto.edit.less | 8 +-- .../ext.srf.datatables.v2.format.less | 20 +++--- skinStyles/jquery/datatables.less | 62 +++++++++---------- skinStyles/jquery/ui.less | 60 +++++++++--------- .../mediawiki.page.gallery.styles.less | 8 +-- .../mediawiki/special/mediawiki.special.less | 24 +++---- 12 files changed, 102 insertions(+), 105 deletions(-) diff --git a/resources/mediawiki.less/mediawiki.skin.variables.less b/resources/mediawiki.less/mediawiki.skin.variables.less index e3f7b4f4c..12983555a 100644 --- a/resources/mediawiki.less/mediawiki.skin.variables.less +++ b/resources/mediawiki.less/mediawiki.skin.variables.less @@ -63,4 +63,4 @@ @font-size-large: var( --font-size-large ); @font-size-x-large: var( --font-size-x-large ); @font-size-xx-large: var( --font-size-xx-large ); -@font-size-xxx-large: var( --font-size-xxx-large ); \ No newline at end of file +@font-size-xxx-large: var( --font-size-xxx-large ); diff --git a/resources/skins.citizen.styles/common/common.less b/resources/skins.citizen.styles/common/common.less index f73b3fd88..263940736 100644 --- a/resources/skins.citizen.styles/common/common.less +++ b/resources/skins.citizen.styles/common/common.less @@ -149,6 +149,7 @@ video { button, label { // Remove the 300ms delay in click event (T118509) + /* stylelint-disable-next-line plugin/no-unsupported-browser-features */ touch-action: manipulation; } } diff --git a/resources/skins.citizen.styles/components/ContentFooter.less b/resources/skins.citizen.styles/components/ContentFooter.less index 259a198d5..998b87165 100644 --- a/resources/skins.citizen.styles/components/ContentFooter.less +++ b/resources/skins.citizen.styles/components/ContentFooter.less @@ -1,9 +1,9 @@ .mw-body-footer { - margin-top: var( --space-md ); display: flex; flex-direction: column; grid-area: footer; gap: var( --space-xl ); + margin-top: var( --space-md ); line-height: var( --line-height-sm ); } diff --git a/resources/skins.citizen.styles/components/TableOfContents.less b/resources/skins.citizen.styles/components/TableOfContents.less index 3b14aacc0..8e246a01e 100644 --- a/resources/skins.citizen.styles/components/TableOfContents.less +++ b/resources/skins.citizen.styles/components/TableOfContents.less @@ -27,8 +27,8 @@ } &__header { - color: var( --color-base--subtle ); font-size: var( --font-size-x-small ); + color: var( --color-base--subtle ); letter-spacing: 0.05em; } diff --git a/resources/skins.citizen.styles/skinning/content.tables.less b/resources/skins.citizen.styles/skinning/content.tables.less index e932e8f67..864542d54 100644 --- a/resources/skins.citizen.styles/skinning/content.tables.less +++ b/resources/skins.citizen.styles/skinning/content.tables.less @@ -9,10 +9,10 @@ .wikitable { margin: var( --space-md ) 0; + font-size: var( --font-size-small ); + border-spacing: 0; border: 1px solid var( --border-color-base ); border-radius: var( --border-radius--medium ); - border-spacing: 0; - font-size: var( --font-size-small ); caption { padding-right: var( --space-sm ); diff --git a/skinStyles/extensions/Echo/ext.echo.styles.alert.less b/skinStyles/extensions/Echo/ext.echo.styles.alert.less index 615e98c2b..7c34cb93e 100644 --- a/skinStyles/extensions/Echo/ext.echo.styles.alert.less +++ b/skinStyles/extensions/Echo/ext.echo.styles.alert.less @@ -12,21 +12,21 @@ .mw-echo-alert { position: fixed; - z-index: @z-index-overlay; - left: 0; right: 0; bottom: 0; + left: 0; + z-index: @z-index-overlay; width: auto; max-width: @max-width-breakpoint-tablet; - margin: var( --space-xs ); padding: 0; - border: 1px solid var( --border-color-base ); - border-radius: var( --border-radius--large ); - box-shadow: var( --box-shadow-dialog ); + margin: var( --space-xs ); font-size: var( --font-size-small ); line-height: var( --line-height-sm ); - background-color: var( --color-surface-1 ); color: var( --color-base ); + background-color: var( --color-surface-1 ); + border: 1px solid var( --border-color-base ); + border-radius: var( --border-radius--large ); + box-shadow: var( --box-shadow-dialog ); @media only screen and ( min-width: @min-width-breakpoint-desktop ) { right: unset; diff --git a/skinStyles/extensions/Scribunto/ext.scribunto.edit.less b/skinStyles/extensions/Scribunto/ext.scribunto.edit.less index adce1687d..ddc1bdc1c 100644 --- a/skinStyles/extensions/Scribunto/ext.scribunto.edit.less +++ b/skinStyles/extensions/Scribunto/ext.scribunto.edit.less @@ -14,13 +14,13 @@ input[ type='button' ] { width: 100%; - margin: var( --space-xs ) 0; padding: var( --space-xs ) var( --space-sm ); + margin: var( --space-xs ) 0; font-weight: var( --font-weight-medium ); - cursor: pointer; - border-radius: var( --border-radius--small ); color: #fff; + cursor: pointer; background-color: var( --color-destructive ); + border-radius: var( --border-radius--small ); &:hover { background: var( --color-destructive--hover ); @@ -33,7 +33,7 @@ > div:last-child { position: sticky; - bottom: 0; + bottom: 0; } } diff --git a/skinStyles/extensions/SemanticResultFormats/datatables/ext.srf.datatables.v2.format.less b/skinStyles/extensions/SemanticResultFormats/datatables/ext.srf.datatables.v2.format.less index 10f669f05..34ef8c2b2 100644 --- a/skinStyles/extensions/SemanticResultFormats/datatables/ext.srf.datatables.v2.format.less +++ b/skinStyles/extensions/SemanticResultFormats/datatables/ext.srf.datatables.v2.format.less @@ -11,15 +11,15 @@ // Re-implement datatable responsiveness broken by SRF // FIXME: Remove when upstream is fixed @media screen and ( max-width: 640px ) { - .srf-datatable { - .dataTables_filter, - .dataTables_length { - float: none; - } + .srf-datatable { + .dataTables_filter, + .dataTables_length { + float: none; + } - .dataTables_filter, - .dt-buttons { - margin-right: 0; - } - } + .dataTables_filter, + .dt-buttons { + margin-right: 0; + } + } } diff --git a/skinStyles/jquery/datatables.less b/skinStyles/jquery/datatables.less index 2662d4df2..778fb8039 100644 --- a/skinStyles/jquery/datatables.less +++ b/skinStyles/jquery/datatables.less @@ -7,7 +7,6 @@ * Date: 2024-03-19 */ - /* jquery.dataTables.css */ table.dataTable { display: table; @@ -15,7 +14,7 @@ table.dataTable { overflow: hidden; // let datatables handle responsiveness font-size: var( --font-size-small ); border: 1px solid var( --border-color-base ); - border-radius: var( --border-radius--medium ); + border-radius: var( --border-radius--medium ); } table.dataTable thead th, @@ -265,15 +264,15 @@ table.dataTable tbody tr.selected > * { } // Expand (+) button -table.dataTable.dtr-inline.collapsed>tbody>tr>td.dtr-control:before, -table.dataTable.dtr-inline.collapsed>tbody>tr>th.dtr-control:before { +table.dataTable.dtr-inline.collapsed > tbody > tr > td.dtr-control::before, +table.dataTable.dtr-inline.collapsed > tbody > tr > th.dtr-control::before { background-color: var( --color-success ); border-color: transparent; } // Collapse (-) button -table.dataTable.dtr-inline.collapsed>tbody>tr.parent>td.dtr-control:before, -table.dataTable.dtr-inline.collapsed>tbody>tr.parent>th.dtr-control:before { +table.dataTable.dtr-inline.collapsed > tbody > tr.parent > td.dtr-control::before, +table.dataTable.dtr-inline.collapsed > tbody > tr.parent > th.dtr-control::before { background-color: var( --color-destructive ); } @@ -293,8 +292,8 @@ table.dataTable > tbody > tr.child ul.dtr-details > li { .dataTables_length select, .dataTables_filter input { - border: 1px solid var( --border-color-base--darker ); padding: var( --space-xs ); + border: 1px solid var( --border-color-base--darker ); border-radius: var( --border-radius--small ); } } @@ -321,7 +320,7 @@ div.dtsp-panesContainer div.dtsp-searchPanes div.dtsp-searchPane div.dataTables_ div.dtsp-panesContainer div.dtsp-searchPanes div.dtsp-searchPane div.dataTables_wrapper:hover { // Consistent border border: 0; - border-radius: var( --border-radius--medium ); + border-radius: var( --border-radius--medium ); } div.dtsp-columns-2 { @@ -334,19 +333,19 @@ div.dtsp-panesContainer { margin-bottom: var( --space-sm ); div.dtsp-titleRow { - margin-bottom: var( --space-xxs ); display: flex; flex-wrap: wrap; + margin-bottom: var( --space-xxs ); } div.dtsp-title { + flex-grow: 1; padding: var( --space-xs ) 0; font-size: var( --font-size-x-small ); - color: var( --color-base--subtle ); - letter-spacing: 0.05em; line-height: 1; - flex-grow: 1; + color: var( --color-base--subtle ); text-align: start; + letter-spacing: 0.05em; } div.dtsp-title, @@ -360,11 +359,11 @@ div.dtsp-panesContainer { button.dtsp-clearAll, button.dtsp-collapseAll, button.dtsp-showAll { - border: 0; padding: var( --space-xs ) var( --space-sm ); font-weight: var( --font-weight-medium ); - border-radius: var( --border-radius--small ); color: var( --color-base--emphasized ); + border: 0; + border-radius: var( --border-radius--small ); &:hover { background-color: var( --background-color-quiet--hover ); @@ -377,20 +376,20 @@ div.dtsp-panesContainer { } button.dtsp-disabledButton { - background-color: transparent !important; - color: var( --color-base--subtle ); display: none; + color: var( --color-base--subtle ); + background-color: transparent !important; } div.dtsp-searchPanes { gap: var( --space-xs ); div.dtsp-searchPane { + height: fit-content; margin-top: 0 !important; + font-size: var( --font-size-small ); border: 1px solid var( --border-color-base ); border-radius: var( --border-radius--medium ); - height: fit-content; - font-size: var( --font-size-small ); // Hidden pane &:has( .dtsp-hidden ) { @@ -398,9 +397,9 @@ div.dtsp-panesContainer { background-color: transparent; &:hover { - opacity: 1; background-color: var( --background-color-quiet--hover ); border-radius: var( --border-radius--medium ); + opacity: 1; } .dtsp-disabledButton { @@ -413,9 +412,9 @@ div.dtsp-panesContainer { div.dtsp-topRow { min-height: auto; - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; background-color: var( --color-surface-2 ); + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; div.dtsp-searchCont input.dtsp-search { padding-left: var( --space-sm ); @@ -430,8 +429,8 @@ div.dtsp-panesContainer { } button.dtsp-paneButton { - opacity: var( --opacity-icon-base ); filter: var( --filter-invert ); + opacity: var( --opacity-icon-base ); &:hover { opacity: var( --opacity-icon-base--hover ); @@ -444,9 +443,9 @@ div.dtsp-panesContainer { input.dtsp-paneInputButton, button.dtsp-paneButton { - margin: 0; width: 36px; height: 40px; + margin: 0; border-radius: var( --border-radius--small ); &:hover { @@ -464,19 +463,16 @@ div.dtsp-panesContainer { } button.dtsp-collapseButton span.dtsp-caret { + top: 4px; font-size: 24px; } button.clearButton, button.dtsp-collapseButton span.dtsp-caret { + font-weight: var( --font-weight-medium ); // Force to be black to work with filter color: #000; - vertical-align: middle; - font-weight: var( --font-weight-medium ); - } - - button.dtsp-collapseButton span.dtsp-caret { - top: 4px; + vertical-align: middle; } button.dtsp-disabledButton { @@ -489,8 +485,8 @@ div.dtsp-panesContainer { background: transparent !important; table { - tr>th, - tr>td { + tr > th, + tr > td { padding: var( --space-xs ) var( --space-sm ); } } @@ -502,10 +498,10 @@ div.dtsp-panesContainer { } div.dtsp-nameCont span.dtsp-pill { + font-size: var( --font-size-x-small ); + color: var( --color-base ); background: var( --color-surface-2 ); border: 1px solid var( --border-color-base ); - color: var( --color-base ); - font-size: var( --font-size-x-small ); } } } diff --git a/skinStyles/jquery/ui.less b/skinStyles/jquery/ui.less index 52f08569f..f80e2b29e 100644 --- a/skinStyles/jquery/ui.less +++ b/skinStyles/jquery/ui.less @@ -8,7 +8,7 @@ */ /* Component containers -----------------------------------*/ +---------------------------------- */ .ui { &-dialog { box-shadow: var( --box-shadow-dialog ); @@ -19,7 +19,7 @@ &.ui-widget-content { background: var( --color-surface-1 ); - border-radius: var(--border-radius--medium); + border-radius: var( --border-radius--medium ); } } @@ -31,24 +31,24 @@ input, select, textarea { - border-color: var( --border-color-base--darker ); - // Show background when hovered - background-color: transparent; - color: var( --color-base--emphasized ); - padding: var(--space-xxs) var(--space-xs); + padding: var( --space-xxs ) var( --space-xs ); /* FIXME: Replace with line-height-small when we import Codex line height */ line-height: var( --line-height-sm ); + color: var( --color-base--emphasized ); + // Show background when hovered + background-color: transparent; + border-color: var( --border-color-base--darker ); &:hover { - border-color: var( --color-primary--hover ); background-color: var( --color-surface-0 ); + border-color: var( --color-primary--hover ); } &:focus { - border-color: var( --color-primary ); background-color: var( --color-surface-0 ); - box-shadow: inset 0 0 0 1px var( --color-primary ); + border-color: var( --color-primary ); outline: 0; + box-shadow: inset 0 0 0 1px var( --color-primary ); } } @@ -57,34 +57,34 @@ textarea, button { font-family: var( --font-family-base ); - border-radius: var(--border-radius--small); + border-radius: var( --border-radius--small ); } &-content { - border-color: var( --border-color-base ); - background: var( --color-surface-2 ); color: var( --color-base ); + background: var( --color-surface-2 ); + border-color: var( --border-color-base ); } &-header { - background: var( --color-surface-2--hover ); - color: var(--color-base--emphasized); - font-weight: var( --font-weight-semibold ); font-size: 1rem; + font-weight: var( --font-weight-semibold ); + color: var( --color-base--emphasized ); + background: var( --color-surface-2--hover ); border: 0; } } } /* Interaction states -----------------------------------*/ +---------------------------------- */ .ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { - border-color: var( --border-color-base ); - background: var( --color-surface-2 ); + font-weight: var( --font-weight-medium ); color: var( --color-base ); - font-weight: var(--font-weight-medium); + background: var( --color-surface-2 ); + border-color: var( --border-color-base ); } .ui-state-default a, @@ -99,9 +99,9 @@ .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { - border-color: transparent; - background: var( --color-surface-2--hover ); color: var( --color-base--emphasized ); + background: var( --color-surface-2--hover ); + border-color: transparent; } .ui-state-hover a, @@ -114,9 +114,9 @@ .ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { - border-color: var( --color-surface-2--active ); - background: var( --color-surface-2--active ); color: var( --color-base--subtle ); + background: var( --color-surface-2--active ); + border-color: var( --color-surface-2--active ); } .ui-state-active a, @@ -126,13 +126,13 @@ } /* Interaction Cues -----------------------------------*/ +---------------------------------- */ .ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight { - border-color: var( --border-color-base ); - background: var( --background-color-primary--hover ); color: var( --color-primary ); + background: var( --background-color-primary--hover ); + border-color: var( --border-color-base ); } .ui-state-highlight a, @@ -144,9 +144,9 @@ .ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error { - border-color: var( --border-color-base ); - background: var( --background-color-destructive ); color: var( --color-destructive ); + background: var( --background-color-destructive ); + border-color: var( --border-color-base ); } .ui-state-error a, @@ -169,6 +169,6 @@ .skin-citizen-dark { .ui-widget-header .ui-icon { - filter: invert(1) hue-rotate(180deg); + filter: invert( 1 ) hue-rotate( 180deg ); } } diff --git a/skinStyles/mediawiki/mediawiki.page.gallery.styles.less b/skinStyles/mediawiki/mediawiki.page.gallery.styles.less index 4802a7b84..4a5dbaa47 100644 --- a/skinStyles/mediawiki/mediawiki.page.gallery.styles.less +++ b/skinStyles/mediawiki/mediawiki.page.gallery.styles.less @@ -27,10 +27,10 @@ ul.mw-gallery-packed-hover li.gallerybox:hover div.gallerytextwrapper, ul.mw-gallery-packed-overlay li.gallerybox div.gallerytextwrapper, ul.mw-gallery-packed-hover li.gallerybox.mw-gallery-focused div.gallerytextwrapper { right: 0; + width: auto !important; + padding: var( --space-xs ); margin: var( --space-xs ); margin-right: 0; // MAGIC - padding: var( --space-xs ); - width: auto !important; font-weight: var( --font-weight-normal ); // should use the same weight as caption background: var( --background-color-overlay ); } @@ -61,11 +61,11 @@ ul.gallery.mw-gallery-slideshow { @media screen { li.gallerybox div.thumb { + max-width: ~'calc( 100% - var( --space-xs ) )'; + margin: var( --space-xs ); overflow: hidden; // quick hack for rounded corner background-color: var( --color-surface-2 ); border-color: transparent; border-radius: var( --border-radius--small ); - max-width: ~'calc( 100% - var( --space-xs ) )'; - margin: var( --space-xs ); } } diff --git a/skinStyles/mediawiki/special/mediawiki.special.less b/skinStyles/mediawiki/special/mediawiki.special.less index 4d18c2403..2a77fdf92 100644 --- a/skinStyles/mediawiki/special/mediawiki.special.less +++ b/skinStyles/mediawiki/special/mediawiki.special.less @@ -11,12 +11,12 @@ /* Special:Version */ /* MediaWiki License */ #mw-version-license + .plainlinks { - margin-top: var(--space-md); - padding: var( --space-md ); + padding: var( --space-md ); + margin-top: var( --space-md ); + font-size: var( --font-size-small ); + color: var( --color-base--subtle ); border: 1px solid var( --border-color-base ); - border-radius: var( --border-radius--medium ); - font-size: var( --font-size-small ); - color: var( --color-base--subtle ); + border-radius: var( --border-radius--medium ); > p { margin-top: 0; @@ -25,22 +25,22 @@ /* Installed software */ #sv-software { - display: block; - border: 0; + display: block; line-height: var( --line-height-sm ); + border: 0; tbody { display: grid; - grid-template-columns: repeat( auto-fit, minmax( 320px, 1fr ) ); + grid-template-columns: repeat( auto-fit, minmax( 320px, 1fr ) ); gap: var( --space-xs ); } tr { - padding: var( --space-sm ) var( --space-md ); - border: 1px solid var( --border-color-base ); - border-radius: var( --border-radius--medium ); display: flex; flex-direction: column; + padding: var( --space-sm ) var( --space-md ); + border: 1px solid var( --border-color-base ); + border-radius: var( --border-radius--medium ); &:first-child { display: none; // Hide table header @@ -52,8 +52,8 @@ border-top: 0; &:first-child { - font-weight: var( --font-weight-semibold ); font-size: var( --font-size-x-large ); + font-weight: var( --font-weight-semibold ); } } } From f84771f0429f17f3353df1405a806d8bcacc89d5 Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Tue, 16 Apr 2024 01:33:25 -0400 Subject: [PATCH 008/254] =?UTF-8?q?refactor(core):=20=E2=99=BB=EF=B8=8F=20?= =?UTF-8?q?simplify=20sticky=20header=20background=20styles?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/mixins.less | 3 ++- skinStyles/extensions/Echo/ext.echo.special.less | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/resources/mixins.less b/resources/mixins.less index 731bad028..bd91dd02f 100644 --- a/resources/mixins.less +++ b/resources/mixins.less @@ -132,7 +132,8 @@ z-index: -1; height: 100%; content: ''; - background-color: var( --background-color-overlay ); + background-color: var( --color-surface-0 ); + filter: opacity( 0.95 ); backdrop-filter: saturate( 50% ) blur( 16px ); } } diff --git a/skinStyles/extensions/Echo/ext.echo.special.less b/skinStyles/extensions/Echo/ext.echo.special.less index 9f6108131..99822c121 100644 --- a/skinStyles/extensions/Echo/ext.echo.special.less +++ b/skinStyles/extensions/Echo/ext.echo.special.less @@ -78,7 +78,8 @@ margin: 0; margin-bottom: var( --space-md ); overflow-x: auto; - background: var( --background-color-overlay ); + background-color: var( --color-surface-0 ); + filter: opacity( 0.95 ); backdrop-filter: saturate( 50% ) blur( 16px ); border-bottom: 1px solid var( --border-color-base ); box-shadow: none; From 44e7af78bd71d7f88aeb6b173e70dc7278d59113 Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Wed, 17 Apr 2024 14:04:02 -0400 Subject: [PATCH 009/254] =?UTF-8?q?fix(mediawiki):=20=F0=9F=90=9B=20image?= =?UTF-8?q?=20clipping=20in=20packed=20gallery?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix: #822 --- skinStyles/mediawiki/mediawiki.page.gallery.styles.less | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/skinStyles/mediawiki/mediawiki.page.gallery.styles.less b/skinStyles/mediawiki/mediawiki.page.gallery.styles.less index 4a5dbaa47..0fa28a5d8 100644 --- a/skinStyles/mediawiki/mediawiki.page.gallery.styles.less +++ b/skinStyles/mediawiki/mediawiki.page.gallery.styles.less @@ -19,7 +19,7 @@ div.gallerytext { letter-spacing: 0.025em; p { - margin: var( --space-xs ) 0; // reset default style + margin: var( --space-xxs ) 0; // reset default style } } @@ -61,8 +61,7 @@ ul.gallery.mw-gallery-slideshow { @media screen { li.gallerybox div.thumb { - max-width: ~'calc( 100% - var( --space-xs ) )'; - margin: var( --space-xs ); + margin: var( --space-xxs ); overflow: hidden; // quick hack for rounded corner background-color: var( --color-surface-2 ); border-color: transparent; From 756c87dad72b04f55ea6c5b78738eb6301d623d2 Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Wed, 17 Apr 2024 14:44:16 -0400 Subject: [PATCH 010/254] =?UTF-8?q?feat(PortableInfobox):=20=E2=9C=A8=20cl?= =?UTF-8?q?ean=20up=20header=20styles?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- .../ext.PortableInfobox.styles.less | 34 ++++++++++++++++++- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f23d5e3fa..8661d3476 100644 --- a/README.md +++ b/README.md @@ -65,7 +65,7 @@ Name | Grade | Version | Last updated [MultimediaViewer](https://www.mediawiki.org/wiki/Extension:MultimediaViewer) | A | REL1_39 `1b97775` | 2022-11-26 [OAuth](https://www.mediawiki.org/wiki/Extension:OAuth) | B | REL1_35 `451ed95` | 2021-08-31 [Popups](https://www.mediawiki.org/wiki/Extension:Popups) | A | REL1_39 `a40ebc1` | 2022-11-28 -[PortableInfobox](https://www.mediawiki.org/wiki/Extension:PortableInfobox) | B | 0.6 `16a77dc` | 2022-04-14 +[PortableInfobox](https://www.mediawiki.org/wiki/Extension:PortableInfobox) | A | 0.6 `16a77dc` | 2024-04-17 [RelatedArticles](https://www.mediawiki.org/wiki/Extension:RelatedArticles) | A | REL1_39 `f513e5c` | 2022-11-16 [ReplaceText](https://www.mediawiki.org/wiki/Extension:ReplaceText) | B | REL1_39 `af4840a` | 2023-01-03 [RevisionSlider](https://www.mediawiki.org/wiki/Extension:RevisionSlider) | B | REL1_35 `4c4e368` | 2022-06-02 diff --git a/skinStyles/extensions/PortableInfobox/ext.PortableInfobox.styles.less b/skinStyles/extensions/PortableInfobox/ext.PortableInfobox.styles.less index 6d8d68c2d..79e765400 100644 --- a/skinStyles/extensions/PortableInfobox/ext.PortableInfobox.styles.less +++ b/skinStyles/extensions/PortableInfobox/ext.PortableInfobox.styles.less @@ -5,13 +5,45 @@ * Module: ext.PortableInfobox.styles * Version: 0.6 16a77dc * - * Date: 2022-04-14 + * Date: 2024-04-17 */ :root { --pi-background: var( --color-surface-2 ); --pi-border-color: var( --border-color-base ); --pi-secondary-background: var( --color-surface-3 ); + --pi-margin: var( --space-md ); +} + +.pi-caption { + // Align with Citizen caption styles + color: var( --color-base--subtle ); + font-size: var( --font-size-x-small ); + font-style: normal; + letter-spacing: 0.025em; +} + + +.portable-infobox { + font-size: var( --font-size-small ); +} + +.portable-infobox .pi-title { + font-size: var( --font-size-x-large ); + line-height: var( --line-height-sm ); +} + +.portable-infobox .pi-header { + font-size: var( --font-size-medium ); + font-weight: var( --font-weight-semibold ); + line-height: var( --line-height-sm ); +} + +.client-js .pi-collapse { + .pi-header:first-child { + // So that clicking the header won't highlight the entire section + user-select: none; + } } .portable-infobox p { From 5bc35e550049c201dedc6bfc2e3817e0a01fc33c Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 17 Apr 2024 18:45:35 +0000 Subject: [PATCH 011/254] =?UTF-8?q?ci:=20=F0=9F=91=B7=20lint=20code=20to?= =?UTF-8?q?=20MediaWiki=20standards?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Check commit and GitHub actions for more details --- .../PortableInfobox/ext.PortableInfobox.styles.less | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/skinStyles/extensions/PortableInfobox/ext.PortableInfobox.styles.less b/skinStyles/extensions/PortableInfobox/ext.PortableInfobox.styles.less index 79e765400..94f4151ae 100644 --- a/skinStyles/extensions/PortableInfobox/ext.PortableInfobox.styles.less +++ b/skinStyles/extensions/PortableInfobox/ext.PortableInfobox.styles.less @@ -16,14 +16,13 @@ } .pi-caption { + font-size: var( --font-size-x-small ); + font-style: normal; // Align with Citizen caption styles color: var( --color-base--subtle ); - font-size: var( --font-size-x-small ); - font-style: normal; - letter-spacing: 0.025em; + letter-spacing: 0.025em; } - .portable-infobox { font-size: var( --font-size-small ); } @@ -35,8 +34,8 @@ .portable-infobox .pi-header { font-size: var( --font-size-medium ); - font-weight: var( --font-weight-semibold ); - line-height: var( --line-height-sm ); + font-weight: var( --font-weight-semibold ); + line-height: var( --line-height-sm ); } .client-js .pi-collapse { From fa25c73b57cac83006db88e5623a0708d2a72f47 Mon Sep 17 00:00:00 2001 From: "translatewiki.net" Date: Thu, 18 Apr 2024 14:14:57 +0200 Subject: [PATCH 012/254] Localisation updates from https://translatewiki.net. --- i18n/ja.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/i18n/ja.json b/i18n/ja.json index d48656ca1..a1ddb75fa 100644 --- a/i18n/ja.json +++ b/i18n/ja.json @@ -3,6 +3,7 @@ "authors": [ "Alistair3149", "Gogchannel", + "Khsmty", "MathXplore", "Shirayuki", "Tamaki Wakita", @@ -29,7 +30,7 @@ "citizen-footer-tagline": "ここのテキストは[[MediaWiki:Citizen-footer-tagline]]を編集してください", "citizen-action-addsection": "話題を追加", "citizen-jumptotop": "トップに戻る", - "citizen-search-fulltext": "$1を含むページを検索", + "citizen-search-fulltext": "ページ内のテキストを検索", "citizen-search-mediasearch": "メディアを検索", "citizen-search-editpage": "編集またはページを作成", "citizen-search-empty-desc": "入力して検索する", @@ -47,7 +48,7 @@ "prefs-citizen-theme-option-auto": "自動", "prefs-citizen-theme-option-light": "ライト", "prefs-citizen-theme-option-dark": "ダーク", - "prefs-citizen-fontsize-label": "フォント サイズ", + "prefs-citizen-fontsize-label": "フォントサイズ", "prefs-citizen-pagewidth-label": "ページ幅", "prefs-citizen-lineheight-label": "行の高さ", "prefs-citizen-resetbutton-label": "リセット" From 7aef0c5a50a68d09dfd6800dbf1df11738d00dbb Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Fri, 19 Apr 2024 13:48:08 -0400 Subject: [PATCH 013/254] =?UTF-8?q?feat(SMW):=20=E2=9C=A8=20tweak=20browse?= =?UTF-8?q?=20property=20font=20size?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ext.smw.browse.styles.less | 59 ++++++++----------- 1 file changed, 25 insertions(+), 34 deletions(-) diff --git a/skinStyles/extensions/SemanticMediaWiki/ext.smw.browse.styles.less b/skinStyles/extensions/SemanticMediaWiki/ext.smw.browse.styles.less index b8591f37b..95311b85b 100644 --- a/skinStyles/extensions/SemanticMediaWiki/ext.smw.browse.styles.less +++ b/skinStyles/extensions/SemanticMediaWiki/ext.smw.browse.styles.less @@ -5,11 +5,11 @@ * Module: ext.smw.browse.styles * Version: 4.0.2 (0fcdfce) * - * Date: 2022-10-20 + * Date: 2024-04-19 */ -@import '../../../resources/mixins.less'; -@import '../../../resources/variables.less'; +//@import '../../../resources/mixins.less'; +//@import '../../../resources/variables.less'; // Disable sticky header since it collides with anchor and adds no value #citizen-body-header-sticky-sentinel { @@ -40,7 +40,7 @@ } .smwb-title { - font-size: 1.5rem; + font-size: var( --font-size-x-large ); font-weight: var( --font-weight-semibold ); line-height: var( --line-height-xs ); background-color: transparent; @@ -51,19 +51,20 @@ border-bottom: 0; } -.smwb-propvalue { +.smwb-propvalue, +.smwb-ipropvalue { background-color: transparent; -} -.smwb-propvalue .smwb-prophead { - padding: var( --space-xs ) var( --space-md ); - font-size: 1rem; - font-weight: var( --font-weight-medium ); -} + .smwb-prophead { + padding: var( --space-xs ) var( --space-md ); + font-size: var( --font-size-small ); + font-weight: var( --font-weight-medium ); + } -.smwb-propvalue .smwb-propval { - padding: var( --space-xs ) var( --space-md ); - background-color: transparent; + .smwb-propval { + padding: var( --space-xs ) var( --space-md ); + background-color: transparent; + } } .smwb-center, @@ -75,6 +76,10 @@ line-height: 3rem; } +.smwb-action-separator { + border-color: var( --border-color-base ); +} + .smwb-title a, .smwb-center a:first-child, .smwb-actions a:first-child { @@ -110,21 +115,6 @@ border-bottom: 0; } -.smwb-ipropvalue { - background-color: transparent; -} - -.smwb-ipropvalue .smwb-prophead { - padding: var( --space-xs ) var( --space-md ); - font-size: 1rem; - font-weight: var( --font-weight-medium ); -} - -.smwb-ipropvalue .smwb-propval { - padding: var( --space-xs ) var( --space-md ); - background-color: transparent; -} - .smwb-input .button-field input { padding: 6px; } @@ -134,10 +124,6 @@ box-shadow: inset 0 0 0 1px var( --color-primary ); } -.smwb-action-separator { - border-left-color: var( --border-color-base ); -} - /** * Light theme */ @@ -178,5 +164,10 @@ padding: var( --space-md ) 0; background: transparent; border-bottom: 1px solid var( --border-color-base ); - .citizen-sticky-header; + //.citizen-sticky-header; +} + +.smwb-factbox, +.smwb-ifactbox { + font-size: var( --font-size-small ); } From 1d0a4adc5561776b73d093112b1cfaa339088e35 Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Fri, 19 Apr 2024 13:48:45 -0400 Subject: [PATCH 014/254] =?UTF-8?q?style:=20=F0=9F=8E=A8=20stylelint=20fix?= =?UTF-8?q?es?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/skins.citizen.styles/components/Sections.less | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/skins.citizen.styles/components/Sections.less b/resources/skins.citizen.styles/components/Sections.less index 18d91fe06..3ff1f4ffd 100644 --- a/resources/skins.citizen.styles/components/Sections.less +++ b/resources/skins.citizen.styles/components/Sections.less @@ -12,7 +12,7 @@ } .mw-headline, - /* T13555 */ + .mw-heading h1, .mw-heading h2 { opacity: var( --opacity-icon-base ); @@ -20,7 +20,7 @@ } .mw-headline, - /* T13555 */ + .mw-heading h1, .mw-heading h2 { transition: var( --transition-hover ); From 22bad4caab23ccedc2c3cd25c5697f7dd74f7e2f Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 19 Apr 2024 17:50:07 +0000 Subject: [PATCH 015/254] =?UTF-8?q?ci:=20=F0=9F=91=B7=20lint=20code=20to?= =?UTF-8?q?=20MediaWiki=20standards?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Check commit and GitHub actions for more details --- resources/skins.citizen.styles/components/Sections.less | 2 -- 1 file changed, 2 deletions(-) diff --git a/resources/skins.citizen.styles/components/Sections.less b/resources/skins.citizen.styles/components/Sections.less index 3ff1f4ffd..dba03ff33 100644 --- a/resources/skins.citizen.styles/components/Sections.less +++ b/resources/skins.citizen.styles/components/Sections.less @@ -12,7 +12,6 @@ } .mw-headline, - .mw-heading h1, .mw-heading h2 { opacity: var( --opacity-icon-base ); @@ -20,7 +19,6 @@ } .mw-headline, - .mw-heading h1, .mw-heading h2 { transition: var( --transition-hover ); From d8209474901c90132c2ceddc7f26505d0f10427a Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Fri, 19 Apr 2024 14:43:49 -0400 Subject: [PATCH 016/254] =?UTF-8?q?fix(core):=20=F0=9F=90=9B=20hide=20sect?= =?UTF-8?q?ion=20indicator=20unless=20explictly=20enabled?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/Sections.less | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/resources/skins.citizen.styles/components/Sections.less b/resources/skins.citizen.styles/components/Sections.less index dba03ff33..356248064 100644 --- a/resources/skins.citizen.styles/components/Sections.less +++ b/resources/skins.citizen.styles/components/Sections.less @@ -1,3 +1,10 @@ +// Hide indicator when client is noscript +// FIXME: On rare occasion, indicator can appear without the .citizen-sections-enabled class, not sure why +.citizen-section-indicator, +.client-nojs.citizen-sections-enabled .citizen-section-indicator { + display: none; +} + .citizen-sections-enabled { .citizen-section { &-heading { @@ -36,6 +43,7 @@ &-indicator { order: -2; + display: block; width: 1rem; height: 1rem; margin-right: var( --space-sm ); @@ -68,15 +76,6 @@ } } -// Hide indicator when client is noscript -.client-nojs { - .citizen-section { - &-indicator { - display: none; - } - } -} - // Fix hover state on touch devices @media ( hover: none ) { .citizen-sections-enabled .citizen-section { From cc5452c11941d45fb702646c8de31216a8f476f3 Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 19 Apr 2024 18:45:09 +0000 Subject: [PATCH 017/254] =?UTF-8?q?ci:=20=F0=9F=91=B7=20lint=20code=20to?= =?UTF-8?q?=20MediaWiki=20standards?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Check commit and GitHub actions for more details --- resources/skins.citizen.styles/components/Sections.less | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/skins.citizen.styles/components/Sections.less b/resources/skins.citizen.styles/components/Sections.less index 356248064..bbd0710b6 100644 --- a/resources/skins.citizen.styles/components/Sections.less +++ b/resources/skins.citizen.styles/components/Sections.less @@ -42,8 +42,8 @@ } &-indicator { - order: -2; display: block; + order: -2; width: 1rem; height: 1rem; margin-right: var( --space-sm ); From fc47692421f6332032ca479774c68921d2a1f9a4 Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Fri, 19 Apr 2024 15:14:18 -0400 Subject: [PATCH 018/254] =?UTF-8?q?feat(core):=20=E2=9C=A8=20rename=20bord?= =?UTF-8?q?er-color=20variables=20and=20increase=20contrast?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Align variable names with Codex --- .../skins.citizen.styles/common/common.less | 2 +- .../common/cssvariables.less | 14 -------------- .../skins.citizen.styles/common/theme.less | 8 ++++++++ .../skinning/content.media-screen.less | 2 +- .../skinning/content.thumbnails-screen.less | 2 +- .../skinning/interface.category.less | 2 +- resources/variables.less | 15 --------------- skinStyles/codex/codex.styles.less | 16 ++++++++-------- .../CodeEditor/ext.codeEditor.ace.less | 6 +++--- .../MediaSearch/mediasearch.styles.less | 16 ++++++++-------- .../extensions/MsUpload/ext.MsUpload.less | 2 +- .../extensions/MultimediaViewer/mmv.less | 2 +- .../TabberNeue/ext.tabberNeue.legacy.less | 2 +- .../ext.tmh.player.styles.less | 2 +- ...nslate.special.managetranslatorsandbox.less | 4 ++-- .../ext.translate.special.translate.less | 2 +- .../ext.translate.specialpages.styles.less | 2 +- .../Translate/ext.translate.tag.languages.less | 2 +- .../ext.WSSearchFront.module.less | 4 ++-- skinStyles/jquery/datatables.less | 2 +- skinStyles/jquery/ui.less | 2 +- .../mediawiki.rcfilters.filters.ui.less | 2 +- .../special/mediawiki.special.changeslist.less | 2 +- .../mediawiki/ui/mediawiki.ui.checkbox.less | 2 +- .../mediawiki/ui/mediawiki.ui.input.less | 2 +- .../mediawiki/ui/mediawiki.ui.radio.less | 2 +- skinStyles/ooui/oojs-ui-core.less | 18 +++++++++--------- skinStyles/ooui/oojs-ui-widgets.less | 4 ++-- 28 files changed, 60 insertions(+), 81 deletions(-) diff --git a/resources/skins.citizen.styles/common/common.less b/resources/skins.citizen.styles/common/common.less index 263940736..ad61b5854 100644 --- a/resources/skins.citizen.styles/common/common.less +++ b/resources/skins.citizen.styles/common/common.less @@ -39,7 +39,7 @@ select, textarea { color: var( --color-base--emphasized ); background-color: transparent; - border: 1px solid var( --border-color-base--darker ); + border: 1px solid var( --border-color-interactive ); } select option { diff --git a/resources/skins.citizen.styles/common/cssvariables.less b/resources/skins.citizen.styles/common/cssvariables.less index a9247ead2..91cc6234d 100644 --- a/resources/skins.citizen.styles/common/cssvariables.less +++ b/resources/skins.citizen.styles/common/cssvariables.less @@ -53,13 +53,6 @@ /* Size */ --size-icon: @size-icon; - /* Border Colors */ - --border-color-base: @border-color-base; - --border-color-base--lighter: @border-color-base--lighter; - --border-color-base--darker: @border-color-base--darker; - --border-color-input: @border-color-input; - --border-color-input--hover: @border-color-input--hover; - /* Border radius */ --border-radius--small: @border-radius--small; --border-radius--medium: @border-radius--medium; @@ -154,13 +147,6 @@ html { /* Opacity */ --opacity-icon-base--active: @dark-opacity-icon-base--active; - - /* Border Colors */ - --border-color-base: @dark-border-color-base; - --border-color-base--lighter: @dark-border-color-base--lighter; - --border-color-base--darker: @dark-border-color-base--darker; - --border-color-input: @dark-border-color-input; - --border-color-input--hover: @dark-border-color-input--hover; } @media ( min-width: @min-width-breakpoint-tablet ) { diff --git a/resources/skins.citizen.styles/common/theme.less b/resources/skins.citizen.styles/common/theme.less index da366a0e6..0ac5db30b 100644 --- a/resources/skins.citizen.styles/common/theme.less +++ b/resources/skins.citizen.styles/common/theme.less @@ -36,6 +36,10 @@ --background-image-success: linear-gradient( var( --background-color-success ), var( --background-color-success ) ); --background-image-warning: linear-gradient( var( --background-color-warning ), var( --background-color-warning ) ); + --border-color-base: rgba( 0, 0, 0, 0.08 ); + --border-color-subtle: rgba( 0, 0, 0, 0.05 ); + --border-color-interactive: rgba( 0, 0, 0, 0.11 ); + --box-shadow-card: @box-shadow-card; --box-shadow-dialog: @box-shadow-dialog; @@ -76,6 +80,10 @@ a { --color-surface-2--hover: ~'hsl( var( --color-primary__h ), 30%, 19% )'; --color-surface-2--active: ~'hsl( var( --color-primary__h ), 30%, 11% )'; + --border-color-base: rgba( 255, 255, 255, 0.05 ); + --border-color-subtle: rgba( 255, 255, 255, 0.02 ); + --border-color-interactive: rgba( 255, 255, 255, 0.08 ); + --surface-shadow: var( --color-primary__h ), 50%, 3%; --shadow-strength: 0.8; diff --git a/resources/skins.citizen.styles/skinning/content.media-screen.less b/resources/skins.citizen.styles/skinning/content.media-screen.less index f7bba919b..030a73551 100644 --- a/resources/skins.citizen.styles/skinning/content.media-screen.less +++ b/resources/skins.citizen.styles/skinning/content.media-screen.less @@ -50,7 +50,7 @@ figure[ typeof~='mw:File/Frame' ] { // Broken file styles > a:first-child:not( .mw-file-description ) { padding: var( --space-sm ); - border: 1px solid var( --border-color-base--darker ); + border: 1px solid var( --border-color-interactive ); &:hover { color: #fff; diff --git a/resources/skins.citizen.styles/skinning/content.thumbnails-screen.less b/resources/skins.citizen.styles/skinning/content.thumbnails-screen.less index 34a3a8965..c7352c0f4 100644 --- a/resources/skins.citizen.styles/skinning/content.thumbnails-screen.less +++ b/resources/skins.citizen.styles/skinning/content.thumbnails-screen.less @@ -32,7 +32,7 @@ // Broken file styles &:not( .image ) { padding: var( --space-sm ); - border: 1px solid var( --border-color-base--darker ); + border: 1px solid var( --border-color-interactive ); &:hover { color: #fff; diff --git a/resources/skins.citizen.styles/skinning/interface.category.less b/resources/skins.citizen.styles/skinning/interface.category.less index 14420b660..37579893d 100644 --- a/resources/skins.citizen.styles/skinning/interface.category.less +++ b/resources/skins.citizen.styles/skinning/interface.category.less @@ -31,7 +31,7 @@ display: block; padding: var( --space-xs ) var( --space-md ); color: var( --color-base--subtle ); - border: 1px solid var( --border-color-base--darker ); + border: 1px solid var( --border-color-interactive ); border-radius: var( --border-radius--pill ); &:hover { diff --git a/resources/variables.less b/resources/variables.less index f669c6e77..d84efb3e5 100644 --- a/resources/variables.less +++ b/resources/variables.less @@ -191,14 +191,6 @@ @padding-page: 16px; /* Border */ -/* Border colors */ -@border-color-base: rgba( 0, 0, 0, 0.05 ); -@border-color-base--lighter: rgba( 0, 0, 0, 0.02 ); -@border-color-base--darker: rgba( 0, 0, 0, 0.08 ); -// To blend better with OOUI styles -@border-color-input: @border-color-base; -@border-color-input--hover: rgba( 0, 0, 0, 0.4 ); - /* Border radius */ @border-radius--small: 4px; @border-radius--medium: @border-radius--small * 2; @@ -243,13 +235,6 @@ // @dark-opacity-icon-base--hover: 0.6; @dark-opacity-icon-base--active: 0.4; -/* Border colors */ -@dark-border-color-base: rgba( 255, 255, 255, 0.05 ); -@dark-border-color-base--lighter: rgba( 255, 255, 255, 0.02 ); -@dark-border-color-base--darker: rgba( 255, 255, 255, 0.08 ); -@dark-border-color-input: @dark-border-color-base; -@dark-border-color-input--hover: rgba( 255, 255, 255, 0.5 ); - /* * Framework */ diff --git a/skinStyles/codex/codex.styles.less b/skinStyles/codex/codex.styles.less index eb959d2ff..d7bd5b9c1 100644 --- a/skinStyles/codex/codex.styles.less +++ b/skinStyles/codex/codex.styles.less @@ -261,7 +261,7 @@ .cdx-checkbox__icon { // Show background when hovered background-color: transparent; - border-color: var( --border-color-base--darker ); + border-color: var( --border-color-interactive ); border-radius: var( --border-radius--small ); } @@ -398,7 +398,7 @@ .cdx-menu { background-color: var( --color-surface-1 ); - border-color: var( --border-color-base--darker ); + border-color: var( --border-color-interactive ); border-radius: 0 0 var( --border-radius--small ) var( --border-radius--small ); // box-shadow: var( --box-shadow-dialog ); } @@ -407,7 +407,7 @@ color: var( --color-base--emphasized ); // Show background when hovered background-color: transparent; - border-color: var( --border-color-base--darker ); + border-color: var( --border-color-interactive ); } .cdx-text-input__input:enabled ~ .cdx-text-input__icon { @@ -506,7 +506,7 @@ .cdx-radio__icon { // Show background when hovered background-color: transparent; - border-color: var( --border-color-base--darker ); + border-color: var( --border-color-interactive ); } .cdx-radio__input:enabled:hover + .cdx-radio__icon { @@ -564,7 +564,7 @@ color: var( --color-base--emphasized ); // Show background when hovered background-color: transparent; - border-color: var( --border-color-base--darker ); + border-color: var( --border-color-interactive ); } .cdx-select--enabled .cdx-select__handle:hover { @@ -586,7 +586,7 @@ .cdx-select--enabled .cdx-select__handle:active { color: var( --color-base--subtle ); background-color: var( --color-surface-1 ); - border-color: var( --border-color-base--darker ); + border-color: var( --border-color-interactive ); } .cdx-select--enabled.cdx-select--expanded .cdx-select__handle { @@ -790,11 +790,11 @@ .cdx-toggle-switch__switch { // Show background when hovered background-color: transparent; - border-color: var( --border-color-base--darker ); + border-color: var( --border-color-interactive ); } .cdx-toggle-switch__switch__grip { - border-color: var( --border-color-base--darker ); + border-color: var( --border-color-interactive ); } .cdx-toggle-switch__input:enabled ~ .cdx-toggle-switch__switch .cdx-toggle-switch__switch__grip { diff --git a/skinStyles/extensions/CodeEditor/ext.codeEditor.ace.less b/skinStyles/extensions/CodeEditor/ext.codeEditor.ace.less index bb1c2dae6..2db6b2456 100644 --- a/skinStyles/extensions/CodeEditor/ext.codeEditor.ace.less +++ b/skinStyles/extensions/CodeEditor/ext.codeEditor.ace.less @@ -191,7 +191,7 @@ &_field { color: var( --color-base--emphasized ); background-color: transparent; - border-color: var( --border-color-base--darker ); + border-color: var( --border-color-interactive ); border-top-left-radius: var( --border-radius--small ); border-bottom-left-radius: var( --border-radius--small ); @@ -211,10 +211,10 @@ font-weight: var( --font-weight-semibold ); color: var( --color-base--emphasized ); background-color: transparent; - border-color: var( --border-color-base--darker ); + border-color: var( --border-color-interactive ); &:last-child { - border-color: var( --border-color-base--darker ); + border-color: var( --border-color-interactive ); } &:hover { diff --git a/skinStyles/extensions/MediaSearch/mediasearch.styles.less b/skinStyles/extensions/MediaSearch/mediasearch.styles.less index 7c4797d1a..468f4db6b 100644 --- a/skinStyles/extensions/MediaSearch/mediasearch.styles.less +++ b/skinStyles/extensions/MediaSearch/mediasearch.styles.less @@ -51,7 +51,7 @@ &__input { color: var( --color-base--emphasized ); background-color: transparent; - border-color: var( --border-color-base--darker ); + border-color: var( --border-color-interactive ); border-radius: var( --border-radius--small ); &::placeholder { @@ -245,7 +245,7 @@ &__icon { // Show background when hovered background-color: transparent; - border-color: var( --border-color-base--darker ); + border-color: var( --border-color-interactive ); border-radius: var( --border-radius--small ); } @@ -391,7 +391,7 @@ &__icon { // Show background when hovered background-color: transparent; - border-color: var( --border-color-base--darker ); + border-color: var( --border-color-interactive ); } &__input { @@ -459,7 +459,7 @@ color: var( --color-base--emphasized ); // Show background when hovered background-color: transparent; - border-color: var( --border-color-base--darker ); + border-color: var( --border-color-interactive ); &:hover { color: var( --color-base--emphasized ); @@ -479,7 +479,7 @@ &:active { color: var( --color-base--subtle ); - border-color: var( --border-color-base--darker ); + border-color: var( --border-color-interactive ); } } @@ -519,7 +519,7 @@ /* SelectMenu.less */ .sd-select-menu { background-color: var( --color-surface-1 ); - border-color: var( --border-color-base--darker ); + border-color: var( --border-color-interactive ); border-radius: 0 0 var( --border-radius--small ) var( --border-radius--small ); // box-shadow: var( --box-shadow-dialog ); @@ -918,7 +918,7 @@ &:active { background-color: var( --color-surface-1 ); - border-color: var( --border-color-base--darker ); + border-color: var( --border-color-interactive ); } } @@ -961,7 +961,7 @@ &:active { background-color: var( --color-surface-1 ); - border-color: var( --border-color-base--darker ); + border-color: var( --border-color-interactive ); } } diff --git a/skinStyles/extensions/MsUpload/ext.MsUpload.less b/skinStyles/extensions/MsUpload/ext.MsUpload.less index 37ec2d836..ed4072756 100644 --- a/skinStyles/extensions/MsUpload/ext.MsUpload.less +++ b/skinStyles/extensions/MsUpload/ext.MsUpload.less @@ -28,7 +28,7 @@ font-size: var( --font-size-small ); font-weight: var( --font-weight-medium ); color: var( --color-base ); - border-color: var( --border-color-base--darker ); + border-color: var( --border-color-interactive ); } &-list { diff --git a/skinStyles/extensions/MultimediaViewer/mmv.less b/skinStyles/extensions/MultimediaViewer/mmv.less index c958b48da..3a91e2c64 100644 --- a/skinStyles/extensions/MultimediaViewer/mmv.less +++ b/skinStyles/extensions/MultimediaViewer/mmv.less @@ -633,7 +633,7 @@ &.mw-mmv-untruncated { // Since background color is dependent on theme now &::before { - background-color: var( --border-color-base--darker ); + background-color: var( --border-color-interactive ); } } } diff --git a/skinStyles/extensions/TabberNeue/ext.tabberNeue.legacy.less b/skinStyles/extensions/TabberNeue/ext.tabberNeue.legacy.less index 08d6702fc..f998f8a52 100644 --- a/skinStyles/extensions/TabberNeue/ext.tabberNeue.legacy.less +++ b/skinStyles/extensions/TabberNeue/ext.tabberNeue.legacy.less @@ -28,7 +28,7 @@ } &__header { - box-shadow: inset 0 -1px 0 0 var( --border-color-base--darker ); + box-shadow: inset 0 -1px 0 0 var( --border-color-interactive ); &__prev, &__next { diff --git a/skinStyles/extensions/TimedMediaHandler/ext.tmh.player.styles.less b/skinStyles/extensions/TimedMediaHandler/ext.tmh.player.styles.less index f2bb1d9fc..933f79d60 100644 --- a/skinStyles/extensions/TimedMediaHandler/ext.tmh.player.styles.less +++ b/skinStyles/extensions/TimedMediaHandler/ext.tmh.player.styles.less @@ -13,7 +13,7 @@ top: 50%; margin: 0 auto; background-color: var( --color-surface-1 ); - border-color: var( --border-color-base--lighter ); + border-color: var( --border-color-subtle ); border-radius: var( --border-radius--pill ); &-bar { diff --git a/skinStyles/extensions/Translate/ext.translate.special.managetranslatorsandbox.less b/skinStyles/extensions/Translate/ext.translate.special.managetranslatorsandbox.less index 47d169860..5b5b38338 100644 --- a/skinStyles/extensions/Translate/ext.translate.special.managetranslatorsandbox.less +++ b/skinStyles/extensions/Translate/ext.translate.special.managetranslatorsandbox.less @@ -94,11 +94,11 @@ } .language-selector:hover { - border-color: var( --border-color-base--darker ); + border-color: var( --border-color-interactive ); } .language-selector.unselected::after { - border-top-color: var( --border-color-base--darker ); + border-top-color: var( --border-color-interactive ); } .translations .row { diff --git a/skinStyles/extensions/Translate/ext.translate.special.translate.less b/skinStyles/extensions/Translate/ext.translate.special.translate.less index 64cdd73f1..685cff886 100644 --- a/skinStyles/extensions/Translate/ext.translate.special.translate.less +++ b/skinStyles/extensions/Translate/ext.translate.special.translate.less @@ -15,7 +15,7 @@ } .tux-workflow-status:hover { - border-color: var( --border-color-base--darker ); + border-color: var( --border-color-interactive ); } .tux-workflow-status-triangle::after { diff --git a/skinStyles/extensions/Translate/ext.translate.specialpages.styles.less b/skinStyles/extensions/Translate/ext.translate.specialpages.styles.less index dc33b2e82..69caccd76 100644 --- a/skinStyles/extensions/Translate/ext.translate.specialpages.styles.less +++ b/skinStyles/extensions/Translate/ext.translate.specialpages.styles.less @@ -95,7 +95,7 @@ .translate-search-more-groups:hover, .translate-search-more-languages:hover { - border-color: var( --border-color-base--darker ); + border-color: var( --border-color-interactive ); } .translate-search-more-groups-info, diff --git a/skinStyles/extensions/Translate/ext.translate.tag.languages.less b/skinStyles/extensions/Translate/ext.translate.tag.languages.less index 93f06c830..c3ea64d8c 100644 --- a/skinStyles/extensions/Translate/ext.translate.tag.languages.less +++ b/skinStyles/extensions/Translate/ext.translate.tag.languages.less @@ -49,7 +49,7 @@ display: block; padding: var( --space-xs ) var( --space-md ); color: var( --color-base--subtle ); - border: 1px solid var( --border-color-base--darker ); + border: 1px solid var( --border-color-interactive ); border-radius: var( --border-radius--pill ); &:hover, diff --git a/skinStyles/extensions/WSSearchFront/ext.WSSearchFront.module.less b/skinStyles/extensions/WSSearchFront/ext.WSSearchFront.module.less index bb5f0c1a0..8116d2454 100644 --- a/skinStyles/extensions/WSSearchFront/ext.WSSearchFront.module.less +++ b/skinStyles/extensions/WSSearchFront/ext.WSSearchFront.module.less @@ -32,11 +32,11 @@ .wssearch--search-button { color: var( --color-base ); background-color: var( --base-color ); - border: 1px solid var( --border-color-input ); + border: 1px solid var( --border-color-interactive ); &:hover { background-color: var( --base-color-lighter ); - border-color: var( --border-color-input--hover ); + border-color: var( --border-color-interactive--hover ); } &:focus { diff --git a/skinStyles/jquery/datatables.less b/skinStyles/jquery/datatables.less index 778fb8039..664519e31 100644 --- a/skinStyles/jquery/datatables.less +++ b/skinStyles/jquery/datatables.less @@ -293,7 +293,7 @@ table.dataTable > tbody > tr.child ul.dtr-details > li { .dataTables_length select, .dataTables_filter input { padding: var( --space-xs ); - border: 1px solid var( --border-color-base--darker ); + border: 1px solid var( --border-color-interactive ); border-radius: var( --border-radius--small ); } } diff --git a/skinStyles/jquery/ui.less b/skinStyles/jquery/ui.less index f80e2b29e..f6d3206e7 100644 --- a/skinStyles/jquery/ui.less +++ b/skinStyles/jquery/ui.less @@ -37,7 +37,7 @@ color: var( --color-base--emphasized ); // Show background when hovered background-color: transparent; - border-color: var( --border-color-base--darker ); + border-color: var( --border-color-interactive ); &:hover { background-color: var( --color-surface-0 ); diff --git a/skinStyles/mediawiki/mediawiki.rcfilters.filters.ui.less b/skinStyles/mediawiki/mediawiki.rcfilters.filters.ui.less index 6d6759017..e7ee80150 100644 --- a/skinStyles/mediawiki/mediawiki.rcfilters.filters.ui.less +++ b/skinStyles/mediawiki/mediawiki.rcfilters.filters.ui.less @@ -65,7 +65,7 @@ &-views { &-select { &-widget.oo-ui-widget { - border-color: var( --border-color-base--darker ); // align with input field on the left + border-color: var( --border-color-interactive ); // align with input field on the left border-top-color: transparent; border-left-width: 0; border-radius: 0 0 var( --border-radius--small ) 0; diff --git a/skinStyles/mediawiki/special/mediawiki.special.changeslist.less b/skinStyles/mediawiki/special/mediawiki.special.changeslist.less index 50aad962e..c6f58c306 100644 --- a/skinStyles/mediawiki/special/mediawiki.special.changeslist.less +++ b/skinStyles/mediawiki/special/mediawiki.special.changeslist.less @@ -145,7 +145,7 @@ body:not( .mw-rcfilters-ui-initialized ) .mw-rcfilters-head { left: 4px; width: 1px; content: ''; - background: var( --border-color-base--darker ); + background: var( --border-color-interactive ); } } diff --git a/skinStyles/mediawiki/ui/mediawiki.ui.checkbox.less b/skinStyles/mediawiki/ui/mediawiki.ui.checkbox.less index 9806668bc..548863bf1 100644 --- a/skinStyles/mediawiki/ui/mediawiki.ui.checkbox.less +++ b/skinStyles/mediawiki/ui/mediawiki.ui.checkbox.less @@ -13,7 +13,7 @@ & + label::before { // Show background when hovered background-color: transparent; - border-color: var( --border-color-base--darker ); + border-color: var( --border-color-interactive ); border-radius: var( --border-radius--small ); } diff --git a/skinStyles/mediawiki/ui/mediawiki.ui.input.less b/skinStyles/mediawiki/ui/mediawiki.ui.input.less index 5d244b7b6..0fc1f5650 100644 --- a/skinStyles/mediawiki/ui/mediawiki.ui.input.less +++ b/skinStyles/mediawiki/ui/mediawiki.ui.input.less @@ -13,7 +13,7 @@ line-height: var( --line-height-xs ); color: var( --color-base--emphasized ); background-color: transparent; - border-color: var( --border-color-base--darker ); + border-color: var( --border-color-interactive ); border-radius: var( --border-radius--small ); &:hover { diff --git a/skinStyles/mediawiki/ui/mediawiki.ui.radio.less b/skinStyles/mediawiki/ui/mediawiki.ui.radio.less index 206cfe636..ca1b28397 100644 --- a/skinStyles/mediawiki/ui/mediawiki.ui.radio.less +++ b/skinStyles/mediawiki/ui/mediawiki.ui.radio.less @@ -14,7 +14,7 @@ &::before { // Show background when hovered background-color: transparent; - border-color: var( --border-color-base--darker ); + border-color: var( --border-color-interactive ); } } diff --git a/skinStyles/ooui/oojs-ui-core.less b/skinStyles/ooui/oojs-ui-core.less index 64c9138bd..900f24712 100644 --- a/skinStyles/ooui/oojs-ui-core.less +++ b/skinStyles/ooui/oojs-ui-core.less @@ -401,7 +401,7 @@ TODO: Need to refactor the current shadow for filter drop-shadow, see variables. .oo-ui-checkboxInputWidget [ type='checkbox' ] + span { // Show background when hovered background-color: transparent; - border-color: var( --border-color-base--darker ); + border-color: var( --border-color-interactive ); } .oo-ui-checkboxInputWidget [ type='checkbox' ]:disabled + span { @@ -453,7 +453,7 @@ TODO: Need to refactor the current shadow for filter drop-shadow, see variables. } .oo-ui-dropdownInputWidget select { - border-color: var( --border-color-base--darker ); + border-color: var( --border-color-interactive ); border-radius: var( --border-radius--small ); } @@ -477,7 +477,7 @@ TODO: Need to refactor the current shadow for filter drop-shadow, see variables. .oo-ui-dropdownInputWidget.oo-ui-widget-enabled select:active { color: var( --color-base--emphasized ); - border-color: var( --border-color-base--darker ); + border-color: var( --border-color-interactive ); } .oo-ui-dropdownInputWidget.oo-ui-widget-enabled select:focus { @@ -497,7 +497,7 @@ TODO: Need to refactor the current shadow for filter drop-shadow, see variables. .oo-ui-radioInputWidget [ type='radio' ] + span { // Show background when hovered background-color: transparent; - border-color: var( --border-color-base--darker ); + border-color: var( --border-color-interactive ); } .oo-ui-radioInputWidget [ type='radio' ]:disabled + span { @@ -537,7 +537,7 @@ TODO: Need to refactor the current shadow for filter drop-shadow, see variables. color: var( --color-base--emphasized ); // Show background when hovered background-color: transparent; - border-color: var( --border-color-base--darker ); + border-color: var( --border-color-interactive ); border-radius: var( --border-radius--small ); } @@ -606,7 +606,7 @@ TODO: Need to refactor the current shadow for filter drop-shadow, see variables. color: var( --color-base--subtle ); text-shadow: none; background-color: var( --color-surface-4 ); - border-color: var( --border-color-base--darker ); + border-color: var( --border-color-interactive ); -webkit-text-fill-color: var( --color-base--subtle ); } @@ -623,7 +623,7 @@ TODO: Need to refactor the current shadow for filter drop-shadow, see variables. .oo-ui-menuSelectWidget { z-index: @z-index-overlay; background-color: var( --color-surface-1 ); - border-color: var( --border-color-base--darker ); + border-color: var( --border-color-interactive ); border-radius: 0 0 var( --border-radius--small ) var( --border-radius--small ); box-shadow: var( --box-shadow-dialog ); } @@ -654,7 +654,7 @@ TODO: Need to refactor the current shadow for filter drop-shadow, see variables. } .oo-ui-dropdownWidget-handle { - border-color: var( --border-color-base--darker ); + border-color: var( --border-color-interactive ); border-radius: var( --border-radius--small ); } @@ -678,7 +678,7 @@ TODO: Need to refactor the current shadow for filter drop-shadow, see variables. .oo-ui-dropdownWidget.oo-ui-widget-enabled .oo-ui-dropdownWidget-handle:active { color: var( --color-base--emphasized ); - border-color: var( --border-color-base--darker ); + border-color: var( --border-color-interactive ); } .oo-ui-dropdownWidget.oo-ui-widget-enabled .oo-ui-dropdownWidget-handle:focus { diff --git a/skinStyles/ooui/oojs-ui-widgets.less b/skinStyles/ooui/oojs-ui-widgets.less index 33c930ffa..33f1e9cc6 100644 --- a/skinStyles/ooui/oojs-ui-widgets.less +++ b/skinStyles/ooui/oojs-ui-widgets.less @@ -47,13 +47,13 @@ .oo-ui-toggleSwitchWidget { // Show background when hovered background-color: transparent; - border-color: var( --border-color-base--darker ); + border-color: var( --border-color-interactive ); } .oo-ui-toggleSwitchWidget.oo-ui-widget-enabled .oo-ui-toggleSwitchWidget-grip { // Show background when hovered background-color: transparent; - border-color: var( --border-color-base--darker ); + border-color: var( --border-color-interactive ); } .oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover { From a3e060b90c8e8b1d7b6375f24c51f29369a4c84c Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Fri, 19 Apr 2024 15:20:45 -0400 Subject: [PATCH 019/254] =?UTF-8?q?feat(core):=20=E2=9C=A8=20tweak=20light?= =?UTF-8?q?=20theme=20colors?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Decrease saturation for surface-0 - Increase saturation for other surfaces --- resources/skins.citizen.styles/common/theme.less | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/resources/skins.citizen.styles/common/theme.less b/resources/skins.citizen.styles/common/theme.less index 0ac5db30b..b616da161 100644 --- a/resources/skins.citizen.styles/common/theme.less +++ b/resources/skins.citizen.styles/common/theme.less @@ -6,11 +6,11 @@ --color-primary__s: @color-primary__s; --color-primary__l: @color-primary__l; - --color-surface-0: ~'hsl( var( --color-primary__h ), 25%, 94% )'; - --color-surface-1: ~'hsl( var( --color-primary__h ), 30%, 92% )'; - --color-surface-2: ~'hsl( var( --color-primary__h ), 30%, 90% )'; - --color-surface-3: ~'hsl( var( --color-primary__h ), 20%, 88% )'; - --color-surface-4: ~'hsl( var( --color-primary__h ), 10%, 86% )'; + --color-surface-0: ~'hsl( var( --color-primary__h ), 30%, 96% )'; + --color-surface-1: ~'hsl( var( --color-primary__h ), 40%, 94% )'; + --color-surface-2: ~'hsl( var( --color-primary__h ), 30%, 92% )'; + --color-surface-3: ~'hsl( var( --color-primary__h ), 20%, 90% )'; + --color-surface-4: ~'hsl( var( --color-primary__h ), 10%, 88% )'; --color-base--emphasized: ~'hsl( var( --color-primary__h ), 85%, 5% )'; --color-base: ~'hsl( var( --color-primary__h ), 30%, 20% )'; From 6b6dc5b26992995def7d928001000723dbb4286e Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Fri, 19 Apr 2024 16:24:41 -0400 Subject: [PATCH 020/254] =?UTF-8?q?feat(core):=20=E2=9C=A8=20increase=20li?= =?UTF-8?q?ne=20height=20for=20CJK=20text?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit To improve readability on sites using Chinese, Japanese, and Korean. --- resources/skins.citizen.styles/common/cssvariables.less | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/resources/skins.citizen.styles/common/cssvariables.less b/resources/skins.citizen.styles/common/cssvariables.less index 91cc6234d..7ad1f579d 100644 --- a/resources/skins.citizen.styles/common/cssvariables.less +++ b/resources/skins.citizen.styles/common/cssvariables.less @@ -115,6 +115,13 @@ html { --padding-page: @padding-page; } +:lang(ja), +:lang(ko), +:lang(zh) { + /* CJK languages need increased line-height for readability */ + --line-height: 1.75; +} + /** * Dark theme */ From b9a524bab481ac98c9a95f16329ea8f3745e2d67 Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 19 Apr 2024 20:26:48 +0000 Subject: [PATCH 021/254] =?UTF-8?q?ci:=20=F0=9F=91=B7=20lint=20code=20to?= =?UTF-8?q?=20MediaWiki=20standards?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Check commit and GitHub actions for more details --- resources/skins.citizen.styles/common/cssvariables.less | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/skins.citizen.styles/common/cssvariables.less b/resources/skins.citizen.styles/common/cssvariables.less index 7ad1f579d..3cbf8b668 100644 --- a/resources/skins.citizen.styles/common/cssvariables.less +++ b/resources/skins.citizen.styles/common/cssvariables.less @@ -115,9 +115,9 @@ html { --padding-page: @padding-page; } -:lang(ja), -:lang(ko), -:lang(zh) { +:lang( ja ), +:lang( ko ), +:lang( zh ) { /* CJK languages need increased line-height for readability */ --line-height: 1.75; } From 6dd0f09aca3621998c5efce2b6c700f5bb9c846c Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Fri, 19 Apr 2024 16:55:08 -0400 Subject: [PATCH 022/254] =?UTF-8?q?feat(core):=20=E2=9C=A8=20proper=20em?= =?UTF-8?q?=20handling=20for=20CJK=20languages?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/typography.less | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/resources/skins.citizen.styles/common/typography.less b/resources/skins.citizen.styles/common/typography.less index 01afd3503..0af9580ec 100644 --- a/resources/skins.citizen.styles/common/typography.less +++ b/resources/skins.citizen.styles/common/typography.less @@ -43,6 +43,27 @@ sup { font-size: 80%; } +em { + :lang( ja ) &, + :lang( ko ) &, + :lang( mn ) &, + :lang( zh ) & { + /* CJK languages do not use italics for emphasis */ + font-style: normal; + text-emphasis: filled; + } + + :lang( ja ) &, + :lang( ko ) &, + :lang( mn ) & { + text-emphasis-position: over right; + } + + :lang( zh ) & { + text-emphasis-position: under right; + } +} + .mw-logo-wordmark { font-weight: var( --font-weight-semibold ); } From 5d8ba9f7b10e12ac1b4cdef5530f9ba0cad26465 Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Fri, 19 Apr 2024 17:07:08 -0400 Subject: [PATCH 023/254] =?UTF-8?q?feat(SMW):=20=E2=9C=A8=20hide=20entity?= =?UTF-8?q?=20examiner=20indicator?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SemanticMediaWiki/ext.smw.style.less | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/skinStyles/extensions/SemanticMediaWiki/ext.smw.style.less b/skinStyles/extensions/SemanticMediaWiki/ext.smw.style.less index 25741da7e..ec92cfcf7 100644 --- a/skinStyles/extensions/SemanticMediaWiki/ext.smw.style.less +++ b/skinStyles/extensions/SemanticMediaWiki/ext.smw.style.less @@ -543,22 +543,26 @@ a.smw-ask-action-btn-lblue:active { } /* smw/smw.indicators.css */ -/* Turn SMW logo into a loading spinner */ .smw-indicator-vertical-bar-loader { - width: 28px; - height: 28px; + /* This can cause significant layout shift on pages, hide it completely. */ + display: none; + + /* Turn SMW logo into a loading spinner */ + /* + width: 20px; + height: 20px; margin: 0; - /* Perhaps base64 is not the best for performance */ background: url( data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbDpzcGFjZT0icHJlc2VydmUiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDM3NSAzMzUiIHZpZXdCb3g9IjAgMCAzNzUgMzM1Ij48cGF0aCBkPSJNMjY2LjggMzA1SDEwOC4yTDI4LjggMTY3LjUgMTA4LjIgMzBoMTU4LjdsNzkuMyAxMzcuNUwyNjYuOCAzMDV6bS0xNTAtMTVoMTQxLjNsNzAuNy0xMjIuNUwyNTguMiA0NUgxMTYuOEw0Ni4yIDE2Ny41IDExNi44IDI5MHoiLz48Y2lyY2xlIGN4PSIxMTIuNSIgY3k9IjM3LjUiIHI9IjM3LjUiLz48Y2lyY2xlIGN4PSIyNjIuNSIgY3k9IjM3LjUiIHI9IjM3LjUiLz48Y2lyY2xlIGN4PSIzNy41IiBjeT0iMTY3LjUiIHI9IjM3LjUiLz48Y2lyY2xlIGN4PSIzMzcuNSIgY3k9IjE2Ny41IiByPSIzNy41Ii8+PGNpcmNsZSBjeD0iMTEyLjUiIGN5PSIyOTcuNSIgcj0iMzcuNSIvPjxjaXJjbGUgY3g9IjI2Mi41IiBjeT0iMjk3LjUiIHI9IjM3LjUiLz48Y2lyY2xlIGN4PSIxODcuNSIgY3k9IjE2Ny41IiByPSI3NSIvPjwvc3ZnPg== ); background-repeat: no-repeat; background-position: center; opacity: var( --opacity-icon-base ); animation: load2 1s infinite ease-in-out; -} -.smw-indicator-vertical-bar-loader::before, -.smw-indicator-vertical-bar-loader::after { - display: none; + &::before, + &::after { + display: none; + } + */ } @keyframes load2 { From bee98d6603655e140c3fe4ad2394f4e961d21fd8 Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Fri, 19 Apr 2024 17:09:14 -0400 Subject: [PATCH 024/254] =?UTF-8?q?chore(release):=20=F0=9F=9A=80=202.12.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 20 ++++++++++++++++++++ package-lock.json | 4 ++-- package.json | 2 +- skin.json | 2 +- 4 files changed, 24 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 616dd4205..c6ea77a7e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,26 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +## [2.12.0](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/compare/v2.11.1...v2.12.0) (2024-04-19) + + +### Features + +* **core:** ✨ increase line height for CJK text ([6b6dc5b](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/6b6dc5b26992995def7d928001000723dbb4286e)) +* **core:** ✨ proper em handling for CJK languages ([6dd0f09](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/6dd0f09aca3621998c5efce2b6c700f5bb9c846c)) +* **core:** ✨ rename border-color variables and increase contrast ([fc47692](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/fc47692421f6332032ca479774c68921d2a1f9a4)) +* **core:** ✨ tweak light theme colors ([a3e060b](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/a3e060b90c8e8b1d7b6375f24c51f29369a4c84c)) +* **PortableInfobox:** ✨ clean up header styles ([756c87d](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/756c87dad72b04f55ea6c5b78738eb6301d623d2)) +* **SMW:** ✨ hide entity examiner indicator ([5d8ba9f](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/5d8ba9f7b10e12ac1b4cdef5530f9ba0cad26465)) +* **SMW:** ✨ tweak browse property font size ([7aef0c5](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/7aef0c5a50a68d09dfd6800dbf1df11738d00dbb)) + + +### Bug Fixes + +* **core:** 🐛 hide section indicator unless explictly enabled ([d820947](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/d8209474901c90132c2ceddc7f26505d0f10427a)) +* **core:** 🐛 incorrect selector for SemanticResultFormats datatables ([84cf306](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/84cf306df1479737f0608f6f58323f4e06681fea)) +* **mediawiki:** 🐛 image clipping in packed gallery ([44e7af7](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/44e7af78bd71d7f88aeb6b173e70dc7278d59113)), closes [#822](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/issues/822) + ### [2.11.1](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/compare/v2.11.0...v2.11.1) (2024-04-06) diff --git a/package-lock.json b/package-lock.json index 3596baa14..cffb1f675 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "Citizen", - "version": "2.11.1", + "version": "2.12.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "Citizen", - "version": "2.11.1", + "version": "2.12.0", "devDependencies": { "@commitlint/cli": "^19.2.2", "@commitlint/config-conventional": "^19.2.2", diff --git a/package.json b/package.json index f23099006..d3d6c4b7d 100644 --- a/package.json +++ b/package.json @@ -31,5 +31,5 @@ "stylelint-order": "^6.0.3", "svgo": "3.2.0" }, - "version": "2.11.1" + "version": "2.12.0" } diff --git a/skin.json b/skin.json index 9ecace0e6..2598b8edb 100644 --- a/skin.json +++ b/skin.json @@ -1,6 +1,6 @@ { "name": "Citizen", - "version": "2.11.1", + "version": "2.12.0", "author": [ "[https://www.mediawiki.org/wiki/User:Alistair3149 Alistair3149]", "[https://www.mediawiki.org/wiki/User:Octfx Octfx]", From 0a0a6631b08e3af73db284c7528105b241802cab Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Fri, 19 Apr 2024 23:02:23 -0400 Subject: [PATCH 025/254] =?UTF-8?q?fix(core):=20=F0=9F=90=9B=20remove=20ma?= =?UTF-8?q?rgin=20when=20contentSub=20is=20empty?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../skins.citizen.styles/skinning/interface-subtitle.less | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/resources/skins.citizen.styles/skinning/interface-subtitle.less b/resources/skins.citizen.styles/skinning/interface-subtitle.less index 428de3cff..2873d1915 100644 --- a/resources/skins.citizen.styles/skinning/interface-subtitle.less +++ b/resources/skins.citizen.styles/skinning/interface-subtitle.less @@ -15,7 +15,8 @@ color: var( --color-base--subtle ); } -#contentSub, +// #contentSub can be empty +#contentSub:not( :empty ), #contentSub2 { margin-bottom: var( --space-md ); } From cd21fd05f3063b1c55e0dc5231c4176601c0972d Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Sat, 20 Apr 2024 01:32:37 -0400 Subject: [PATCH 026/254] =?UTF-8?q?fix(core):=20=F0=9F=90=9B=20make=20ToC?= =?UTF-8?q?=20tracking=20work=20for=20non-content=20pages?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Since MW 1.40, ToC has been enabled on all pages including non-content page. By generating a list of elements to track through the ToC instead of targeting specific classes, it should be more resilient and will work for non-content pages. --- .../skins.citizen.scripts/tableOfContents.js | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/resources/skins.citizen.scripts/tableOfContents.js b/resources/skins.citizen.scripts/tableOfContents.js index 8a49847d9..d00f508c7 100644 --- a/resources/skins.citizen.scripts/tableOfContents.js +++ b/resources/skins.citizen.scripts/tableOfContents.js @@ -44,14 +44,22 @@ function changeActiveSection( id ) { * @return {void} */ function init( bodyContent ) { - if ( !document.getElementById( 'mw-panel-toc' ) ) { + const tocEl = document.getElementById( 'mw-panel-toc' ); + if ( !tocEl ) { return; } - const getElements = () => { - /* T13555 */ - return bodyContent.querySelectorAll( '.mw-headline' ).length > 0 ? bodyContent.querySelectorAll( '.mw-headline' ) : - bodyContent.querySelectorAll( '.mw-heading' ); + const getHeadlineElements = () => { + const getHeadlineIds = () => { + const headlineIds = []; + // Nodelist.forEach is forbidden by mediawiki/no-nodelist-unsupported-methods + Array.from( tocEl.querySelectorAll( '.citizen-toc__listItem' ) ).forEach( ( tocListEl ) => { + // Remove 'toc-' prefix from ID + headlineIds.push( '#' + tocListEl.id.slice( 4 ) ); + } ); + return headlineIds.join( ',' ); + }; + return bodyContent.querySelectorAll( getHeadlineIds() ); }; // We use scroll-padding-top to handle scrolling with fixed header @@ -64,7 +72,7 @@ function init( bodyContent ) { ) + 20; }; - const headlines = getElements(); + const headlines = getHeadlineElements(); // Do not continue if there are no headlines // TODO: Need to revamp the selector so that it works better with MW 1.40, From 4aa7a220eff62686b8e7fb27ffd78fec9ea6300e Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Tue, 23 Apr 2024 18:42:28 -0400 Subject: [PATCH 027/254] =?UTF-8?q?fix(ooui):=20=F0=9F=90=9B=20load=20skin?= =?UTF-8?q?Styles=20when=20only=20styles=20are=20initalized?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- skin.json | 1 + 1 file changed, 1 insertion(+) diff --git a/skin.json b/skin.json index 2598b8edb..1fba41dea 100644 --- a/skin.json +++ b/skin.json @@ -554,6 +554,7 @@ "+oojs-ui-core.styles": "skinStyles/ooui/oojs-ui-core.less", "+oojs-ui-toolbars": "skinStyles/ooui/oojs-ui-toolbars.less", "+oojs-ui-widgets": "skinStyles/ooui/oojs-ui-widgets.less", + "+oojs-ui-widgets.styles": "skinStyles/ooui/oojs-ui-widgets.less", "+oojs-ui-windows": "skinStyles/ooui/oojs-ui-windows.less", "+jquery.spinner.styles": "skinStyles/jquery.spinner/jquery.spinner.styles.less", "+jquery.ui": "skinStyles/jquery/ui.less", From e50320c86302321467372d53cad676851cc7c08f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 23 Apr 2024 20:48:48 -0400 Subject: [PATCH 028/254] chore(deps-dev): bump @commitlint/cli from 19.2.2 to 19.3.0 (#830) Bumps [@commitlint/cli](https://github.com/conventional-changelog/commitlint/tree/HEAD/@commitlint/cli) from 19.2.2 to 19.3.0. - [Release notes](https://github.com/conventional-changelog/commitlint/releases) - [Changelog](https://github.com/conventional-changelog/commitlint/blob/master/@commitlint/cli/CHANGELOG.md) - [Commits](https://github.com/conventional-changelog/commitlint/commits/v19.3.0/@commitlint/cli) --- updated-dependencies: - dependency-name: "@commitlint/cli" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 16 ++++++++-------- package.json | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index cffb1f675..69da7b459 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,7 +8,7 @@ "name": "Citizen", "version": "2.12.0", "devDependencies": { - "@commitlint/cli": "^19.2.2", + "@commitlint/cli": "^19.3.0", "@commitlint/config-conventional": "^19.2.2", "@wikimedia/types-wikimedia": "0.4.2", "devmoji": "^2.3.0", @@ -141,12 +141,12 @@ } }, "node_modules/@commitlint/cli": { - "version": "19.2.2", - "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-19.2.2.tgz", - "integrity": "sha512-P8cbOHfg2PQRzfICLSrzUVOCVMqjEZ8Hlth6mtJ4yOEjT47Q5PbIGymgX3rLVylNw+3IAT2Djn9IJ2wHbXFzBg==", + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-19.3.0.tgz", + "integrity": "sha512-LgYWOwuDR7BSTQ9OLZ12m7F/qhNY+NpAyPBgo4YNMkACE7lGuUnuQq1yi9hz1KA4+3VqpOYl8H1rY/LYK43v7g==", "dev": true, "dependencies": { - "@commitlint/format": "^19.0.3", + "@commitlint/format": "^19.3.0", "@commitlint/lint": "^19.2.2", "@commitlint/load": "^19.2.0", "@commitlint/read": "^19.2.1", @@ -214,9 +214,9 @@ } }, "node_modules/@commitlint/format": { - "version": "19.0.3", - "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-19.0.3.tgz", - "integrity": "sha512-QjjyGyoiVWzx1f5xOteKHNLFyhyweVifMgopozSgx1fGNrGV8+wp7k6n1t6StHdJ6maQJ+UUtO2TcEiBFRyR6Q==", + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-19.3.0.tgz", + "integrity": "sha512-luguk5/aF68HiF4H23ACAfk8qS8AHxl4LLN5oxPc24H+2+JRPsNr1OS3Gaea0CrH7PKhArBMKBz5RX9sA5NtTg==", "dev": true, "dependencies": { "@commitlint/types": "^19.0.3", diff --git a/package.json b/package.json index d3d6c4b7d..3e2887a28 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "release:major": "standard-version --release-as major" }, "devDependencies": { - "@commitlint/cli": "^19.2.2", + "@commitlint/cli": "^19.3.0", "@commitlint/config-conventional": "^19.2.2", "@wikimedia/types-wikimedia": "0.4.2", "devmoji": "^2.3.0", From ff3acf3b71466c4427021811290271faf6fb1de6 Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Tue, 23 Apr 2024 22:55:16 -0400 Subject: [PATCH 029/254] =?UTF-8?q?fix(core):=20=F0=9F=90=9B=20use=20runOn?= =?UTF-8?q?SkinTemplateNavigationHooks=20instead?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This should somewhat ensure Citizen gets to run its hook after all the extensions. Hopefully it will resolve various issues regarding hook load orders. Closes: #812 --- includes/Hooks/SkinHooks.php | 19 ++++++++++--------- includes/SkinCitizen.php | 9 +++++++++ skin.json | 3 +-- 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/includes/Hooks/SkinHooks.php b/includes/Hooks/SkinHooks.php index 5f65d17ca..8026868fb 100644 --- a/includes/Hooks/SkinHooks.php +++ b/includes/Hooks/SkinHooks.php @@ -31,7 +31,6 @@ use MediaWiki\Hook\SidebarBeforeOutputHook; use MediaWiki\Hook\SkinBuildSidebarHook; use MediaWiki\Hook\SkinEditSectionLinksHook; -use MediaWiki\Hook\SkinTemplateNavigation__UniversalHook; use MediaWiki\ResourceLoader as RL; use MediaWiki\Skins\Citizen\GetConfigTrait; use MediaWiki\Skins\Hook\SkinPageReadyConfigHook; @@ -49,8 +48,7 @@ class SkinHooks implements SidebarBeforeOutputHook, SkinBuildSidebarHook, SkinEditSectionLinksHook, - SkinPageReadyConfigHook, - SkinTemplateNavigation__UniversalHook + SkinPageReadyConfigHook { use GetConfigTrait; @@ -214,11 +212,12 @@ public function onSkinPageReadyConfig( $context, array &$config ): void { /** * Modify navigation links * + * TODO: Update to a proper hook when T287622 is resolved * @see https://www.mediawiki.org/wiki/Manual:Hooks/SkinTemplateNavigation::Universal * @param SkinTemplate $sktemplate * @param array &$links */ - public function onSkinTemplateNavigation__Universal( $sktemplate, &$links ): void { + public static function onSkinTemplateNavigation( $sktemplate, &$links ): void { // Be extra safe because it might be active on other skins with caching if ( $sktemplate->getSkinName() !== 'citizen' ) { return; @@ -248,6 +247,7 @@ public function onSkinTemplateNavigation__Universal( $sktemplate, &$links ): voi /** * Update actions menu items * + * @internal used inside Hooks\SkinHooks::onSkinTemplateNavigation * @param array &$links */ private static function updateActionsMenu( &$links ) { @@ -269,6 +269,7 @@ private static function updateActionsMenu( &$links ) { /** * Update associated pages menu items * + * @internal used inside Hooks\SkinHooks::onSkinTemplateNavigation * @param array &$links */ private static function updateAssociatedPagesMenu( &$links ) { @@ -293,11 +294,8 @@ private static function updateAssociatedPagesMenu( &$links ) { /** * Update toolbox menu items - * This is not guaranteed to run after extensions hook - * - * WORKAROUND: Load the skin after all extensions - * FIXME: Revisit when T287622 is resolved * + * @internal used inside Hooks\SkinHooks::onSkinTemplateNavigation * @param array &$links */ private static function updateToolboxMenu( &$links ) { @@ -331,7 +329,8 @@ private static function updateToolboxMenu( &$links ) { /** * Update user menu - * + * + * @internal used inside Hooks\SkinHooks::onSkinTemplateNavigation * @param SkinTemplate $sktemplate * @param array &$links */ @@ -363,6 +362,7 @@ private static function updateUserMenu( $sktemplate, &$links ) { /** * Update user interface preferences menu * + * @internal used inside Hooks\SkinHooks::onSkinTemplateNavigation * @param SkinTemplate $sktemplate * @param array &$links */ @@ -373,6 +373,7 @@ private static function updateUserInterfacePreferencesMenu( $sktemplate, &$links /** * Update views menu items * + * @internal used inside Hooks\SkinHooks::onSkinTemplateNavigation * @param array &$links */ private static function updateViewsMenu( &$links ) { diff --git a/includes/SkinCitizen.php b/includes/SkinCitizen.php index 31c6e845a..5c60d1ee2 100644 --- a/includes/SkinCitizen.php +++ b/includes/SkinCitizen.php @@ -33,6 +33,7 @@ use MediaWiki\Skins\Citizen\Partials\Tagline; use MediaWiki\Skins\Citizen\Partials\Theme; use SkinMustache; +use SkinTemplate; /** * Skin subclass for Citizen @@ -56,6 +57,14 @@ public function __construct( $options = [] ) { parent::__construct( $options ); } + /** + * @inheritDoc + */ + protected function runOnSkinTemplateNavigationHooks( SkinTemplate $skin, &$content_navigation ) { + parent::runOnSkinTemplateNavigationHooks( $skin, $content_navigation ); + Hooks\SkinHooks::onSkinTemplateNavigation( $skin, $content_navigation ); + } + /** * @inheritDoc */ diff --git a/skin.json b/skin.json index 1fba41dea..c743f526f 100644 --- a/skin.json +++ b/skin.json @@ -87,8 +87,7 @@ "SidebarBeforeOutput": "SkinHooks", "SkinBuildSidebar": "SkinHooks", "SkinEditSectionLinks": "SkinHooks", - "SkinPageReadyConfig": "SkinHooks", - "SkinTemplateNavigation::Universal": "SkinHooks" + "SkinPageReadyConfig": "SkinHooks" }, "ResourceModules": { "skins.citizen.styles": { From 59aa0a91036980cbbb778d07f0c27647c87f2ccd Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 24 Apr 2024 02:55:42 +0000 Subject: [PATCH 030/254] =?UTF-8?q?ci:=20=F0=9F=91=B7=20lint=20code=20to?= =?UTF-8?q?=20MediaWiki=20standards?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Check commit and GitHub actions for more details --- .husky/pre-commit | 0 includes/Hooks/SkinHooks.php | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) mode change 100755 => 100644 .husky/pre-commit diff --git a/.husky/pre-commit b/.husky/pre-commit old mode 100755 new mode 100644 diff --git a/includes/Hooks/SkinHooks.php b/includes/Hooks/SkinHooks.php index 8026868fb..8b00e612d 100644 --- a/includes/Hooks/SkinHooks.php +++ b/includes/Hooks/SkinHooks.php @@ -329,7 +329,7 @@ private static function updateToolboxMenu( &$links ) { /** * Update user menu - * + * * @internal used inside Hooks\SkinHooks::onSkinTemplateNavigation * @param SkinTemplate $sktemplate * @param array &$links From ed226a400e70c8680411025114ef0e1c61bb3496 Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Wed, 24 Apr 2024 00:21:36 -0400 Subject: [PATCH 031/254] =?UTF-8?q?feat(preferences):=20=E2=9C=A8=20implem?= =?UTF-8?q?ent=20a=20localStorage=20version=20of=20mw.user.clientPrefs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is the first step of migrating to the clientPrefs library when it is avaliable. Currently only themes are using it and the standard classes are added to the HTML element. Related: #780 --- .../clientPrefs.localStorage.js | 116 ++++++++++++++++++ .../skins.citizen.preferences.js | 13 ++ skin.json | 7 +- 3 files changed, 135 insertions(+), 1 deletion(-) create mode 100644 resources/skins.citizen.preferences/clientPrefs.localStorage.js diff --git a/resources/skins.citizen.preferences/clientPrefs.localStorage.js b/resources/skins.citizen.preferences/clientPrefs.localStorage.js new file mode 100644 index 000000000..ef9c1fc23 --- /dev/null +++ b/resources/skins.citizen.preferences/clientPrefs.localStorage.js @@ -0,0 +1,116 @@ +/** + * mw.user.clientPrefs modified to only use localStorage + * TODO: Revisit when we move to MW 1.43 and the interface is more stable + */ + +const CLIENTPREF_STORAGE_NAME = 'mwclientpreferences'; +const CLIENTPREF_SUFFIX = '-clientpref-'; +const CLIENTPREF_DELIMITER = ','; + +/** + * Check if the feature name is composed of valid characters. + * + * A valid feature name may contain letters, numbers, and "-" characters. + * + * @private + * @param {string} value + * @return {boolean} + */ +function isValidFeatureName( value ) { + return value.match( /^[a-zA-Z0-9-]+$/ ) !== null; +} + +/** + * Check if the value is composed of valid characters. + * + * @private + * @param {string} value + * @return {boolean} + */ +function isValidFeatureValue( value ) { + return value.match( /^[a-zA-Z0-9]+$/ ) !== null; +} + +/** + * Save the feature value to the client preferences localStorage. + * Modified from the original to use localStorage instead of cookie. + * + * @private + * @param {string} feature + * @param {string} value + */ +function saveClientPrefs( feature, value ) { + const existingStorage = mw.storage.get( CLIENTPREF_STORAGE_NAME ) || ''; + const data = {}; + existingStorage.split( CLIENTPREF_DELIMITER ).forEach( function ( keyValuePair ) { + const m = keyValuePair.match( /^([\w-]+)-clientpref-(\w+)$/ ); + if ( m ) { + data[ m[ 1 ] ] = m[ 2 ]; + } + } ); + data[ feature ] = value; + + const newStorage = Object.keys( data ).map( function ( key ) { + return key + CLIENTPREF_SUFFIX + data[ key ]; + } ).join( CLIENTPREF_DELIMITER ); + mw.storage.set( CLIENTPREF_STORAGE_NAME, newStorage ); +} + +function clientPrefs() { + return { + /** + * Change the class on the HTML document element, and save the value in a localStorage. + * + * @memberof mw.user.clientPrefs + * @param {string} feature + * @param {string} value + * @return {boolean} True if feature was stored successfully, false if the value + * uses a forbidden character or the feature is not recognised + * e.g. a matching class was not defined on the HTML document element. + */ + set: function ( feature, value ) { + if ( !isValidFeatureName( feature ) || !isValidFeatureValue( value ) ) { + return false; + } + const currentValue = this.get( feature ); + + const oldFeatureClass = feature + CLIENTPREF_SUFFIX + currentValue; + const newFeatureClass = feature + CLIENTPREF_SUFFIX + value; + // The following classes are removed here: + // * feature-name-clientpref- + // * e.g. vector-font-size--clientpref-small + document.documentElement.classList.remove( oldFeatureClass ); + // The following classes are added here: + // * feature-name-clientpref- + // * e.g. vector-font-size--clientpref-xlarge + document.documentElement.classList.add( newFeatureClass ); + saveClientPrefs( feature, value ); + return true; + }, + + /** + * Retrieve the current value of the feature from the HTML document element. + * + * @memberof mw.user.clientPrefs + * @param {string} feature + * @return {string|boolean} returns boolean if the feature is not recognized + * returns string if a feature was found. + */ + get: function ( feature ) { + const featurePrefix = feature + CLIENTPREF_SUFFIX; + const docClass = document.documentElement.className; + // eslint-disable-next-line security/detect-non-literal-regexp + const featureRegEx = new RegExp( + '(^| )' + mw.util.escapeRegExp( featurePrefix ) + '([a-zA-Z0-9]+)( |$)' + ); + const match = docClass.match( featureRegEx ); + + // check no further matches if we replaced this occurance. + const isAmbiguous = docClass.replace( featureRegEx, '$1$3' ).match( featureRegEx ) !== null; + return !isAmbiguous && match ? match[ 2 ] : false; + } + }; +} + +/** @module clientPrefs */ +module.exports = clientPrefs; diff --git a/resources/skins.citizen.preferences/skins.citizen.preferences.js b/resources/skins.citizen.preferences/skins.citizen.preferences.js index d9a9370a8..918813a57 100644 --- a/resources/skins.citizen.preferences/skins.citizen.preferences.js +++ b/resources/skins.citizen.preferences/skins.citizen.preferences.js @@ -8,6 +8,18 @@ const CLASS = 'citizen-pref', PREFIX_KEY = 'skin-citizen-'; +/** + * Clientprefs names theme differently from Citizen, we will need to translate it + * TODO: Migrate to clientprefs fully on MW 1.43 + */ +const CLIENTPREFS_THEME_MAP = { + auto: 'os', + light: 'day', + dark: 'night' +}; + +const clientPrefs = require( './clientPrefs.localStorage.js' )(); + /** * Set the value of the input element * @@ -121,6 +133,7 @@ function setPref() { if ( currentPref.theme !== newPref.theme ) { localStorage.setItem( PREFIX_KEY + 'theme', newPref.theme ); + clientPrefs.set( 'skin-theme', CLIENTPREFS_THEME_MAP[ newPref.theme ] ); } else if ( currentPref.fontsize !== newPref.fontsize ) { const formattedFontSize = ( newPref.fontsize + 8 ) * 10 + '%'; diff --git a/skin.json b/skin.json index c743f526f..cf4389e96 100644 --- a/skin.json +++ b/skin.json @@ -225,7 +225,8 @@ { "name": "resources/skins.citizen.preferences/config.json", "callback": "MediaWiki\\Skins\\Citizen\\Hooks\\ResourceLoaderHooks::getCitizenPreferencesResourceLoaderConfig" - } + }, + "resources/skins.citizen.preferences/clientPrefs.localStorage.js" ], "messages": [ "preferences", @@ -238,6 +239,10 @@ "prefs-citizen-lineheight-label", "prefs-citizen-resetbutton-label" ], + "dependencies": [ + "mediawiki.storage", + "mediawiki.util" + ], "targets": [ "desktop", "mobile" From 3093510faea82f428db9603c4191998b3b8d3d87 Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Wed, 24 Apr 2024 00:25:09 -0400 Subject: [PATCH 032/254] =?UTF-8?q?refactor(preferences):=20=E2=99=BB?= =?UTF-8?q?=EF=B8=8F=20use=20mw.storage=20instead=20of=20localStorage?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../skins.citizen.preferences.js | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/resources/skins.citizen.preferences/skins.citizen.preferences.js b/resources/skins.citizen.preferences/skins.citizen.preferences.js index 918813a57..cc2bc9ddd 100644 --- a/resources/skins.citizen.preferences/skins.citizen.preferences.js +++ b/resources/skins.citizen.preferences/skins.citizen.preferences.js @@ -105,10 +105,10 @@ function getPref() { }; const pref = { - theme: localStorage.getItem( PREFIX_KEY + 'theme' ), - fontsize: localStorage.getItem( PREFIX_KEY + 'fontsize' ) || initFontSize(), - pagewidth: localStorage.getItem( PREFIX_KEY + 'pagewidth' ) || rootStyle.getPropertyValue( '--width-layout' ), - lineheight: localStorage.getItem( PREFIX_KEY + 'lineheight' ) || rootStyle.getPropertyValue( '--line-height' ) + theme: mw.storage.get( PREFIX_KEY + 'theme' ), + fontsize: mw.storage.get( PREFIX_KEY + 'fontsize' ) || initFontSize(), + pagewidth: mw.storage.get( PREFIX_KEY + 'pagewidth' ) || rootStyle.getPropertyValue( '--width-layout' ), + lineheight: mw.storage.get( PREFIX_KEY + 'lineheight' ) || rootStyle.getPropertyValue( '--line-height' ) }; return pref; @@ -132,12 +132,12 @@ function setPref() { }; if ( currentPref.theme !== newPref.theme ) { - localStorage.setItem( PREFIX_KEY + 'theme', newPref.theme ); + mw.storage.set( PREFIX_KEY + 'theme', newPref.theme ); clientPrefs.set( 'skin-theme', CLIENTPREFS_THEME_MAP[ newPref.theme ] ); } else if ( currentPref.fontsize !== newPref.fontsize ) { const formattedFontSize = ( newPref.fontsize + 8 ) * 10 + '%'; - localStorage.setItem( PREFIX_KEY + 'fontsize', formattedFontSize ); + mw.storage.set( PREFIX_KEY + 'fontsize', formattedFontSize ); setIndicator( 'fontsize', formattedFontSize ); } else if ( currentPref.pagewidth !== newPref.pagewidth ) { @@ -148,12 +148,12 @@ function setPref() { } else { formattedPageWidth = ( newPref.pagewidth + 6 ) * 120 + 'px'; } - localStorage.setItem( PREFIX_KEY + 'pagewidth', formattedPageWidth ); + mw.storage.set( PREFIX_KEY + 'pagewidth', formattedPageWidth ); setIndicator( 'pagewidth', formattedPageWidth ); } else if ( currentPref.lineheight !== newPref.lineheight ) { const formattedLineHeight = newPref.lineheight / 10 + 1; - localStorage.setItem( PREFIX_KEY + 'lineheight', formattedLineHeight ); + mw.storage.set( PREFIX_KEY + 'lineheight', formattedLineHeight ); setIndicator( 'lineheight', formattedLineHeight ); } @@ -178,7 +178,7 @@ function resetPref() { keys.forEach( ( key ) => { const keyName = PREFIX_KEY + key; - if ( localStorage.getItem( keyName ) ) { + if ( mw.storage.get( keyName ) ) { localStorage.removeItem( keyName ); } } ); @@ -189,7 +189,7 @@ function resetPref() { keys.forEach( ( key ) => { const keyName = PREFIX_KEY + key; - localStorage.setItem( keyName, pref[ key ] ); + mw.storage.set( keyName, pref[ key ] ); setIndicator( key, pref[ key ] ); setInputValue( key, prefValue[ key ] ); } ); From b0affaf53abb56f92bb8e1771439f31cde251085 Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Wed, 24 Apr 2024 00:27:35 -0400 Subject: [PATCH 033/254] =?UTF-8?q?ci(test):=20=F0=9F=91=B7=20=F0=9F=9A=A8?= =?UTF-8?q?=20fix=20incorrect=20test=20function=20names?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/phpunit/Hooks/SkinHooksTest.php | 36 +++++++++++++-------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/tests/phpunit/Hooks/SkinHooksTest.php b/tests/phpunit/Hooks/SkinHooksTest.php index 1c9c6971f..58169f26c 100644 --- a/tests/phpunit/Hooks/SkinHooksTest.php +++ b/tests/phpunit/Hooks/SkinHooksTest.php @@ -266,14 +266,14 @@ public function testSkinPageReadyConfig() { * @covers \MediaWiki\Skins\Citizen\Hooks\SkinHooks * @return void */ - public function testSkinTemplateNavigation__UniversalNameMissmatch() { + public function testSkinTemplateNavigationNameMissmatch() { $template = $this->getMockBuilder( SkinTemplate::class )->disableOriginalConstructor()->getMock(); $template->expects( $this->once() )->method( 'getSkinName' )->willReturn( 'foo' ); $links = []; $hooks = new SkinHooks(); - $hooks->onSkinTemplateNavigation__Universal( $template, $links ); + $hooks->onSkinTemplateNavigation( $template, $links ); $this->assertEmpty( $links ); } @@ -282,7 +282,7 @@ public function testSkinTemplateNavigation__UniversalNameMissmatch() { * @covers \MediaWiki\Skins\Citizen\Hooks\SkinHooks * @return void */ - public function testSkinTemplateNavigation__UniversalActions() { + public function testSkinTemplateNavigationActions() { $template = $this->getMockBuilder( SkinTemplate::class )->disableOriginalConstructor()->getMock(); $template->expects( $this->once() )->method( 'getSkinName' )->willReturn( 'citizen' ); @@ -293,7 +293,7 @@ public function testSkinTemplateNavigation__UniversalActions() { ]; $hooks = new SkinHooks(); - $hooks->onSkinTemplateNavigation__Universal( $template, $links ); + $hooks->onSkinTemplateNavigation( $template, $links ); $this->assertArraySubmapSame( [ 'actions' => [ @@ -309,7 +309,7 @@ public function testSkinTemplateNavigation__UniversalActions() { * @covers \MediaWiki\Skins\Citizen\Hooks\SkinHooks * @return void */ - public function testSkinTemplateNavigation__UniversalAssociatedPagesMenu() { + public function testSkinTemplateNavigationAssociatedPagesMenu() { $template = $this->getMockBuilder( SkinTemplate::class )->disableOriginalConstructor()->getMock(); $template->expects( $this->once() )->method( 'getSkinName' )->willReturn( 'citizen' ); @@ -320,7 +320,7 @@ public function testSkinTemplateNavigation__UniversalAssociatedPagesMenu() { ]; $hooks = new SkinHooks(); - $hooks->onSkinTemplateNavigation__Universal( $template, $links ); + $hooks->onSkinTemplateNavigation( $template, $links ); $this->assertArraySubmapSame( [ 'associated-pages' => [ @@ -336,7 +336,7 @@ public function testSkinTemplateNavigation__UniversalAssociatedPagesMenu() { * @covers \MediaWiki\Skins\Citizen\Hooks\SkinHooks * @return void */ - public function testSkinTemplateNavigation__UniversalUserMenuTemp() { + public function testSkinTemplateNavigationUserMenuTemp() { $mockUser = $this->getMockBuilder( \User::class )->disableOriginalConstructor()->getMock(); $mockUser->expects( $this->once() )->method( 'isTemp' )->willReturn( true ); @@ -351,7 +351,7 @@ public function testSkinTemplateNavigation__UniversalUserMenuTemp() { ]; $hooks = new SkinHooks(); - $hooks->onSkinTemplateNavigation__Universal( $template, $links ); + $hooks->onSkinTemplateNavigation( $template, $links ); $this->assertArrayNotHasKey( 'tmpuserpage', $links['user-menu'] ); } @@ -360,7 +360,7 @@ public function testSkinTemplateNavigation__UniversalUserMenuTemp() { * @covers \MediaWiki\Skins\Citizen\Hooks\SkinHooks * @return void */ - public function testSkinTemplateNavigation__UniversalUserMenuAnon() { + public function testSkinTemplateNavigationUserMenuAnon() { $template = $this->getMockBuilder( SkinTemplate::class )->disableOriginalConstructor()->getMock(); $template->expects( $this->once() )->method( 'getSkinName' )->willReturn( 'citizen' ); $template->expects( $this->once() )->method( 'getUser' )->willReturn( @@ -374,7 +374,7 @@ public function testSkinTemplateNavigation__UniversalUserMenuAnon() { ]; $hooks = new SkinHooks(); - $hooks->onSkinTemplateNavigation__Universal( $template, $links ); + $hooks->onSkinTemplateNavigation( $template, $links ); $this->assertArrayNotHasKey( 'anonuserpage', $links['user-menu'] ); } @@ -383,7 +383,7 @@ public function testSkinTemplateNavigation__UniversalUserMenuAnon() { * @covers \MediaWiki\Skins\Citizen\Hooks\SkinHooks * @return void */ - public function testSkinTemplateNavigation__UniversalUserMenuRegistered() { + public function testSkinTemplateNavigationUserMenuRegistered() { $mockUser = $this->getMockBuilder( \User::class )->disableOriginalConstructor()->getMock(); $mockUser->expects( $this->once() )->method( 'isRegistered' )->willReturn( true ); @@ -398,7 +398,7 @@ public function testSkinTemplateNavigation__UniversalUserMenuRegistered() { ]; $hooks = new SkinHooks(); - $hooks->onSkinTemplateNavigation__Universal( $template, $links ); + $hooks->onSkinTemplateNavigation( $template, $links ); $this->assertArrayNotHasKey( 'userpage', $links['user-menu'] ); } @@ -407,7 +407,7 @@ public function testSkinTemplateNavigation__UniversalUserMenuRegistered() { * @covers \MediaWiki\Skins\Citizen\Hooks\SkinHooks * @return void */ - public function testSkinTemplateNavigation__UniversalUserInterfacePreferencesMenu() { + public function testSkinTemplateNavigationUserInterfacePreferencesMenu() { $template = $this->getMockBuilder( SkinTemplate::class )->disableOriginalConstructor()->getMock(); $template->expects( $this->once() )->method( 'getSkinName' )->willReturn( 'citizen' ); @@ -416,7 +416,7 @@ public function testSkinTemplateNavigation__UniversalUserInterfacePreferencesMen ]; $hooks = new SkinHooks(); - $hooks->onSkinTemplateNavigation__Universal( $template, $links ); + $hooks->onSkinTemplateNavigation( $template, $links ); $this->assertArrayHasKey( 'user-interface-preferences', $links ); $this->assertEmpty( $links['user-interface-preferences'] ); @@ -426,7 +426,7 @@ public function testSkinTemplateNavigation__UniversalUserInterfacePreferencesMen * @covers \MediaWiki\Skins\Citizen\Hooks\SkinHooks * @return void */ - public function testSkinTemplateNavigation__UniversalViews() { + public function testSkinTemplateNavigationViews() { $template = $this->getMockBuilder( SkinTemplate::class )->disableOriginalConstructor()->getMock(); $template->expects( $this->once() )->method( 'getSkinName' )->willReturn( 'citizen' ); @@ -437,7 +437,7 @@ public function testSkinTemplateNavigation__UniversalViews() { ]; $hooks = new SkinHooks(); - $hooks->onSkinTemplateNavigation__Universal( $template, $links ); + $hooks->onSkinTemplateNavigation( $template, $links ); $this->assertArraySubmapSame( [ 'views' => [ @@ -453,7 +453,7 @@ public function testSkinTemplateNavigation__UniversalViews() { * @covers \MediaWiki\Skins\Citizen\Hooks\SkinHooks * @return void */ - public function testSkinTemplateNavigation__UniversalViewsVEEdit() { + public function testSkinTemplateNavigationViewsVEEdit() { $template = $this->getMockBuilder( SkinTemplate::class )->disableOriginalConstructor()->getMock(); $template->expects( $this->once() )->method( 'getSkinName' )->willReturn( 'citizen' ); @@ -469,7 +469,7 @@ public function testSkinTemplateNavigation__UniversalViewsVEEdit() { ]; $hooks = new SkinHooks(); - $hooks->onSkinTemplateNavigation__Universal( $template, $links ); + $hooks->onSkinTemplateNavigation( $template, $links ); $this->assertArraySubmapSame( [ 'views' => [ From d9675ebd606745902a39fa9e135ed10d37ca36f3 Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Wed, 24 Apr 2024 16:19:29 -0400 Subject: [PATCH 034/254] =?UTF-8?q?fix(core):=20=F0=9F=90=9B=20round=20scr?= =?UTF-8?q?ollLeft=20to=20integer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fractional pixels from scrollLeft prevent Citizen from detecting overflow state properly. --- resources/skins.citizen.scripts/tables.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/skins.citizen.scripts/tables.js b/resources/skins.citizen.scripts/tables.js index a20e54eb2..a64725033 100644 --- a/resources/skins.citizen.scripts/tables.js +++ b/resources/skins.citizen.scripts/tables.js @@ -21,7 +21,7 @@ function setupOverflowState( element ) { return; } - const currentPosition = element.parentNode.scrollLeft; + const currentPosition = Math.ceil( element.parentNode.scrollLeft ); if ( currentPosition <= 0 ) { // At the start From 30ee7c1dd13a1e469b88a0ba8d224eec592ccabf Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Wed, 24 Apr 2024 17:47:33 -0400 Subject: [PATCH 035/254] =?UTF-8?q?refactor(core):=20=E2=99=BB=EF=B8=8F=20?= =?UTF-8?q?use=20ResourceLoader=20to=20minify=20inline=20JS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- includes/Hooks/SkinHooks.php | 15 ++++----------- resources/skins.citizen.scripts/inline.js | 1 - 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/includes/Hooks/SkinHooks.php b/includes/Hooks/SkinHooks.php index 8b00e612d..105366b62 100644 --- a/includes/Hooks/SkinHooks.php +++ b/includes/Hooks/SkinHooks.php @@ -26,6 +26,7 @@ namespace MediaWiki\Skins\Citizen\Hooks; use ExtensionRegistry; +use Html; use Language; use MediaWiki\Hook\BeforePageDisplayHook; use MediaWiki\Hook\SidebarBeforeOutputHook; @@ -64,17 +65,9 @@ public function onBeforePageDisplay( $out, $skin ): void { return; } - $nonce = $out->getCSP()->getNonce(); - - // Script content at 'skins.citizen.scripts.theme/inline.js - // phpcs:disable Generic.Files.LineLength.TooLong - $script = sprintf( - '%s', - $nonce !== false ? sprintf( ' nonce="%s"', $nonce ) : '', - 'window.applyPref=()=>{const a="skin-citizen-",b="skin-citizen-theme",c=a=>window.localStorage.getItem(a),d=c("skin-citizen-theme"),e=()=>{const d={fontsize:"font-size",pagewidth:"--width-layout",lineheight:"--line-height"},e=()=>["auto","dark","light"].map(b=>a+b),f=a=>{let b=document.getElementById("citizen-style");null===b&&(b=document.createElement("style"),b.setAttribute("id","citizen-style"),document.head.appendChild(b)),b.textContent=`:root{${a}}`};try{const g=c(b);let h="";if(null!==g){const b=document.documentElement;b.classList.remove(...e(a)),b.classList.add(a+g)}for(const[b,e]of Object.entries(d)){const d=c(a+b);null!==d&&(h+=`${e}:${d};`)}h&&f(h)}catch(a){}};if("auto"===d){const a=window.matchMedia("(prefers-color-scheme: dark)"),c=a.matches?"dark":"light",d=(a,b)=>window.localStorage.setItem(a,b);d(b,c),e(),a.addListener(()=>{e()}),d(b,"auto")}else e()},(()=>{window.applyPref()})();' - ); - // phpcs:enable Generic.Files.LineLength.TooLong - + $script = file_get_contents( MW_INSTALL_PATH . '/skins/Citizen/resources/skins.citizen.scripts/inline.js' ); + $script = Html::inlineScript( $script ); + $script = RL\ResourceLoader::filter( 'minify-js', $script, [ 'cache' => false ] ); $out->addHeadItem( 'skin.citizen.inline', $script ); } diff --git a/resources/skins.citizen.scripts/inline.js b/resources/skins.citizen.scripts/inline.js index f4fecb755..e8a1c5cc6 100644 --- a/resources/skins.citizen.scripts/inline.js +++ b/resources/skins.citizen.scripts/inline.js @@ -2,7 +2,6 @@ * Citizen * * Inline script used in includes/Hooks/SkinHooks.php - * Mangle using https://jscompress.com/ */ window.applyPref = () => { const From 755f42eb07d7535af70f1e481da6166f06902be8 Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Wed, 24 Apr 2024 19:43:17 -0400 Subject: [PATCH 036/254] =?UTF-8?q?refactor(core):=20=E2=99=BB=EF=B8=8F=20?= =?UTF-8?q?clean=20up=20redundant=20styles?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../skins.citizen.styles/components/Header.less | 12 +++++++----- resources/skins.citizen.styles/components/Menu.less | 2 ++ .../skins.citizen.styles/components/Pagetools.less | 3 --- .../skins.citizen.styles/components/Usermenu.less | 1 - 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/resources/skins.citizen.styles/components/Header.less b/resources/skins.citizen.styles/components/Header.less index 5dd2375c6..09a63c565 100644 --- a/resources/skins.citizen.styles/components/Header.less +++ b/resources/skins.citizen.styles/components/Header.less @@ -100,11 +100,6 @@ background-color: var( --background-color-primary--active ); } } - - // Hide header menu labels - .citizen-menu__heading { - .mixin-screen-reader-text; - } } &__start, @@ -137,6 +132,13 @@ } } +#p-personal { + // Hide header menu labels + .citizen-menu__heading { + .mixin-screen-reader-text; + } +} + // Reset hover styles if it is a touch device // This is dumb but hover:hover overrides active states @media ( hover: none ) { diff --git a/resources/skins.citizen.styles/components/Menu.less b/resources/skins.citizen.styles/components/Menu.less index 32f8d60a0..04e1d247c 100644 --- a/resources/skins.citizen.styles/components/Menu.less +++ b/resources/skins.citizen.styles/components/Menu.less @@ -1,4 +1,6 @@ .citizen-menu { + font-size: var( --font-size-small ); + &__heading { display: block; padding: var( --space-xs ) var( --space-md ); diff --git a/resources/skins.citizen.styles/components/Pagetools.less b/resources/skins.citizen.styles/components/Pagetools.less index 9a21f07bb..b3f0f6198 100644 --- a/resources/skins.citizen.styles/components/Pagetools.less +++ b/resources/skins.citizen.styles/components/Pagetools.less @@ -2,8 +2,6 @@ display: flex; gap: var( --space-xxs ); margin-left: -0.75rem; // Align to the margin - font-size: var( --font-size-small ); - font-weight: var( --font-weight-medium ); // TODO: Merge this with header__item &__item { @@ -46,7 +44,6 @@ padding: var( --space-xs ) 0; margin: var( --space-xs ); overflow: auto; - font-size: var( --font-size-small ); .citizen-card; .citizen-card-hide( top right ); .citizen-card-transition(); diff --git a/resources/skins.citizen.styles/components/Usermenu.less b/resources/skins.citizen.styles/components/Usermenu.less index 37dce782a..fa0d3f1b0 100644 --- a/resources/skins.citizen.styles/components/Usermenu.less +++ b/resources/skins.citizen.styles/components/Usermenu.less @@ -1,6 +1,5 @@ .citizen-userMenu { &__card { - font-size: var( --font-size-small ); .citizen-header-card( right ); } From a741639085d70c22a9f49890542a142a223bf981 Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Wed, 24 Apr 2024 20:23:45 -0400 Subject: [PATCH 037/254] =?UTF-8?q?feat(core):=20=E2=9C=A8=20move=20theme?= =?UTF-8?q?=20preferences=20to=20clientPrefs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Since clientPrefs and other related features are not avaliable until MW 1.42, many of them are backported as polyfill. Instead of using cookies, the polyfill are using localStorage only like Citizen in the past. There are many changes behind the scene, but the most important one being that `skin-citizen-*` theme classes are now soft-deprecated, and replaced by the standardized `skin-theme-clientpref-*` classes. There will be sufficient time before the hard deprecation. Related: #780 --- i18n/en.json | 13 +- i18n/qqq.json | 10 +- includes/Hooks/SkinHooks.php | 1 + includes/Partials/Theme.php | 13 +- .../addPortlet.polyfill.js | 88 +++++ .../clientPreferences.js | 348 ++++++++++++++++++ .../clientPreferences.json | 6 + ...ocalStorage.js => clientPrefs.polyfill.js} | 3 +- .../skins.citizen.preferences.js | 53 ++- .../skins.citizen.preferences.less | 121 +++--- .../templates/preferences.mustache | 15 +- resources/skins.citizen.scripts/inline.js | 94 +++-- skin.json | 13 +- 13 files changed, 616 insertions(+), 162 deletions(-) create mode 100644 resources/skins.citizen.preferences/addPortlet.polyfill.js create mode 100644 resources/skins.citizen.preferences/clientPreferences.js create mode 100644 resources/skins.citizen.preferences/clientPreferences.json rename resources/skins.citizen.preferences/{clientPrefs.localStorage.js => clientPrefs.polyfill.js} (97%) diff --git a/i18n/en.json b/i18n/en.json index 40129365c..c415fb154 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -43,12 +43,15 @@ "citizen-tagline-ns-help": "Help page", "citizen-tagline-ns-category": "Category page", "citizen-tagline-user-regdate": "Joined $1", - "prefs-citizen-theme-label": "Theme", - "prefs-citizen-theme-option-auto": "Auto", - "prefs-citizen-theme-option-light": "Light", - "prefs-citizen-theme-option-dark": "Dark", "prefs-citizen-fontsize-label": "Font size", "prefs-citizen-pagewidth-label": "Page width", "prefs-citizen-lineheight-label": "Line height", - "prefs-citizen-resetbutton-label": "Reset to default" + "prefs-citizen-resetbutton-label": "Reset to default", + + "skin-theme-name": "Color", + "skin-theme-description": "Reduces the light emitted by device screens.", + "skin-theme-day-label": "Day", + "skin-theme-night-label": "Night", + "skin-theme-os-label": "Automatic", + "skin-theme-exclusion-notice": "This page is always in day mode." } diff --git a/i18n/qqq.json b/i18n/qqq.json index 29a660c76..91fe88715 100644 --- a/i18n/qqq.json +++ b/i18n/qqq.json @@ -46,12 +46,12 @@ "citizen-tagline-ns-help": "Tagline for pages in help namespace", "citizen-tagline-ns-category": "Tagline for pages in category namespace", "citizen-tagline-user-regdate": "Label for registration date in taglines on userpages", - "prefs-citizen-theme-label": "Tooltip for the theme dropdown in Special:Preferences", - "prefs-citizen-theme-option-auto": "Label for the auto theme option", - "prefs-citizen-theme-option-light": "Label for the light theme option", - "prefs-citizen-theme-option-dark": "Label for the dark theme option", "prefs-citizen-fontsize-label": "Label for the font size settings", "prefs-citizen-pagewidth-label": "Label for the page width settings", "prefs-citizen-lineheight-label": "Label for the line height settings", - "prefs-citizen-resetbutton-label": "Label for the reset button that restore default settings" + "prefs-citizen-resetbutton-label": "Label for the reset button that restore default settings", + "skin-theme-name": "Label for setting that allows you to change theme.", + "skin-theme-description": "Description for theme.", + "skin-theme-day-label": "Label for light theme (standard mode).", + "skin-theme-night-label": "Label for night theme (dark mode)." } diff --git a/includes/Hooks/SkinHooks.php b/includes/Hooks/SkinHooks.php index 105366b62..73a150fcc 100644 --- a/includes/Hooks/SkinHooks.php +++ b/includes/Hooks/SkinHooks.php @@ -67,6 +67,7 @@ public function onBeforePageDisplay( $out, $skin ): void { $script = file_get_contents( MW_INSTALL_PATH . '/skins/Citizen/resources/skins.citizen.scripts/inline.js' ); $script = Html::inlineScript( $script ); + // TODO: Consider turning on cache after this is more stable $script = RL\ResourceLoader::filter( 'minify-js', $script, [ 'cache' => false ] ); $out->addHeadItem( 'skin.citizen.inline', $script ); } diff --git a/includes/Partials/Theme.php b/includes/Partials/Theme.php index 2d66b5507..a9ff2a10a 100644 --- a/includes/Partials/Theme.php +++ b/includes/Partials/Theme.php @@ -25,6 +25,12 @@ namespace MediaWiki\Skins\Citizen\Partials; +const CLIENTPREFS_THEME_MAP = [ + 'auto' => 'os', + 'light' => 'day', + 'dark' => 'night' +]; + /** * Theme switcher partial of Skin Citizen */ @@ -42,7 +48,12 @@ public function setSkinTheme( array &$options ) { // Set theme to site theme $theme = $this->getConfigValue( 'CitizenThemeDefault' ) ?? 'auto'; - // Add HTML class based on theme set + // Legacy class to be deprecated $out->addHtmlClasses( 'skin-citizen-' . $theme ); + + // Add HTML class based on theme set + if ( CLIENTPREFS_THEME_MAP[ $theme ] ) { + $out->addHtmlClasses( 'skin-theme-clientpref-' . $theme ); + } } } diff --git a/resources/skins.citizen.preferences/addPortlet.polyfill.js b/resources/skins.citizen.preferences/addPortlet.polyfill.js new file mode 100644 index 000000000..b972d343b --- /dev/null +++ b/resources/skins.citizen.preferences/addPortlet.polyfill.js @@ -0,0 +1,88 @@ +/** + * TODO: Revisit when we move to MW 1.43 and the interface is more stable + */ + +/** + * Creates default portlet. + * Based on Vector + * + * @param {Element} portlet + * @return {Element} + */ +function addDefaultPortlet( portlet ) { + const ul = portlet.querySelector( 'ul' ); + if ( !ul ) { + return portlet; + } + ul.classList.add( 'citizen-menu__content-list' ); + const label = portlet.querySelector( 'label' ); + if ( label ) { + const labelDiv = document.createElement( 'div' ); + labelDiv.classList.add( 'citizen-menu__heading' ); + labelDiv.innerHTML = label.textContent || ''; + portlet.insertBefore( labelDiv, label ); + label.remove(); + } + let wrapper = portlet.querySelector( 'div:last-child' ); + if ( wrapper ) { + ul.remove(); + wrapper.appendChild( ul ); + wrapper.classList.add( 'citizen-menu__content' ); + } else { + wrapper = document.createElement( 'div' ); + wrapper.classList.add( 'citizen-menu__content' ); + ul.remove(); + wrapper.appendChild( ul ); + portlet.appendChild( wrapper ); + } + portlet.classList.add( 'citizen-menu' ); + return portlet; +} + +/** + * Polyfill for mw.util.addPortlet for < MW 1.42 + * + * @return {Element} + */ +function addPortlet() { + if ( mw.util.addPortlet ) { + return addDefaultPortlet( mw.util.addPortlet ); + } + + return function ( id, label, before ) { + const portlet = document.createElement( 'div' ); + portlet.classList.add( 'mw-portlet', 'mw-portlet-' + id, 'emptyPortlet', + // Additional class is added to allow skins to track portlets added via this mechanism. + 'mw-portlet-js' + ); + portlet.id = id; + if ( label ) { + const labelNode = document.createElement( 'label' ); + labelNode.textContent = label; + portlet.appendChild( labelNode ); + } + const listWrapper = document.createElement( 'div' ); + const list = document.createElement( 'ul' ); + listWrapper.appendChild( list ); + portlet.appendChild( listWrapper ); + if ( before ) { + let referenceNode; + try { + referenceNode = document.querySelector( before ); + } catch ( e ) { + // CSS selector not supported by browser. + } + if ( referenceNode ) { + const parentNode = referenceNode.parentNode; + parentNode.insertBefore( portlet, referenceNode ); + } else { + return null; + } + } + mw.hook( 'util.addPortlet' ).fire( portlet, before ); + return addDefaultPortlet( portlet ); + }; +} + +/** @module addPortlet */ +module.exports = addPortlet; diff --git a/resources/skins.citizen.preferences/clientPreferences.js b/resources/skins.citizen.preferences/clientPreferences.js new file mode 100644 index 000000000..327963b17 --- /dev/null +++ b/resources/skins.citizen.preferences/clientPreferences.js @@ -0,0 +1,348 @@ +/** + * @typedef {Object} ClientPreference + * @property {string[]} options that are valid for this client preference + * @property {string} preferenceKey for registered users. + * @property {string} [type] defaults to radio. Supported: radio, switch + * @property {Function} [callback] callback executed after a client preference has been modified. + */ + +/** + * @typedef {Object} PreferenceOption + * @property {string} label + * @property {string} value + */ + +const addPortlet = require( './addPortlet.polyfill.js' )(); +const clientPrefs = require( './clientPrefs.polyfill.js' )(); + +/** + * Get the list of client preferences that are active on the page, including hidden. + * + * @return {string[]} of active client preferences + */ +function getClientPreferences() { + return Array.from( document.documentElement.classList ).filter( + ( className ) => className.match( /-clientpref-/ ) + ).map( ( className ) => className.split( '-clientpref-' )[ 0 ] ); +} + +/** + * Check if the feature is excluded from the current page. + * + * @param {string} featureName + * @return {boolean} + */ +function isFeatureExcluded( featureName ) { + return document.documentElement.classList.contains( featureName + '-clientpref-excluded' ); +} + +/** + * Get the list of client preferences that are active on the page and not hidden. + * + * @param {Record} config + * @return {string[]} of user facing client preferences + */ +function getVisibleClientPreferences( config ) { + const active = getClientPreferences(); + // Order should be based on key in config.json + return Object.keys( config ).filter( ( key ) => active.indexOf( key ) > -1 ); +} + +/** + * @param {string} featureName + * @param {string} value + * @param {Record} config + */ +function toggleDocClassAndSave( featureName, value, config ) { + const pref = config[ featureName ]; + const callback = pref.callback || ( () => {} ); + clientPrefs.set( featureName, value ); + callback(); +} + +/** + * @param {string} featureName + * @param {string} value + * @return {string} + */ +const getInputId = ( featureName, value ) => `skin-client-pref-${ featureName }-value-${ value }`; + +/** + * @param {string} type + * @param {string} featureName + * @param {string} value + * @return {HTMLInputElement} + */ +function makeInputElement( type, featureName, value ) { + const input = document.createElement( 'input' ); + const name = `skin-client-pref-${ featureName }-group`; + const id = getInputId( featureName, value ); + input.name = name; + input.id = id; + input.type = type; + if ( type === 'checkbox' ) { + input.checked = value === '1'; + } else { + input.value = value; + } + input.setAttribute( 'data-event-name', id ); + return input; +} + +/** + * @param {string} featureName + * @param {string} value + * @return {HTMLLabelElement} + */ +function makeLabelElement( featureName, value ) { + const label = document.createElement( 'label' ); + // eslint-disable-next-line mediawiki/msg-doc + label.textContent = mw.msg( `${ featureName }-${ value }-label` ); + label.setAttribute( 'for', getInputId( featureName, value ) ); + return label; +} + +/** + * Create an element that informs users that a feature is not functional + * on a given page. This message is hidden by default and made visible in + * CSS if a specific exclusion class exists. + * + * @param {string} featureName + * @return {HTMLElement} + */ +function makeExclusionNotice( featureName ) { + const p = document.createElement( 'p' ); + // eslint-disable-next-line mediawiki/msg-doc + const noticeMessage = mw.message( `${ featureName }-exclusion-notice` ); + p.classList.add( 'exclusion-notice', `${ featureName }-exclusion-notice` ); + p.textContent = noticeMessage.text(); + return p; +} + +/** + * @param {Element} parent + * @param {string} featureName + * @param {string} value + * @param {string} currentValue + * @param {Record} config + */ +function appendRadioToggle( parent, featureName, value, currentValue, config ) { + const input = makeInputElement( 'radio', featureName, value ); + // input.classList.add( 'cdx-radio__input' ); + input.classList.add( 'citizen-client-prefs-radio__input' ); + if ( currentValue === value ) { + input.checked = true; + } + + if ( isFeatureExcluded( featureName ) ) { + input.disabled = true; + } + + const icon = document.createElement( 'span' ); + // icon.classList.add( 'cdx-radio__icon' ); + icon.classList.add( 'citizen-client-prefs-radio__icon' ); + const label = makeLabelElement( featureName, value ); + // label.classList.add( 'cdx-radio__label' ); + label.classList.add( 'citizen-client-prefs-radio__label' ); + const container = document.createElement( 'div' ); + // container.classList.add( 'cdx-radio' ); + container.classList.add( 'citizen-client-prefs-radio' ); + container.appendChild( input ); + container.appendChild( icon ); + container.appendChild( label ); + parent.appendChild( container ); + input.addEventListener( 'change', () => { + toggleDocClassAndSave( featureName, value, config ); + } ); +} + +/** + * @param {Element} form + * @param {string} featureName + * @param {HTMLElement} labelElement + * @param {string} currentValue + * @param {Record} config + */ +function appendToggleSwitch( form, featureName, labelElement, currentValue, config ) { + const input = makeInputElement( 'checkbox', featureName, currentValue ); + // input.classList.add( 'cdx-toggle-switch__input' ); + input.classList.add( 'citizen-client-prefs-toggle-switch__input' ); + const switcher = document.createElement( 'span' ); + // switcher.classList.add( 'cdx-toggle-switch__switch' ); + switcher.classList.add( 'citizen-client-prefs-toggle-switch__switch' ); + const grip = document.createElement( 'span' ); + // grip.classList.add( 'cdx-toggle-switch__switch__grip' ); + grip.classList.add( 'citizen-client-prefs-toggle-switch__switch__grip' ); + switcher.appendChild( grip ); + const label = labelElement || makeLabelElement( featureName, currentValue ); + // label.classList.add( 'cdx-toggle-switch__label' ); + label.classList.add( 'citizen-client-prefs-toggle-switch__label' ); + const toggleSwitch = document.createElement( 'span' ); + // toggleSwitch.classList.add( 'cdx-toggle-switch' ); + toggleSwitch.classList.add( 'citizen-client-prefs-toggle-switch' ); + toggleSwitch.appendChild( input ); + toggleSwitch.appendChild( switcher ); + toggleSwitch.appendChild( label ); + input.addEventListener( 'change', () => { + toggleDocClassAndSave( featureName, input.checked ? '1' : '0', config ); + } ); + form.appendChild( toggleSwitch ); +} + +/** + * @param {string} className + * @return {Element} + */ +function createRow( className ) { + const row = document.createElement( 'div' ); + row.setAttribute( 'class', className ); + return row; +} + +/** + * Get the label for the feature. + * + * @param {string} featureName + * @return {MwMessage} + */ +const getFeatureLabelMsg = ( featureName ) => + // eslint-disable-next-line mediawiki/msg-doc + mw.message( `${ featureName }-name` ); + +/** + * adds a toggle button + * + * @param {string} featureName + * @param {Record} config + * @return {Element|null} + */ +function makeControl( featureName, config ) { + const pref = config[ featureName ]; + if ( !pref ) { + return null; + } + const currentValue = clientPrefs.get( featureName ); + // The client preference was invalid. This shouldn't happen unless a gadget + // or script has modified the documentElement. + if ( typeof currentValue === 'boolean' ) { + return null; + } + const row = createRow( '' ); + const form = document.createElement( 'form' ); + const type = pref.type || 'radio'; + switch ( type ) { + case 'radio': + pref.options.forEach( ( value ) => { + appendRadioToggle( form, featureName, value, currentValue, config ); + } ); + break; + case 'switch': { + const labelElement = document.createElement( 'label' ); + labelElement.textContent = getFeatureLabelMsg( featureName ).text(); + appendToggleSwitch( form, featureName, labelElement, currentValue, config ); + break; + } default: + throw new Error( 'Unknown client preference! Only switch or radio are supported.' ); + } + row.appendChild( form ); + + if ( isFeatureExcluded( featureName ) ) { + const exclusionNotice = makeExclusionNotice( featureName ); + row.appendChild( exclusionNotice ); + } + return row; +} + +/** + * @param {Element} parent + * @param {string} featureName + * @param {Record} config + */ +function makeClientPreference( parent, featureName, config ) { + const labelMsg = getFeatureLabelMsg( featureName ); + // If the user is not debugging messages and no language exists, + // exit as its a hidden client preference. + if ( !labelMsg.exists() && mw.config.get( 'wgUserLanguage' ) !== 'qqx' ) { + return; + } else { + const id = `skin-client-prefs-${ featureName }`; + const portlet = addPortlet( id, labelMsg.text() ); + const labelElement = portlet.querySelector( 'label' ); + // eslint-disable-next-line mediawiki/msg-doc + const descriptionMsg = mw.message( `${ featureName }-description` ); + if ( descriptionMsg.exists() ) { + const desc = document.createElement( 'span' ); + desc.classList.add( 'skin-client-pref-description' ); + desc.textContent = descriptionMsg.text(); + if ( labelElement && labelElement.parentNode ) { + labelElement.appendChild( desc ); + } + } + const row = makeControl( featureName, config ); + parent.appendChild( portlet ); + if ( row ) { + const tmp = mw.util.addPortletLink( id, '', '' ); + // create a dummy link + if ( tmp ) { + const link = tmp.querySelector( 'a' ); + if ( link ) { + link.replaceWith( row ); + } + } + } + } +} + +/** + * Fills the client side preference dropdown with controls. + * + * @param {string} selector of element to fill with client preferences + * @param {Record} config + * @return {Promise} + */ +function render( selector, config ) { + const node = document.querySelector( selector ); + if ( !node ) { + return Promise.reject(); + } + return new Promise( ( resolve ) => { + getVisibleClientPreferences( config ).forEach( ( pref ) => { + makeClientPreference( node, pref, config ); + } ); + mw.requestIdleCallback( () => { + resolve( node ); + } ); + } ); +} + +/** + * @param {string} clickSelector what to click + * @param {string} renderSelector where to render + * @param {Record} config + */ +function bind( clickSelector, renderSelector, config ) { + let enhanced = false; + const chk = /** @type {HTMLInputElement} */ ( + document.querySelector( clickSelector ) + ); + if ( !chk ) { + return; + } + if ( chk.checked ) { + render( renderSelector, config ); + enhanced = true; + } else { + chk.addEventListener( 'input', () => { + if ( enhanced ) { + return; + } + render( renderSelector, config ); + enhanced = true; + } ); + } +} +module.exports = { + bind, + toggleDocClassAndSave, + render +}; diff --git a/resources/skins.citizen.preferences/clientPreferences.json b/resources/skins.citizen.preferences/clientPreferences.json new file mode 100644 index 000000000..e0586f2ac --- /dev/null +++ b/resources/skins.citizen.preferences/clientPreferences.json @@ -0,0 +1,6 @@ +{ + "skin-theme": { + "options": [ "os", "day", "night" ], + "preferenceKey": "citizen-theme" + } +} diff --git a/resources/skins.citizen.preferences/clientPrefs.localStorage.js b/resources/skins.citizen.preferences/clientPrefs.polyfill.js similarity index 97% rename from resources/skins.citizen.preferences/clientPrefs.localStorage.js rename to resources/skins.citizen.preferences/clientPrefs.polyfill.js index ef9c1fc23..fb4a0c0a6 100644 --- a/resources/skins.citizen.preferences/clientPrefs.localStorage.js +++ b/resources/skins.citizen.preferences/clientPrefs.polyfill.js @@ -1,5 +1,6 @@ /** - * mw.user.clientPrefs modified to only use localStorage + * Polyfill for mw.user.clientPrefs for < MW 1.42 + * Modified to use localStorage for all users * TODO: Revisit when we move to MW 1.43 and the interface is more stable */ diff --git a/resources/skins.citizen.preferences/skins.citizen.preferences.js b/resources/skins.citizen.preferences/skins.citizen.preferences.js index cc2bc9ddd..2dd71fb91 100644 --- a/resources/skins.citizen.preferences/skins.citizen.preferences.js +++ b/resources/skins.citizen.preferences/skins.citizen.preferences.js @@ -18,7 +18,7 @@ const CLIENTPREFS_THEME_MAP = { dark: 'night' }; -const clientPrefs = require( './clientPrefs.localStorage.js' )(); +const clientPrefs = require( './clientPrefs.polyfill.js' )(); /** * Set the value of the input element @@ -56,7 +56,6 @@ function setIndicator( key, value ) { */ function convertForForm( pref ) { return { - theme: pref.theme, fontsize: Number( pref.fontsize.slice( 0, -1 ) ) / 10 - 8, pagewidth: Number( pref.pagewidth.slice( 0, -2 ) ) / 120 - 6, lineheight: ( pref.lineheight - 1 ) * 10 @@ -105,7 +104,6 @@ function getPref() { }; const pref = { - theme: mw.storage.get( PREFIX_KEY + 'theme' ), fontsize: mw.storage.get( PREFIX_KEY + 'fontsize' ) || initFontSize(), pagewidth: mw.storage.get( PREFIX_KEY + 'pagewidth' ) || rootStyle.getPropertyValue( '--width-layout' ), lineheight: mw.storage.get( PREFIX_KEY + 'lineheight' ) || rootStyle.getPropertyValue( '--line-height' ) @@ -125,17 +123,12 @@ function setPref() { formData = Object.fromEntries( new FormData( document.getElementById( CLASS + '-form' ) ) ), currentPref = convertForForm( getPref() ), newPref = { - theme: formData[ CLASS + '-theme' ], fontsize: Number( formData[ CLASS + '-fontsize' ] ), pagewidth: Number( formData[ CLASS + '-pagewidth' ] ), lineheight: Number( formData[ CLASS + '-lineheight' ] ) }; - if ( currentPref.theme !== newPref.theme ) { - mw.storage.set( PREFIX_KEY + 'theme', newPref.theme ); - clientPrefs.set( 'skin-theme', CLIENTPREFS_THEME_MAP[ newPref.theme ] ); - - } else if ( currentPref.fontsize !== newPref.fontsize ) { + if ( currentPref.fontsize !== newPref.fontsize ) { const formattedFontSize = ( newPref.fontsize + 8 ) * 10 + '%'; mw.storage.set( PREFIX_KEY + 'fontsize', formattedFontSize ); setIndicator( 'fontsize', formattedFontSize ); @@ -166,7 +159,6 @@ function setPref() { * @return {void} */ function resetPref() { - // Do not reset theme as its default value is defined somewhere else const keys = [ 'fontsize', 'pagewidth', 'lineheight' ]; // Remove style @@ -239,15 +231,12 @@ function togglePanel() { toggle = document.getElementById( CLASS + '-toggle' ), panel = document.getElementById( CLASS + '-panel' ), form = document.getElementById( CLASS + '-form' ), - themeOption = document.getElementById( CLASS + '-theme' ), resetButton = document.getElementById( CLASS + '-resetbutton' ); if ( !panel.classList.contains( CLASS_PANEL_ACTIVE ) ) { panel.classList.add( CLASS_PANEL_ACTIVE ); toggle.setAttribute( 'aria-expanded', true ); form.addEventListener( 'input', setPref ); - // Some browser doesn't fire input events when checking radio buttons - themeOption.addEventListener( 'click', setPref ); resetButton.addEventListener( 'click', resetPref ); window.addEventListener( 'click', dismissOnClickOutside ); window.addEventListener( 'keydown', dismissOnEscape ); @@ -255,7 +244,6 @@ function togglePanel() { panel.classList.remove( CLASS_PANEL_ACTIVE ); toggle.setAttribute( 'aria-expanded', false ); form.removeEventListener( 'input', setPref ); - themeOption.removeEventListener( 'click', setPref ); resetButton.removeEventListener( 'click', resetPref ); window.removeEventListener( 'click', dismissOnClickOutside ); window.removeEventListener( 'keydown', dismissOnEscape ); @@ -270,10 +258,6 @@ function togglePanel() { function getMessages() { const keys = [ 'preferences', - 'prefs-citizen-theme-label', - 'prefs-citizen-theme-option-auto', - 'prefs-citizen-theme-option-light', - 'prefs-citizen-theme-option-dark', 'prefs-citizen-fontsize-label', 'prefs-citizen-pagewidth-label', 'prefs-citizen-lineheight-label', @@ -313,19 +297,10 @@ function initPanel( event ) { // TODO: Use ES6 template literals when RL does not screw up multiline const panel = template.render( data ).get()[ 1 ]; - // The priorities is as follow: - // 1. User-set theme (localStorage) - // 2. Site default theme (wgCitizenThemeDefault) - // 3. Fallback to auto - const currentTheme = prefValue.theme || - require( './config.json' ).wgCitizenThemeDefault || - 'auto'; - // Attach panel after button event.currentTarget.parentNode.insertBefore( panel, event.currentTarget.nextSibling ); // Set up initial state - document.getElementById( CLASS + '-theme__input__' + currentTheme ).checked = true; keys.forEach( ( key ) => { setIndicator( key, pref[ key ] ); setInputValue( key, prefValue[ key ] ); @@ -334,6 +309,30 @@ function initPanel( event ) { togglePanel(); event.currentTarget.addEventListener( 'click', togglePanel ); event.currentTarget.removeEventListener( 'click', initPanel ); + + const clientPreferenceSelector = '#citizen-client-prefs'; + const clientPreferenceExists = document.querySelectorAll( clientPreferenceSelector ).length > 0; + if ( clientPreferenceExists ) { + const clientPreferences = require( /** @type {string} */ ( './clientPreferences.js' ) ); + const clientPreferenceConfig = ( require( './clientPreferences.json' ) ); + + // Support legacy skin-citizen-* class + // TODO: Remove it in the future version after sufficient time + clientPreferenceConfig[ 'skin-theme' ].callback = () => { + const LEGACY_THEME_CLASSES = [ + 'skin-citizen-auto', + 'skin-citizen-light', + 'skin-citizen-dark' + ]; + const legacyThemeKey = Object.keys( CLIENTPREFS_THEME_MAP ).find( ( key ) => { + return CLIENTPREFS_THEME_MAP[ key ] === clientPrefs.get( 'skin-theme' ); + } ); + document.documentElement.classList.remove( ...LEGACY_THEME_CLASSES ); + document.documentElement.classList.add( `skin-citizen-${ legacyThemeKey }` ); + }; + + clientPreferences.render( clientPreferenceSelector, clientPreferenceConfig ); + } } /** diff --git a/resources/skins.citizen.preferences/skins.citizen.preferences.less b/resources/skins.citizen.preferences/skins.citizen.preferences.less index 5ef77c06a..ccc37a968 100644 --- a/resources/skins.citizen.preferences/skins.citizen.preferences.less +++ b/resources/skins.citizen.preferences/skins.citizen.preferences.less @@ -17,31 +17,15 @@ width: 100%; } - &__value { - font-weight: var( --font-weight-medium ); - color: var( --color-base--emphasized ); + &__title { + font-size: var( --font-size-x-small ); + color: var( --color-base--subtle ); + letter-spacing: 0.05em; } - } - &-theme { - &-option { - flex-grow: 1; - padding: 0.5rem 1rem; + &__value { font-weight: var( --font-weight-medium ); - text-align: center; - white-space: nowrap; - cursor: pointer; - border: 2px solid var( --border-color-base ); - border-radius: var( --border-radius--medium ); - - &:hover { - border-color: var( --color-primary--hover ); - box-shadow: var( --box-shadow-card ); - } - - &:active { - border-color: var( --color-primary--active ); - } + color: var( --color-base--emphasized ); } } @@ -89,39 +73,6 @@ margin: var( --space-md ) 0; } - &-theme { - &-option { - &-light { - color: ~'hsl( var( --color-primary__h ), 30%, 20% )'; - background: ~'hsl( var( --color-primary__h ), 25%, 94% )'; - } - - &-dark { - color: ~'hsl( var( --color-primary__h ), 10%, 75% )'; - background: ~'hsl( var( --color-primary__h ), 20%, 10% )'; - } - } - - fieldset { - display: flex; - gap: 0.5rem; - width: 100%; - padding: 0; - margin-top: 0.25rem; - } - - // Let label be the radio button - input { - display: none; - - &:checked { - + label { - border-color: var( --color-primary ); - } - } - } - } - &-resetbutton { width: 100%; padding: var( --space-sm ) var( --space-md ); @@ -145,6 +96,66 @@ } } +// New clientPrefs styles +.citizen-client-prefs { + &-radio { + &__input { + // Hide radio button because we use label as button + display: none; + + &:checked { + ~ .citizen-client-prefs-radio__label { + border-color: var( --color-primary ); + } + } + } + + &__label { + display: block; + padding: var( --space-xs ) var( --space-md ); + font-weight: var( --font-weight-medium ); + border: 2px solid var( --border-color-base ); + border-radius: var( --border-radius--medium ); + } + } +} + +#citizen-client-prefs { + .citizen-menu { + &__content { + padding: 0 var( --space-md ); + } + } +} + +#skin-client-prefs-skin-theme { + form { + display: grid; + // This is not the best because it does not adapt to the text length but will revisit later + grid-template-columns: 1fr 1fr; + gap: var( --space-xxs ); + text-align: center; + } + + label { + background: var( --color-surface-0 ); + + &[ for='skin-client-pref-skin-theme-value-day' ] { + // color-base of day theme + color: ~'hsl( var( --color-primary__h ), 30%, 20% )'; + // color-surface-0 of day theme + background: ~'hsl( var( --color-primary__h ), 30%, 96% )'; + } + + &[ for='skin-client-pref-skin-theme-value-night' ] { + // color-base of night theme + color: ~'hsl( var( --color-primary__h ), 25%, 80% )'; + // color-surface-0 of night theme + background: ~'hsl( var( --color-primary__h ), 20%, 10% )'; + } + } +} + @media ( hover: hover ) { .citizen-pref:hover .citizen-pref__button .citizen-ui-icon::before { transform: rotate3d( 0, 0, 1, 90deg ); diff --git a/resources/skins.citizen.preferences/templates/preferences.mustache b/resources/skins.citizen.preferences/templates/preferences.mustache index ed5dc10aa..98774e8bf 100644 --- a/resources/skins.citizen.preferences/templates/preferences.mustache +++ b/resources/skins.citizen.preferences/templates/preferences.mustache @@ -11,21 +11,8 @@ \ No newline at end of file diff --git a/templates/MainMenu.mustache b/templates/MainMenu.mustache new file mode 100644 index 000000000..ad8bef322 --- /dev/null +++ b/templates/MainMenu.mustache @@ -0,0 +1,4 @@ +
+ {{#data-portlets-first}}{{>Menu}}{{/data-portlets-first}} + {{#array-portlets-rest}}{{>Menu}}{{/array-portlets-rest}} +
\ No newline at end of file diff --git a/templates/MenuListItem.mustache b/templates/MenuListItem.mustache index 5791122f7..850293c77 100644 --- a/templates/MenuListItem.mustache +++ b/templates/MenuListItem.mustache @@ -1,4 +1,4 @@ -
  • {{! +
  • {{! }}{{#array-links}}{{! }}{{>Link}}{{! }}{{/array-links}}{{! diff --git a/templates/PageFooter.mustache b/templates/PageFooter.mustache new file mode 100644 index 000000000..49ceaeda7 --- /dev/null +++ b/templates/PageFooter.mustache @@ -0,0 +1,9 @@ +{{! + +}} +
    + {{{html-categories}}} + {{#data-page-footer}} + {{>PageFooter__item}} + {{/data-page-footer}} +
    \ No newline at end of file diff --git a/templates/ContentFooter__item.mustache b/templates/PageFooter__item.mustache similarity index 100% rename from templates/ContentFooter__item.mustache rename to templates/PageFooter__item.mustache diff --git a/templates/PageHeader.mustache b/templates/PageHeader.mustache new file mode 100644 index 000000000..7daf17aec --- /dev/null +++ b/templates/PageHeader.mustache @@ -0,0 +1,5 @@ +
    + {{#data-page-heading}}{{>PageHeading}}{{/data-page-heading}} + {{>PageTools}} +
    +
    diff --git a/templates/PageHeading.mustache b/templates/PageHeading.mustache new file mode 100644 index 000000000..88648c3ca --- /dev/null +++ b/templates/PageHeading.mustache @@ -0,0 +1,15 @@ +{{! + Indicator[] array-indicators wiki-defined badges such as "good article", + "featured article". An empty array if none are defined. + string html-title-heading--formatted + string html-tagline + string html-citizen-jumptotop Jump to top title text +}} +
    +
    + {{{html-title-heading}}} + {{>Indicators}} +
    +
    {{{html-tagline}}}
    + +
    \ No newline at end of file diff --git a/templates/PageSidebar.mustache b/templates/PageSidebar.mustache new file mode 100644 index 000000000..974c5c77a --- /dev/null +++ b/templates/PageSidebar.mustache @@ -0,0 +1,9 @@ +{{! + +}} +
    + {{#data-page-sidebar}} + {{#data-page-sidebar-lastmod}}{{>Menu}}{{/data-page-sidebar-lastmod}} + {{/data-page-sidebar}} + {{>TableOfContents}} +
    \ No newline at end of file diff --git a/templates/Drawer__siteStats.mustache b/templates/SiteStats.mustache similarity index 78% rename from templates/Drawer__siteStats.mustache rename to templates/SiteStats.mustache index 4886161da..a5dc268a1 100644 --- a/templates/Drawer__siteStats.mustache +++ b/templates/SiteStats.mustache @@ -1,8 +1,8 @@
    - {{#array-drawer-sitestats-item}} + {{#array-sitestats-items}}
    {{value}}
    - {{/array-drawer-sitestats-item}} + {{/array-sitestats-items}}
    \ No newline at end of file diff --git a/templates/UserInfo.mustache b/templates/UserInfo.mustache new file mode 100644 index 000000000..1289d60ad --- /dev/null +++ b/templates/UserInfo.mustache @@ -0,0 +1,20 @@ +
    +
    + {{#title}}
    {{.}}
    {{/title}} + {{#data-user-page}}{{>Menu}}{{/data-user-page}} +
    +
    + {{#text}}
    {{.}}
    {{/text}} + {{#data-user-groups}} +
      + {{#array-list-items}}{{>MenuListItem}}{{/array-list-items}} +
    + {{/data-user-groups}} +
    + {{#data-user-edit}} +
    +
    {{count}}
    +
    {{label}}
    +
    + {{/data-user-edit}} +
    \ No newline at end of file diff --git a/templates/UserMenu.mustache b/templates/UserMenu.mustache index e731c94fe..1df22a3f1 100644 --- a/templates/UserMenu.mustache +++ b/templates/UserMenu.mustache @@ -19,9 +19,7 @@ {{msg-citizen-usermenu-toggle}} diff --git a/templates/skin.mustache b/templates/skin.mustache index 5982ca4eb..182c12b31 100644 --- a/templates/skin.mustache +++ b/templates/skin.mustache @@ -12,18 +12,20 @@ {{>Header}}
    -
    {{{html-site-notice}}}
    +
    +
    {{{html-site-notice}}}
    +
    - {{>ContentHeader}} + {{>PageHeader}}
    {{{html-subtitle}}}
    {{#html-undelete-link}}
    {{{.}}}
    {{/html-undelete-link}} {{{html-user-message}}} {{{html-body-content--formatted}}}
    - {{#toc-enabled}}{{>ContentSidebar}}{{/toc-enabled}} - {{>ContentFooter}} + {{#toc-enabled}}{{>PageSidebar}}{{/toc-enabled}} + {{>PageFooter}}
    {{{html-after-content}}} diff --git a/tests/phpunit/Partials/DrawerTest.php b/tests/phpunit/Partials/DrawerTest.php deleted file mode 100644 index 1d637aeee..000000000 --- a/tests/phpunit/Partials/DrawerTest.php +++ /dev/null @@ -1,85 +0,0 @@ -assertEmpty( $partial->decorateMainMenuData( [ - 'array-portlets-rest' => [], - ] )['array-portlets-rest'] ); - } - - /** - * @covers \MediaWiki\Skins\Citizen\Partials\Drawer::decorateMainMenuData - * @return void - */ - public function testDecorateMainMenuRemovePageTools() { - $partial = new Drawer( new SkinCitizen() ); - - $mainMenuData = [ - 'array-portlets-rest' => [ - [ 'id' => 'foo' ], - [ 'id' => 'p-tb' ], - ], - ]; - - $this->assertNotEmpty( $partial->decorateMainMenuData( $mainMenuData ) ); - $this->assertArrayHasKey( 'array-portlets-rest', $partial->decorateMainMenuData( $mainMenuData ) ); - $this->assertNotContains( [ 'id' => 'pt-tb' ], $partial->decorateMainMenuData( $mainMenuData )['array-portlets-rest'] ); - } - - /** - * @covers \MediaWiki\Skins\Citizen\Partials\Drawer::getSiteStatsData - * @return void - */ - public function testGetSiteStatsDataDisabled() { - $this->overrideConfigValues( [ - 'CitizenEnableDrawerSiteStats' => false, - ] ); - - $partial = new Drawer( new SkinCitizen() ); - $this->assertEmpty( $partial->getSiteStatsData() ); - } - - /** - * @covers \MediaWiki\Skins\Citizen\Partials\Drawer::getSiteStatsData - * @covers \MediaWiki\Skins\Citizen\Partials\Drawer::getSiteStatValue - * @return void - */ - public function testGetSiteStatsDataNoFormat() { - $this->overrideConfigValues( [ - 'CitizenEnableDrawerSiteStats' => true, - 'CitizenUseNumberFormatter' => false, - ] ); - - $partial = new Drawer( new SkinCitizen() ); - $data = $partial->getSiteStatsData(); - - $this->assertArrayHasKey( 'array-drawer-sitestats-item', $data ); - $this->assertCount( 4, $data['array-drawer-sitestats-item'] ); - - foreach ( $data['array-drawer-sitestats-item'] as $stat ) { - $this->assertArrayHasKey( 'id', $stat ); - $this->assertArrayHasKey( 'icon', $stat ); - $this->assertArrayHasKey( 'value', $stat ); - $this->assertArrayHasKey( 'label', $stat ); - - $this->assertContains( $stat['id'], [ 'articles', 'images', 'users', 'edits' ] ); - } - } -} diff --git a/tests/phpunit/Partials/FooterTest.php b/tests/phpunit/Partials/FooterTest.php deleted file mode 100644 index 055a13188..000000000 --- a/tests/phpunit/Partials/FooterTest.php +++ /dev/null @@ -1,43 +0,0 @@ - [ - 'array-items' => [ - [ 'name' => 'copyright' ] - ] - ] - ]; - - $out = $partial->decorateFooterData( $data ); - - $this->assertArraySubmapSame( [ - 'data-info' => [ - 'array-items' => [ - [ - 'name' => 'copyright', - 'label' => wfMessage( 'citizen-page-info-copyright' )->text() - ] - ], - ] - ], $out ); - } -} diff --git a/tests/phpunit/Partials/HeaderTest.php b/tests/phpunit/Partials/HeaderTest.php deleted file mode 100644 index 913bd6873..000000000 --- a/tests/phpunit/Partials/HeaderTest.php +++ /dev/null @@ -1,39 +0,0 @@ -decorateSearchBoxData( [] ); - - $this->assertArrayHasKey( 'msg-citizen-search-toggle-shortcut', $out ); - $this->assertEquals( '[/]', $out['msg-citizen-search-toggle-shortcut'] ); - } - - /** - * @covers \MediaWiki\Skins\Citizen\Partials\Header::getUserInfoData - * @covers \MediaWiki\Skins\Citizen\Partials\Header::getUserPageHTML - * @covers \MediaWiki\Skins\Citizen\Partials\Header::getUserGroupsHTML - * @covers \MediaWiki\Skins\Citizen\Partials\Header::getUserContributionsHTML - * @return void - */ - public function testGetUserInfoData() { - $partial = new Header( new SkinCitizen() ); - $out = $partial->getUserInfoData( [] ); - - $this->assertArrayHasKey( 'id', $out ); - } -} diff --git a/tests/phpunit/Partials/PageTitleTest.php b/tests/phpunit/Partials/PageTitleTest.php deleted file mode 100644 index e4d24a2b5..000000000 --- a/tests/phpunit/Partials/PageTitleTest.php +++ /dev/null @@ -1,57 +0,0 @@ -setTitle( $title ); - $partial = new PageTitle( new SkinCitizen() ); - - $data = sprintf( - '

    %s

    ', - 'Foo Title (paren)' - ); - $text = $partial->decorateTitle( $data ); - - $this->assertStringNotContainsString( 'mw-page-title-parenthesis', $text ); - } - - /** - * @covers \MediaWiki\Skins\Citizen\Partials\PageTitle - * @return void - * @throws MWException - */ - public function testDecorateTitle() { - $title = Title::makeTitle( NS_MAIN, 'Foo' ); - RequestContext::resetMain(); - RequestContext::getMain()->setTitle( $title ); - $partial = new PageTitle( new SkinCitizen() ); - - $data = sprintf( - '

    %s

    ', - 'Foo Title (paren)' - ); - $text = $partial->decorateTitle( $data ); - - $this->assertStringContainsString( 'mw-page-title-parenthesis', $text ); - } -} diff --git a/tests/phpunit/Partials/TaglineTest.php b/tests/phpunit/Partials/TaglineTest.php deleted file mode 100644 index f135ebb23..000000000 --- a/tests/phpunit/Partials/TaglineTest.php +++ /dev/null @@ -1,70 +0,0 @@ -assertEmpty( $partial->getTagline() ); - } - - /** - * @covers \MediaWiki\Skins\Citizen\Partials\Tagline - * @return void - */ - public function testGetTagLineShortDesc() { - $title = Title::makeTitle( NS_MAIN, 'Foo' ); - - RequestContext::resetMain(); - - $out = new OutputPage( RequestContext::getMain() ); - $out->setProperty( 'shortdesc', '' ); - - RequestContext::getMain()->setOutput( $out ); - RequestContext::getMain()->setTitle( $title ); - - $partial = new Tagline( new SkinCitizen() ); - - $this->assertEquals( '', $partial->getTagline() ); - } - - /** - * @covers \MediaWiki\Skins\Citizen\Partials\Tagline - * @return void - */ - public function testGetTagLineNoNSText() { - $title = $this->getMockBuilder( Title::class )->disableOriginalConstructor()->getMock(); - $title->expects( $this->once() )->method( 'getNsText' )->willReturn( false ); - - RequestContext::resetMain(); - - $out = new OutputPage( RequestContext::getMain() ); - $out->setProperty( 'shortdesc', null ); - - RequestContext::getMain()->setOutput( $out ); - RequestContext::getMain()->setTitle( $title ); - - $partial = new Tagline( new SkinCitizen() ); - - $this->assertEquals( - wfMessage( 'tagline' )->text(), - $partial->getTagline() - ); - } -} diff --git a/tests/phpunit/Unit/Components/CitizenComponentLinkTest.php b/tests/phpunit/Unit/Components/CitizenComponentLinkTest.php new file mode 100644 index 000000000..8f10c7126 --- /dev/null +++ b/tests/phpunit/Unit/Components/CitizenComponentLinkTest.php @@ -0,0 +1,59 @@ +createMock( MessageLocalizer::class ); + // Adjusting mock to prevent calling the service container. + $localizer->method( 'msg' ) + ->willReturnCallback( function ( $key ) use ( $accessKeyHint ) { + // Directly create Message object without accessing real message texts + // to avoid 'Premature access to service container' error. + return $this->createConfiguredMock( Message::class, [ + 'exists' => true, + 'text' => $key === $accessKeyHint . '-label' ? 'Mock aria label' : $key, + '__toString' => 'Mock aria label', + ] ); + } ); + + // Create the component + $linkComponent = new CitizenComponentLink( $href, $text, $icon, $localizer, $accessKeyHint ); + $actual = $linkComponent->getTemplateData(); + + // Assert the expected values + $this->assertEquals( $icon, $actual['icon'] ); + $this->assertEquals( $text, $actual['text'] ); + $this->assertEquals( $href, $actual['href'] ); + + // New assertions for HTML attributes + $expectedTitle = "tooltip-sample-accesskeyword-separatorbrackets"; + $expectedAriaLabel = "Mock aria label"; + $attributesString = $actual['html-attributes']; + + // Assert that the expected attributes are present in the string + $this->assertStringContainsString( 'title="' . $expectedTitle . '"', $attributesString ); + $this->assertStringContainsString( 'aria-label="' . $expectedAriaLabel . '"', $attributesString ); + } +} diff --git a/tests/phpunit/Unit/Components/CitizenComponentMainMenuTest.php b/tests/phpunit/Unit/Components/CitizenComponentMainMenuTest.php new file mode 100644 index 000000000..3bc56cbec --- /dev/null +++ b/tests/phpunit/Unit/Components/CitizenComponentMainMenuTest.php @@ -0,0 +1,66 @@ +assertInstanceOf( CitizenComponent::class, $mainMenu ); + } + + /** + * @return array[] + */ + public function provideMainMenuData(): array { + return [ + [ + 'sidebarData' => [ + 'data-portlets-first' => [], + 'array-portlets-rest' => [], + ] + ] + ]; + } + + /** + * @covers ::getTemplateData + * @dataProvider provideMainMenuData + */ + public function testGetTemplateData( array $sidebarData ) { + // Create a new CitizenComponentMainMenu object + $mainMenu = new CitizenComponentMainMenu( $sidebarData ); + + // Call the getTemplateData method + $templateData = $mainMenu->getTemplateData(); + + // Assert the structure and types of expected keys + $this->assertIsArray( $templateData['data-portlets-first'] ); + $this->assertIsArray( $templateData['array-portlets-rest'] ); + + // Assert the structure and types of expected keys + $this->assertArrayHasKey( 'data-portlets-first', $templateData ); + $this->assertArrayHasKey( 'array-portlets-rest', $templateData ); + } +} diff --git a/tests/phpunit/Unit/Components/CitizenComponentMenuListItemTest.php b/tests/phpunit/Unit/Components/CitizenComponentMenuListItemTest.php new file mode 100644 index 000000000..b69cdb641 --- /dev/null +++ b/tests/phpunit/Unit/Components/CitizenComponentMenuListItemTest.php @@ -0,0 +1,38 @@ +link = $link; + $this->class = $class; + $this->id = $id; + } + + /** + * @inheritDoc + */ + public function getTemplateData(): array { + return $this->link->getTemplateData() + [ + 'item-class' => $this->class, + 'item-id' => $this->id, + ]; + } +} diff --git a/tests/phpunit/Unit/Components/CitizenComponentMenuTest.php b/tests/phpunit/Unit/Components/CitizenComponentMenuTest.php new file mode 100644 index 000000000..29c075150 --- /dev/null +++ b/tests/phpunit/Unit/Components/CitizenComponentMenuTest.php @@ -0,0 +1,98 @@ + 'some-class', + 'label' => 'Some label', + 'html-tooltip' => 'Some tooltip', + 'label-class' => 'some-label-class', + 'html-before-portal' => 'Some before portal', + 'html-items' => 'Some items', + 'html-after-portal' => 'Some after portal', + 'array-list-items' => [ 'some-item-one', 'some-item-2', 'some-item-3' ] + ] + ] + ]; + } + + /** + * @return array[] + */ + public function provideCountData(): array { + return [ + [ + [ + 'array-list-items' => [ 'some-item-one', 'some-item-2', 'some-item-3' ] + ], + 3 + ], + [ + [ + 'html-items' => '
  • Some item
  • Some item
  • Some item
  • ' + ], + 3 + ] + ]; + } + + /** + * This test checks if the CitizenComponentMenu class can be instantiated + * @covers ::__construct + */ + public function testConstruct() { + // Create a new CitizenComponentMenu object + $menu = new CitizenComponentMenu( [] ); + + // Check if the object is an instance of CitizenComponent + $this->assertInstanceOf( CitizenComponent::class, $menu ); + } + + /** + * This test checks if the count method returns the correct number of items + * @covers ::count + * @dataProvider provideCountData + */ + public function testCount( array $data, int $expected ) { + // Create a new CitizenComponentMenu object + $menu = new CitizenComponentMenu( $data ); + + // Check if the count method returns the correct number of items + $this->assertSame( $expected, $menu->count() ); + } + + /** + * This test checks if the getTemplateData method returns the correct data + * @covers ::getTemplateData + * @dataProvider provideMenuData + */ + public function testGetTemplateData( array $data ) { + // Create a new CitizenComponentMenu object + $menu = new CitizenComponentMenu( $data ); + + // Call the getTemplateData method + $actualData = $menu->getTemplateData(); + + // Check if the getTemplateData method returns the correct data + $this->assertSame( $data, $actualData ); + } +} diff --git a/tests/phpunit/Hooks/ResourceLoaderHooksTest.php b/tests/phpunit/integration/Hooks/ResourceLoaderHooksTest.php similarity index 95% rename from tests/phpunit/Hooks/ResourceLoaderHooksTest.php rename to tests/phpunit/integration/Hooks/ResourceLoaderHooksTest.php index c281fd41f..f0e10dbfc 100644 --- a/tests/phpunit/Hooks/ResourceLoaderHooksTest.php +++ b/tests/phpunit/integration/Hooks/ResourceLoaderHooksTest.php @@ -2,15 +2,16 @@ declare( strict_types=1 ); -namespace MediaWiki\Skins\Citizen\Tests\Hooks; +namespace MediaWiki\Skins\Citizen\Tests\Integration\Hooks; use MediaWiki\ResourceLoader\Context; use MediaWiki\Skins\Citizen\Hooks\ResourceLoaderHooks; +use MediaWikiIntegrationTestCase; /** * @group Citizen */ -class ResourceLoaderHooksTest extends \MediaWikiIntegrationTestCase { +class ResourceLoaderHooksTest extends MediaWikiIntegrationTestCase { /** * @covers \MediaWiki\Skins\Citizen\Hooks\ResourceLoaderHooks * @return void diff --git a/tests/phpunit/Hooks/SkinHooksTest.php b/tests/phpunit/integration/Hooks/SkinHooksTest.php similarity index 98% rename from tests/phpunit/Hooks/SkinHooksTest.php rename to tests/phpunit/integration/Hooks/SkinHooksTest.php index 58169f26c..740255c29 100644 --- a/tests/phpunit/Hooks/SkinHooksTest.php +++ b/tests/phpunit/integration/Hooks/SkinHooksTest.php @@ -2,12 +2,13 @@ declare( strict_types=1 ); -namespace MediaWiki\Skins\Citizen\Tests\Hooks; +namespace MediaWiki\Skins\Citizen\Tests\Integration\Hooks; use MediaWiki\Request\ContentSecurityPolicy; use MediaWiki\Skins\Citizen\Hooks\SkinHooks; use MediaWiki\Skins\Citizen\SkinCitizen; use MediaWiki\Title\Title; +use MediaWikiIntegrationTestCase; use OutputPage; use RequestContext; use ResourceLoaderContext; @@ -16,7 +17,7 @@ /** * @group Citizen */ -class SkinHooksTest extends \MediaWikiIntegrationTestCase { +class SkinHooksTest extends MediaWikiIntegrationTestCase { /** * @covers \MediaWiki\Skins\Citizen\Hooks\SkinHooks * @return void diff --git a/tests/phpunit/Partials/BodyContentTest.php b/tests/phpunit/integration/Partials/BodyContentTest.php similarity index 97% rename from tests/phpunit/Partials/BodyContentTest.php rename to tests/phpunit/integration/Partials/BodyContentTest.php index aa0aafaa5..35d8b9d12 100644 --- a/tests/phpunit/Partials/BodyContentTest.php +++ b/tests/phpunit/integration/Partials/BodyContentTest.php @@ -2,7 +2,7 @@ declare( strict_types=1 ); -namespace MediaWiki\Skins\Citizen\Tests\Partials; +namespace MediaWiki\Skins\Citizen\Tests\Integration\Partials; use MediaWiki\Skins\Citizen\Partials\BodyContent; use MediaWiki\Skins\Citizen\SkinCitizen; diff --git a/tests/phpunit/Partials/PageToolsTest.php b/tests/phpunit/integration/Partials/PageToolsTest.php similarity index 98% rename from tests/phpunit/Partials/PageToolsTest.php rename to tests/phpunit/integration/Partials/PageToolsTest.php index e31b124cf..4300285fe 100644 --- a/tests/phpunit/Partials/PageToolsTest.php +++ b/tests/phpunit/integration/Partials/PageToolsTest.php @@ -2,7 +2,7 @@ declare( strict_types=1 ); -namespace MediaWiki\Skins\Citizen\Tests\Partials; +namespace MediaWiki\Skins\Citizen\Tests\Integration\Partials; use MediaWiki\Skins\Citizen\Partials\PageTools; use MediaWiki\Skins\Citizen\SkinCitizen; diff --git a/tests/phpunit/SkinCitizenTest.php b/tests/phpunit/integration/SkinCitizenTest.php similarity index 98% rename from tests/phpunit/SkinCitizenTest.php rename to tests/phpunit/integration/SkinCitizenTest.php index ce22e8ab0..2442c17f9 100644 --- a/tests/phpunit/SkinCitizenTest.php +++ b/tests/phpunit/integration/SkinCitizenTest.php @@ -2,7 +2,7 @@ declare( strict_types=1 ); -namespace MediaWiki\Skins\Citizen\Tests; +namespace MediaWiki\Skins\Citizen\Integration\Tests; use Exception; use MediaWiki\Skins\Citizen\SkinCitizen; From a193d14de7b6728774231d8a37750a70682cc089 Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Wed, 15 May 2024 01:31:23 -0400 Subject: [PATCH 143/254] =?UTF-8?q?feat(core):=20=E2=9C=A8=20tweak=20dark?= =?UTF-8?q?=20theme=20color=20to=20be=20darker?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/skins.citizen.styles/common/features.less | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/resources/skins.citizen.styles/common/features.less b/resources/skins.citizen.styles/common/features.less index 9de3fd332..e3b63d924 100644 --- a/resources/skins.citizen.styles/common/features.less +++ b/resources/skins.citizen.styles/common/features.less @@ -5,11 +5,11 @@ .theme-dark() { --color-primary__l: 60%; - --color-surface-0: ~'hsl( var( --color-primary__h ), 20%, 10% )'; - --color-surface-1: ~'hsl( var( --color-primary__h ), 25%, 12% )'; - --color-surface-2: ~'hsl( var( --color-primary__h ), 25%, 15% )'; - --color-surface-3: ~'hsl( var( --color-primary__h ), 15%, 20% )'; - --color-surface-4: ~'hsl( var( --color-primary__h ), 15%, 25% )'; + --color-surface-0: ~'hsl( var( --color-primary__h ), 20%, 8% )'; + --color-surface-1: ~'hsl( var( --color-primary__h ), 25%, 10% )'; + --color-surface-2: ~'hsl( var( --color-primary__h ), 25%, 13% )'; + --color-surface-3: ~'hsl( var( --color-primary__h ), 15%, 18% )'; + --color-surface-4: ~'hsl( var( --color-primary__h ), 15%, 23% )'; --color-base--emphasized: ~'hsl( var( --color-primary__h ), 80%, 95% )'; --color-base: ~'hsl( var( --color-primary__h ), 25%, 80% )'; From c09b82cb07913be5e7243c5eca0869a3007bc3b6 Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Wed, 15 May 2024 02:02:48 -0400 Subject: [PATCH 144/254] fix(core): Rename Usermenu.less to UserMenu.less --- .../components/{Usermenu.less => UserMenu.less} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename resources/skins.citizen.styles/components/{Usermenu.less => UserMenu.less} (100%) diff --git a/resources/skins.citizen.styles/components/Usermenu.less b/resources/skins.citizen.styles/components/UserMenu.less similarity index 100% rename from resources/skins.citizen.styles/components/Usermenu.less rename to resources/skins.citizen.styles/components/UserMenu.less From 0006db65a20f31c07a640fe5a0fbf2b485df392f Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Wed, 15 May 2024 02:31:00 -0400 Subject: [PATCH 145/254] fix(components): catch MalformedTitleException in titleFromText --- includes/Components/CitizenComponentUserInfo.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/includes/Components/CitizenComponentUserInfo.php b/includes/Components/CitizenComponentUserInfo.php index f09511ba7..1b84a829b 100644 --- a/includes/Components/CitizenComponentUserInfo.php +++ b/includes/Components/CitizenComponentUserInfo.php @@ -4,6 +4,7 @@ namespace MediaWiki\Skins\Citizen\Components; +use MalformedTitleException; use MediaWiki\MediaWikiServices; use MediaWiki\Title\Title; use MediaWiki\User\UserIdentity; @@ -94,7 +95,11 @@ private function getUserGroups(): ?array { foreach ( $groups as $group ) { $id = sprintf( $msgKey, $group ); $text = $this->localizer->msg( $id )->text(); - $title = $this->title->newFromText( $text, NS_PROJECT ); + try { + $title = $this->title->newFromTextThrow( $text, NS_PROJECT ); + catch ( MalformedTitleException $e ) { + // ignore + } if ( !$text || !$title ) { continue; From c1aad746c31ab55b87f39666297976a3ecc6663d Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 15 May 2024 06:31:31 +0000 Subject: [PATCH 146/254] =?UTF-8?q?ci:=20=F0=9F=91=B7=20lint=20code=20to?= =?UTF-8?q?=20MediaWiki=20standards?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Check commit and GitHub actions for more details --- .../Components/CitizenComponentUserInfo.php | 72 +++++++++---------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/includes/Components/CitizenComponentUserInfo.php b/includes/Components/CitizenComponentUserInfo.php index 1b84a829b..ee2c98804 100644 --- a/includes/Components/CitizenComponentUserInfo.php +++ b/includes/Components/CitizenComponentUserInfo.php @@ -40,7 +40,7 @@ class CitizenComponentUserInfo implements CitizenComponent { * @param UserIdentity $user * @param array $userPageData */ - public function __construct( +public function __construct( bool $isRegistered, bool $isTemp, MessageLocalizer $localizer, @@ -48,55 +48,55 @@ public function __construct( UserIdentity $user, array $userPageData ) { - $this->isRegistered = $isRegistered; - $this->isTemp = $isTemp; - $this->localizer = $localizer; - $this->title = $title; - $this->user = $user; - $this->userPageData = $userPageData; - } + $this->isRegistered = $isRegistered; + $this->isTemp = $isTemp; + $this->localizer = $localizer; + $this->title = $title; + $this->user = $user; + $this->userPageData = $userPageData; +} /** * Get the user edit count * * @return array|null */ - private function getUserEditCount(): ?array { - // Return user edits - $edits = MediaWikiServices::getInstance()->getUserEditTracker()->getUserEditCount( $this->user ); +private function getUserEditCount(): ?array { + // Return user edits + $edits = MediaWikiServices::getInstance()->getUserEditTracker()->getUserEditCount( $this->user ); - if ( empty( $edits ) ) { - return null; - } + if ( empty( $edits ) ) { + return null; + } - $label = $this->localizer->msg( 'usereditcount' )->numParams( $edits ); - $label = str_replace( $edits, '', $label ); + $label = $this->localizer->msg( 'usereditcount' )->numParams( $edits ); + $label = str_replace( $edits, '', $label ); - return [ - 'count' => number_format( $edits, 0 ), - 'label' => $label - ]; - } + return [ + 'count' => number_format( $edits, 0 ), + 'label' => $label + ]; +} /** * Build the template data for the user groups * * @return array|null */ - private function getUserGroups(): ?array { - $groups = MediaWikiServices::getInstance()->getUserGroupManager()->getUserGroups( $this->user ); +private function getUserGroups(): ?array { + $groups = MediaWikiServices::getInstance()->getUserGroupManager()->getUserGroups( $this->user ); - if ( empty( $groups ) ) { - return null; - } + if ( empty( $groups ) ) { + return null; + } - $listItems = []; - $msgKey = 'group-%s-member'; - foreach ( $groups as $group ) { - $id = sprintf( $msgKey, $group ); - $text = $this->localizer->msg( $id )->text(); - try { - $title = $this->title->newFromTextThrow( $text, NS_PROJECT ); + $listItems = []; + $msgKey = 'group-%s-member'; + foreach ( $groups as $group ) { + $id = sprintf( $msgKey, $group ); + $text = $this->localizer->msg( $id )->text(); + try { + $title = $this->title->newFromTextThrow( $text, NS_PROJECT ); catch ( MalformedTitleException $e ) { // ignore } @@ -106,8 +106,8 @@ private function getUserGroups(): ?array { } $link = new CitizenComponentLink( - $title->getLinkURL(), - ucfirst( $text ) + $title->getLinkURL(), + ucfirst( $text ) ); $listItem = new CitizenComponentMenuListItem( $link, 'citizen-userInfo-usergroup', $id ); @@ -116,7 +116,7 @@ private function getUserGroups(): ?array { } return [ - 'array-list-items' => $listItems + 'array-list-items' => $listItems ]; } From d4d71dc34a7300176f185d50a8742fcd160f5147 Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Wed, 15 May 2024 02:43:50 -0400 Subject: [PATCH 147/254] =?UTF-8?q?fix(core):=20=F0=9F=90=9B=20incorrect?= =?UTF-8?q?=20try=20catch=20block?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/CitizenComponentUserInfo.php | 107 +++++++++--------- 1 file changed, 56 insertions(+), 51 deletions(-) diff --git a/includes/Components/CitizenComponentUserInfo.php b/includes/Components/CitizenComponentUserInfo.php index ee2c98804..1b77d921d 100644 --- a/includes/Components/CitizenComponentUserInfo.php +++ b/includes/Components/CitizenComponentUserInfo.php @@ -1,6 +1,6 @@ isRegistered = $isRegistered; - $this->isTemp = $isTemp; - $this->localizer = $localizer; - $this->title = $title; - $this->user = $user; - $this->userPageData = $userPageData; -} + $this->isRegistered = $isRegistered; + $this->isTemp = $isTemp; + $this->localizer = $localizer; + $this->title = $title; + $this->user = $user; + $this->userPageData = $userPageData; + } /** * Get the user edit count * * @return array|null */ -private function getUserEditCount(): ?array { - // Return user edits - $edits = MediaWikiServices::getInstance()->getUserEditTracker()->getUserEditCount( $this->user ); + private function getUserEditCount(): ?array + { + // Return user edits + $edits = MediaWikiServices::getInstance()->getUserEditTracker()->getUserEditCount($this->user); - if ( empty( $edits ) ) { - return null; - } + if (empty($edits)) { + return null; + } - $label = $this->localizer->msg( 'usereditcount' )->numParams( $edits ); - $label = str_replace( $edits, '', $label ); + $label = $this->localizer->msg('usereditcount')->numParams($edits); + $label = str_replace($edits, '', $label); - return [ - 'count' => number_format( $edits, 0 ), - 'label' => $label - ]; -} + return [ + 'count' => number_format($edits, 0), + 'label' => $label + ]; + } /** * Build the template data for the user groups * * @return array|null */ -private function getUserGroups(): ?array { - $groups = MediaWikiServices::getInstance()->getUserGroupManager()->getUserGroups( $this->user ); + private function getUserGroups(): ?array + { + $groups = MediaWikiServices::getInstance()->getUserGroupManager()->getUserGroups($this->user); - if ( empty( $groups ) ) { - return null; - } + if (empty($groups)) { + return null; + } - $listItems = []; - $msgKey = 'group-%s-member'; - foreach ( $groups as $group ) { - $id = sprintf( $msgKey, $group ); - $text = $this->localizer->msg( $id )->text(); - try { - $title = $this->title->newFromTextThrow( $text, NS_PROJECT ); - catch ( MalformedTitleException $e ) { + $listItems = []; + $msgKey = 'group-%s-member'; + foreach ($groups as $group) { + $id = sprintf($msgKey, $group); + $text = $this->localizer->msg($id)->text(); + try { + $title = $this->title->newFromTextThrow($text, NS_PROJECT); + } catch (MalformedTitleException $e) { // ignore } - if ( !$text || !$title ) { + if (!$text || !$title) { continue; } $link = new CitizenComponentLink( - $title->getLinkURL(), - ucfirst( $text ) + $title->getLinkURL(), + ucfirst($text) ); - $listItem = new CitizenComponentMenuListItem( $link, 'citizen-userInfo-usergroup', $id ); + $listItem = new CitizenComponentMenuListItem($link, 'citizen-userInfo-usergroup', $id); $listItems[] = $listItem->getTemplateData(); } return [ - 'array-list-items' => $listItems + 'array-list-items' => $listItems ]; } @@ -125,13 +128,14 @@ private function getUserGroups(): ?array { * * @return array */ - private function getUserPage(): array { + private function getUserPage(): array + { $user = $this->user; $userPageData = $this->userPageData; $htmlItems = $userPageData['html-items']; $realname = $user->getRealName(); - if ( !empty( $realname ) ) { + if (!empty($realname)) { $username = $user->getName(); $innerHtml = <<$realname @@ -145,12 +149,12 @@ private function getUserPage(): array { ); } - $menu = new CitizenComponentMenu( [ + $menu = new CitizenComponentMenu([ 'id' => 'citizen-user-menu-userpage', 'class' => null, 'label' => null, 'html-items' => $htmlItems - ] ); + ]); return $menu->getTemplateData(); } @@ -158,25 +162,26 @@ private function getUserPage(): array { /** * @inheritDoc */ - public function getTemplateData(): array { + public function getTemplateData(): array + { $localizer = $this->localizer; $data = []; - if ( $this->isRegistered ) { + if ($this->isRegistered) { $data = [ 'data-user-page' => $this->getUserPage(), 'data-user-edit' => $this->getUserEditCount() ]; - if ( $this->isTemp ) { - $data['text'] = $localizer->msg( 'citizen-user-info-text-temp' ); + if ($this->isTemp) { + $data['text'] = $localizer->msg('citizen-user-info-text-temp'); } else { $data['data-user-groups'] = $this->getUserGroups(); } } else { $data = [ - 'title' => $localizer->msg( 'notloggedin' ), - 'text' => $localizer->msg( 'citizen-user-info-text-anon' ) + 'title' => $localizer->msg('notloggedin'), + 'text' => $localizer->msg('citizen-user-info-text-anon') ]; } From 1827a1b5c9d1731a77279c5e00613006e20b907a Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 15 May 2024 06:44:12 +0000 Subject: [PATCH 148/254] =?UTF-8?q?ci:=20=F0=9F=91=B7=20lint=20code=20to?= =?UTF-8?q?=20MediaWiki=20standards?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Check commit and GitHub actions for more details --- .../Components/CitizenComponentUserInfo.php | 63 +++++++++---------- 1 file changed, 29 insertions(+), 34 deletions(-) diff --git a/includes/Components/CitizenComponentUserInfo.php b/includes/Components/CitizenComponentUserInfo.php index 1b77d921d..58f7afb04 100644 --- a/includes/Components/CitizenComponentUserInfo.php +++ b/includes/Components/CitizenComponentUserInfo.php @@ -1,6 +1,6 @@ getUserEditTracker()->getUserEditCount($this->user); + $edits = MediaWikiServices::getInstance()->getUserEditTracker()->getUserEditCount( $this->user ); - if (empty($edits)) { + if ( empty( $edits ) ) { return null; } - $label = $this->localizer->msg('usereditcount')->numParams($edits); - $label = str_replace($edits, '', $label); + $label = $this->localizer->msg( 'usereditcount' )->numParams( $edits ); + $label = str_replace( $edits, '', $label ); return [ - 'count' => number_format($edits, 0), + 'count' => number_format( $edits, 0 ), 'label' => $label ]; } @@ -85,35 +83,34 @@ private function getUserEditCount(): ?array * * @return array|null */ - private function getUserGroups(): ?array - { - $groups = MediaWikiServices::getInstance()->getUserGroupManager()->getUserGroups($this->user); + private function getUserGroups(): ?array { + $groups = MediaWikiServices::getInstance()->getUserGroupManager()->getUserGroups( $this->user ); - if (empty($groups)) { + if ( empty( $groups ) ) { return null; } $listItems = []; $msgKey = 'group-%s-member'; - foreach ($groups as $group) { - $id = sprintf($msgKey, $group); - $text = $this->localizer->msg($id)->text(); + foreach ( $groups as $group ) { + $id = sprintf( $msgKey, $group ); + $text = $this->localizer->msg( $id )->text(); try { - $title = $this->title->newFromTextThrow($text, NS_PROJECT); - } catch (MalformedTitleException $e) { + $title = $this->title->newFromTextThrow( $text, NS_PROJECT ); + } catch ( MalformedTitleException $e ) { // ignore } - if (!$text || !$title) { + if ( !$text || !$title ) { continue; } $link = new CitizenComponentLink( $title->getLinkURL(), - ucfirst($text) + ucfirst( $text ) ); - $listItem = new CitizenComponentMenuListItem($link, 'citizen-userInfo-usergroup', $id); + $listItem = new CitizenComponentMenuListItem( $link, 'citizen-userInfo-usergroup', $id ); $listItems[] = $listItem->getTemplateData(); } @@ -128,14 +125,13 @@ private function getUserGroups(): ?array * * @return array */ - private function getUserPage(): array - { + private function getUserPage(): array { $user = $this->user; $userPageData = $this->userPageData; $htmlItems = $userPageData['html-items']; $realname = $user->getRealName(); - if (!empty($realname)) { + if ( !empty( $realname ) ) { $username = $user->getName(); $innerHtml = <<$realname @@ -149,12 +145,12 @@ private function getUserPage(): array ); } - $menu = new CitizenComponentMenu([ + $menu = new CitizenComponentMenu( [ 'id' => 'citizen-user-menu-userpage', 'class' => null, 'label' => null, 'html-items' => $htmlItems - ]); + ] ); return $menu->getTemplateData(); } @@ -162,26 +158,25 @@ private function getUserPage(): array /** * @inheritDoc */ - public function getTemplateData(): array - { + public function getTemplateData(): array { $localizer = $this->localizer; $data = []; - if ($this->isRegistered) { + if ( $this->isRegistered ) { $data = [ 'data-user-page' => $this->getUserPage(), 'data-user-edit' => $this->getUserEditCount() ]; - if ($this->isTemp) { - $data['text'] = $localizer->msg('citizen-user-info-text-temp'); + if ( $this->isTemp ) { + $data['text'] = $localizer->msg( 'citizen-user-info-text-temp' ); } else { $data['data-user-groups'] = $this->getUserGroups(); } } else { $data = [ - 'title' => $localizer->msg('notloggedin'), - 'text' => $localizer->msg('citizen-user-info-text-anon') + 'title' => $localizer->msg( 'notloggedin' ), + 'text' => $localizer->msg( 'citizen-user-info-text-anon' ) ]; } From 84a65a303b86bfe665697b911e1d647f8d55c3ec Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Wed, 15 May 2024 09:40:25 -0400 Subject: [PATCH 149/254] =?UTF-8?q?fix(core):=20=F0=9F=90=9B=20only=20pass?= =?UTF-8?q?=20string=20into=20str=20replace?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- includes/Components/CitizenComponentUserInfo.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/Components/CitizenComponentUserInfo.php b/includes/Components/CitizenComponentUserInfo.php index 58f7afb04..a5d1d14f5 100644 --- a/includes/Components/CitizenComponentUserInfo.php +++ b/includes/Components/CitizenComponentUserInfo.php @@ -70,7 +70,7 @@ private function getUserEditCount(): ?array { } $label = $this->localizer->msg( 'usereditcount' )->numParams( $edits ); - $label = str_replace( $edits, '', $label ); + $label = str_replace( (string)$edits, '', $label ); return [ 'count' => number_format( $edits, 0 ), From e5fef2ac09cb61089dc2edf7bd5bff17d4691394 Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Wed, 15 May 2024 10:08:20 -0400 Subject: [PATCH 150/254] =?UTF-8?q?fix(core):=20=F0=9F=90=9B=20turn=20mess?= =?UTF-8?q?age=20into=20string=20before=20str=5Freplace?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- includes/Components/CitizenComponentUserInfo.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/Components/CitizenComponentUserInfo.php b/includes/Components/CitizenComponentUserInfo.php index a5d1d14f5..c51e88869 100644 --- a/includes/Components/CitizenComponentUserInfo.php +++ b/includes/Components/CitizenComponentUserInfo.php @@ -69,7 +69,7 @@ private function getUserEditCount(): ?array { return null; } - $label = $this->localizer->msg( 'usereditcount' )->numParams( $edits ); + $label = $this->localizer->msg( 'usereditcount' )->numParams( $edits )->text(); $label = str_replace( (string)$edits, '', $label ); return [ From dac9c39139a803d34f121cd50fa9c599ca2cdf76 Mon Sep 17 00:00:00 2001 From: "translatewiki.net" Date: Thu, 16 May 2024 14:13:36 +0200 Subject: [PATCH 151/254] Localisation updates from https://translatewiki.net. --- i18n/de.json | 2 +- i18n/he.json | 4 +++- i18n/it.json | 4 +++- i18n/lb.json | 3 ++- i18n/mk.json | 4 +++- i18n/nl.json | 7 +++++-- i18n/pl.json | 20 +++++++++++++++++++- i18n/zh-hans.json | 19 ++++++++++++++++++- 8 files changed, 54 insertions(+), 9 deletions(-) diff --git a/i18n/de.json b/i18n/de.json index f005b0620..165026828 100644 --- a/i18n/de.json +++ b/i18n/de.json @@ -51,7 +51,7 @@ "citizen-tagline-ns-category": "Kategorieseite", "citizen-tagline-user-regdate": "Beigetreten $1", "citizen-theme-name": "Farbschema", - "citizen-theme-description": "Das Thema des Wikis ändern", + "citizen-theme-description": "Das Farbschema des Wikis ändern", "citizen-theme-day-label": "Hell", "citizen-theme-night-label": "Dunkel", "citizen-theme-os-label": "System", diff --git a/i18n/he.json b/i18n/he.json index 2aaf92c39..bcd60f709 100644 --- a/i18n/he.json +++ b/i18n/he.json @@ -53,5 +53,7 @@ "citizen-feature-custom-width-name": "רוחב", "citizen-feature-custom-width-standard-label": "רגיל", "citizen-feature-custom-width-wide-label": "רחב", - "citizen-feature-custom-width-full-label": "מלא" + "citizen-feature-custom-width-full-label": "מלא", + "citizen-user-info-text-anon": "כתובת ה־IP שלך תהיה גלויה לציבור אם תעשה עריכות כלשהן.", + "citizen-user-info-text-temp": "החשבון הזמני הזה נוצר לאחר שנעשתה עריכה ללא חשבון בדפדפן ובמכשיר הזה." } diff --git a/i18n/it.json b/i18n/it.json index 1c0558fda..557efc37a 100644 --- a/i18n/it.json +++ b/i18n/it.json @@ -42,5 +42,7 @@ "citizen-tagline-ns-template": "Modello della pagina", "citizen-tagline-ns-help": "Pagina d'aiuto", "citizen-tagline-ns-category": "Pagina delle categorie", - "citizen-tagline-user-regdate": "Iscritto $1" + "citizen-tagline-user-regdate": "Iscritto $1", + "citizen-user-info-text-anon": "Il tuo indirizzo IP sarà visibile pubblicamente se effettuerai modifiche.", + "citizen-user-info-text-temp": "Questa utenza temporanea è stata creata dopo che è stata apportata una modifica senza un'utenza su questo browser e dispositivo." } diff --git a/i18n/lb.json b/i18n/lb.json index f470cbc78..447ee54e6 100644 --- a/i18n/lb.json +++ b/i18n/lb.json @@ -26,5 +26,6 @@ "citizen-feature-custom-font-size-standard-label": "Standard", "citizen-feature-custom-font-size-large-label": "Grouss", "citizen-feature-custom-width-name": "Breet", - "citizen-feature-custom-width-standard-label": "Standard" + "citizen-feature-custom-width-standard-label": "Standard", + "citizen-user-info-text-anon": "Är IP-Adress ass ëffentlech siichtbar, wann Dir Ännerunge maacht." } diff --git a/i18n/mk.json b/i18n/mk.json index d290aa164..016e6d37f 100644 --- a/i18n/mk.json +++ b/i18n/mk.json @@ -55,5 +55,7 @@ "citizen-feature-custom-width-name": "Ширина", "citizen-feature-custom-width-standard-label": "Стандардна", "citizen-feature-custom-width-wide-label": "Широко", - "citizen-feature-custom-width-full-label": "Полно" + "citizen-feature-custom-width-full-label": "Полно", + "citizen-user-info-text-anon": "Вашата IP-адреса ќе биде јавно видлива ако правите уредувања.", + "citizen-user-info-text-temp": "Оваа привремена сметка е создадена откако е направено уредување без сметка на овој прелистувач и уред." } diff --git a/i18n/nl.json b/i18n/nl.json index e448d2dd8..ae3508032 100644 --- a/i18n/nl.json +++ b/i18n/nl.json @@ -3,7 +3,8 @@ "authors": [ "Mainframe98", "McDutchie", - "Romaine" + "Romaine", + "Sjoerddebruin" ] }, "citizen.css": "/* CSS die hier wordt geplaatst heeft alleen invloed op het uiterlijk Citizen */", @@ -27,5 +28,7 @@ "citizen-tagline-ns-file": "Bestand op {{SITENAME}}", "citizen-tagline-ns-template": "Sjabloonpagina", "citizen-tagline-ns-help": "Hulppagina", - "citizen-tagline-ns-category": "Categoriepagina" + "citizen-tagline-ns-category": "Categoriepagina", + "citizen-theme-day-label": "Licht", + "citizen-theme-night-label": "Donker" } diff --git a/i18n/pl.json b/i18n/pl.json index a02b82736..42193e0da 100644 --- a/i18n/pl.json +++ b/i18n/pl.json @@ -1,6 +1,7 @@ { "@metadata": { "authors": [ + "Faalagorn", "Kareyac", "Rail" ] @@ -38,5 +39,22 @@ "citizen-tagline-ns-template": "Szablon", "citizen-tagline-ns-help": "Strona pomocy", "citizen-tagline-ns-category": "Kategoria", - "citizen-tagline-user-regdate": "Użytkownik dołączył $1" + "citizen-tagline-user-regdate": "Użytkownik dołączył $1", + "citizen-theme-name": "Kolor", + "citizen-theme-description": "Zmień motyw wiki", + "citizen-theme-day-label": "Jasny", + "citizen-theme-night-label": "Ciemny", + "citizen-theme-os-label": "Automatyczny", + "citizen-theme-exclusion-notice": "Ta strona zawsze jest wyświetlana w jasnym motywie.", + "citizen-feature-pure-black-name": "Tryb czystej czerni", + "citizen-feature-pure-black-0-label": "Wyłączony", + "citizen-feature-pure-black-1-label": "Włączony", + "citizen-feature-custom-font-size-name": "Tekst", + "citizen-feature-custom-font-size-small-label": "Mały", + "citizen-feature-custom-font-size-standard-label": "Standardowy", + "citizen-feature-custom-font-size-large-label": "Duży", + "citizen-feature-custom-width-name": "Szerokość", + "citizen-feature-custom-width-standard-label": "Standardowa", + "citizen-feature-custom-width-wide-label": "Szeroka", + "citizen-feature-custom-width-full-label": "Pełna" } diff --git a/i18n/zh-hans.json b/i18n/zh-hans.json index 6c8ac7bee..62be6cb96 100644 --- a/i18n/zh-hans.json +++ b/i18n/zh-hans.json @@ -53,5 +53,22 @@ "citizen-tagline-ns-category": "分类页面", "citizen-tagline-user-regdate": "$1注册", "citizen-theme-name": "颜色", - "citizen-feature-custom-font-size-name": "文本" + "citizen-theme-description": "更改wiki的主题", + "citizen-theme-day-label": "浅色", + "citizen-theme-night-label": "深色", + "citizen-theme-os-label": "自动", + "citizen-theme-exclusion-notice": "此页面始终处于浅色模式。", + "citizen-feature-pure-black-name": "纯黑模式", + "citizen-feature-pure-black-0-label": "关闭", + "citizen-feature-pure-black-1-label": "开启", + "citizen-feature-custom-font-size-name": "文字", + "citizen-feature-custom-font-size-small-label": "小", + "citizen-feature-custom-font-size-standard-label": "标准", + "citizen-feature-custom-font-size-large-label": "大", + "citizen-feature-custom-width-name": "宽度", + "citizen-feature-custom-width-standard-label": "标准", + "citizen-feature-custom-width-wide-label": "宽", + "citizen-feature-custom-width-full-label": "全屏", + "citizen-user-info-text-anon": "如果您进行任何编辑,您的IP地址会公开展示。", + "citizen-user-info-text-temp": "此临时账号是因您在此浏览器及设备上进行了无账号编辑而创建。" } From 996947993859a8ddac6943904eb9693851085624 Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Fri, 17 May 2024 09:45:34 -0400 Subject: [PATCH 152/254] =?UTF-8?q?fix(core):=20=F0=9F=90=9B=20do=20not=20?= =?UTF-8?q?hide=20view=20button=20on=20revision=20page?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes: #845 --- skinStyles/mediawiki/mediawiki.diff.styles.less | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/skinStyles/mediawiki/mediawiki.diff.styles.less b/skinStyles/mediawiki/mediawiki.diff.styles.less index 95f4bebf1..a375f7fbc 100644 --- a/skinStyles/mediawiki/mediawiki.diff.styles.less +++ b/skinStyles/mediawiki/mediawiki.diff.styles.less @@ -61,3 +61,13 @@ .mw-diff-movedpara-right::after { color: var( --color-base--subtle ); } + +// HACK: Restore view button on revision page +// There are no good way to target revision page +.action-view #ca-view { + position: relative !important; + clip: unset; + width: auto; + height: auto; + margin: 0; +} From 35af4f89dda7fafcd9c7ffae8dcbfaf5e4f13371 Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 17 May 2024 13:46:49 +0000 Subject: [PATCH 153/254] =?UTF-8?q?ci:=20=F0=9F=91=B7=20lint=20code=20to?= =?UTF-8?q?=20MediaWiki=20standards?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Check commit and GitHub actions for more details --- skinStyles/mediawiki/mediawiki.diff.styles.less | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/skinStyles/mediawiki/mediawiki.diff.styles.less b/skinStyles/mediawiki/mediawiki.diff.styles.less index a375f7fbc..d96d4771a 100644 --- a/skinStyles/mediawiki/mediawiki.diff.styles.less +++ b/skinStyles/mediawiki/mediawiki.diff.styles.less @@ -66,8 +66,8 @@ // There are no good way to target revision page .action-view #ca-view { position: relative !important; - clip: unset; - width: auto; + width: auto; height: auto; margin: 0; + clip: unset; } From 18676da2d495fc0da83cd2fb3abc241ea58a9718 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 17 May 2024 09:52:51 -0400 Subject: [PATCH 154/254] chore(deps-dev): bump grunt-banana-checker from 0.12.0 to 0.13.0 (#847) Bumps [grunt-banana-checker](https://github.com/wikimedia/banana-checker) from 0.12.0 to 0.13.0. - [Release notes](https://github.com/wikimedia/banana-checker/releases) - [Changelog](https://github.com/wikimedia/banana-checker/blob/master/History.md) - [Commits](https://github.com/wikimedia/banana-checker/commits) --- updated-dependencies: - dependency-name: grunt-banana-checker dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 27 +++++++++++++++++++++++---- package.json | 2 +- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 69d63b290..3735a7b37 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ "@wikimedia/types-wikimedia": "0.4.2", "devmoji": "^2.3.0", "eslint-config-wikimedia": "0.27.0", - "grunt-banana-checker": "0.12.0", + "grunt-banana-checker": "0.13.0", "husky": "^9.0.11", "standard-version": "^9.5.0", "stylelint": "15.11.0", @@ -4236,10 +4236,13 @@ "dev": true }, "node_modules/grunt-banana-checker": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/grunt-banana-checker/-/grunt-banana-checker-0.12.0.tgz", - "integrity": "sha512-rdu8YqGxfyBUNMSLmqusSg8RUzGE61+kqrge4fRYb32Vqu5hzDGeomDQIkILEsSrZjtNTTcJ8iTwIswQ+POCGw==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/grunt-banana-checker/-/grunt-banana-checker-0.13.0.tgz", + "integrity": "sha512-uAUKILcP69Q4OJHHV2wzxqVaoXB8G3Uh/XuSJLn0Bk/9+WiUY/Q4+OX7dUhrPPeDZPtoGh37qqJLVvZlDTUecg==", "dev": true, + "dependencies": { + "chalk": "4.1.2" + }, "bin": { "banana-checker": "src/cli.js" }, @@ -4247,6 +4250,22 @@ "node": ">=16" } }, + "node_modules/grunt-banana-checker/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/handlebars": { "version": "4.7.8", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", diff --git a/package.json b/package.json index 399c68e43..0d1eaec5f 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "@wikimedia/types-wikimedia": "0.4.2", "devmoji": "^2.3.0", "eslint-config-wikimedia": "0.27.0", - "grunt-banana-checker": "0.12.0", + "grunt-banana-checker": "0.13.0", "husky": "^9.0.11", "standard-version": "^9.5.0", "stylelint": "15.11.0", From b10c1a8fc2141a07128c7e9a6d3db9983d12d03b Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Fri, 17 May 2024 15:35:15 -0400 Subject: [PATCH 155/254] =?UTF-8?q?chore:=20=F0=9F=94=A7=20drop=20JSdoc=20?= =?UTF-8?q?as=20it=20is=20not=20being=20used?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jsdoc.json | 34 ---------------------------------- 1 file changed, 34 deletions(-) delete mode 100644 jsdoc.json diff --git a/jsdoc.json b/jsdoc.json deleted file mode 100644 index e7f4ab49f..000000000 --- a/jsdoc.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "opts": { - "destination": "docs/js", - "package": "package.json", - "pedantic": true, - "readme": "README.md", - "recurse": true, - "template": "node_modules/jsdoc-wmf-theme" - }, - "source": { - "include": [ "resources" ] - }, - "templates": { - "cleverLinks": true, - "default": { - "useLongnameInNav": true - }, - "wmf": { - "linkMap": { - "Document": "https://developer.mozilla.org/docs/Web/API/Document", - "HTMLElement": "https://developer.mozilla.org/docs/Web/API/HTMLElement", - "HTMLInputElement": "https://developer.mozilla.org/docs/Web/API/HTMLInputElement", - "Window": "https://developer.mozilla.org/docs/Web/API/Window", - - "CheckboxHack": "https://doc.wikimedia.org/mediawiki-core/master/js", - - "MW": "https://doc.wikimedia.org/mediawiki-core/master/js/#!/api/mw", - "JQueryStatic": "https://api.jquery.com", - - "void": "#" - } - } - } -} From 488f65519c10511379964a256a34c26f492cd0c0 Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Fri, 17 May 2024 15:46:16 -0400 Subject: [PATCH 156/254] =?UTF-8?q?chore:=20=F0=9F=94=A7=20drop=20standard?= =?UTF-8?q?-version=20in=20favor=20of=20release-please?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 2028 +++------------------------------------------ package.json | 7 +- 2 files changed, 105 insertions(+), 1930 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3735a7b37..5f36e6b2e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,6 @@ "eslint-config-wikimedia": "0.27.0", "grunt-banana-checker": "0.13.0", "husky": "^9.0.11", - "standard-version": "^9.5.0", "stylelint": "15.11.0", "stylelint-config-recess-order": "4.6.0", "stylelint-config-wikimedia": "0.16.1", @@ -592,15 +591,6 @@ "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", "dev": true }, - "node_modules/@hutson/parse-repository-url": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz", - "integrity": "sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@mdn/browser-compat-data": { "version": "5.5.21", "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-5.5.21.tgz", @@ -854,12 +844,6 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/add-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", - "integrity": "sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==", - "dev": true - }, "node_modules/ajv": { "version": "8.12.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", @@ -1038,12 +1022,6 @@ "integrity": "sha512-F3O+12ud7ZwBaiB/RZIMGDgz3nEuXz8RhtdPB4Lkd/WVP5Vy77EqBWRMz4vJ64x8LTTH3BOaHCD2ZuUcgShqyQ==", "dev": true }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, "node_modules/builtin-modules": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", @@ -1074,32 +1052,6 @@ "node": ">=6" } }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/caniuse-lite": { "version": "1.0.30001610", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001610.tgz", @@ -1135,1077 +1087,151 @@ "node_modules/ci-info": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.0.0.tgz", - "integrity": "sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "engines": { - "node": ">=8" - } - }, - "node_modules/clean-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", - "integrity": "sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/clean-regexp/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/colord": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", - "dev": true - }, - "node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/comment-parser": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz", - "integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==", - "dev": true, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/compare-func": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", - "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", - "dev": true, - "dependencies": { - "array-ify": "^1.0.0", - "dot-prop": "^5.1.0" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/concat-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", - "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", - "dev": true, - "engines": [ - "node >= 6.0" - ], - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.0.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/conventional-changelog": { - "version": "3.1.25", - "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-3.1.25.tgz", - "integrity": "sha512-ryhi3fd1mKf3fSjbLXOfK2D06YwKNic1nC9mWqybBHdObPd8KJ2vjaXZfYj1U23t+V8T8n0d7gwnc9XbIdFbyQ==", - "dev": true, - "dependencies": { - "conventional-changelog-angular": "^5.0.12", - "conventional-changelog-atom": "^2.0.8", - "conventional-changelog-codemirror": "^2.0.8", - "conventional-changelog-conventionalcommits": "^4.5.0", - "conventional-changelog-core": "^4.2.1", - "conventional-changelog-ember": "^2.0.9", - "conventional-changelog-eslint": "^3.0.9", - "conventional-changelog-express": "^2.0.6", - "conventional-changelog-jquery": "^3.0.11", - "conventional-changelog-jshint": "^2.0.9", - "conventional-changelog-preset-loader": "^2.3.4" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-angular": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz", - "integrity": "sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==", - "dev": true, - "dependencies": { - "compare-func": "^2.0.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/conventional-changelog-atom": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-2.0.8.tgz", - "integrity": "sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==", - "dev": true, - "dependencies": { - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-codemirror": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-2.0.8.tgz", - "integrity": "sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==", - "dev": true, - "dependencies": { - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-config-spec": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-config-spec/-/conventional-changelog-config-spec-2.1.0.tgz", - "integrity": "sha512-IpVePh16EbbB02V+UA+HQnnPIohgXvJRxHcS5+Uwk4AT5LjzCZJm5sp/yqs5C6KZJ1jMsV4paEV13BN1pvDuxQ==", - "dev": true - }, - "node_modules/conventional-changelog-conventionalcommits": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-7.0.2.tgz", - "integrity": "sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==", - "dev": true, - "dependencies": { - "compare-func": "^2.0.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/conventional-changelog-core": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-4.2.4.tgz", - "integrity": "sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==", - "dev": true, - "dependencies": { - "add-stream": "^1.0.0", - "conventional-changelog-writer": "^5.0.0", - "conventional-commits-parser": "^3.2.0", - "dateformat": "^3.0.0", - "get-pkg-repo": "^4.0.0", - "git-raw-commits": "^2.0.8", - "git-remote-origin-url": "^2.0.0", - "git-semver-tags": "^4.1.1", - "lodash": "^4.17.15", - "normalize-package-data": "^3.0.0", - "q": "^1.5.1", - "read-pkg": "^3.0.0", - "read-pkg-up": "^3.0.0", - "through2": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-core/node_modules/conventional-commits-parser": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", - "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", - "dev": true, - "dependencies": { - "is-text-path": "^1.0.1", - "JSONStream": "^1.0.4", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" - }, - "bin": { - "conventional-commits-parser": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-core/node_modules/dargs": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", - "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/conventional-changelog-core/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", - "dev": true, - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/conventional-changelog-core/node_modules/git-raw-commits": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz", - "integrity": "sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==", - "dev": true, - "dependencies": { - "dargs": "^7.0.0", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" - }, - "bin": { - "git-raw-commits": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-core/node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-core/node_modules/is-text-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", - "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", - "dev": true, - "dependencies": { - "text-extensions": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/conventional-changelog-core/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", - "dev": true, - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/conventional-changelog-core/node_modules/meow": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", - "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", - "dev": true, - "dependencies": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/conventional-changelog-core/node_modules/meow/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/conventional-changelog-core/node_modules/meow/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/conventional-changelog-core/node_modules/meow/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/conventional-changelog-core/node_modules/meow/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/conventional-changelog-core/node_modules/meow/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/conventional-changelog-core/node_modules/meow/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/conventional-changelog-core/node_modules/meow/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/conventional-changelog-core/node_modules/meow/node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/conventional-changelog-core/node_modules/meow/node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/conventional-changelog-core/node_modules/meow/node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/conventional-changelog-core/node_modules/meow/node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/conventional-changelog-core/node_modules/meow/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/conventional-changelog-core/node_modules/meow/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/conventional-changelog-core/node_modules/normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-core/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/conventional-changelog-core/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", - "dev": true, - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/conventional-changelog-core/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/conventional-changelog-core/node_modules/path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/conventional-changelog-core/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/conventional-changelog-core/node_modules/read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", - "dev": true, - "dependencies": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/conventional-changelog-core/node_modules/read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==", - "dev": true, - "dependencies": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/conventional-changelog-core/node_modules/read-pkg/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/conventional-changelog-core/node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/conventional-changelog-core/node_modules/read-pkg/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/conventional-changelog-core/node_modules/split2": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", - "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", - "dev": true, - "dependencies": { - "readable-stream": "^3.0.0" - } - }, - "node_modules/conventional-changelog-core/node_modules/text-extensions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", - "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/conventional-changelog-core/node_modules/type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/conventional-changelog-core/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-ember": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-2.0.9.tgz", - "integrity": "sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==", - "dev": true, - "dependencies": { - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-eslint": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-3.0.9.tgz", - "integrity": "sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==", - "dev": true, - "dependencies": { - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-express": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-2.0.6.tgz", - "integrity": "sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==", - "dev": true, - "dependencies": { - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-jquery": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-3.0.11.tgz", - "integrity": "sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==", - "dev": true, - "dependencies": { - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-jshint": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-2.0.9.tgz", - "integrity": "sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==", - "dev": true, - "dependencies": { - "compare-func": "^2.0.0", - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-preset-loader": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz", - "integrity": "sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-writer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz", - "integrity": "sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==", - "dev": true, - "dependencies": { - "conventional-commits-filter": "^2.0.7", - "dateformat": "^3.0.0", - "handlebars": "^4.7.7", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "semver": "^6.0.0", - "split": "^1.0.0", - "through2": "^4.0.0" - }, - "bin": { - "conventional-changelog-writer": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-writer/node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-writer/node_modules/meow": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", - "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", - "dev": true, - "dependencies": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/conventional-changelog-writer/node_modules/normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-writer/node_modules/normalize-package-data/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-writer/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/conventional-changelog-writer/node_modules/type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/conventional-changelog-writer/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog/node_modules/conventional-changelog-angular": { - "version": "5.0.13", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", - "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", - "dev": true, - "dependencies": { - "compare-func": "^2.0.0", - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog/node_modules/conventional-changelog-conventionalcommits": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.6.3.tgz", - "integrity": "sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==", - "dev": true, - "dependencies": { - "compare-func": "^2.0.0", - "lodash": "^4.17.15", - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-commits-filter": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", - "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", - "dev": true, - "dependencies": { - "lodash.ismatch": "^4.4.0", - "modify-values": "^1.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-commits-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz", - "integrity": "sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==", - "dev": true, - "dependencies": { - "is-text-path": "^2.0.0", - "JSONStream": "^1.3.5", - "meow": "^12.0.1", - "split2": "^4.0.0" - }, - "bin": { - "conventional-commits-parser": "cli.mjs" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/conventional-recommended-bump": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-6.1.0.tgz", - "integrity": "sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw==", + "integrity": "sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==", "dev": true, - "dependencies": { - "concat-stream": "^2.0.0", - "conventional-changelog-preset-loader": "^2.3.4", - "conventional-commits-filter": "^2.0.7", - "conventional-commits-parser": "^3.2.0", - "git-raw-commits": "^2.0.8", - "git-semver-tags": "^4.1.1", - "meow": "^8.0.0", - "q": "^1.5.1" - }, - "bin": { - "conventional-recommended-bump": "cli.js" - }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/conventional-recommended-bump/node_modules/conventional-commits-parser": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", - "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", + "node_modules/clean-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", + "integrity": "sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==", "dev": true, "dependencies": { - "is-text-path": "^1.0.1", - "JSONStream": "^1.0.4", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" - }, - "bin": { - "conventional-commits-parser": "cli.js" + "escape-string-regexp": "^1.0.5" }, "engines": { - "node": ">=10" + "node": ">=4" } }, - "node_modules/conventional-recommended-bump/node_modules/dargs": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", - "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", + "node_modules/clean-regexp/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "engines": { - "node": ">=8" + "node": ">=0.8.0" } }, - "node_modules/conventional-recommended-bump/node_modules/git-raw-commits": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz", - "integrity": "sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==", + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "dependencies": { - "dargs": "^7.0.0", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" - }, - "bin": { - "git-raw-commits": "cli.js" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">=10" + "node": ">=12" } }, - "node_modules/conventional-recommended-bump/node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "lru-cache": "^6.0.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">=10" + "node": ">=7.0.0" } }, - "node_modules/conventional-recommended-bump/node_modules/is-text-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", - "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", - "dev": true, - "dependencies": { - "text-extensions": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "dev": true }, - "node_modules/conventional-recommended-bump/node_modules/meow": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", - "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true, - "dependencies": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 10" } }, - "node_modules/conventional-recommended-bump/node_modules/normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "node_modules/comment-parser": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz", + "integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==", "dev": true, - "dependencies": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - }, "engines": { - "node": ">=10" + "node": ">= 12.0.0" } }, - "node_modules/conventional-recommended-bump/node_modules/split2": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", - "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "node_modules/compare-func": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", + "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", "dev": true, "dependencies": { - "readable-stream": "^3.0.0" + "array-ify": "^1.0.0", + "dot-prop": "^5.1.0" } }, - "node_modules/conventional-recommended-bump/node_modules/text-extensions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", - "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/conventional-changelog-angular": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz", + "integrity": "sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==", "dev": true, + "dependencies": { + "compare-func": "^2.0.0" + }, "engines": { - "node": ">=0.10" + "node": ">=16" } }, - "node_modules/conventional-recommended-bump/node_modules/type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "node_modules/conventional-changelog-conventionalcommits": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-7.0.2.tgz", + "integrity": "sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==", "dev": true, - "engines": { - "node": ">=10" + "dependencies": { + "compare-func": "^2.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=16" } }, - "node_modules/conventional-recommended-bump/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "node_modules/conventional-commits-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz", + "integrity": "sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==", "dev": true, + "dependencies": { + "is-text-path": "^2.0.0", + "JSONStream": "^1.3.5", + "meow": "^12.0.1", + "split2": "^4.0.0" + }, + "bin": { + "conventional-commits-parser": "cli.mjs" + }, "engines": { - "node": ">=10" + "node": ">=16" } }, "node_modules/core-js-compat": { @@ -2462,15 +1488,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -2528,24 +1545,6 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, - "node_modules/detect-indent": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", - "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/devmoji": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/devmoji/-/devmoji-2.3.0.tgz", @@ -2738,89 +1737,6 @@ "node": ">=8" } }, - "node_modules/dotgitignore": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/dotgitignore/-/dotgitignore-2.1.0.tgz", - "integrity": "sha512-sCm11ak2oY6DglEPpCB8TixLjWAxd3kJTs6UIcSasNYxXdFPV+YKlye92c8H4kKFqV5qYMIh7d+cYecEg0dIkA==", - "dev": true, - "dependencies": { - "find-up": "^3.0.0", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/dotgitignore/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/dotgitignore/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/dotgitignore/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/dotgitignore/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/dotgitignore/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/dotgitignore/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/duplexer2": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", @@ -3676,38 +2592,14 @@ "engines": { "node": ">= 4.9.1" } - }, - "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/figures/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, - "engines": { - "node": ">=0.8.0" + "dependencies": { + "reusify": "^1.0.4" } }, "node_modules/file-entry-cache": { @@ -3795,120 +2687,6 @@ "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/get-pkg-repo": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-4.2.1.tgz", - "integrity": "sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==", - "dev": true, - "dependencies": { - "@hutson/parse-repository-url": "^3.0.0", - "hosted-git-info": "^4.0.0", - "through2": "^2.0.0", - "yargs": "^16.2.0" - }, - "bin": { - "get-pkg-repo": "src/cli.js" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-pkg-repo/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/get-pkg-repo/node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/get-pkg-repo/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/get-pkg-repo/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/get-pkg-repo/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/get-pkg-repo/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/get-pkg-repo/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/get-pkg-repo/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/get-pkg-repo/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/get-stream": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", @@ -3950,147 +2728,6 @@ "node": ">=16" } }, - "node_modules/git-remote-origin-url": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", - "integrity": "sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==", - "dev": true, - "dependencies": { - "gitconfiglocal": "^1.0.0", - "pify": "^2.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/git-semver-tags": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-4.1.1.tgz", - "integrity": "sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==", - "dev": true, - "dependencies": { - "meow": "^8.0.0", - "semver": "^6.0.0" - }, - "bin": { - "git-semver-tags": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/git-semver-tags/node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/git-semver-tags/node_modules/meow": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", - "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", - "dev": true, - "dependencies": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/git-semver-tags/node_modules/normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/git-semver-tags/node_modules/normalize-package-data/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/git-semver-tags/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/git-semver-tags/node_modules/type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/git-semver-tags/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/gitconfiglocal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", - "integrity": "sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==", - "dev": true, - "dependencies": { - "ini": "^1.3.2" - } - }, - "node_modules/gitconfiglocal/node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -4223,12 +2860,6 @@ "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==", "dev": true }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", @@ -4266,27 +2897,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, "node_modules/hard-rejection": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", @@ -4672,12 +3282,6 @@ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -4696,12 +3300,6 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true - }, "node_modules/jsonparse": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", @@ -4817,43 +3415,6 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, - "node_modules/load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/load-json-file/node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "dev": true, - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/load-json-file/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/locate-path": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", @@ -4881,12 +3442,6 @@ "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", "dev": true }, - "node_modules/lodash.ismatch": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", - "integrity": "sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==", - "dev": true - }, "node_modules/lodash.isplainobject": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", @@ -5092,15 +3647,6 @@ "node": ">=0.10.0" } }, - "node_modules/modify-values": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", - "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -5150,12 +3696,6 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, "node_modules/node-releases": { "version": "2.0.14", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", @@ -5302,15 +3842,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -5401,15 +3932,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/pluralize": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", @@ -5543,13 +4065,7 @@ "dev": true, "engines": { "node": ">= 0.8.0" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true + } }, "node_modules/punycode": { "version": "2.3.1", @@ -5560,16 +4076,6 @@ "node": ">=6" } }, - "node_modules/q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", - "dev": true, - "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" - } - }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -5590,15 +4096,6 @@ } ] }, - "node_modules/quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/rambda": { "version": "7.5.0", "resolved": "https://registry.npmjs.org/rambda/-/rambda-7.5.0.tgz", @@ -5739,19 +4236,6 @@ "node": ">= 6" } }, - "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/regexp-tree": { "version": "0.1.27", "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", @@ -5995,15 +4479,6 @@ "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/source-map-js": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", @@ -6055,18 +4530,6 @@ "integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==", "dev": true }, - "node_modules/split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", - "dev": true, - "dependencies": { - "through": "2" - }, - "engines": { - "node": "*" - } - }, "node_modules/split2": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", @@ -6076,239 +4539,6 @@ "node": ">= 10.x" } }, - "node_modules/standard-version": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/standard-version/-/standard-version-9.5.0.tgz", - "integrity": "sha512-3zWJ/mmZQsOaO+fOlsa0+QK90pwhNd042qEcw6hKFNoLFs7peGyvPffpEBbK/DSGPbyOvli0mUIFv5A4qTjh2Q==", - "dev": true, - "dependencies": { - "chalk": "^2.4.2", - "conventional-changelog": "3.1.25", - "conventional-changelog-config-spec": "2.1.0", - "conventional-changelog-conventionalcommits": "4.6.3", - "conventional-recommended-bump": "6.1.0", - "detect-indent": "^6.0.0", - "detect-newline": "^3.1.0", - "dotgitignore": "^2.1.0", - "figures": "^3.1.0", - "find-up": "^5.0.0", - "git-semver-tags": "^4.0.0", - "semver": "^7.1.1", - "stringify-package": "^1.0.1", - "yargs": "^16.0.0" - }, - "bin": { - "standard-version": "bin/cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/standard-version/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/standard-version/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/standard-version/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/standard-version/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/standard-version/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/standard-version/node_modules/conventional-changelog-conventionalcommits": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.6.3.tgz", - "integrity": "sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==", - "dev": true, - "dependencies": { - "compare-func": "^2.0.0", - "lodash": "^4.17.15", - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/standard-version/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/standard-version/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/standard-version/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/standard-version/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/standard-version/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/standard-version/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/standard-version/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/standard-version/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/standard-version/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/standard-version/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/standard-version/node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -6332,13 +4562,6 @@ "node": ">=8" } }, - "node_modules/stringify-package": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stringify-package/-/stringify-package-1.0.1.tgz", - "integrity": "sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg==", - "deprecated": "This module is not used anymore, and has been replaced by @npmcli/package-json", - "dev": true - }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -6351,15 +4574,6 @@ "node": ">=8" } }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/strip-final-newline": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", @@ -7424,15 +5638,6 @@ "node": ">=8.0" } }, - "node_modules/trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/ts-interface-checker": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-1.0.0.tgz", @@ -7484,12 +5689,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", - "dev": true - }, "node_modules/typescript": { "version": "5.4.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", @@ -7504,19 +5703,6 @@ "node": ">=14.17" } }, - "node_modules/uglify-js": { - "version": "3.17.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", - "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", - "dev": true, - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", @@ -7649,12 +5835,6 @@ "node": ">= 8" } }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true - }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", diff --git a/package.json b/package.json index 0d1eaec5f..976c66d50 100644 --- a/package.json +++ b/package.json @@ -10,11 +10,7 @@ "lint:i18n": "banana-checker --requireLowerCase=0 i18n/", "minify-svg": "svgo --config=.svgo.config.js --quiet --recursive --folder resources/", "test": "", - "prepare": "husky", - "release": "standard-version", - "release:minor": "standard-version --release-as minor", - "release:patch": "standard-version --release-as patch", - "release:major": "standard-version --release-as major" + "prepare": "husky" }, "devDependencies": { "@commitlint/cli": "^19.3.0", @@ -24,7 +20,6 @@ "eslint-config-wikimedia": "0.27.0", "grunt-banana-checker": "0.13.0", "husky": "^9.0.11", - "standard-version": "^9.5.0", "stylelint": "15.11.0", "stylelint-config-recess-order": "4.6.0", "stylelint-config-wikimedia": "0.16.1", From c72a25b02744823615b8ba0f8713707b5db897c3 Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Fri, 17 May 2024 16:14:42 -0400 Subject: [PATCH 157/254] =?UTF-8?q?chore:=20=F0=9F=94=A7=20add=20release-p?= =?UTF-8?q?lease=20action?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/release-please.yml | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 .github/workflows/release-please.yml diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml new file mode 100644 index 000000000..c7ad5239b --- /dev/null +++ b/.github/workflows/release-please.yml @@ -0,0 +1,21 @@ +on: + push: + branches: + - main + +permissions: + contents: write + pull-requests: write + +name: release-please + +jobs: + release-please: + runs-on: ubuntu-latest + steps: + - uses: googleapis/release-please-action@v4 + with: + # this assumes that you have created a personal access token + # (PAT) and configured it as a GitHub action secret named + # `MY_RELEASE_PLEASE_TOKEN` (this secret name is not important). + token: ${{ secrets.MY_RELEASE_PLEASE_TOKEN }} \ No newline at end of file From 2b15ff8d1147f0fae83d95e2369fa3d0a68d8ce1 Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Fri, 17 May 2024 16:18:39 -0400 Subject: [PATCH 158/254] =?UTF-8?q?chore:=20=F0=9F=94=A7=20set=20release?= =?UTF-8?q?=20policy=20to=20PHP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/release-please.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml index c7ad5239b..13f977a47 100644 --- a/.github/workflows/release-please.yml +++ b/.github/workflows/release-please.yml @@ -18,4 +18,7 @@ jobs: # this assumes that you have created a personal access token # (PAT) and configured it as a GitHub action secret named # `MY_RELEASE_PLEASE_TOKEN` (this secret name is not important). - token: ${{ secrets.MY_RELEASE_PLEASE_TOKEN }} \ No newline at end of file + token: ${{ secrets.MY_RELEASE_PLEASE_TOKEN }} + # this is a built-in strategy in release-please, see "Action Inputs" + # for more options + release-type: php \ No newline at end of file From 27eac2da9572b37623e0e856c36cd5d3bc6420a7 Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Fri, 17 May 2024 16:41:08 -0400 Subject: [PATCH 159/254] =?UTF-8?q?fix(codex):=20=F0=9F=90=9B=20target=20n?= =?UTF-8?q?ew=20codex=20style=20RL=20module=20as=20well?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We need to keep the old RL name since we still have to support MW 1.39 --- skin.json | 1 + 1 file changed, 1 insertion(+) diff --git a/skin.json b/skin.json index 66f776852..50f74c318 100644 --- a/skin.json +++ b/skin.json @@ -348,6 +348,7 @@ }, "ResourceModuleSkinStyles": { "citizen": { + "+codex-styles": "skinStyles/codex/codex.styles.less", "+ext.advancedSearch.initialstyles": "skinStyles/extensions/AdvancedSearch/ext.advancedSearch.initialstyles.less", "+ext.advancedSearch.styles": "skinStyles/extensions/AdvancedSearch/ext.advancedSearch.styles.less", "+ext.ajaxpoll": "skinStyles/extensions/AJAXPoll/ext.ajaxpoll.less", From c5e8c2bfc864c00f668aef78aa1aeaaef8dc240d Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Fri, 17 May 2024 16:43:35 -0400 Subject: [PATCH 160/254] =?UTF-8?q?fix(core):=20=F0=9F=90=9B=20incorrect?= =?UTF-8?q?=20label=20text=20when=20edit=20count=20contains=20separator?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- includes/Components/CitizenComponentUserInfo.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/includes/Components/CitizenComponentUserInfo.php b/includes/Components/CitizenComponentUserInfo.php index c51e88869..f785d1908 100644 --- a/includes/Components/CitizenComponentUserInfo.php +++ b/includes/Components/CitizenComponentUserInfo.php @@ -69,11 +69,12 @@ private function getUserEditCount(): ?array { return null; } + $edits = (string)number_format( $edits, 0 ); $label = $this->localizer->msg( 'usereditcount' )->numParams( $edits )->text(); - $label = str_replace( (string)$edits, '', $label ); + $label = str_replace( $edits, '', $label ); return [ - 'count' => number_format( $edits, 0 ), + 'count' => $edits, 'label' => $label ]; } From cae19d7a3020c6181f74f54e5c0cf6086165a7c0 Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Fri, 17 May 2024 17:14:00 -0400 Subject: [PATCH 161/254] =?UTF-8?q?feat(mediawiki):=20=E2=9C=A8=20tweak=20?= =?UTF-8?q?login=20and=20signup=20page=20styles?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...diawiki.special.userlogin.common.styles.less | 17 ++++++++++++----- ...diawiki.special.userlogin.signup.styles.less | 13 +++++++------ 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/skinStyles/mediawiki/special/mediawiki.special.userlogin.common.styles.less b/skinStyles/mediawiki/special/mediawiki.special.userlogin.common.styles.less index dfe33e273..16dd0355d 100644 --- a/skinStyles/mediawiki/special/mediawiki.special.userlogin.common.styles.less +++ b/skinStyles/mediawiki/special/mediawiki.special.userlogin.common.styles.less @@ -8,10 +8,17 @@ * Date: 2022-11-23 */ -#userloginForm { - > .mw-htmlform { - // Widen the form a bit - width: auto; - max-width: 400px; +.mw-ui-container { + #userloginForm { + max-width: ~'calc( 400px + var( --space-md ) * 2 )'; + padding: var( --space-md ); + background: var( --color-surface-2 ); + border-radius: var( --border-radius--large ); + + > .mw-htmlform { + // Widen the form a bit + width: auto; + max-width: 400px; + } } } diff --git a/skinStyles/mediawiki/special/mediawiki.special.userlogin.signup.styles.less b/skinStyles/mediawiki/special/mediawiki.special.userlogin.signup.styles.less index 7f25ebe66..844e8d223 100644 --- a/skinStyles/mediawiki/special/mediawiki.special.userlogin.signup.styles.less +++ b/skinStyles/mediawiki/special/mediawiki.special.userlogin.signup.styles.less @@ -22,6 +22,9 @@ #userloginForm { grid-area: form; + /* Fix weird margin issue */ + padding-top: 0; + padding-bottom: var( --space-xs ); margin-right: 0; } } @@ -32,14 +35,13 @@ 'message' 'stats' 'form'; - gap: var( --space-md ); + gap: 0 var( --space-md ); } .mw-createacct-benefits { &-container { grid-area: stats; - padding-bottom: var( --space-lg ); - border-bottom: 1px solid var( --border-color-base ); + padding-bottom: var( --space-md ); h2 { margin: 0; @@ -85,15 +87,14 @@ grid-template-areas: 'message message' 'form stats'; + grid-template-columns: max-content; } .mw-createacct-benefits { &-container { padding-top: var( --space-md ); padding-bottom: 0; - padding-left: var( --space-xxl ); - border-bottom: 0; - border-left: 1px solid var( --border-color-base ); + padding-left: var( --space-md ); h2 { max-width: 20rem; From 820d612eaff26caffd3745f63ce3b9359136a04a Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Fri, 17 May 2024 19:38:42 -0400 Subject: [PATCH 162/254] =?UTF-8?q?feat(VisualEditor):=20=E2=9C=A8=20hide?= =?UTF-8?q?=20less=20useful=20buttons=20when=20width=20is=20limited?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../VisualEditor/ext.visualEditor.core.less | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/skinStyles/extensions/VisualEditor/ext.visualEditor.core.less b/skinStyles/extensions/VisualEditor/ext.visualEditor.core.less index ffdbc8fca..44f2062ff 100644 --- a/skinStyles/extensions/VisualEditor/ext.visualEditor.core.less +++ b/skinStyles/extensions/VisualEditor/ext.visualEditor.core.less @@ -367,10 +367,15 @@ /* Responsive handling */ .ve-init-mw-desktopArticleTarget-toolbar { > .oo-ui-toolbar-bar { - > .oo-ui-toolbar-tools:first-child { - display: inline-block; - max-width: ~'calc( 100% - 250px )'; - white-space: nowrap; + > .oo-ui-toolbar-tools { + // Needed to hide overflow tools + background: var( --color-surface-0 ); + + &:first-child { + display: inline-block; + max-width: ~'calc( 100% - 250px )'; + white-space: nowrap; + } } > .oo-ui-toolbar-actions { @@ -395,3 +400,14 @@ } } } + +/* Hide less useful buttons on small viewport */ +@media ( max-width: @max-width-breakpoint-tablet ) { + .ve-ui-toolbar-group { + &-format, + &-style, + &-help { + display: none; + } + } +} From b9225057a786ac3c7b283660769c2a871adaf5a3 Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Sat, 18 May 2024 01:40:07 -0400 Subject: [PATCH 163/254] =?UTF-8?q?fix(mediawiki):=20=F0=9F=90=9B=20overfl?= =?UTF-8?q?ow=20signupstart=20container?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../special/mediawiki.special.userlogin.signup.styles.less | 1 - 1 file changed, 1 deletion(-) diff --git a/skinStyles/mediawiki/special/mediawiki.special.userlogin.signup.styles.less b/skinStyles/mediawiki/special/mediawiki.special.userlogin.signup.styles.less index 844e8d223..103fc59f9 100644 --- a/skinStyles/mediawiki/special/mediawiki.special.userlogin.signup.styles.less +++ b/skinStyles/mediawiki/special/mediawiki.special.userlogin.signup.styles.less @@ -87,7 +87,6 @@ grid-template-areas: 'message message' 'form stats'; - grid-template-columns: max-content; } .mw-createacct-benefits { From f781773cbaba9e3ac49610e11daed8e6b084a6d9 Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Sat, 18 May 2024 19:47:30 -0400 Subject: [PATCH 164/254] =?UTF-8?q?fix(core):=20=F0=9F=90=9B=20pass=20name?= =?UTF-8?q?space=20key=20as=20string?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When the namespace key only consists of number, it can cause a TypeError. Fixes: #849 --- includes/Hooks/SkinHooks.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/Hooks/SkinHooks.php b/includes/Hooks/SkinHooks.php index 2f3790fee..ee222ab35 100644 --- a/includes/Hooks/SkinHooks.php +++ b/includes/Hooks/SkinHooks.php @@ -287,7 +287,7 @@ private static function updateAssociatedPagesMenu( &$links ) { // Since talk keys have namespace as prefix foreach ( $links['associated-pages'] as $key => $item ) { // I wish I can use str_ends_with but need to wait for PHP 7.X to be dropped - if ( substr( $key, -4 ) === 'talk' ) { + if ( substr( (string)$key, -4 ) === 'talk' ) { $links['associated-pages'][$key]['icon'] = 'speechBubbles'; } } From 1572722077d36f70af15ded331688ad3c5314b4b Mon Sep 17 00:00:00 2001 From: "translatewiki.net" Date: Mon, 20 May 2024 14:11:07 +0200 Subject: [PATCH 165/254] Localisation updates from https://translatewiki.net. --- i18n/ia.json | 4 +++- i18n/ko.json | 29 ++++++++++++++++++++++++++--- i18n/sr-ec.json | 3 ++- i18n/vi.json | 21 ++++++++++++++++++++- 4 files changed, 51 insertions(+), 6 deletions(-) diff --git a/i18n/ia.json b/i18n/ia.json index 2df47ac5c..23b27a326 100644 --- a/i18n/ia.json +++ b/i18n/ia.json @@ -54,5 +54,7 @@ "citizen-feature-custom-width-name": "Latitude", "citizen-feature-custom-width-standard-label": "Normal", "citizen-feature-custom-width-wide-label": "Late", - "citizen-feature-custom-width-full-label": "Plen" + "citizen-feature-custom-width-full-label": "Plen", + "citizen-user-info-text-anon": "Tu adresse IP essera visibile publicamente si tu face modificationes.", + "citizen-user-info-text-temp": "Iste conto temporari ha essite create post que un modification ha essite effectuate sin conto sur iste navigator e apparato." } diff --git a/i18n/ko.json b/i18n/ko.json index dc1adcd28..5dd3ea909 100644 --- a/i18n/ko.json +++ b/i18n/ko.json @@ -2,10 +2,12 @@ "@metadata": { "authors": [ "Alistair3149", + "Markingdots", "Ykhwong", "렌즈" ] }, + "citizen-prefs-talkpage": "[[mw:Skin_talk:Citizen|토론]]", "citizen.css": "/* 여기의 모든 CSS는 시티즌 스킨을 사용하는 사용자에게 로드됩니다 */", "citizen.js": "/* 여기의 모든 자바스크립트는 시티즌 스킨을 사용하는 사용자에게 로드됩니다 */", "citizen-drawer-toggle": "메뉴 여닫기", @@ -26,14 +28,35 @@ "citizen-jumptotop": "맨 위로 돌아가기", "citizen-search-fulltext": "$1 포함된 문서 검색", "citizen-search-mediasearch": "$1 관련 미디어 검색", + "citizen-search-editpage": "편집하거나 문서를 만들기", "citizen-search-empty-desc": "검색을 시작하려면 입력하세요", - "citizen-search-noresults-title": "저런! $1 관련 결과가 없습니다", - "citizen-search-noresults-desc": "아래 옵션을 시도해 볼까요?", + "citizen-search-noresults-title": "어? $1 관련 결과가 없습니다.", + "citizen-search-noresults-desc": "위의 옵션을 시도해 볼까요?", "citizen-tagline-ns-talk": "{{SUBJECTPAGENAME}}의 토론 문서", "citizen-tagline-ns-project": "{{SITENAME}}에 대한 정보", "citizen-tagline-ns-file": "{{SITENAME}}의 파일", "citizen-tagline-ns-mediawiki": "미디어위키 인터페이스 문서", "citizen-tagline-ns-template": "틀 문서", "citizen-tagline-ns-help": "도움말 문서", - "citizen-tagline-ns-category": "분류 문서" + "citizen-tagline-ns-category": "분류 문서", + "citizen-tagline-user-regdate": "$1에 가입함", + "citizen-theme-name": "색상 테마", + "citizen-theme-description": "색상 테마 변경", + "citizen-theme-day-label": "라이트", + "citizen-theme-night-label": "다크", + "citizen-theme-os-label": "자동", + "citizen-theme-exclusion-notice": "이 페이지는 항상 라이트 모드입니다.", + "citizen-feature-pure-black-name": "퓨어 다크 모드", + "citizen-feature-pure-black-0-label": "끄기", + "citizen-feature-pure-black-1-label": "켜기", + "citizen-feature-custom-font-size-name": "글자 크기", + "citizen-feature-custom-font-size-small-label": "작게", + "citizen-feature-custom-font-size-standard-label": "보통", + "citizen-feature-custom-font-size-large-label": "크게", + "citizen-feature-custom-width-name": "페이지 너비", + "citizen-feature-custom-width-standard-label": "보통", + "citizen-feature-custom-width-wide-label": "넓게", + "citizen-feature-custom-width-full-label": "가득 채우기", + "citizen-user-info-text-anon": "만약 지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.", + "citizen-user-info-text-temp": "이 임시 계정은 이 브라우저와 기기에서 계정없이 편집이 이루어진 후 생성되었습니다." } diff --git a/i18n/sr-ec.json b/i18n/sr-ec.json index 84506267e..61f06685d 100644 --- a/i18n/sr-ec.json +++ b/i18n/sr-ec.json @@ -39,5 +39,6 @@ "citizen-feature-custom-font-size-standard-label": "Стандардно", "citizen-feature-custom-font-size-large-label": "Велико", "citizen-feature-custom-width-name": "Ширина", - "citizen-feature-custom-width-wide-label": "Широко" + "citizen-feature-custom-width-wide-label": "Широко", + "citizen-user-info-text-anon": "Ваша IP адреса биће јавно видљива ако начините било какву измену." } diff --git a/i18n/vi.json b/i18n/vi.json index aac866eb9..8a2633cdf 100644 --- a/i18n/vi.json +++ b/i18n/vi.json @@ -39,5 +39,24 @@ "citizen-tagline-ns-template": "Trang bản mẫu", "citizen-tagline-ns-help": "Trang trợ giúp", "citizen-tagline-ns-category": "Trang thể loại", - "citizen-tagline-user-regdate": "Đăng ký vào $1" + "citizen-tagline-user-regdate": "Đăng ký vào $1", + "citizen-theme-name": "Màu", + "citizen-theme-description": "Thay đổi chủ đề của wiki", + "citizen-theme-day-label": "Sáng", + "citizen-theme-night-label": "Tối", + "citizen-theme-os-label": "Tự động", + "citizen-theme-exclusion-notice": "Trang này mặc định luôn ở chế độ sáng.", + "citizen-feature-pure-black-name": "Chế độ tối thuần túy", + "citizen-feature-pure-black-0-label": "Tắt", + "citizen-feature-pure-black-1-label": "Bật", + "citizen-feature-custom-font-size-name": "Văn bản", + "citizen-feature-custom-font-size-small-label": "Nhỏ", + "citizen-feature-custom-font-size-standard-label": "Chuẩn", + "citizen-feature-custom-font-size-large-label": "Lớn", + "citizen-feature-custom-width-name": "Chiều rộng nội dung", + "citizen-feature-custom-width-standard-label": "Chuẩn", + "citizen-feature-custom-width-wide-label": "Rộng", + "citizen-feature-custom-width-full-label": "Đầy đủ", + "citizen-user-info-text-anon": "Địa chỉ IP của bạn sẽ được hiển thị công khai nếu bạn thực hiện bất kỳ sửa đổi nào.", + "citizen-user-info-text-temp": "Tài khoản tạm thời này được tạo sau khi thực hiện sửa đổi mà không có tài khoản trên trình duyệt và thiết bị này." } From a43754d8540e902884a039f8ee9ecf5f16bd7769 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 May 2024 11:44:21 -0400 Subject: [PATCH 166/254] --- (#850) updated-dependencies: - dependency-name: "@wikimedia/types-wikimedia" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5f36e6b2e..93728b775 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "devDependencies": { "@commitlint/cli": "^19.3.0", "@commitlint/config-conventional": "^19.2.2", - "@wikimedia/types-wikimedia": "0.4.2", + "@wikimedia/types-wikimedia": "0.4.3", "devmoji": "^2.3.0", "eslint-config-wikimedia": "0.27.0", "grunt-banana-checker": "0.13.0", @@ -818,9 +818,9 @@ "dev": true }, "node_modules/@wikimedia/types-wikimedia": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@wikimedia/types-wikimedia/-/types-wikimedia-0.4.2.tgz", - "integrity": "sha512-MWZJE6JRUYRSuwajjiO4l7xz6530MUqdTOP0t0AteVm8Gqs+hUEcs5tTmAVJDg/ByvzyZ/M/KsW1UcuTRs0N8g==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@wikimedia/types-wikimedia/-/types-wikimedia-0.4.3.tgz", + "integrity": "sha512-c9qY4NUNLsc5OHpFIPd2EMMtqqI5g5PYMSg/ivaDxbn4gJf+1xbFzEC1kQCraCoIWFu9kvXdsMx+ZfhRsSkUaA==", "dev": true }, "node_modules/acorn": { diff --git a/package.json b/package.json index 976c66d50..eb7d895b3 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "devDependencies": { "@commitlint/cli": "^19.3.0", "@commitlint/config-conventional": "^19.2.2", - "@wikimedia/types-wikimedia": "0.4.2", + "@wikimedia/types-wikimedia": "0.4.3", "devmoji": "^2.3.0", "eslint-config-wikimedia": "0.27.0", "grunt-banana-checker": "0.13.0", From 1270d4edd1c789d703df892eed9acb95ef0fa5c5 Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Tue, 21 May 2024 15:00:03 -0400 Subject: [PATCH 167/254] =?UTF-8?q?refactor(core):=20=E2=99=BB=EF=B8=8F=20?= =?UTF-8?q?add=20error=20handling=20to=20lastModified.js?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../skins.citizen.scripts/lastModified.js | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/resources/skins.citizen.scripts/lastModified.js b/resources/skins.citizen.scripts/lastModified.js index 6490b5b70..ec081c5df 100644 --- a/resources/skins.citizen.scripts/lastModified.js +++ b/resources/skins.citizen.scripts/lastModified.js @@ -1,5 +1,6 @@ /** - * Enhance last modified to use human readable relative time + * Updates the text content of a specific HTML element to display a human-readable, + * relative time format based on a timestamp attribute. * * @return {void} */ @@ -9,9 +10,7 @@ function init() { return; } - // There might be better method but it works :P const lang = document.documentElement.getAttribute( 'lang' ); - // eslint-disable-next-line compat/compat const rtf = new Intl.RelativeTimeFormat( lang ); const DIVISIONS = [ @@ -24,8 +23,22 @@ function init() { { amount: Number.POSITIVE_INFINITY, name: 'years' } ]; + const SECONDS_IN_MILLISECOND = 1000; + + // eslint-disable-next-line jsdoc/require-returns-check + /** + * Formats the time elapsed since a given date in a human-readable relative time format. + * + * @param {string} date - The timestamp to calculate relative time from. + * @return {string} The formatted relative time string. + */ const formatTimeAgo = ( date ) => { - let duration = date - Date.now() / 1000; + const timestamp = parseFloat( date ); + if ( isNaN( timestamp ) ) { + mw.log.error( '[Citizen] Invalid timestamp value' ); + return; + } + let duration = timestamp - Date.now() / SECONDS_IN_MILLISECOND; for ( let i = 0; i < DIVISIONS.length; i++ ) { const division = DIVISIONS[ i ]; From a405d64616d4797a3ae7bf153684c4ac2907fbb7 Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Tue, 21 May 2024 18:08:28 -0400 Subject: [PATCH 168/254] =?UTF-8?q?refactor(core):=20=E2=99=BB=EF=B8=8F=20?= =?UTF-8?q?various=20performance=20and=20style=20improvements?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/skins.citizen.scripts/search.js | 20 ++- resources/skins.citizen.scripts/sections.js | 49 +++--- .../skins.citizen.scripts/tableOfContents.js | 53 +++--- resources/skins.citizen.scripts/tables.js | 166 ++++++++++-------- .../skins.citizen.styles/common/common.less | 4 + 5 files changed, 156 insertions(+), 136 deletions(-) diff --git a/resources/skins.citizen.scripts/search.js b/resources/skins.citizen.scripts/search.js index 198be55bf..1ee90ceb1 100644 --- a/resources/skins.citizen.scripts/search.js +++ b/resources/skins.citizen.scripts/search.js @@ -161,31 +161,35 @@ function renderSearchClearButton( input ) { let hasClearButton = false; clearButton.classList.add( 'citizen-search__clear', 'citizen-search__formButton' ); + // TODO: Add i18n for the message below + // clearButton.setAttribute( 'aria-label', 'Clear search input' ); clearIcon.classList.add( 'citizen-ui-icon', 'mw-ui-icon-wikimedia-clear' ); clearButton.append( clearIcon ); clearButton.addEventListener( 'click', ( event ) => { event.preventDefault(); - clearButton.remove(); + clearButton.classList.add( 'hidden' ); input.value = ''; input.dispatchEvent( new Event( 'input' ) ); - setTimeout( () => { + requestAnimationFrame( () => { input.focus(); - }, 10 ); + } ); } ); input.addEventListener( 'input', () => { - if ( input.value === '' ) { - clearButton.remove(); - hasClearButton = false; - } else if ( hasClearButton === false ) { + const value = input.value; + const shouldDisplay = value !== ''; + clearButton.classList.toggle( 'hidden', !shouldDisplay ); + if ( shouldDisplay && !hasClearButton ) { input.after( clearButton ); - hasClearButton = true; } + hasClearButton = shouldDisplay; } ); } /** + * Initializes the search functionality for the Citizen search boxes. + * * @param {Window} window * @return {void} */ diff --git a/resources/skins.citizen.scripts/sections.js b/resources/skins.citizen.scripts/sections.js index 5417bb3de..e449b8760 100644 --- a/resources/skins.citizen.scripts/sections.js +++ b/resources/skins.citizen.scripts/sections.js @@ -9,39 +9,42 @@ function init( bodyContent ) { return; } - const - headings = bodyContent.querySelectorAll( '.citizen-section-heading' ), - sections = bodyContent.querySelectorAll( '.citizen-section-collapsible' ), - editSections = bodyContent.querySelectorAll( '.mw-editsection, .mw-editsection-like' ); + const headings = bodyContent.querySelectorAll( '.citizen-section-heading' ); + const sections = bodyContent.querySelectorAll( '.citizen-section-collapsible' ); - for ( let i = 0; i < headings.length; i++ ) { - const j = i + 1, - collapsibleID = `citizen-section-collapsible-${ j }`, - /* T13555 */ - headline = headings[ i ].querySelector( '.mw-headline' ) || headings[ i ].querySelector( '.mw-heading' ); + const toggleAriaExpanded = ( headline ) => { + headline.toggleAttribute( 'aria-expanded' ); + + }; - // Set up ARIA + const setHeadlineAttributes = ( headline, collapsibleID ) => { headline.setAttribute( 'tabindex', 0 ); headline.setAttribute( 'role', 'button' ); headline.setAttribute( 'aria-controls', collapsibleID ); headline.setAttribute( 'aria-expanded', true ); + }; - // TODO: Need a keyboard handler - headings[ i ].addEventListener( 'click', function () { - // .section-heading--collapsed + const handleClick = ( i ) => { + const collapsibleID = `citizen-section-collapsible-${ i + 1 }`; + const headline = headings[ i ].querySelector( '.citizen-section-heading .mw-headline' ); - this.classList.toggle( 'citizen-section-heading--collapsed' ); - // .section-collapsible--collapsed + if ( headline ) { + setHeadlineAttributes( headline, collapsibleID ); - sections[ j ].classList.toggle( 'citizen-section-collapsible--collapsed' ); - headline.setAttribute( 'aria-expanded', headline.getAttribute( 'aria-expanded' ) === 'true' ? 'false' : 'true' ); - } ); - } + headings[ i ].addEventListener( 'click', function ( e ) { + this.classList.toggle( 'citizen-section-heading--collapsed' ); + sections[ i + 1 ].classList.toggle( 'citizen-section-collapsible--collapsed' ); + toggleAriaExpanded( headline ); - for ( let i = 0; i < editSections.length; i++ ) { - editSections[ i ].addEventListener( 'click', function ( e ) { - e.stopPropagation(); - } ); + if ( e.target.closest( '.mw-editsection, .mw-editsection-like' ) ) { + e.stopPropagation(); + } + } ); + } + }; + + for ( let i = 0; i < headings.length; i++ ) { + handleClick( i ); } } diff --git a/resources/skins.citizen.scripts/tableOfContents.js b/resources/skins.citizen.scripts/tableOfContents.js index 6b5d69857..168629d5e 100644 --- a/resources/skins.citizen.scripts/tableOfContents.js +++ b/resources/skins.citizen.scripts/tableOfContents.js @@ -3,23 +3,15 @@ const ACTIVE_SECTION_CLASS = 'citizen-toc__listItem--active'; let /** @type {HTMLElement | undefined} */ activeSection; /** - * @param {string} id + * Changes the active section in the table of contents based on the provided ID. + * + * @param {HTMLElement} toc - The Table of Content HTML element + * @param {string} id - The ID of the section to make active. + * @return {void} */ -function changeActiveSection( id ) { - const toc = document.getElementById( 'mw-panel-toc' ); - +function changeActiveSection( toc, id ) { const getLink = ( hash ) => { - const - prefix = 'a[href="#', - suffix = '"]'; - - let el = toc.querySelector( prefix + hash + suffix ); - - if ( el === null ) { - // Sometimes the href attribute is encoded - el = toc.querySelector( prefix + encodeURIComponent( hash ) + suffix ); - } - + const el = toc.querySelector( `a[href="#${ hash }"], a[href="#${ encodeURIComponent( hash ) }"]` ); return el; }; @@ -44,30 +36,29 @@ function changeActiveSection( id ) { * @return {void} */ function init( bodyContent ) { - const tocEl = document.getElementById( 'mw-panel-toc' ); - if ( !tocEl ) { + const toc = document.getElementById( 'mw-panel-toc' ); + if ( !toc ) { return; } const getHeadlineElements = () => { - const getHeadlineIds = () => { - const headlineIds = []; - // Nodelist.forEach is forbidden by mediawiki/no-nodelist-unsupported-methods - Array.from( tocEl.querySelectorAll( '.citizen-toc__listItem' ) ).forEach( ( tocListEl ) => { - // Remove 'toc-' prefix from ID - headlineIds.push( '#' + CSS.escape( tocListEl.id.slice( 4 ) ) ); - } ); - return headlineIds.join( ',' ); - }; - return bodyContent.querySelectorAll( getHeadlineIds() ); + const headlineElements = []; + Array.from( toc.querySelectorAll( '.citizen-toc__listItem' ) ).forEach( ( tocListEl ) => { + // Remove 'toc-' prefix from ID + const headlineElement = bodyContent.querySelector( '#' + CSS.escape( tocListEl.id.slice( 4 ) ) ); + if ( headlineElement ) { + headlineElements.push( headlineElement ); + } + } ); + return headlineElements; }; // We use scroll-padding-top to handle scrolling with fixed header // It is better to respect that so it is consistent const getTopMargin = () => { + const computedStyle = window.getComputedStyle( document.documentElement ); return Number( - window.getComputedStyle( document.documentElement ) - .getPropertyValue( 'scroll-padding-top' ) + computedStyle.getPropertyValue( 'scroll-padding-top' ) .slice( 0, -2 ) ) + 20; }; @@ -87,7 +78,9 @@ function init( bodyContent ) { elements: headlines, topMargin: getTopMargin(), onIntersection: ( section ) => { - changeActiveSection( section.id ); + if ( section.id && section.id.trim() !== '' ) { + changeActiveSection( toc, section.id ); + } } } ); diff --git a/resources/skins.citizen.scripts/tables.js b/resources/skins.citizen.scripts/tables.js index a64725033..6374b3a6d 100644 --- a/resources/skins.citizen.scripts/tables.js +++ b/resources/skins.citizen.scripts/tables.js @@ -8,120 +8,136 @@ const config = require( './config.json' ); * @return {void} */ function setupOverflowState( element ) { - const initState = () => { - const updateState = () => { - const - containerWidth = element.parentNode.offsetWidth, - contentWidth = element.scrollWidth; - - // Break if no horizontal overflow - if ( contentWidth <= containerWidth ) { - element.parentNode.classList.remove( 'citizen-overflow--left' ); - element.parentNode.classList.remove( 'citizen-overflow--right' ); - return; - } + if ( !element.parentNode ) { + mw.log.error( '[Citizen] Parent node is null or undefined. Cannot proceed with setupOverflowState.' ); + return; + } - const currentPosition = Math.ceil( element.parentNode.scrollLeft ); - - if ( currentPosition <= 0 ) { - // At the start - element.parentNode.classList.remove( 'citizen-overflow--left' ); - element.parentNode.classList.add( 'citizen-overflow--right' ); - } else if ( currentPosition + containerWidth >= contentWidth ) { - // At the end - element.parentNode.classList.remove( 'citizen-overflow--right' ); - element.parentNode.classList.add( 'citizen-overflow--left' ); - } else { - // At the middle - element.parentNode.classList.add( 'citizen-overflow--left' ); - element.parentNode.classList.add( 'citizen-overflow--right' ); - } - }; + const parentNode = element.parentNode; + let cachedContainerWidth; + let cachedContentWidth; + let cachedScrollPosition; - if ( element.parentNode === null ) { + const updateOverflowClasses = ( isLeft, isRight ) => { + parentNode.classList.toggle( 'citizen-overflow--left', isLeft ); + parentNode.classList.toggle( 'citizen-overflow--right', isRight ); + }; + + const updateState = () => { + const containerWidth = parentNode.offsetWidth; + const contentWidth = element.scrollWidth; + const currentPosition = Math.round( parentNode.scrollLeft ); + + if ( isNaN( containerWidth ) || isNaN( contentWidth ) ) { + mw.log.error( '[Citizen] Invalid width values. Cannot calculate overflow state.' ); return; } - updateState(); + if ( + containerWidth === cachedContainerWidth && + contentWidth === cachedContentWidth && + currentPosition === cachedScrollPosition + ) { + return; + } - // Update state on element scroll - element.parentNode.addEventListener( 'scroll', () => { - window.requestAnimationFrame( updateState ); - } ); + cachedContainerWidth = containerWidth; + cachedContentWidth = contentWidth; + cachedScrollPosition = currentPosition; + + const isAtStart = currentPosition <= 0; + const isAtEnd = currentPosition + containerWidth >= contentWidth; + updateOverflowClasses( !isAtStart, !isAtEnd ); }; - initState(); + updateState(); + + parentNode.addEventListener( 'scroll', () => { + window.requestAnimationFrame( updateState ); + } ); - // Listen for window resize - if ( window.ResizeObserver ) { - const overflowResizeObserver = new ResizeObserver( mw.util.debounce( 250, initState ) ); + const debouncedUpdateState = mw.util.debounce( 250, updateState ); + const isResizeObserverSupported = typeof ResizeObserver === 'function'; + if ( isResizeObserverSupported ) { + const overflowResizeObserver = new ResizeObserver( debouncedUpdateState ); overflowResizeObserver.observe( element ); + } else { + // Fallback mechanism or error handling for environments without ResizeObserver support + mw.log.warn( '[Citizen] ResizeObserver is not supported in this environment.' ); } } /** - * Wrap table in div container to make it scrollable without breaking layout + * Wraps a given HTML table element in a new div container with specific classes, + * ensuring it does not wrap tables with certain ignored classes. It also manages + * class inheritance from the table to the wrapper and sets up overflow handling. * - * @param {HTMLTableElement} table + * @param {HTMLTableElement} table - The HTML table element to be wrapped. * @return {void} */ function wrapTable( table ) { - // Load ignored classes from config - const ignoredClasses = config.wgCitizenTableNowrapClasses; + try { + if ( + !config.wgCitizenTableNowrapClasses || + !Array.isArray( config.wgCitizenTableNowrapClasses ) + ) { + mw.log.error( '[Citizen] Invalid or missing $wgCitizenTableNowrapClasses. Cannot proceed with wrapping table.' ); + return; + } - // Check table and parent for ignored classes - const hasIgnoredClass = ( ignoreClass ) => { - return table.classList.contains( ignoreClass ) || - table.parentNode.classList.contains( ignoreClass ); - }; + if ( !table || !table.parentNode ) { + mw.log.error( '[Citizen] Table or table.parentNode is null or undefined.' ); + return; + } - // Return if table has one of the ignored classes - if ( ignoredClasses.some( hasIgnoredClass ) ) { - return; - } + const ignoredClasses = config.wgCitizenTableNowrapClasses; - const wrapper = document.createElement( 'div' ); + if ( ignoredClasses.some( ( cls ) => table.classList.contains( cls ) ) ) { + return; + } + + const wrapper = document.createElement( 'div' ); + wrapper.className = 'citizen-table-wrapper'; - // Some classes should be inherited from the table - // For example, float helper classes like floatleft and floatright - const inheritTableClass = () => { - // TODO: Make this a config flag const inheritedClasses = [ 'floatleft', 'floatright' ]; - inheritedClasses.forEach( ( inheritedClass ) => { - if ( table.classList.contains( inheritedClass ) ) { - wrapper.classList.add( inheritedClass ); - table.classList.remove( inheritedClass ); + const filteredClasses = inheritedClasses.filter( ( cls ) => table.classList.contains( cls ) ); + + filteredClasses.forEach( ( cls ) => { + if ( !wrapper.classList.contains( cls ) ) { + wrapper.classList.add( cls ); + } + if ( table.classList.contains( cls ) ) { + table.classList.remove( cls ); } } ); - }; - wrapper.classList.add( 'citizen-table-wrapper' ); - inheritTableClass(); - table.parentNode.insertBefore( wrapper, table ); - wrapper.appendChild( table ); + table.parentNode.insertBefore( wrapper, table ); + wrapper.appendChild( table ); - setupOverflowState( table ); + setupOverflowState( table ); + } catch ( error ) { + mw.log.error( `[Citizen] Error occurred while wrapping table: ${ error.message }` ); + } } /** - * @param {HTMLElement} bodyContent + * Initializes the process of wrapping tables within the given body content. + * + * @param {HTMLElement} bodyContent - The body content element containing tables to be wrapped. * @return {void} */ function init( bodyContent ) { - // Don't touch nested tables since we only need to wrap the outer layer - if ( !bodyContent.querySelector( 'table:not( table table )' ) ) { - return; - } - const tables = bodyContent.querySelectorAll( 'table:not( table table )' ); - tables.forEach( ( table ) => { - wrapTable( table ); - } ); + if ( tables.length > 0 ) { + Array.from( tables ).forEach( ( table ) => { + wrapTable( table ); + } ); + } } module.exports = { diff --git a/resources/skins.citizen.styles/common/common.less b/resources/skins.citizen.styles/common/common.less index b130b4027..e46a3b1c3 100644 --- a/resources/skins.citizen.styles/common/common.less +++ b/resources/skins.citizen.styles/common/common.less @@ -87,6 +87,10 @@ td { } } +.hidden { + .hidden(); +} + .nowrap { white-space: nowrap; } From 593c6406fbc4931e211f13ceadc4618452d308a4 Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Tue, 21 May 2024 18:46:19 -0400 Subject: [PATCH 169/254] =?UTF-8?q?refactor(core):=20=E2=99=BB=EF=B8=8F=20?= =?UTF-8?q?simplify=20section=20handling?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- includes/Partials/BodyContent.php | 6 +- resources/skins.citizen.scripts/sections.js | 66 +++++++++++++------ .../components/Sections.less | 14 ++-- 3 files changed, 55 insertions(+), 31 deletions(-) diff --git a/includes/Partials/BodyContent.php b/includes/Partials/BodyContent.php index 3acdcf037..eb85db132 100644 --- a/includes/Partials/BodyContent.php +++ b/includes/Partials/BodyContent.php @@ -43,9 +43,9 @@ final class BodyContent extends Partial { */ /** - * Class name for collapsible section wrappers + * Class name for section wrappers */ - public const STYLE_COLLAPSIBLE_SECTION_CLASS = 'citizen-section-collapsible'; + public const SECTION_CLASS = 'citizen-section'; /** * List of tags that could be considered as section headers. @@ -203,7 +203,7 @@ private function prepareHeading( DOMDocument $doc, DOMElement $heading ) { */ private function createSectionBodyElement( DOMDocument $doc, $sectionNumber ) { $sectionBody = $doc->createElement( 'section' ); - $sectionBody->setAttribute( 'class', self::STYLE_COLLAPSIBLE_SECTION_CLASS ); + $sectionBody->setAttribute( 'class', self::SECTION_CLASS ); $sectionBody->setAttribute( 'id', 'citizen-section-collapsible-' . $sectionNumber ); return $sectionBody; diff --git a/resources/skins.citizen.scripts/sections.js b/resources/skins.citizen.scripts/sections.js index e449b8760..5327b8d2f 100644 --- a/resources/skins.citizen.scripts/sections.js +++ b/resources/skins.citizen.scripts/sections.js @@ -10,42 +10,68 @@ function init( bodyContent ) { } const headings = bodyContent.querySelectorAll( '.citizen-section-heading' ); - const sections = bodyContent.querySelectorAll( '.citizen-section-collapsible' ); + const sections = bodyContent.querySelectorAll( '.citizen-section' ); - const toggleAriaExpanded = ( headline ) => { - headline.toggleAttribute( 'aria-expanded' ); + const setHeadlineAttributes = ( heading, collapsibleID, i ) => { + const headline = heading.querySelector( '.mw-headline' ) || + heading.querySelector( '.mw-heading' ); - }; + if ( !headline ) { + return; + } - const setHeadlineAttributes = ( headline, collapsibleID ) => { headline.setAttribute( 'tabindex', 0 ); headline.setAttribute( 'role', 'button' ); headline.setAttribute( 'aria-controls', collapsibleID ); headline.setAttribute( 'aria-expanded', true ); + headline.setAttribute( 'data-mw-citizen-section-heading-index', i ); }; - const handleClick = ( i ) => { - const collapsibleID = `citizen-section-collapsible-${ i + 1 }`; - const headline = headings[ i ].querySelector( '.citizen-section-heading .mw-headline' ); + const toggleClasses = ( i ) => { + if ( sections[ i + 1 ] ) { + headings[ i ].classList.toggle( 'citizen-section-heading--collapsed' ); + sections[ i + 1 ].classList.toggle( 'citizen-section--collapsed' ); + } + }; - if ( headline ) { - setHeadlineAttributes( headline, collapsibleID ); + const toggleAriaExpanded = ( el ) => { + const isExpanded = el.getAttribute( 'aria-expanded' ) === 'true'; + el.setAttribute( 'aria-expanded', isExpanded ? 'false' : 'true' ); + }; - headings[ i ].addEventListener( 'click', function ( e ) { - this.classList.toggle( 'citizen-section-heading--collapsed' ); - sections[ i + 1 ].classList.toggle( 'citizen-section-collapsible--collapsed' ); - toggleAriaExpanded( headline ); + const onEditSectionClick = ( e ) => { + e.stopPropagation(); + }; - if ( e.target.closest( '.mw-editsection, .mw-editsection-like' ) ) { - e.stopPropagation(); - } - } ); + const handleClick = ( e ) => { + const target = e.target; + const isEditSection = target.closest( '.mw-editsection, .mw-editsection-like' ); + + if ( isEditSection ) { + onEditSectionClick( e ); + return; + } + + const heading = target.closest( '.citizen-section-heading' ); + + if ( heading ) { + const i = +heading.getAttribute( 'data-mw-citizen-section-heading-index' ); + const headline = heading.querySelector( '.mw-headline' ) || + heading.querySelector( '.mw-heading' ); + + if ( headline ) { + toggleClasses( i ); + toggleAriaExpanded( headline ); + } } }; - for ( let i = 0; i < headings.length; i++ ) { - handleClick( i ); + const headingsLength = headings.length; + for ( let i = 0; i < headingsLength; i++ ) { + setHeadlineAttributes( headings[ i ], `citizen-section-${ i + 1 }`, i ); } + + bodyContent.addEventListener( 'click', handleClick, false ); } module.exports = { diff --git a/resources/skins.citizen.styles/components/Sections.less b/resources/skins.citizen.styles/components/Sections.less index ed406e30a..b1274c987 100644 --- a/resources/skins.citizen.styles/components/Sections.less +++ b/resources/skins.citizen.styles/components/Sections.less @@ -59,10 +59,10 @@ // Fix button alignment &-heading, - &-collapsible > h3, - &-collapsible > h4, - &-collapsible > h5, - &-collapsible > h6 { + > h3, + > h4, + > h5, + > h6 { display: flex; align-items: center; @@ -73,10 +73,8 @@ } } - &-collapsible { - &--collapsed { - display: none; - } + &--collapsed { + display: none; } } } From 27c0fb44620940f6230736a09fd1c553689d4011 Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Tue, 21 May 2024 21:43:59 -0400 Subject: [PATCH 170/254] =?UTF-8?q?refactor(search):=20=E2=99=BB=EF=B8=8F?= =?UTF-8?q?=20various=20fixes=20and=20improvements?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/skins.citizen.search/htmlHelper.js | 21 ++- resources/skins.citizen.search/main.js | 4 +- .../skins.citizen.search/searchAction.js | 9 +- .../skins.citizen.search/searchResults.js | 3 + resources/skins.citizen.search/typeahead.js | 138 +++++++++++------- 5 files changed, 108 insertions(+), 67 deletions(-) diff --git a/resources/skins.citizen.search/htmlHelper.js b/resources/skins.citizen.search/htmlHelper.js index 34158ca6e..9adc8b0c8 100644 --- a/resources/skins.citizen.search/htmlHelper.js +++ b/resources/skins.citizen.search/htmlHelper.js @@ -17,6 +17,11 @@ * @property {string} desc */ +/** + * Return an object containing functions to handle HTML elements for a typeahead component. + * + * @return {Object} An object with functions for creating, updating, and removing HTML elements for a typeahead component. + */ function htmlHelper() { return { /** @@ -34,7 +39,7 @@ function htmlHelper() { if ( data.label ) { const label = document.createElement( 'span' ); label.classList.add( 'citizen-typeahead-item-group-label' ); - label.innerText = data.label; + label.textContent = data.label; itemGroup.append( label ); } @@ -42,11 +47,14 @@ function htmlHelper() { const list = document.createElement( 'ol' ); list.classList.add( 'citizen-typeahead-item-group-list' ); list.setAttribute( 'role', 'presentation' ); + const fragment = document.createDocumentFragment(); data.items.forEach( ( itemData, index ) => { - itemData.id = `citizen-typeahead-${ data.id }-${ index }`; - const item = this.getItemElement( itemData ); - list.append( item ); + const modifiedId = `citizen-typeahead-${ data.id }-${ index }`; + const modifiedItemData = { ...itemData, id: modifiedId }; + const item = this.getItemElement( modifiedItemData ); + fragment.appendChild( item ); } ); + list.appendChild( fragment ); itemGroup.append( list ); } @@ -111,13 +119,14 @@ function htmlHelper() { } } if ( data.title ) { + // Required to use innerHTML because of highlightText item.querySelector( '.citizen-typeahead__title' ).innerHTML = data.title; } if ( data.label ) { - item.querySelector( '.citizen-typeahead__label' ).innerHTML = data.label; + item.querySelector( '.citizen-typeahead__label' ).textContent = data.label; } if ( data.desc ) { - item.querySelector( '.citizen-typeahead__description' ).innerHTML = data.desc; + item.querySelector( '.citizen-typeahead__description' ).textContent = data.desc; } }, /** diff --git a/resources/skins.citizen.search/main.js b/resources/skins.citizen.search/main.js index cc92c0db1..3cb1228e8 100644 --- a/resources/skins.citizen.search/main.js +++ b/resources/skins.citizen.search/main.js @@ -2,8 +2,8 @@ * @return {void} */ function initSearchLoader() { - const searchForm = document.getElementById( 'searchform' ), - searchInput = document.getElementById( 'searchInput' ); + const searchForm = document.getElementById( 'searchform' ); + const searchInput = document.getElementById( 'searchInput' ); if ( searchForm && searchInput ) { const typeahead = require( './typeahead.js' ); diff --git a/resources/skins.citizen.search/searchAction.js b/resources/skins.citizen.search/searchAction.js index 4352a6055..ed77caeee 100644 --- a/resources/skins.citizen.search/searchAction.js +++ b/resources/skins.citizen.search/searchAction.js @@ -6,7 +6,7 @@ function searchAction() { userRights: undefined, getUserRights: async function () { // Get and cache user rights - this.userRights = await mw.user.getRights(); + this.userRights = this.userRights ?? await mw.user.getRights(); return this.userRights; }, init: function ( typeaheadEl, itemGroupData ) { @@ -23,11 +23,12 @@ function searchAction() { items: [] }; + const searchQueryEncoded = encodeURIComponent( searchQuery.valueHtml ); // TODO: Save this in a separate JSON file // Fulltext search itemGroupData.items.push( { // id: 'fulltext', - link: `${ config.wgScriptPath }/index.php?title=Special:Search&fulltext=1&search=${ searchQuery.valueHtml }`, + link: `${ config.wgScriptPath }/index.php?title=Special:Search&fulltext=1&search=${ searchQueryEncoded }`, icon: 'articleSearch', msg: 'citizen-search-fulltext' } ); @@ -36,7 +37,7 @@ function searchAction() { if ( config.isMediaSearchExtensionEnabled ) { itemGroupData.items.push( { // id: 'mediasearch', - link: `${ config.wgScriptPath }/index.php?title=Special:MediaSearch&type=image&search=${ searchQuery.valueHtml }`, + link: `${ config.wgScriptPath }/index.php?title=Special:MediaSearch&type=image&search=${ searchQueryEncoded }`, icon: 'imageGallery', msg: 'citizen-search-mediasearch' } ); @@ -54,7 +55,7 @@ function searchAction() { // TODO: Check whether the page exists itemGroupData.items.push( { // id: 'editpage', - link: `${ config.wgScriptPath }/index.php?title=${ searchQuery.valueHtml }&action=edit`, + link: `${ config.wgScriptPath }/index.php?title=${ searchQueryEncoded }&action=edit`, icon: 'edit', msg: 'citizen-search-editpage' } ); diff --git a/resources/skins.citizen.search/searchResults.js b/resources/skins.citizen.search/searchResults.js index c781e874b..3d7e27dac 100644 --- a/resources/skins.citizen.search/searchResults.js +++ b/resources/skins.citizen.search/searchResults.js @@ -4,6 +4,9 @@ const searchAction = require( './searchAction.js' )(); function searchResults() { return { + fetch: function ( queryValue, activeSearchClient ) { + return activeSearchClient.fetchByTitle( queryValue ); + }, render: function ( typeaheadEl, searchQuery ) { searchAction.render( typeaheadEl, searchQuery ); }, diff --git a/resources/skins.citizen.search/typeahead.js b/resources/skins.citizen.search/typeahead.js index 0f9fa82d8..a1686772e 100644 --- a/resources/skins.citizen.search/typeahead.js +++ b/resources/skins.citizen.search/typeahead.js @@ -1,6 +1,5 @@ -const - PREFIX = 'citizen-typeahead', - SEARCH_LOADING_CLASS = 'citizen-loading'; +const PREFIX = 'citizen-typeahead'; +const SEARCH_LOADING_CLASS = 'citizen-loading'; // Config object from getCitizenSearchResourceLoaderConfig() const config = require( './config.json' ); @@ -18,10 +17,16 @@ const typeahead = { form: { /** @type {HTMLFormElement | undefined} */ element: undefined, + isLoading: false, init: function ( formEl ) { - this.element = formEl; - this.element.setAttribute( 'aria-owns', typeahead.element.id ); - this.element.append( typeahead.element ); + const typeaheadFormElement = formEl; + this.element = typeaheadFormElement; + typeaheadFormElement.setAttribute( 'aria-owns', typeahead.element.id ); + typeaheadFormElement.appendChild( typeahead.element ); + }, + setLoadingState: function ( state ) { + this.element.classList.toggle( SEARCH_LOADING_CLASS, state ); + this.isLoading = state; } }, input: { @@ -31,25 +36,36 @@ const typeahead = { // Trigger update only when character is composed (e.g. CJK IME) isComposing: false, init: function ( inputEl ) { - this.element = inputEl; + const typeaheadInputElement = inputEl; + this.element = typeaheadInputElement; const wrapper = document.createElement( 'div' ); wrapper.classList.add( 'citizen-typeahead-input-group' ); - this.element.parentNode.insertBefore( wrapper, this.element ); + typeaheadInputElement.parentNode.insertBefore( wrapper, typeaheadInputElement ); const overlay = document.createElement( 'div' ); overlay.classList.add( 'citizen-typeahead-input-overlay' ); this.displayElement = document.createElement( 'span' ); + this.displayElement.textContent = typeaheadInputElement.value; this.displayElement.classList.add( 'citizen-typeahead-input-overlay-query' ); overlay.append( this.displayElement ); - this.element.classList.add( 'citizen-typeahead-input' ); - this.element.setAttribute( 'aria-autocomplete', 'list' ); - this.element.setAttribute( 'aria-controls', typeahead.element.id ); + typeaheadInputElement.classList.add( 'citizen-typeahead-input' ); + typeaheadInputElement.setAttribute( 'aria-autocomplete', 'list' ); + typeaheadInputElement.setAttribute( 'aria-controls', typeahead.element.id ); + + wrapper.append( overlay, typeaheadInputElement ); + typeaheadInputElement.addEventListener( 'focus', this.onFocus ); - wrapper.append( overlay, this.element ); - this.element.addEventListener( 'focus', this.onFocus ); - this.element.focus(); + const isVisible = typeaheadInputElement.offsetWidth > 0 || + typeaheadInputElement.offsetHeight > 0; + const isFocusable = !typeaheadInputElement.disabled && !typeaheadInputElement.readOnly; + + if ( isVisible && isFocusable ) { + requestAnimationFrame( () => { + typeaheadInputElement.focus(); + } ); + } }, onCompositionstart: function () { typeahead.input.element.addEventListener( 'compositionend', typeahead.input.onCompositionend ); @@ -57,23 +73,25 @@ const typeahead = { }, onCompositionend: function () { typeahead.input.isComposing = false; - typeahead.input.dispatchEvent( new Event( 'input' ) ); + typeahead.input.element.dispatchEvent( new Event( 'input' ) ); }, onFocus: function () { + const typeaheadInputElement = typeahead.input.element; // Refresh the typeahead since the query will be emptied when blurred - typeahead.afterSeachQueryInput(); + typeahead.afterSearchQueryInput(); typeahead.form.element.parentElement.classList.add( 'citizen-search__card--expanded' ); // FIXME: Should probably clean up this somehow typeahead.element.addEventListener( 'click', typeahead.onClick ); - typeahead.input.element.addEventListener( 'keydown', typeahead.input.onKeydown ); - typeahead.input.element.addEventListener( 'input', typeahead.input.onInput ); - typeahead.input.element.addEventListener( 'blur', typeahead.onBlur ); + typeaheadInputElement.addEventListener( 'keydown', typeahead.input.onKeydown ); + typeaheadInputElement.addEventListener( 'input', typeahead.input.onInput ); + typeaheadInputElement.addEventListener( 'blur', typeahead.onBlur ); + typeaheadInputElement.addEventListener( 'compositionstart', typeahead.input.onCompositionstart ); }, onInput: function () { - typeahead.input.displayElement.innerText = typeahead.input.element.value; - typeahead.input.element.addEventListener( 'compositionstart', typeahead.input.onCompositionstart ); + const typeaheadInputElement = typeahead.input.element; + typeahead.input.displayElement.textContent = typeaheadInputElement.value; if ( typeahead.input.isComposing !== true ) { - mw.util.debounce( 100, typeahead.afterSeachQueryInput() ); + mw.util.debounce( 100, typeahead.afterSearchQueryInput() ); } }, onKeydown: function ( event ) { @@ -162,8 +180,9 @@ const typeahead = { } ); }, set: function () { - this.groupElements = typeahead.element.querySelectorAll( '.citizen-typeahead-item-group' ); - this.elements = typeahead.element.querySelectorAll( '.citizen-typeahead__item[role="option"]' ); + const typeaheadElement = typeahead.element; + this.groupElements = typeaheadElement.querySelectorAll( '.citizen-typeahead-item-group' ); + this.elements = typeaheadElement.querySelectorAll( '.citizen-typeahead__item[role="option"]' ); this.bindMouseHoverEvent(); this.setMax( this.elements.length ); }, @@ -193,22 +212,25 @@ const typeahead = { typeahead.input.element.setAttribute( 'aria-activedescendant', '' ); typeahead.items.clearIndex(); // Remove loading animation - typeahead.form.element.classList.remove( SEARCH_LOADING_CLASS ); + typeahead.form.setLoadingState( false ); } }, onBlur: function ( event ) { - if ( !typeahead.element.contains( event.relatedTarget ) ) { + const typeaheadElement = typeahead.element; + const typeaheadInputElement = typeahead.input.element; + if ( !typeaheadElement.contains( event.relatedTarget ) ) { // HACK: On Safari, users are unable to click any links because the blur // event dismiss the links before it is clicked. This should fix it. setTimeout( () => { typeahead.form.element.parentElement.classList.remove( 'citizen-search__card--expanded' ); - typeahead.input.element.setAttribute( 'aria-activedescendant', '' ); - typeahead.element.removeEventListener( 'click', typeahead.onClick ); - typeahead.input.element.removeEventListener( 'keydown', typeahead.input.onKeydown ); - typeahead.input.element.removeEventListener( 'input', typeahead.input.onInput ); - typeahead.input.element.removeEventListener( 'compositionstart', typeahead.input.onCompositionstart ); - typeahead.input.element.removeEventListener( 'compositionend', typeahead.input.onCompositionend ); - typeahead.input.element.removeEventListener( 'blur', this.onBlur ); + typeaheadInputElement.setAttribute( 'aria-activedescendant', '' ); + typeaheadElement.removeEventListener( 'click', typeahead.onClick ); + typeaheadInputElement.removeEventListener( 'keydown', typeahead.input.onKeydown ); + // input listener need to stay on to make clear button works + // typeaheadInputElement.removeEventListener( 'input', typeahead.input.onInput ); + typeaheadInputElement.removeEventListener( 'compositionstart', typeahead.input.onCompositionstart ); + typeaheadInputElement.removeEventListener( 'compositionend', typeahead.input.onCompositionend ); + typeaheadInputElement.removeEventListener( 'blur', this.onBlur ); }, 10 ); } }, @@ -231,11 +253,12 @@ const typeahead = { } }, updateSearchClient: function () { + const typeaheadInputElement = typeahead.input.element; searchClient.setActive( config.wgCitizenSearchGateway ); // Search command experiement - if ( typeahead.input.element.value.startsWith( '/' ) ) { - const command = typeahead.input.element.value.split( ' ' )[ 0 ].slice( 1 ); + if ( typeaheadInputElement.value.startsWith( '/' ) ) { + const command = typeaheadInputElement.value.split( ' ' )[ 0 ].slice( 1 ); if ( command.length > 0 ) { const searchClientData = searchClient.getData( 'command', command ); // Multi-search clients experiment @@ -248,11 +271,12 @@ const typeahead = { return Promise.resolve( `Search client updated to ${ searchClient.active.id }.` ); }, updateSearchQuery: function () { - if ( searchQuery.value === typeahead.input.element.value ) { + const typeaheadInputElement = typeahead.input.element; + if ( searchQuery.value === typeaheadInputElement.value ) { return Promise.reject( `Search query has not changed: ${ searchQuery.value }.` ); } - searchQuery.setValue( typeahead.input.element.value ); + searchQuery.setValue( typeaheadInputElement.value ); typeahead.updateSearchClient(); @@ -280,10 +304,10 @@ const typeahead = { return Promise.resolve( `Search query updated to ${ searchQuery.value }.` ); }, - afterSeachQueryInput: function () { + afterSearchQueryInput: function () { typeahead.updateSearchQuery().then( updateTypeaheadItems ) .catch( () => { - // Don't do anything if search query has not changed. + // Don't do anything if search query has not changed. } ); }, init: function ( formEl, inputEl ) { @@ -304,7 +328,7 @@ const typeahead = { // Run once in case there is searchQuery before eventlistener is attached if ( this.input.element.value.length > 0 ) { - this.afterSeachQueryInput(); + this.afterSearchQueryInput(); } } }; @@ -313,7 +337,10 @@ const typeahead = { * Fetch suggestions from API and render the suggetions in HTML * */ -function getSuggestions() { +// eslint-disable-next-line es-x/no-async-functions +async function getSuggestions() { + const typeaheadInputElement = typeahead.input.element; + const renderSuggestions = ( results ) => { const fragment = document.createDocumentFragment(); if ( results.length > 0 ) { @@ -343,7 +370,7 @@ function getSuggestions() { const isRedirectUseful = () => { // Change to lowercase then remove space and dashes const cleanup = ( text ) => { - return text.toLowerCase().replace( /-|\s/g, '' ); + return text.toLowerCase().replace( /[-\s]/g, '' ); }; const cleanTitle = cleanup( title ), @@ -360,9 +387,9 @@ function getSuggestions() { // Show the redirect title and highlight it if ( matchedTitle && isRedirectUseful() ) { html = `
    - - ${ highlightTitle( matchedTitle ) } -
    `; + + ${ highlightTitle( matchedTitle ) } + `; } return html; @@ -408,35 +435,36 @@ function getSuggestions() { typeahead.element.append( fragment ); typeahead.suggestions.set(); // In case if somehow typeahead.suggestions.clear() didn't clear the loading animation - typeahead.form.element.classList.remove( SEARCH_LOADING_CLASS ); + typeahead.form.setLoadingState( false ); typeahead.items.set(); }; // Add loading animation - typeahead.form.element.classList.add( SEARCH_LOADING_CLASS ); + typeahead.form.setLoadingState( true ); - const { abort, fetch } = searchClient.active.client.fetchByTitle( searchQuery.value ); + const { abort, fetch } = searchResults.fetch( searchQuery.value, searchClient.active.client ); // Abort fetch if the input is detected // So that fetch request won't be queued up - typeahead.input.element.addEventListener( 'input', abort, { once: true } ); + typeaheadInputElement.addEventListener( 'input', abort, { once: true } ); - fetch?.then( ( response ) => { - typeahead.input.element.removeEventListener( 'input', abort ); + try { + const response = await fetch; + typeaheadInputElement.removeEventListener( 'input', abort ); typeahead.suggestions.clear(); if ( response.results !== null ) { renderSuggestions( response.results ); } - } ).catch( ( error ) => { - typeahead.input.element.removeEventListener( 'input', abort ); - typeahead.form.element.classList.remove( SEARCH_LOADING_CLASS ); + } catch ( error ) { + typeaheadInputElement.removeEventListener( 'input', abort ); + typeahead.form.setLoadingState( false ); // User can trigger the abort when the fetch event is pending // There is no need for an error if ( error.name !== 'AbortError' ) { const message = `Uh oh, a wild error appears! ${ error }`; throw new Error( message ); } - } ); + } } /** From 8b1158bc7849186379422c9222ddc292de87f66b Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Tue, 21 May 2024 22:14:58 -0400 Subject: [PATCH 171/254] =?UTF-8?q?refactor(search):=20=E2=99=BB=EF=B8=8F?= =?UTF-8?q?=20use=20data-mw=20prefix=20for=20data=20attribute=20names?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/skins.citizen.search/htmlHelper.js | 4 ++-- resources/skins.citizen.search/searchAction.js | 6 ++++-- resources/skins.citizen.search/searchPresults.js | 2 +- resources/skins.citizen.search/skins.citizen.search.less | 2 +- resources/skins.citizen.search/typeahead.js | 8 ++++---- 5 files changed, 12 insertions(+), 10 deletions(-) diff --git a/resources/skins.citizen.search/htmlHelper.js b/resources/skins.citizen.search/htmlHelper.js index 9adc8b0c8..930866a00 100644 --- a/resources/skins.citizen.search/htmlHelper.js +++ b/resources/skins.citizen.search/htmlHelper.js @@ -33,7 +33,7 @@ function htmlHelper() { getItemGroupElement: function ( data ) { const itemGroup = document.createElement( 'li' ); itemGroup.classList.add( 'citizen-typeahead-item-group' ); - itemGroup.setAttribute( 'data-group', `${ data.id }` ); + itemGroup.setAttribute( 'data-mw-citizen-typeahead-group', `${ data.id }` ); itemGroup.setAttribute( 'role', 'presentation' ); if ( data.label ) { @@ -136,7 +136,7 @@ function htmlHelper() { * @param {string} id */ removeItemGroup: function ( typeaheadEl, id ) { - typeaheadEl.querySelector( `.citizen-typeahead-item-group[data-group="${ id }"]` )?.remove(); + typeaheadEl.querySelector( `.citizen-typeahead-item-group[data-mw-citizen-typeahead-group="${ id }"]` )?.remove(); } }; } diff --git a/resources/skins.citizen.search/searchAction.js b/resources/skins.citizen.search/searchAction.js index ed77caeee..f41e81555 100644 --- a/resources/skins.citizen.search/searchAction.js +++ b/resources/skins.citizen.search/searchAction.js @@ -4,9 +4,10 @@ const htmlHelper = require( './htmlHelper.js' )(); function searchAction() { return { userRights: undefined, + // eslint-disable-next-line es-x/no-async-functions getUserRights: async function () { // Get and cache user rights - this.userRights = this.userRights ?? await mw.user.getRights(); + this.userRights = await mw.user.getRights(); return this.userRights; }, init: function ( typeaheadEl, itemGroupData ) { @@ -17,6 +18,7 @@ function searchAction() { itemGroupData.items = itemGroupData.items.map( ( item ) => ( { ...item, ...actionData } ) ); typeaheadEl.append( htmlHelper.getItemGroupElement( itemGroupData ) ); }, + // eslint-disable-next-line es-x/no-async-functions render: async function ( typeaheadEl, searchQuery ) { const itemGroupData = { id: 'action', @@ -61,7 +63,7 @@ function searchAction() { } ); } - if ( !typeaheadEl.querySelector( '.citizen-typeahead-item-group[data-group="action"]' ) ) { + if ( !typeaheadEl.querySelector( '.citizen-typeahead-item-group[data-mw-citizen-typeahead-group="action"]' ) ) { this.init( typeaheadEl, itemGroupData ); } diff --git a/resources/skins.citizen.search/searchPresults.js b/resources/skins.citizen.search/searchPresults.js index 2b6d97e70..5482ae147 100644 --- a/resources/skins.citizen.search/searchPresults.js +++ b/resources/skins.citizen.search/searchPresults.js @@ -52,7 +52,7 @@ function searchPresults() { }, set: function ( typeaheadEl ) { // FIXME: Clean this up when we add top pages - this.elements = typeaheadEl.querySelectorAll( '.citizen-typeahead-item-group[data-group="history"]' ); + this.elements = typeaheadEl.querySelectorAll( '.citizen-typeahead-item-group[data-mw-citizen-typeahead-group="history"]' ); }, clear: function ( typeaheadEl ) { htmlHelper.removeItemGroup( typeaheadEl, 'history' ); diff --git a/resources/skins.citizen.search/skins.citizen.search.less b/resources/skins.citizen.search/skins.citizen.search.less index 319dcffc7..7891f15da 100644 --- a/resources/skins.citizen.search/skins.citizen.search.less +++ b/resources/skins.citizen.search/skins.citizen.search.less @@ -64,7 +64,7 @@ } // FIXME: Use a generic attribute - &[ data-group='action' ] .citizen-typeahead-item-group-list { + &[ data-mw-citizen-typeahead-group='action' ] .citizen-typeahead-item-group-list { display: flex; gap: var( --space-xxs ); padding-right: var( --space-sm ); diff --git a/resources/skins.citizen.search/typeahead.js b/resources/skins.citizen.search/typeahead.js index a1686772e..ed5e25ce1 100644 --- a/resources/skins.citizen.search/typeahead.js +++ b/resources/skins.citizen.search/typeahead.js @@ -85,11 +85,11 @@ const typeahead = { typeaheadInputElement.addEventListener( 'keydown', typeahead.input.onKeydown ); typeaheadInputElement.addEventListener( 'input', typeahead.input.onInput ); typeaheadInputElement.addEventListener( 'blur', typeahead.onBlur ); - typeaheadInputElement.addEventListener( 'compositionstart', typeahead.input.onCompositionstart ); }, onInput: function () { const typeaheadInputElement = typeahead.input.element; typeahead.input.displayElement.textContent = typeaheadInputElement.value; + typeaheadInputElement.addEventListener( 'compositionstart', typeahead.input.onCompositionstart ); if ( typeahead.input.isComposing !== true ) { mw.util.debounce( 100, typeahead.afterSearchQueryInput() ); } @@ -271,12 +271,12 @@ const typeahead = { return Promise.resolve( `Search client updated to ${ searchClient.active.id }.` ); }, updateSearchQuery: function () { - const typeaheadInputElement = typeahead.input.element; - if ( searchQuery.value === typeaheadInputElement.value ) { + const currentQuery = typeahead.input.element.value; + if ( searchQuery.value === currentQuery ) { return Promise.reject( `Search query has not changed: ${ searchQuery.value }.` ); } - searchQuery.setValue( typeaheadInputElement.value ); + searchQuery.setValue( currentQuery ); typeahead.updateSearchClient(); From 685901cce3a51c5b574a0c56f26bfd214738c4e9 Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Tue, 21 May 2024 23:15:53 -0400 Subject: [PATCH 172/254] =?UTF-8?q?fix(core):=20=F0=9F=90=9B=20incorrect?= =?UTF-8?q?=20section=20selector?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/skins.citizen.scripts/sections.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/skins.citizen.scripts/sections.js b/resources/skins.citizen.scripts/sections.js index 5327b8d2f..009d6c2a7 100644 --- a/resources/skins.citizen.scripts/sections.js +++ b/resources/skins.citizen.scripts/sections.js @@ -55,11 +55,11 @@ function init( bodyContent ) { const heading = target.closest( '.citizen-section-heading' ); if ( heading ) { - const i = +heading.getAttribute( 'data-mw-citizen-section-heading-index' ); const headline = heading.querySelector( '.mw-headline' ) || heading.querySelector( '.mw-heading' ); if ( headline ) { + const i = +headline.getAttribute( 'data-mw-citizen-section-heading-index' ); toggleClasses( i ); toggleAriaExpanded( headline ); } From 3d2ec5300cc461ac28254bf9f12ec718e2e46340 Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Tue, 21 May 2024 23:30:54 -0400 Subject: [PATCH 173/254] =?UTF-8?q?refactor(pref):=20=E2=99=BB=EF=B8=8F=20?= =?UTF-8?q?clean=20up=20pref=20code?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../skins.citizen.preferences.js | 154 +++++++++--------- 1 file changed, 77 insertions(+), 77 deletions(-) diff --git a/resources/skins.citizen.preferences/skins.citizen.preferences.js b/resources/skins.citizen.preferences/skins.citizen.preferences.js index 2ab2e943e..fb4557038 100644 --- a/resources/skins.citizen.preferences/skins.citizen.preferences.js +++ b/resources/skins.citizen.preferences/skins.citizen.preferences.js @@ -1,5 +1,3 @@ -const CLASS = 'citizen-pref'; - /** * Clientprefs names theme differently from Citizen, we will need to translate it * TODO: Migrate to clientprefs fully on MW 1.43 @@ -13,17 +11,17 @@ const CLIENTPREFS_THEME_MAP = { const clientPrefs = require( './clientPrefs.polyfill.js' )(); /** - * Dismiss the prefernce panel when clicked outside + * Dismiss the preference panel when clicked outside * * @param {Event} event */ function dismissOnClickOutside( event ) { - const pref = document.getElementById( CLASS ); + const pref = document.getElementById( 'citizen-pref' ); if ( event.target instanceof Node && !pref.contains( event.target ) ) { - const panel = document.getElementById( CLASS + '-panel' ); + const panel = document.getElementById( 'citizen-pref-panel' ); - if ( panel.classList.contains( CLASS + '-panel--active' ) ) { + if ( panel.classList.contains( 'citizen-pref-panel--active' ) ) { togglePanel(); } } @@ -49,10 +47,10 @@ function dismissOnEscape( event ) { */ function togglePanel() { // .citizen-pref-panel--active - const CLASS_PANEL_ACTIVE = CLASS + '-panel--active'; + const CLASS_PANEL_ACTIVE = 'citizen-pref-panel--active'; const - toggle = document.getElementById( CLASS + '-toggle' ), - panel = document.getElementById( CLASS + '-panel' ); + toggle = document.getElementById( 'citizen-pref-toggle' ), + panel = document.getElementById( 'citizen-pref-panel' ); if ( !panel.classList.contains( CLASS_PANEL_ACTIVE ) ) { panel.classList.add( CLASS_PANEL_ACTIVE ); @@ -68,13 +66,13 @@ function togglePanel() { } /** - * Set up the DOM and initial input states for the panel - * It only loads when user first clicked the toggle + * Creates a panel element for user preferences. + * The panel includes a header with the text retrieved from mw.message('preferences').text() + * and a container element with the id 'citizen-client-prefs'. * - * @param {Event} event - * @return {void} + * @return {Element} The created panel element. */ -function initPanel( event ) { +function createPanel() { const panel = document.createElement( 'aside' ); panel.id = 'citizen-pref-panel'; panel.classList.add( 'citizen-pref-panel' ); @@ -89,21 +87,44 @@ function initPanel( event ) { panel.append( header, container ); - // Attach panel after button - event.currentTarget.parentNode.insertBefore( panel, event.currentTarget.nextSibling ); + return panel; +} + +/** + * Attaches a panel element to a target button element. + * + * @param {Element} panel - The panel element to attach. + * @param {Element} button - The button element to attach the panel to. + * @return {void} + */ +function attachPanel( panel, button ) { + button.parentNode.insertBefore( panel, button.nextSibling ); +} +/** + * Initializes the click event listener for a given button element. + * Toggles the panel visibility when the button is clicked. + * + * @param {Element} button - The button element to attach the click event listener to. + * @return {void} + */ +function initPanelClick( button ) { togglePanel(); - event.currentTarget.addEventListener( 'click', togglePanel ); - event.currentTarget.removeEventListener( 'click', initPanel ); + button.addEventListener( 'click', togglePanel ); + button.removeEventListener( 'click', initPanelClick ); +} - const clientPreferenceSelector = '#citizen-client-prefs'; - const clientPreferenceExists = document.querySelectorAll( clientPreferenceSelector ).length > 0; +/** + * Function to handle client preferences based on the existence of 'citizen-client-prefs' element. + * If the element exists, it loads client preferences and config, sets a callback for skin theme change, + * updates the document's classes based on the theme, and renders the client preferences. + */ +function handleClientPreferences() { + const clientPreferenceExists = document.getElementById( 'citizen-client-prefs' ) !== null; if ( clientPreferenceExists ) { - const clientPreferences = require( /** @type {string} */ ( './clientPreferences.js' ) ); + const clientPreferences = require( /** @type {string} */( './clientPreferences.js' ) ); const clientPreferenceConfig = ( require( './clientPreferences.json' ) ); - // Support legacy skin-citizen-* class - // TODO: Remove it in the future version after sufficient time clientPreferenceConfig[ 'skin-theme' ].callback = () => { const LEGACY_THEME_CLASSES = [ 'skin-citizen-auto', @@ -117,40 +138,21 @@ function initPanel( event ) { document.documentElement.classList.add( `skin-citizen-${ legacyThemeKey }` ); }; - clientPreferences.render( clientPreferenceSelector, clientPreferenceConfig ); + clientPreferences.render( '#citizen-client-prefs', clientPreferenceConfig ); } } /** - * Test if storage is avaliable - * Taken from https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API/Using_the_Web_Storage_API + * Initializes a panel by creating it, attaching it to a target element, + * setting up click event listeners, and handling client preferences. * - * @param {string} type - * @return {boolean|Error} + * @param {Event} event - The event triggering the initialization. */ -function storageAvailable( type ) { - let storage; - - try { - storage = window[ type ]; - const x = '__storage_test__'; - storage.setItem( x, x ); - storage.removeItem( x ); - return true; - } catch ( /** @type {Error} */ e ) { - return e instanceof DOMException && ( - // everything except Firefox - e.code === 22 || - // Firefox - e.code === 1014 || - // test name field too, because code might not be present - // everything except Firefox - e.name === 'QuotaExceededError' || - // Firefox - e.name === 'NS_ERROR_DOM_QUOTA_REACHED' ) && - // acknowledge QuotaExceededError only if there's something already stored - ( storage && storage.length !== 0 ); - } +function initPanel( event ) { + const panel = createPanel(); + attachPanel( panel, event.currentTarget ); + initPanelClick( event.currentTarget ); + handleClientPreferences(); } /** @@ -173,34 +175,32 @@ function initPref( window ) { } ); } - if ( storageAvailable( 'localStorage' ) ) { - if ( typeof window.mw !== 'undefined' ) { - const headerTools = document.querySelector( '.citizen-header__end' ), - container = document.createElement( 'div' ), - button = document.createElement( 'button' ), - icon = document.createElement( 'span' ); - - // citizen-pref - container.id = CLASS; - - container.classList.add( CLASS, 'citizen-header__item' ); - button.id = CLASS + '-toggle'; - - button.classList.add( CLASS + '__button', 'citizen-header__button', 'citizen-button' ); - button.setAttribute( 'title', mw.message( 'preferences' ).text() ); - button.setAttribute( 'aria-label', mw.message( 'preferences' ).text() ); - button.setAttribute( 'aria-controls', CLASS + '-panel' ); - button.setAttribute( 'aria-expanded', false ); - icon.classList.add( 'citizen-ui-icon', 'mw-ui-icon-wikimedia-settings' ); - button.prepend( icon ); - container.prepend( button ); - headerTools.prepend( container ); - - button.addEventListener( 'click', initPanel, { once: true } ); - } + if ( typeof window.localStorage !== 'undefined' && typeof window.mw !== 'undefined' ) { + const headerTools = document.querySelector( '.citizen-header__end' ); + const container = document.createElement( 'div' ); + const button = document.createElement( 'button' ); + const icon = document.createElement( 'span' ); + + // citizen-pref + container.id = 'citizen-pref'; + + container.classList.add( 'citizen-pref', 'citizen-header__item' ); + button.id = 'citizen-pref-toggle'; + + button.classList.add( 'citizen-pref__button', 'citizen-header__button', 'citizen-button' ); + button.setAttribute( 'title', mw.message( 'preferences' ).text() ); + button.setAttribute( 'aria-label', mw.message( 'preferences' ).text() ); + button.setAttribute( 'aria-controls', 'citizen-pref-panel' ); + button.setAttribute( 'aria-expanded', false ); + icon.classList.add( 'citizen-ui-icon', 'mw-ui-icon-wikimedia-settings' ); + button.prepend( icon ); + container.prepend( button ); + headerTools.prepend( container ); + + button.addEventListener( 'click', initPanel, { once: true } ); } else { // eslint-disable-next-line no-console - console.log( 'Preference module is disabled due to localStoarge being not avaliable.' ); + console.error( 'Preference module is disabled due to localStoarge being not avaliable.' ); } } From 434ec2ebaf9c59b1f03fae02e05d64ae50f99850 Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Tue, 21 May 2024 23:48:09 -0400 Subject: [PATCH 174/254] =?UTF-8?q?refactor(core):=20=E2=99=BB=EF=B8=8F=20?= =?UTF-8?q?various=20minor=20refactor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../skins.citizen.search/searchHistory.js | 40 +++++++++++++------ resources/skins.citizen.search/typeahead.js | 5 ++- 2 files changed, 31 insertions(+), 14 deletions(-) diff --git a/resources/skins.citizen.search/searchHistory.js b/resources/skins.citizen.search/searchHistory.js index abd944923..58f571466 100644 --- a/resources/skins.citizen.search/searchHistory.js +++ b/resources/skins.citizen.search/searchHistory.js @@ -1,35 +1,51 @@ +/** + * Represents a search history object that stores search queries and provides methods to manipulate the history. + * + * @param {Object} config - The configuration object containing the maximum number of search results allowed. + * @return {Object} An object with methods to get, set, add, clear, and initialize the search history. + */ function searchHistory( config ) { return { data: [], - /* TODO: Should probably create a separate config */ limit: config.wgCitizenMaxSearchResults, + isValidSearchHistory: function ( arr ) { + return Array.isArray( arr ) && arr.length <= this.limit; + }, get: function () { - // IDK why this.data keeps returning an empty array without init - this.init(); + if ( this.data.length === 0 ) { + this.init(); + } return this.data; }, set: function ( arr ) { - this.data = arr; + if ( arr && this.isValidSearchHistory( arr ) ) { + this.data = arr; + mw.storage.set( 'skin-citizen-search-history', JSON.stringify( this.data ) ); + } }, add: function ( query ) { if ( typeof query === 'string' ) { - let history = this.data; + let history = [ ...this.data ]; history.unshift( query ); - history = history.filter( ( value, index ) => { - return history.indexOf( value ) === index; - } ); + history = [ ...new Set( history ) ]; // Remove duplicates if ( history.length > this.limit ) { - history.splice( this.limit ); + history.length = this.limit; } this.set( history ); - /* NOTE: Should we set an expiry? This data only exists locally though */ - mw.storage.set( 'skin-citizen-search-history', JSON.stringify( this.data ) ); } }, + clear: function () { + this.set( [] ); + mw.storage.remove( 'skin-citizen-search-history' ); + }, init: function () { const storedData = mw.storage.get( 'skin-citizen-search-history' ); if ( storedData ) { - this.set( JSON.parse( storedData ) ); + try { + this.data = JSON.parse( storedData ); + } catch ( error ) { + mw.log.error( `[Citizen] Error parsing search history. Stored data: ${ storedData }`, error ); + } } } }; diff --git a/resources/skins.citizen.search/typeahead.js b/resources/skins.citizen.search/typeahead.js index ed5e25ce1..d5bdbe215 100644 --- a/resources/skins.citizen.search/typeahead.js +++ b/resources/skins.citizen.search/typeahead.js @@ -400,7 +400,7 @@ async function getSuggestions() { id: 'suggestion', items: [] }; - results.forEach( ( result ) => { + const items = results.map( ( result ) => { const data = { type: 'page', size: 'md', @@ -415,8 +415,9 @@ async function getSuggestions() { // Thumbnail placeholder icon data.icon = 'image'; } - itemGroupData.items.push( data ); + return data; } ); + itemGroupData.items.push( ...items ); fragment.append( htmlHelper.getItemGroupElement( itemGroupData ) ); } else { // Update placeholder with no result content From ae7a01f690001448692ac231090a89ed9dd8c1dc Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Wed, 22 May 2024 00:03:49 -0400 Subject: [PATCH 175/254] =?UTF-8?q?refactor(core):=20=E2=99=BB=EF=B8=8F=20?= =?UTF-8?q?move=20some=20suggestion=20functions=20to=20searchResults?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../skins.citizen.search/searchResults.js | 69 +++++++++++++++++++ resources/skins.citizen.search/typeahead.js | 55 +-------------- 2 files changed, 71 insertions(+), 53 deletions(-) diff --git a/resources/skins.citizen.search/searchResults.js b/resources/skins.citizen.search/searchResults.js index 3d7e27dac..b82eea69f 100644 --- a/resources/skins.citizen.search/searchResults.js +++ b/resources/skins.citizen.search/searchResults.js @@ -2,8 +2,77 @@ // const htmlHelper = require( './htmlHelper.js' )(); const searchAction = require( './searchAction.js' )(); +/** + * Returns an object with methods related to search results handling. + * + * @return {Object} An object with the following methods: + * - getRedirectLabel: A function that generates HTML for a search result label with redirection information. + * - highlightTitle: A function that highlights a matched title within a given text. + * - fetch: A function that fetches search results based on a query value using an active search client. + * - render: A function that renders search results in a specified typeahead element. + * - clear: A function that clears search results from a typeahead element. + */ function searchResults() { return { + getRedirectLabel: function ( title, matchedTitle, queryValue ) { + const normalizeText = ( text ) => { + return text.replace( /[-\s]/g, ( match ) => match.toLowerCase() ).toLowerCase(); + }; + + const redirectMessageCache = {}; + const getRedirectMessage = () => { + if ( !redirectMessageCache[ matchedTitle ] ) { + redirectMessageCache[ matchedTitle ] = mw.message( 'search-redirect', matchedTitle ).plain(); + } + return redirectMessageCache[ matchedTitle ]; + }; + + const isRedirectUseful = () => { + const cleanTitle = normalizeText( title ); + const cleanMatchedTitle = normalizeText( matchedTitle ); + + return !( + cleanTitle.includes( cleanMatchedTitle ) || + cleanMatchedTitle.includes( cleanTitle ) + ); + }; + + const generateRedirectHtml = () => { + const div = document.createElement( 'div' ); + div.classList.add( 'citizen-typeahead__labelItem' ); + div.title = getRedirectMessage( matchedTitle ); + + const spanIcon = document.createElement( 'span' ); + spanIcon.classList.add( 'citizen-ui-icon', 'mw-ui-icon-wikimedia-articleRedirect' ); + div.appendChild( spanIcon ); + + const spanText = document.createElement( 'span' ); + spanText.textContent = this.highlightTitle( matchedTitle, queryValue ); + div.appendChild( spanText ); + + return div.outerHTML; + }; + + let html = ''; + if ( matchedTitle && isRedirectUseful() ) { + html = generateRedirectHtml(); + } + + return html; + }, + highlightTitle: ( function () { + const regexCache = {}; + return function ( title, match ) { + if ( !match ) { + return title; + } + if ( !regexCache[ match ] ) { + regexCache[ match ] = new RegExp( mw.util.escapeRegExp( match ), 'i' ); + } + const regex = regexCache[ match ]; + return title.replace( regex, '$&' ); + }; + }() ), fetch: function ( queryValue, activeSearchClient ) { return activeSearchClient.fetchByTitle( queryValue ); }, diff --git a/resources/skins.citizen.search/typeahead.js b/resources/skins.citizen.search/typeahead.js index d5bdbe215..15adcf5cc 100644 --- a/resources/skins.citizen.search/typeahead.js +++ b/resources/skins.citizen.search/typeahead.js @@ -344,57 +344,6 @@ async function getSuggestions() { const renderSuggestions = ( results ) => { const fragment = document.createDocumentFragment(); if ( results.length > 0 ) { - /** - * Return the redirect title with search query highlight - * - * @param {string} text - * @return {string} - */ - const highlightTitle = ( text ) => { - const regex = new RegExp( mw.util.escapeRegExp( searchQuery.valueHtml ), 'i' ); - return text.replace( regex, `$&` ); - }; - /** - * Return the HTML of the redirect label - * - * @param {string} title - * @param {string} matchedTitle - * @return {string} - */ - const getRedirectLabel = ( title, matchedTitle ) => { - /** - * Check if the redirect is useful (T303013) - * - * @return {boolean} - */ - const isRedirectUseful = () => { - // Change to lowercase then remove space and dashes - const cleanup = ( text ) => { - return text.toLowerCase().replace( /[-\s]/g, '' ); - }; - const - cleanTitle = cleanup( title ), - cleanMatchedTitle = cleanup( matchedTitle ); - - return !( - cleanTitle.includes( cleanMatchedTitle ) || - cleanMatchedTitle.includes( cleanTitle ) - ); - }; - - let html = ''; - // Result is a redirect - // Show the redirect title and highlight it - if ( matchedTitle && isRedirectUseful() ) { - html = `
    - - ${ highlightTitle( matchedTitle ) } -
    `; - } - - return html; - }; - // Create suggestion items const itemGroupData = { id: 'suggestion', @@ -405,10 +354,10 @@ async function getSuggestions() { type: 'page', size: 'md', link: result.url, - title: highlightTitle( result.title ), + title: searchResults.highlightTitle( result.title, searchQuery.valueHtml ), desc: result.description }; - data.label = getRedirectLabel( result.title, result.label ); + data.label = searchResults.getRedirectLabel( result.title, result.label ); if ( result.thumbnail ) { data.thumbnail = result.thumbnail.url; } else { From d6bfce15c5534791d2f7c4275f5781d2b2d8f6dc Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Wed, 22 May 2024 00:36:16 -0400 Subject: [PATCH 176/254] =?UTF-8?q?refactor(search):=20=E2=99=BB=EF=B8=8F?= =?UTF-8?q?=20clean=20up=20searchResults=20functions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../skins.citizen.search/searchResults.js | 87 ++++++++++++++----- resources/skins.citizen.search/typeahead.js | 48 ++-------- 2 files changed, 74 insertions(+), 61 deletions(-) diff --git a/resources/skins.citizen.search/searchResults.js b/resources/skins.citizen.search/searchResults.js index b82eea69f..9b8de156c 100644 --- a/resources/skins.citizen.search/searchResults.js +++ b/resources/skins.citizen.search/searchResults.js @@ -1,25 +1,37 @@ // const config = require( './config.json' ); -// const htmlHelper = require( './htmlHelper.js' )(); +const htmlHelper = require( './htmlHelper.js' )(); const searchAction = require( './searchAction.js' )(); /** - * Returns an object with methods related to search results handling. + * Returns an object with methods for handling search results in a citizen search context. + * It includes methods for getting redirect labels, highlighting titles, getting placeholder HTML, + * getting results HTML, fetching search results, rendering search actions, and clearing search results. * - * @return {Object} An object with the following methods: - * - getRedirectLabel: A function that generates HTML for a search result label with redirection information. - * - highlightTitle: A function that highlights a matched title within a given text. - * - fetch: A function that fetches search results based on a query value using an active search client. - * - render: A function that renders search results in a specified typeahead element. - * - clear: A function that clears search results from a typeahead element. + * Methods: + * - getRedirectLabel: Returns a redirect label for a matched title based on query value. + * - highlightTitle: Highlights a title based on a matching query. + * - getPlaceholderHTML: Returns HTML for a placeholder when no search results are found. + * - getResultsHTML: Returns HTML for displaying search results. + * - fetch: Fetches search results based on a query value using an active search client. + * - render: Renders search actions on a typeahead element with a search query. + * - clear: Clears search results from a typeahead element. + * + * @return {Object} An object with methods for handling search results. */ function searchResults() { + const textCache = {}; + const redirectMessageCache = {}; + const regexCache = {}; + return { getRedirectLabel: function ( title, matchedTitle, queryValue ) { const normalizeText = ( text ) => { - return text.replace( /[-\s]/g, ( match ) => match.toLowerCase() ).toLowerCase(); + if ( !textCache[ text ] ) { + textCache[ text ] = text.replace( /[-\s]/g, ( match ) => match.toLowerCase() ).toLowerCase(); + } + return textCache[ text ]; }; - const redirectMessageCache = {}; const getRedirectMessage = () => { if ( !redirectMessageCache[ matchedTitle ] ) { redirectMessageCache[ matchedTitle ] = mw.message( 'search-redirect', matchedTitle ).plain(); @@ -60,19 +72,52 @@ function searchResults() { return html; }, - highlightTitle: ( function () { - const regexCache = {}; - return function ( title, match ) { - if ( !match ) { - return title; - } - if ( !regexCache[ match ] ) { - regexCache[ match ] = new RegExp( mw.util.escapeRegExp( match ), 'i' ); + highlightTitle: function ( title, match ) { + if ( !match ) { + return title; + } + if ( !regexCache[ match ] ) { + regexCache[ match ] = new RegExp( mw.util.escapeRegExp( match ), 'i' ); + } + const regex = regexCache[ match ]; + return title.replace( regex, '$&' ); + }, + getPlaceholderHTML: function ( queryValue ) { + const data = { + icon: 'articleNotFound', + type: 'placeholder', + size: 'lg', + title: mw.message( 'citizen-search-noresults-title', queryValue ).text(), + desc: mw.message( 'citizen-search-noresults-desc' ).text() + }; + return htmlHelper.getItemElement( data ); + }, + getResultsHTML: function ( results, queryValue ) { + const createSuggestionItem = ( result ) => { + const data = { + type: 'page', + size: 'md', + link: result.url, + title: this.highlightTitle( result.title, queryValue ), + desc: result.description + }; + data.label = this.getRedirectLabel( result.title, result.label ); + if ( result.thumbnail ) { + data.thumbnail = result.thumbnail.url; + } else { + // Thumbnail placeholder icon + data.icon = 'image'; } - const regex = regexCache[ match ]; - return title.replace( regex, '$&' ); + return data; }; - }() ), + + const items = results.map( ( result ) => createSuggestionItem( result ) ); + const itemGroupData = { + id: 'suggestion', + items: items + }; + return htmlHelper.getItemGroupElement( itemGroupData ); + }, fetch: function ( queryValue, activeSearchClient ) { return activeSearchClient.fetchByTitle( queryValue ); }, diff --git a/resources/skins.citizen.search/typeahead.js b/resources/skins.citizen.search/typeahead.js index 15adcf5cc..f0021215d 100644 --- a/resources/skins.citizen.search/typeahead.js +++ b/resources/skins.citizen.search/typeahead.js @@ -344,40 +344,10 @@ async function getSuggestions() { const renderSuggestions = ( results ) => { const fragment = document.createDocumentFragment(); if ( results.length > 0 ) { - // Create suggestion items - const itemGroupData = { - id: 'suggestion', - items: [] - }; - const items = results.map( ( result ) => { - const data = { - type: 'page', - size: 'md', - link: result.url, - title: searchResults.highlightTitle( result.title, searchQuery.valueHtml ), - desc: result.description - }; - data.label = searchResults.getRedirectLabel( result.title, result.label ); - if ( result.thumbnail ) { - data.thumbnail = result.thumbnail.url; - } else { - // Thumbnail placeholder icon - data.icon = 'image'; - } - return data; - } ); - itemGroupData.items.push( ...items ); - fragment.append( htmlHelper.getItemGroupElement( itemGroupData ) ); + fragment.append( searchResults.getResultsHTML( results, searchQuery.valueHtml ) ); } else { // Update placeholder with no result content - const data = { - icon: 'articleNotFound', - type: 'placeholder', - size: 'lg', - title: mw.message( 'citizen-search-noresults-title', searchQuery.valueHtml ).text(), - desc: mw.message( 'citizen-search-noresults-desc' ).text() - }; - fragment.append( htmlHelper.getItemElement( data ) ); + fragment.append( searchResults.getPlaceholderHTML( searchQuery.valueHtml ) ); } htmlHelper.removeItemGroup( typeahead.element, 'suggestion' ); @@ -394,19 +364,17 @@ async function getSuggestions() { const { abort, fetch } = searchResults.fetch( searchQuery.value, searchClient.active.client ); - // Abort fetch if the input is detected - // So that fetch request won't be queued up - typeaheadInputElement.addEventListener( 'input', abort, { once: true } ); + const inputEventListener = () => { + abort(); + typeaheadInputElement.removeEventListener( 'input', inputEventListener ); + }; + typeaheadInputElement.addEventListener( 'input', inputEventListener, { once: true } ); try { const response = await fetch; - typeaheadInputElement.removeEventListener( 'input', abort ); typeahead.suggestions.clear(); - if ( response.results !== null ) { - renderSuggestions( response.results ); - } + renderSuggestions( response.results ); } catch ( error ) { - typeaheadInputElement.removeEventListener( 'input', abort ); typeahead.form.setLoadingState( false ); // User can trigger the abort when the fetch event is pending // There is no need for an error From b946056c13bb3bfd8e3842bab473ab97ce82198b Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Wed, 22 May 2024 00:58:13 -0400 Subject: [PATCH 177/254] =?UTF-8?q?fix(search):=20=F0=9F=90=9B=20label=20c?= =?UTF-8?q?an=20sometimes=20contain=20HTML?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/skins.citizen.search/htmlHelper.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/skins.citizen.search/htmlHelper.js b/resources/skins.citizen.search/htmlHelper.js index 930866a00..fffcf38d6 100644 --- a/resources/skins.citizen.search/htmlHelper.js +++ b/resources/skins.citizen.search/htmlHelper.js @@ -123,7 +123,7 @@ function htmlHelper() { item.querySelector( '.citizen-typeahead__title' ).innerHTML = data.title; } if ( data.label ) { - item.querySelector( '.citizen-typeahead__label' ).textContent = data.label; + item.querySelector( '.citizen-typeahead__label' ).innerHTML = data.label; } if ( data.desc ) { item.querySelector( '.citizen-typeahead__description' ).textContent = data.desc; From d7f6c0c53e3b8e4dc534d9784f5409bf061594fb Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Sat, 25 May 2024 00:47:02 -0400 Subject: [PATCH 178/254] =?UTF-8?q?feat(TabberNeue):=20=E2=9C=A8=20update?= =?UTF-8?q?=20TabberNeue=20RL=20module=20name?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- skin.json | 2 +- .../{ext.tabberNeue.legacy.less => ext.tabberNeue.less} | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) rename skinStyles/extensions/TabberNeue/{ext.tabberNeue.legacy.less => ext.tabberNeue.less} (94%) diff --git a/README.md b/README.md index c99a631a0..812ee9e3f 100644 --- a/README.md +++ b/README.md @@ -78,7 +78,7 @@ Name | Grade | Version | Last updated [SyntaxHighlight](https://www.mediawiki.org/wiki/Extension:SyntaxHighlight) | A | REL1_35 `05598b3` | 2023-05-22 [Tabs](https://www.mediawiki.org/wiki/Extension:Tabs) | A | REL1_39 `63ccef2` | 2023-07-11 [Tabber](https://www.mediawiki.org/wiki/Extension:Tabber) | A | N/A | N/A -[TabberNeue](https://www.mediawiki.org/wiki/Extension:TabberNeue) | A | 1.7.5 `dcc4bc1` | 2023-07-05 +[TabberNeue](https://www.mediawiki.org/wiki/Extension:TabberNeue) | A | 2.0.0 | 2024-05-25 [TemplateData](https://www.mediawiki.org/wiki/Extension:TemplateData) | A | REL1_39 `e2c12b5` | 2023-05-01 [TimedMediaHandler](https://www.mediawiki.org/wiki/Extension:TimedMediaHandler) | B | N/A | N/A [Translate](https://www.mediawiki.org/wiki/Extension:Translate) | A | MLEB 2023.01 | 2023-02-17 diff --git a/skin.json b/skin.json index 50f74c318..eb647a6c4 100644 --- a/skin.json +++ b/skin.json @@ -501,7 +501,7 @@ "+ext.popups.main": "skinStyles/extensions/Popups/ext.popups.main.less", "+ext.PortableInfobox.styles": "skinStyles/extensions/PortableInfobox/ext.PortableInfobox.styles.less", "+ext.Tabber": "skinStyles/extensions/Tabber/ext.Tabber.less", - "+ext.tabberNeue.legacy": "skinStyles/extensions/TabberNeue/ext.tabberNeue.legacy.less", + "+ext.tabberNeue": "skinStyles/extensions/TabberNeue/ext.tabberNeue.less", "+ext.templateDataGenerator.editTemplatePage": "skinStyles/extensions/TemplateData/ext.templateDataGenerator.editTemplatePage.less", "+ext.uploadWizard": "skinStyles/extensions/UploadWizard/ext.uploadWizard.less", "+ext.uploadWizard.page.styles": "skinStyles/extensions/UploadWizard/uploadWizard.noWizard.less", diff --git a/skinStyles/extensions/TabberNeue/ext.tabberNeue.legacy.less b/skinStyles/extensions/TabberNeue/ext.tabberNeue.less similarity index 94% rename from skinStyles/extensions/TabberNeue/ext.tabberNeue.legacy.less rename to skinStyles/extensions/TabberNeue/ext.tabberNeue.less index f998f8a52..90e185401 100644 --- a/skinStyles/extensions/TabberNeue/ext.tabberNeue.legacy.less +++ b/skinStyles/extensions/TabberNeue/ext.tabberNeue.less @@ -2,10 +2,10 @@ * Citizen * * SkinStyles for Extension:TabberNeue - * Module: ext.tabberNeue.legacy - * Version: 1.7.5 (dcc4bc1) + * Module: ext.tabberNeue + * Version: 2.0.0 * - * Date: 2023-07-05 + * Date: 2024-05-25 */ .tabber { From 0eb9a8a7d1dbbd6bc16080f80ec15af1d4207ea0 Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Sat, 25 May 2024 00:56:18 -0400 Subject: [PATCH 179/254] =?UTF-8?q?chore(dep-dev):=20=F0=9F=94=A7=20remove?= =?UTF-8?q?=20svgo=20as=20it=20is=20not=20used?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .svgo.config.js | 40 ------------------- package-lock.json | 98 +---------------------------------------------- package.json | 4 +- 3 files changed, 2 insertions(+), 140 deletions(-) delete mode 100644 .svgo.config.js diff --git a/.svgo.config.js b/.svgo.config.js deleted file mode 100644 index 492f68745..000000000 --- a/.svgo.config.js +++ /dev/null @@ -1,40 +0,0 @@ -/** - * SVGO Configuration - * Compatible to v2.4.0+ - * Recommended options from: - * https://www.mediawiki.org/wiki/Manual:Coding_conventions/SVG#Exemplified_safe_configuration - */ -module.exports = { - plugins: [ - { - // Set of built-in plugins enabled by default. - name: 'preset-default', - params: { - overrides: { - cleanupIDs: false, - removeDesc: false, - removeTitle: false, - removeViewBox: false, - // If the SVG doesn't start with an XML declaration, then its MIME type will - // be detected as "text/plain" rather than "image/svg+xml" by libmagic and, - // consequently, MediaWiki's CSSMin CSS minifier. libmagic's default database - // currently requires that SVGs contain an XML declaration: - // https://github.com/threatstack/libmagic/blob/master/magic/Magdir/sgml#L5 - removeXMLProcInst: false - } - } - }, - 'removeRasterImages', - 'sortAttrs' - ], - // Set whitespace according to Wikimedia Coding Conventions. - // @see https://github.com/svg/svgo/blob/v2.8.0/lib/stringifier.js#L41 for available options. - js2svg: { - eol: 'lf', - finalNewline: true, - // Configure the indent to tabs (default 4 spaces) used by `--pretty` here. - indent: '\t', - pretty: true - }, - multipass: true -}; diff --git a/package-lock.json b/package-lock.json index 93728b775..b2e46ed12 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,8 +18,7 @@ "stylelint": "15.11.0", "stylelint-config-recess-order": "4.6.0", "stylelint-config-wikimedia": "0.16.1", - "stylelint-order": "^6.0.3", - "svgo": "3.3.1" + "stylelint-order": "^6.0.3" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -632,15 +631,6 @@ "node": ">= 8" } }, - "node_modules/@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "dev": true, - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/@types/conventional-commits-parser": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/@types/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz", @@ -1362,22 +1352,6 @@ "xtend": ">=4.0.0 <4.1.0-0" } }, - "node_modules/css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, "node_modules/css-tokenize": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/css-tokenize/-/css-tokenize-1.0.1.tgz", @@ -1419,18 +1393,6 @@ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" } }, - "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "dev": true, - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -1443,39 +1405,6 @@ "node": ">=4" } }, - "node_modules/csso": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", - "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", - "dev": true, - "dependencies": { - "css-tree": "~2.2.0" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/csso/node_modules/css-tree": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", - "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", - "dev": true, - "dependencies": { - "mdn-data": "2.0.28", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/csso/node_modules/mdn-data": { - "version": "2.0.28", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", - "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", - "dev": true - }, "node_modules/dargs": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/dargs/-/dargs-8.1.0.tgz", @@ -5552,31 +5481,6 @@ "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", "dev": true }, - "node_modules/svgo": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.1.tgz", - "integrity": "sha512-xQQTIGRl3gHTO2PFlZFLl+Xwofj+CMOPitfoByGBNAniQnY6SbGgd31u3C8RTqdlqZqYNl9Sb83VXbimVHcU6w==", - "dev": true, - "dependencies": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^5.1.0", - "css-tree": "^2.3.1", - "css-what": "^6.1.0", - "csso": "^5.0.5", - "picocolors": "^1.0.0" - }, - "bin": { - "svgo": "bin/svgo.js" - }, - "engines": { - "node": ">=14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/svgo" - } - }, "node_modules/table": { "version": "6.8.2", "resolved": "https://registry.npmjs.org/table/-/table-6.8.2.tgz", diff --git a/package.json b/package.json index eb7d895b3..5efa78591 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,6 @@ "lint:js": "eslint --cache --max-warnings 0 .", "lint:styles": "stylelint \"**/*.{less,css}\"", "lint:i18n": "banana-checker --requireLowerCase=0 i18n/", - "minify-svg": "svgo --config=.svgo.config.js --quiet --recursive --folder resources/", "test": "", "prepare": "husky" }, @@ -23,8 +22,7 @@ "stylelint": "15.11.0", "stylelint-config-recess-order": "4.6.0", "stylelint-config-wikimedia": "0.16.1", - "stylelint-order": "^6.0.3", - "svgo": "3.3.1" + "stylelint-order": "^6.0.3" }, "version": "2.13.5" } From 4762102d616bce2095d1912e735cf5594191594c Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Sat, 25 May 2024 01:14:44 -0400 Subject: [PATCH 180/254] =?UTF-8?q?chore(eslint):=20=F0=9F=94=A7=20use=20w?= =?UTF-8?q?ikimedia/server=20for=20root=20folder=20eslint=20config?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .eslintrc.json | 29 ++--------------------------- resources/.eslintrc.json | 31 +++++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 27 deletions(-) create mode 100644 resources/.eslintrc.json diff --git a/.eslintrc.json b/.eslintrc.json index 1e1ee2d29..04f9da7ac 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,31 +1,6 @@ { "root": true, "extends": [ - "wikimedia/client-es6", - "wikimedia/mediawiki" - ], - "env": { - "browser": true - }, - "globals": { - "exports": true - }, - "rules": { - "no-implicit-globals": "warn", - "es-x/no-async-functions": "warn", - "es-x/no-object-fromentries": "warn", - "es-x/no-object-entries": "warn", - "es-x/no-object-values": "warn", - "es-x/no-array-prototype-includes": "warn", - "es-x/no-optional-chaining": "warn", - "es-x/no-nullish-coalescing-operators": "warn", - "es-x/no-rest-spread-properties": "warn", - "es-x/no-symbol-prototype-description": "warn", - "compat/compat": "warn", - "mediawiki/class-doc": "off" - }, - "parserOptions": { - "ecmaVersion": 11, - "sourceType": "module" - } + "wikimedia/server" + ] } diff --git a/resources/.eslintrc.json b/resources/.eslintrc.json new file mode 100644 index 000000000..1e1ee2d29 --- /dev/null +++ b/resources/.eslintrc.json @@ -0,0 +1,31 @@ +{ + "root": true, + "extends": [ + "wikimedia/client-es6", + "wikimedia/mediawiki" + ], + "env": { + "browser": true + }, + "globals": { + "exports": true + }, + "rules": { + "no-implicit-globals": "warn", + "es-x/no-async-functions": "warn", + "es-x/no-object-fromentries": "warn", + "es-x/no-object-entries": "warn", + "es-x/no-object-values": "warn", + "es-x/no-array-prototype-includes": "warn", + "es-x/no-optional-chaining": "warn", + "es-x/no-nullish-coalescing-operators": "warn", + "es-x/no-rest-spread-properties": "warn", + "es-x/no-symbol-prototype-description": "warn", + "compat/compat": "warn", + "mediawiki/class-doc": "off" + }, + "parserOptions": { + "ecmaVersion": 11, + "sourceType": "module" + } +} From ae9b418bff5ff253db6471701d54389f62f38931 Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Sat, 25 May 2024 01:19:09 -0400 Subject: [PATCH 181/254] chore(main): release 2.14.0 (#851) --- CHANGELOG.md | 40 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 93e748ec8..f9ca573e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,44 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +## [2.14.0](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/compare/v2.13.5...v2.14.0) (2024-05-25) + + +### Features + +* **components:** rewrite template data partials into CitizenComponent components ([#846](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/issues/846)) ([03da361](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/03da361b9700faf9f1843018eefb38bb47e84f49)) +* **core:** ✨ tweak dark theme color to be darker ([a193d14](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/a193d14de7b6728774231d8a37750a70682cc089)) +* **mediawiki:** ✨ tweak login and signup page styles ([cae19d7](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/cae19d7a3020c6181f74f54e5c0cf6086165a7c0)) +* **TabberNeue:** ✨ update TabberNeue RL module name ([d7f6c0c](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/d7f6c0c53e3b8e4dc534d9784f5409bf061594fb)) +* **VisualEditor:** ✨ hide less useful buttons when width is limited ([820d612](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/820d612eaff26caffd3745f63ce3b9359136a04a)) + + +### Bug Fixes + +* **codex:** 🐛 target new codex style RL module as well ([27eac2d](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/27eac2da9572b37623e0e856c36cd5d3bc6420a7)) +* **components:** catch MalformedTitleException in titleFromText ([0006db6](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/0006db65a20f31c07a640fe5a0fbf2b485df392f)) +* **core:** 🐛 do not hide view button on revision page ([9969479](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/996947993859a8ddac6943904eb9693851085624)), closes [#845](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/issues/845) +* **core:** 🐛 incorrect label text when edit count contains separator ([c5e8c2b](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/c5e8c2bfc864c00f668aef78aa1aeaaef8dc240d)) +* **core:** 🐛 incorrect section selector ([685901c](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/685901cce3a51c5b574a0c56f26bfd214738c4e9)) +* **core:** 🐛 incorrect try catch block ([d4d71dc](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/d4d71dc34a7300176f185d50a8742fcd160f5147)) +* **core:** 🐛 only pass string into str replace ([84a65a3](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/84a65a303b86bfe665697b911e1d647f8d55c3ec)) +* **core:** 🐛 pass namespace key as string ([f781773](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/f781773cbaba9e3ac49610e11daed8e6b084a6d9)), closes [#849](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/issues/849) +* **core:** 🐛 turn message into string before str_replace ([e5fef2a](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/e5fef2ac09cb61089dc2edf7bd5bff17d4691394)) +* **core:** Rename Usermenu.less to UserMenu.less ([c09b82c](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/c09b82cb07913be5e7243c5eca0869a3007bc3b6)) +* **mediawiki:** 🐛 overflow signupstart container ([b922505](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/b9225057a786ac3c7b283660769c2a871adaf5a3)) +* **search:** 🐛 label can sometimes contain HTML ([b946056](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/b946056c13bb3bfd8e3842bab473ab97ce82198b)) + + +### Miscellaneous Chores + +* 🔧 add release-please action ([c72a25b](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/c72a25b02744823615b8ba0f8713707b5db897c3)) +* 🔧 drop JSdoc as it is not being used ([b10c1a8](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/b10c1a8fc2141a07128c7e9a6d3db9983d12d03b)) +* 🔧 drop standard-version in favor of release-please ([488f655](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/488f65519c10511379964a256a34c26f492cd0c0)) +* 🔧 set release policy to PHP ([2b15ff8](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/2b15ff8d1147f0fae83d95e2369fa3d0a68d8ce1)) +* **dep-dev:** 🔧 remove svgo as it is not used ([0eb9a8a](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/0eb9a8a7d1dbbd6bc16080f80ec15af1d4207ea0)) +* **deps-dev:** bump grunt-banana-checker from 0.12.0 to 0.13.0 ([#847](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/issues/847)) ([18676da](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/18676da2d495fc0da83cd2fb3abc241ea58a9718)) +* **eslint:** 🔧 use wikimedia/server for root folder eslint config ([4762102](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/4762102d616bce2095d1912e735cf5594191594c)) + ### [2.13.5](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/compare/v2.13.4...v2.13.5) (2024-05-09) @@ -1581,4 +1619,4 @@ All notable changes to this project will be documented in this file. See [standa * remove unused debug code ([a8485ac](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/a8485ac76a488b39f765a3e05a705bb828ecd261)) -* drop security header support ([42df59f](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/42df59f2b454b9c7928957da24528cbdfd31fc93)) +* drop security header support ([42df59f](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/42df59f2b454b9c7928957da24528cbdfd31fc93)) From cc4e7b1d85a41a81fe49e9dda53a747584449165 Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Sat, 25 May 2024 01:58:49 -0400 Subject: [PATCH 182/254] =?UTF-8?q?chore(release-please):=20=F0=9F=94=A7?= =?UTF-8?q?=20add=20manifest=20and=20config=20files?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/release-please.yml | 5 +---- .release-please-config.json | 13 +++++++++++++ .release-please-manifest.json | 3 +++ 3 files changed, 17 insertions(+), 4 deletions(-) create mode 100644 .release-please-config.json create mode 100644 .release-please-manifest.json diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml index 13f977a47..c7ad5239b 100644 --- a/.github/workflows/release-please.yml +++ b/.github/workflows/release-please.yml @@ -18,7 +18,4 @@ jobs: # this assumes that you have created a personal access token # (PAT) and configured it as a GitHub action secret named # `MY_RELEASE_PLEASE_TOKEN` (this secret name is not important). - token: ${{ secrets.MY_RELEASE_PLEASE_TOKEN }} - # this is a built-in strategy in release-please, see "Action Inputs" - # for more options - release-type: php \ No newline at end of file + token: ${{ secrets.MY_RELEASE_PLEASE_TOKEN }} \ No newline at end of file diff --git a/.release-please-config.json b/.release-please-config.json new file mode 100644 index 000000000..c6e51d91b --- /dev/null +++ b/.release-please-config.json @@ -0,0 +1,13 @@ +{ + "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json", + "release-type": "php", + "pull-request-title-pattern": "build: release ${version}", + "extra-files": [ + "skin.json", + "package.json", + "package-lock.json" + ], + "packages": { + ".": {} + } +} \ No newline at end of file diff --git a/.release-please-manifest.json b/.release-please-manifest.json new file mode 100644 index 000000000..851649e84 --- /dev/null +++ b/.release-please-manifest.json @@ -0,0 +1,3 @@ +{ + ".": "2.14.0" +} \ No newline at end of file From 0ed940c7e41f6d3fbcc09cc72331a9b5955e50d9 Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Sat, 25 May 2024 02:00:51 -0400 Subject: [PATCH 183/254] =?UTF-8?q?chore(release-please):=20=F0=9F=94=A7?= =?UTF-8?q?=20fix=20config=20file=20name?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .release-please-config.json => release-please-config.json | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .release-please-config.json => release-please-config.json (100%) diff --git a/.release-please-config.json b/release-please-config.json similarity index 100% rename from .release-please-config.json rename to release-please-config.json From d6e996b09fef4c1e8aae61d1b6b08567690b5cbe Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Sat, 25 May 2024 02:19:49 -0400 Subject: [PATCH 184/254] =?UTF-8?q?chore(workflow):=20=F0=9F=94=A7=20only?= =?UTF-8?q?=20trigger=20PHP=20tests=20when=20PHP=20files=20are=20changed?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/{mediawiki.yml => lint.yml} | 251 +++++++++--------- .github/workflows/{ci.yml => php-tests.yml} | 9 +- .github/workflows/release-please.yml | 5 +- 3 files changed, 134 insertions(+), 131 deletions(-) rename .github/workflows/{mediawiki.yml => lint.yml} (88%) rename .github/workflows/{ci.yml => php-tests.yml} (90%) diff --git a/.github/workflows/mediawiki.yml b/.github/workflows/lint.yml similarity index 88% rename from .github/workflows/mediawiki.yml rename to .github/workflows/lint.yml index c0c65d086..a4aaf0b1c 100644 --- a/.github/workflows/mediawiki.yml +++ b/.github/workflows/lint.yml @@ -1,121 +1,130 @@ -name: Lint - -on: - push: - branches: - - '**' - pull_request: - branches: - - '**' - -jobs: - test: - name: Lint - runs-on: ubuntu-latest - strategy: - matrix: - php-versions: ['8.2', '8.1', '8.0', '7.4'] - steps: - - name: Cancel Previous Runs - uses: styfle/cancel-workflow-action@0.12.1 - with: - access_token: ${{ github.token }} - - - uses: actions/checkout@v4 - with: - fetch-depth: 0 # OR "2" -> To retrieve the preceding commit. - - - name: Cache dependencies - uses: actions/cache@v4 - with: - path: /home/runner/cache - key: ${{ runner.os }}-${{ hashFiles('**/*.lock') }} - - - name: Install dependencies - run: | - composer validate - composer install --prefer-dist --no-progress - npm install --save-dev - - # Check for changed files - - name: Check for PHP changes - id: changed-php - uses: tj-actions/changed-files@v44 - with: - since_last_remote_commit: "true" - files: | - includes/**/*.php - - - name: Check for script changes - id: changed-script - uses: tj-actions/changed-files@v44 - with: - since_last_remote_commit: "true" - files: | - resources/**/*.js - - - name: Check for stylesheet changes - id: changed-stylesheet - uses: tj-actions/changed-files@v44 - with: - since_last_remote_commit: "true" - files: | - resources/**/*.css - resources/**/*.less - skinStyles/**/*.css - skinStyles/**/*.less - - - name: Check for i18n changes - id: changed-i18n - uses: tj-actions/changed-files@v44 - with: - since_last_remote_commit: "true" - files: | - i18n/*.json - - # Bypass the phpcbf non-standard exit code - - name: Lint PHP - if: steps.changed-php.outputs.any_changed == 'true' - continue-on-error: true - run: | - sh ./bin/phpcbf.sh - composer fix - composer test - - - name: Lint script - if: steps.changed-script.outputs.any_changed == 'true' - continue-on-error: true - run: | - npm run lint:fix:js - npm run lint:js - - - name: Lint stylesheet - if: steps.changed-stylesheet.outputs.any_changed == 'true' - continue-on-error: true - run: | - npm run lint:fix:styles - npm run lint:styles - - - name: Lint i18n - if: steps.changed-i18n.outputs.any_changed == 'true' - continue-on-error: true - run: | - npm run lint:i18n - - # Only patch code when it is a push event - - name: Push the changes - if: github.event_name == 'push' - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - if ! git diff --exit-code --quiet; then - git config --global user.name "github-actions" - git config --global user.email "github-actions@users.noreply.github.com" - git remote set-url origin "https://x-access-token:${GITHUB_TOKEN}@github.com/${GITHUB_REPOSITORY}.git" - git add . - git commit -am "ci: 👷 lint code to MediaWiki standards" -m "Check commit and GitHub actions for more details" - git pull --rebase - git push - else - echo "No changes to commit" - fi +name: Lint + +on: + push: + branches: + - '**' + pull_request: + branches: + - '**' + +jobs: + test: + name: Lint + runs-on: ubuntu-latest + strategy: + matrix: + php-versions: ['8.2', '8.1', '8.0', '7.4'] + steps: + - name: Cancel Previous Runs + uses: styfle/cancel-workflow-action@0.12.1 + with: + access_token: ${{ github.token }} + + - uses: actions/checkout@v4 + with: + fetch-depth: 0 # OR "2" -> To retrieve the preceding commit. + + - name: Cache dependencies + uses: actions/cache@v4 + with: + path: /home/runner/cache + key: ${{ runner.os }}-${{ hashFiles('**/*.lock') }} + + - name: Install dependencies + run: | + composer validate + composer install --prefer-dist --no-progress + npm install --save-dev + + # Check for changed files + - name: Check for PHP changes + id: changed-php + uses: tj-actions/changed-files@v44 + with: + since_last_remote_commit: "true" + files: | + includes/**/*.php + + - name: Check for script changes + id: changed-script + uses: tj-actions/changed-files@v44 + with: + since_last_remote_commit: "true" + files: | + resources/**/*.js + + - name: Check for stylesheet changes + id: changed-stylesheet + uses: tj-actions/changed-files@v44 + with: + since_last_remote_commit: "true" + files: | + resources/**/*.css + resources/**/*.less + skinStyles/**/*.css + skinStyles/**/*.less + + - name: Check for i18n changes + id: changed-i18n + uses: tj-actions/changed-files@v44 + with: + since_last_remote_commit: "true" + files: | + i18n/*.json + + # Bypass the phpcbf non-standard exit code + - name: Lint PHP + if: steps.changed-php.outputs.any_changed == 'true' + continue-on-error: true + run: | + sh ./bin/phpcbf.sh + composer fix + composer test + + - name: Lint script + if: steps.changed-script.outputs.any_changed == 'true' + continue-on-error: true + run: | + npm run lint:fix:js + npm run lint:js + + - name: Lint stylesheet + if: steps.changed-stylesheet.outputs.any_changed == 'true' + continue-on-error: true + run: | + npm run lint:fix:styles + npm run lint:styles + + - name: Lint i18n + if: steps.changed-i18n.outputs.any_changed == 'true' + continue-on-error: true + run: | + npm run lint:i18n + + - name: Trigger PHP tests + run: | + if [ steps.changed-php.outputs.any_changed == 'true' ]; then + curl -X POST -H "Authorization: token ${{ secrets.WORKFLOW_TOKEN }}" \ + -H "Accept: application/vnd.github.v3+json" \ + https://api.github.com/repos/StarCitizenTools/mediawiki-skins-Citizen/actions/workflows/php-tests.yaml/dispatches \ + -d '{"ref":"main"}' + fi + + # Only patch code when it is a push event + - name: Push the changes + if: github.event_name == 'push' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + if ! git diff --exit-code --quiet; then + git config --global user.name "github-actions" + git config --global user.email "github-actions@users.noreply.github.com" + git remote set-url origin "https://x-access-token:${GITHUB_TOKEN}@github.com/${GITHUB_REPOSITORY}.git" + git add . + git commit -am "ci: 👷 lint code to MediaWiki standards" -m "Check commit and GitHub actions for more details" + git pull --rebase + git push + else + echo "No changes to commit" + fi diff --git a/.github/workflows/ci.yml b/.github/workflows/php-tests.yml similarity index 90% rename from .github/workflows/ci.yml rename to .github/workflows/php-tests.yml index a55c179cf..21e9402fd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/php-tests.yml @@ -1,14 +1,11 @@ -name: PHP unit test +name: PHP tests on: - push: - branches: [ main, develop, feature/* ] - pull_request: - branches: [ "*" ] + workflow_dispatch: jobs: test: - name: "PHPUnit: MW ${{ matrix.mw }}, PHP ${{ matrix.php }}" + name: "PHP tests: MW ${{ matrix.mw }}, PHP ${{ matrix.php }}" continue-on-error: ${{ matrix.experimental }} strategy: diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml index c7ad5239b..7179ce4c5 100644 --- a/.github/workflows/release-please.yml +++ b/.github/workflows/release-please.yml @@ -15,7 +15,4 @@ jobs: steps: - uses: googleapis/release-please-action@v4 with: - # this assumes that you have created a personal access token - # (PAT) and configured it as a GitHub action secret named - # `MY_RELEASE_PLEASE_TOKEN` (this secret name is not important). - token: ${{ secrets.MY_RELEASE_PLEASE_TOKEN }} \ No newline at end of file + token: ${{ secrets.WORKFLOW_TOKEN }} \ No newline at end of file From 6c996b7fff8b6f0913c14e8b4ad9bc5829756a25 Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Sat, 25 May 2024 02:22:53 -0400 Subject: [PATCH 185/254] =?UTF-8?q?chore(workflow):=20=F0=9F=94=A7=20check?= =?UTF-8?q?=20if=20condition=20earlier?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/lint.yml | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index a4aaf0b1c..4bc7b5daf 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -103,13 +103,12 @@ jobs: npm run lint:i18n - name: Trigger PHP tests + if: steps.changed-php.outputs.any_changed == 'true' run: | - if [ steps.changed-php.outputs.any_changed == 'true' ]; then - curl -X POST -H "Authorization: token ${{ secrets.WORKFLOW_TOKEN }}" \ - -H "Accept: application/vnd.github.v3+json" \ - https://api.github.com/repos/StarCitizenTools/mediawiki-skins-Citizen/actions/workflows/php-tests.yaml/dispatches \ - -d '{"ref":"main"}' - fi + curl -X POST -H "Authorization: token ${{ secrets.WORKFLOW_TOKEN }}" \ + -H "Accept: application/vnd.github.v3+json" \ + https://api.github.com/repos/StarCitizenTools/mediawiki-skins-Citizen/actions/workflows/php-tests.yaml/dispatches \ + -d '{"ref":"main"}' # Only patch code when it is a push event - name: Push the changes From 139c2c4070e1fe744e61e6e7d890e8bb35fc50bd Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Sat, 25 May 2024 02:29:29 -0400 Subject: [PATCH 186/254] build: release 2.14.1 (#852) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * build: release 2.14.1 * ci: 👷 lint code to MediaWiki standards Check commit and GitHub actions for more details --------- Co-authored-by: github-actions --- .release-please-manifest.json | 2 +- CHANGELOG.md | 10 ++++++++++ package-lock.json | 4 ++-- package.json | 2 +- skin.json | 2 +- 5 files changed, 15 insertions(+), 5 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 851649e84..b286ef0a0 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "2.14.0" + ".": "2.14.1" } \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index f9ca573e6..c34df32a6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,16 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +## [2.14.1](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/compare/v2.14.0...v2.14.1) (2024-05-25) + + +### Miscellaneous Chores + +* **release-please:** 🔧 add manifest and config files ([cc4e7b1](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/cc4e7b1d85a41a81fe49e9dda53a747584449165)) +* **release-please:** 🔧 fix config file name ([0ed940c](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/0ed940c7e41f6d3fbcc09cc72331a9b5955e50d9)) +* **workflow:** 🔧 check if condition earlier ([6c996b7](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/6c996b7fff8b6f0913c14e8b4ad9bc5829756a25)) +* **workflow:** 🔧 only trigger PHP tests when PHP files are changed ([d6e996b](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/d6e996b09fef4c1e8aae61d1b6b08567690b5cbe)) + ## [2.14.0](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/compare/v2.13.5...v2.14.0) (2024-05-25) diff --git a/package-lock.json b/package-lock.json index b2e46ed12..bb6d40b07 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "Citizen", - "version": "2.13.5", + "version": "2.14.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "Citizen", - "version": "2.13.5", + "version": "2.14.1", "devDependencies": { "@commitlint/cli": "^19.3.0", "@commitlint/config-conventional": "^19.2.2", diff --git a/package.json b/package.json index 5efa78591..7cbde81a8 100644 --- a/package.json +++ b/package.json @@ -24,5 +24,5 @@ "stylelint-config-wikimedia": "0.16.1", "stylelint-order": "^6.0.3" }, - "version": "2.13.5" + "version": "2.14.1" } diff --git a/skin.json b/skin.json index eb647a6c4..20e556217 100644 --- a/skin.json +++ b/skin.json @@ -1,6 +1,6 @@ { "name": "Citizen", - "version": "2.13.5", + "version": "2.14.1", "author": [ "[https://www.mediawiki.org/wiki/User:Alistair3149 Alistair3149]", "[https://www.mediawiki.org/wiki/User:Octfx Octfx]", From 45ee5f897c6f17df8479600319fef5181b72d4b2 Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Sat, 25 May 2024 03:46:31 -0400 Subject: [PATCH 187/254] =?UTF-8?q?feat(TabberNeue):=20=E2=9C=A8=20add=20i?= =?UTF-8?q?nit=20styles?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- skin.json | 1 + .../ext.tabberNeue.init.styles.less | 19 ++++++++++++++++ .../extensions/TabberNeue/ext.tabberNeue.less | 22 ++++++++++--------- 3 files changed, 32 insertions(+), 10 deletions(-) create mode 100644 skinStyles/extensions/TabberNeue/ext.tabberNeue.init.styles.less diff --git a/skin.json b/skin.json index 20e556217..440aa9f8f 100644 --- a/skin.json +++ b/skin.json @@ -502,6 +502,7 @@ "+ext.PortableInfobox.styles": "skinStyles/extensions/PortableInfobox/ext.PortableInfobox.styles.less", "+ext.Tabber": "skinStyles/extensions/Tabber/ext.Tabber.less", "+ext.tabberNeue": "skinStyles/extensions/TabberNeue/ext.tabberNeue.less", + "+ext.tabberNeue.init.styles": "skinStyles/extensions/TabberNeue/ext.tabberNeue.init.styles.less", "+ext.templateDataGenerator.editTemplatePage": "skinStyles/extensions/TemplateData/ext.templateDataGenerator.editTemplatePage.less", "+ext.uploadWizard": "skinStyles/extensions/UploadWizard/ext.uploadWizard.less", "+ext.uploadWizard.page.styles": "skinStyles/extensions/UploadWizard/uploadWizard.noWizard.less", diff --git a/skinStyles/extensions/TabberNeue/ext.tabberNeue.init.styles.less b/skinStyles/extensions/TabberNeue/ext.tabberNeue.init.styles.less new file mode 100644 index 000000000..cf70f2679 --- /dev/null +++ b/skinStyles/extensions/TabberNeue/ext.tabberNeue.init.styles.less @@ -0,0 +1,19 @@ +/* + * Citizen + * + * SkinStyles for Extension:TabberNeue + * Module: ext.tabberNeue.init.styles + * Version: 2.0.0 + * + * Date: 2024-05-25 +*/ + +.client-js { + .tabber:not( .tabber--live ) { + .tabber__header { + &::after { + background: linear-gradient( to right, var( --color-base ) 8%, var( --color-base--subtle ) 18%, var( --color-base ) 33% ); + } + } + } +} diff --git a/skinStyles/extensions/TabberNeue/ext.tabberNeue.less b/skinStyles/extensions/TabberNeue/ext.tabberNeue.less index 90e185401..553bfef0f 100644 --- a/skinStyles/extensions/TabberNeue/ext.tabberNeue.less +++ b/skinStyles/extensions/TabberNeue/ext.tabberNeue.less @@ -23,6 +23,18 @@ } } + &__panel { + &--loading { + .tabber__transclusion { + a, + &::before, + &::after { + background: linear-gradient( to right, var( --color-base ) 8%, var( --color-base--subtle ) 18%, var( --color-base ) 33% ); + } + } + } + } + &__indicator { background: var( --color-primary ); } @@ -37,16 +49,6 @@ } } } - - &__transclusion { - &--loading { - .tabber__loading-indicator, - &::before, - &::after { - background-color: var( --color-primary ); - } - } - } } @media ( hover: hover ) { From ae6d207fb4d42601e78a51c8d721e00a0c2ba046 Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Sat, 25 May 2024 06:57:02 -0400 Subject: [PATCH 188/254] =?UTF-8?q?fix(core):=20=F0=9F=90=9B=20escape=20do?= =?UTF-8?q?uble=20quotes=20for=20toc=20selector?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .release-please-manifest.json | 4 +- release-please-config.json | 24 +++---- .../skins.citizen.scripts/tableOfContents.js | 71 ++++++++++--------- 3 files changed, 53 insertions(+), 46 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index b286ef0a0..24878e4ef 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "2.14.1" -} \ No newline at end of file + ".": "2.14.1" +} diff --git a/release-please-config.json b/release-please-config.json index c6e51d91b..4369a9b3a 100644 --- a/release-please-config.json +++ b/release-please-config.json @@ -1,13 +1,13 @@ { - "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json", - "release-type": "php", - "pull-request-title-pattern": "build: release ${version}", - "extra-files": [ - "skin.json", - "package.json", - "package-lock.json" - ], - "packages": { - ".": {} - } -} \ No newline at end of file + "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json", + "release-type": "php", + "pull-request-title-pattern": "build: release ${version}", + "extra-files": [ + "skin.json", + "package.json", + "package-lock.json" + ], + "packages": { + ".": {} + } +} diff --git a/resources/skins.citizen.scripts/tableOfContents.js b/resources/skins.citizen.scripts/tableOfContents.js index 168629d5e..7182762a5 100644 --- a/resources/skins.citizen.scripts/tableOfContents.js +++ b/resources/skins.citizen.scripts/tableOfContents.js @@ -2,6 +2,30 @@ const ACTIVE_SECTION_CLASS = 'citizen-toc__listItem--active'; let /** @type {HTMLElement | undefined} */ activeSection; +/** + * Escapes double quotes in the given HTML attribute ID. + * + * @param {string} id - The HTML attribute ID to escape double quotes from. + * @return {string} The escaped HTML attribute ID with double quotes replaced. + */ +function escapeHtmlAttributeQuotes( id ) { + // Escapes double quotes in the given id + return id.replace( /"/g, '\\"' ); +} + +/** + * Finds a link element in the table of contents (TOC) based on the provided ID. + * + * @param {Element} toc - The table of contents element to search within. + * @param {string} id - The ID of the section to find the link for. + * @return {Element|null} The link element corresponding to the provided ID, or null if not found. + */ +function findLinkById( toc, id ) { + const sanitizedId = escapeHtmlAttributeQuotes( id ); + const linkElement = toc.querySelector( `a[href="#${ sanitizedId }"]` ); + return linkElement; +} + /** * Changes the active section in the table of contents based on the provided ID. * @@ -10,12 +34,7 @@ let /** @type {HTMLElement | undefined} */ activeSection; * @return {void} */ function changeActiveSection( toc, id ) { - const getLink = ( hash ) => { - const el = toc.querySelector( `a[href="#${ hash }"], a[href="#${ encodeURIComponent( hash ) }"]` ); - return el; - }; - - const link = getLink( id ); + const link = findLinkById( toc, id ); if ( activeSection ) { activeSection.classList.remove( ACTIVE_SECTION_CLASS ); @@ -41,36 +60,25 @@ function init( bodyContent ) { return; } - const getHeadlineElements = () => { - const headlineElements = []; - Array.from( toc.querySelectorAll( '.citizen-toc__listItem' ) ).forEach( ( tocListEl ) => { - // Remove 'toc-' prefix from ID - const headlineElement = bodyContent.querySelector( '#' + CSS.escape( tocListEl.id.slice( 4 ) ) ); - if ( headlineElement ) { - headlineElements.push( headlineElement ); - } - } ); - return headlineElements; + const extractIds = () => { + return Array.from( toc.querySelectorAll( '.citizen-toc__listItem' ) ) + .map( ( tocListEl ) => tocListEl.id.slice( 4 ) ); }; - // We use scroll-padding-top to handle scrolling with fixed header - // It is better to respect that so it is consistent - const getTopMargin = () => { - const computedStyle = window.getComputedStyle( document.documentElement ); - return Number( - computedStyle.getPropertyValue( 'scroll-padding-top' ) - .slice( 0, -2 ) - ) + 20; + const queryElements = ( ids ) => { + return ids.map( ( id ) => bodyContent.querySelector( '#' + CSS.escape( id ) ) ) + .filter( ( element ) => element !== null && element !== undefined ); }; - const headlines = getHeadlineElements(); + const headlines = queryElements( extractIds() ); - // Do not continue if there are no headlines - // TODO: Need to revamp the selector so that it works better with MW 1.40, - // currently MW 1.40 has ToC on non-content pages as well - if ( !headlines ) { - return; - } + const computedStyle = window.getComputedStyle( document.documentElement ); + const scrollPaddingTop = computedStyle.getPropertyValue( 'scroll-padding-top' ); + const topMargin = Number( scrollPaddingTop.slice( 0, -2 ) ) + 20; + + const getTopMargin = () => { + return topMargin; + }; const initSectionObserver = require( './sectionObserver.js' ).init; @@ -84,7 +92,6 @@ function init( bodyContent ) { } } ); - // TODO: Pause section observer on ToC link click sectionObserver.resume(); } From 27bca0fc6624908f0294f14347238967147b1fee Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Sat, 25 May 2024 19:26:38 -0400 Subject: [PATCH 189/254] =?UTF-8?q?feat:=20=E2=9C=A8=20improve=20scrolling?= =?UTF-8?q?=20performance?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../skins.citizen.scripts/scrollObserver.js | 7 +- resources/skins.citizen.scripts/skin.js | 64 ++++++++++--------- 2 files changed, 37 insertions(+), 34 deletions(-) diff --git a/resources/skins.citizen.scripts/scrollObserver.js b/resources/skins.citizen.scripts/scrollObserver.js index 28f5761f6..7bd0b43c3 100644 --- a/resources/skins.citizen.scripts/scrollObserver.js +++ b/resources/skins.citizen.scripts/scrollObserver.js @@ -1,5 +1,5 @@ /** - * Create an observer based vertical scroll direction + * Create an observer based vertical scroll direction with debouncing * * @param {Function} onScrollDown functionality for when viewport is scrolled down * @param {Function} onScrollUp functionality for when viewport is scrolled up @@ -7,8 +7,6 @@ * @return {void} */ function initDirectionObserver( onScrollDown, onScrollUp, threshold ) { - const throttle = require( 'mediawiki.util' ).throttle; - let lastScrollTop = window.scrollY; const onScroll = () => { @@ -26,7 +24,8 @@ function initDirectionObserver( onScrollDown, onScrollUp, threshold ) { lastScrollTop = scrollTop; }; - window.addEventListener( 'scroll', throttle( onScroll, 250 ) ); + const debouncedOnScroll = mw.util.debounce( onScroll, 100 ); + window.addEventListener( 'scroll', mw.util.throttle( debouncedOnScroll, 250 ) ); } /** diff --git a/resources/skins.citizen.scripts/skin.js b/resources/skins.citizen.scripts/skin.js index 857a75100..9f879de28 100644 --- a/resources/skins.citizen.scripts/skin.js +++ b/resources/skins.citizen.scripts/skin.js @@ -1,3 +1,8 @@ +const SCROLL_DOWN_CLASS = 'citizen-scroll--down'; +const SCROLL_UP_CLASS = 'citizen-scroll--up'; +const STICKY_SENTINEL_ID = 'citizen-page-header-sticky-sentinel'; +const STICKY_CLASS = 'citizen-page-header--sticky'; + /** * Wait for first paint before calling this function. * (see T234570#5779890, T246419). @@ -10,40 +15,39 @@ function enableCssAnimations( document ) { } /** - * Add a class to indicate that sticky header is active + * Initializes the sticky header functionality by setting up scroll observers and intersection observers. * - * @param {Document} document - * @return {void} + * @param {Document} document - The document object representing the webpage. */ function initStickyHeader( document ) { - const scrollObserver = require( './scrollObserver.js' ); - - // Detect scroll direction and add the right class - scrollObserver.initDirectionObserver( - () => { - document.body.classList.remove( 'citizen-scroll--up' ); - document.body.classList.add( 'citizen-scroll--down' ); - }, - () => { - document.body.classList.remove( 'citizen-scroll--down' ); - document.body.classList.add( 'citizen-scroll--up' ); - }, - 10 - ); - - const sentinel = document.getElementById( 'citizen-page-header-sticky-sentinel' ); - - // In some pages we use display:none to disable the sticky header - // Do not start observer if it is set to display:none + const { initDirectionObserver, initIntersectionObserver } = require( './scrollObserver.js' ); + + const toggleScrollClass = ( removeClass, addClass ) => { + return () => { + window.requestAnimationFrame( () => { + document.body.classList.remove( removeClass ); + document.body.classList.add( addClass ); + } ); + }; + }; + + const addScrollDownClass = toggleScrollClass( SCROLL_UP_CLASS, SCROLL_DOWN_CLASS ); + const addScrollUpClass = toggleScrollClass( SCROLL_DOWN_CLASS, SCROLL_UP_CLASS ); + + const toggleStickyClass = () => { + return ( state ) => { + window.requestAnimationFrame( () => { + document.body.classList.toggle( STICKY_CLASS, state ); + } ); + }; + }; + + initDirectionObserver( addScrollDownClass, addScrollUpClass, 10 ); + + const sentinel = document.getElementById( STICKY_SENTINEL_ID ); + if ( sentinel && getComputedStyle( sentinel ).getPropertyValue( 'display' ) !== 'none' ) { - const observer = scrollObserver.initIntersectionObserver( - () => { - document.body.classList.add( 'citizen-page-header--sticky' ); - }, - () => { - document.body.classList.remove( 'citizen-page-header--sticky' ); - } - ); + const observer = initIntersectionObserver( toggleStickyClass( true ), toggleStickyClass( false ) ); observer.observe( sentinel ); } } From af3d72ad7501f5329b18bf90f6e4aaa8cd58085e Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Sat, 25 May 2024 19:53:17 -0400 Subject: [PATCH 190/254] =?UTF-8?q?fix(core):=20=F0=9F=90=9B=20incorrect?= =?UTF-8?q?=20sticky=20header=20class=20assignment?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/skins.citizen.scripts/skin.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/resources/skins.citizen.scripts/skin.js b/resources/skins.citizen.scripts/skin.js index 9f879de28..bc3eae74c 100644 --- a/resources/skins.citizen.scripts/skin.js +++ b/resources/skins.citizen.scripts/skin.js @@ -34,8 +34,8 @@ function initStickyHeader( document ) { const addScrollDownClass = toggleScrollClass( SCROLL_UP_CLASS, SCROLL_DOWN_CLASS ); const addScrollUpClass = toggleScrollClass( SCROLL_DOWN_CLASS, SCROLL_UP_CLASS ); - const toggleStickyClass = () => { - return ( state ) => { + const toggleStickyClass = ( state ) => { + return () => { window.requestAnimationFrame( () => { document.body.classList.toggle( STICKY_CLASS, state ); } ); @@ -45,8 +45,9 @@ function initStickyHeader( document ) { initDirectionObserver( addScrollDownClass, addScrollUpClass, 10 ); const sentinel = document.getElementById( STICKY_SENTINEL_ID ); + const shouldStickyHeader = sentinel && getComputedStyle( sentinel ).getPropertyValue( 'display' ) !== 'none'; - if ( sentinel && getComputedStyle( sentinel ).getPropertyValue( 'display' ) !== 'none' ) { + if ( shouldStickyHeader ) { const observer = initIntersectionObserver( toggleStickyClass( true ), toggleStickyClass( false ) ); observer.observe( sentinel ); } From e9289b149a70783ed2f6596bd7d2d7563f0cf0d9 Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Sat, 25 May 2024 23:18:18 -0400 Subject: [PATCH 191/254] =?UTF-8?q?perf(core):=20=E2=9A=A1=EF=B8=8F=20furt?= =?UTF-8?q?her=20improvements=20to=20scroll=20and=20section=20observers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../skins.citizen.scripts/scrollObserver.js | 25 ++++++++++--------- .../skins.citizen.scripts/sectionObserver.js | 22 +++------------- 2 files changed, 17 insertions(+), 30 deletions(-) diff --git a/resources/skins.citizen.scripts/scrollObserver.js b/resources/skins.citizen.scripts/scrollObserver.js index 7bd0b43c3..e1a1bbe10 100644 --- a/resources/skins.citizen.scripts/scrollObserver.js +++ b/resources/skins.citizen.scripts/scrollObserver.js @@ -1,21 +1,22 @@ /** - * Create an observer based vertical scroll direction with debouncing + * Initialize a direction observer based on scroll behavior. * - * @param {Function} onScrollDown functionality for when viewport is scrolled down - * @param {Function} onScrollUp functionality for when viewport is scrolled up - * @param {number} threshold minimum scrolled px to trigger the function - * @return {void} + * @param {Function} onScrollDown - Function to be called when scrolling down. + * @param {Function} onScrollUp - Function to be called when scrolling up. + * @param {number} threshold - The threshold for significant scroll position change. */ function initDirectionObserver( onScrollDown, onScrollUp, threshold ) { let lastScrollTop = window.scrollY; const onScroll = () => { + // Check if the scroll position has changed significantly const scrollTop = window.scrollY; if ( Math.abs( scrollTop - lastScrollTop ) < threshold ) { return; } + // Determine scroll direction and trigger appropriate functions if ( scrollTop > lastScrollTop ) { onScrollDown(); } else { @@ -24,8 +25,8 @@ function initDirectionObserver( onScrollDown, onScrollUp, threshold ) { lastScrollTop = scrollTop; }; - const debouncedOnScroll = mw.util.debounce( onScroll, 100 ); - window.addEventListener( 'scroll', mw.util.throttle( debouncedOnScroll, 250 ) ); + const debouncedOnScroll = mw.util.debounce( mw.util.throttle( onScroll, 250 ), 100 ); + window.addEventListener( 'scroll', debouncedOnScroll ); } /** @@ -38,13 +39,13 @@ function initDirectionObserver( onScrollDown, onScrollUp, threshold ) { */ function initIntersectionObserver( onHidden, onVisible ) { /* eslint-disable-next-line compat/compat */ - return new IntersectionObserver( ( entries ) => { - if ( !entries[ 0 ].isIntersecting && entries[ 0 ].boundingClientRect.top < 0 ) { + return new IntersectionObserver( ( [ entry ] ) => { + if ( entry.isIntersecting ) { + // Viewport is within the target element. + onVisible(); + } else if ( entry.boundingClientRect.top < 0 ) { // Viewport has crossed the bottom edge of the target element. onHidden(); - } else { - // Viewport is above the bottom edge of the target element. - onVisible(); } } ); } diff --git a/resources/skins.citizen.scripts/sectionObserver.js b/resources/skins.citizen.scripts/sectionObserver.js index 96625af9a..425db4cef 100644 --- a/resources/skins.citizen.scripts/sectionObserver.js +++ b/resources/skins.citizen.scripts/sectionObserver.js @@ -1,9 +1,3 @@ -/** - * Based on Vector - * NOTE: It is kept as an ES6 module because we are dropping ES5 soon. - * But some parts are in ES5 because ResourceLoader is messing up ES6 in 1.35 - */ - /** @module SectionObserver */ /** @@ -33,9 +27,6 @@ * `props.onIntersection` callback will be fired with the corresponding section * as a param. * - * Because sectionObserver uses a scroll event listener (in combination with - * IntersectionObserver), the changes are throttled to a default maximum rate of - * 200ms so that the main thread is not excessively blocked. * IntersectionObserver is used to asynchronously calculate the positions of the * observed tags off the main thread and in a manner that does not cause * expensive forced synchronous layouts. @@ -45,11 +36,7 @@ */ function sectionObserver( props ) { - props = Object.assign( { - topMargin: 0, - throttleMs: 200, - onIntersection: () => {} - }, props ); + const { topMargin = 0, onIntersection = () => {} } = props; let /** @type {boolean} */ inThrottle = false; let /** @type {HTMLElement | undefined} */ current; @@ -57,7 +44,6 @@ function sectionObserver( props ) { const observer = new IntersectionObserver( ( entries ) => { let /** @type {IntersectionObserverEntry | undefined} */ closestNegativeEntry; let /** @type {IntersectionObserverEntry | undefined} */ closestPositiveEntry; - const topMargin = /** @type {number} */ ( props.topMargin ); entries.forEach( ( entry ) => { const top = @@ -90,7 +76,7 @@ function sectionObserver( props ) { // If the intersection is new, fire the `onIntersection` callback. if ( current !== closestTag ) { - props.onIntersection( closestTag ); + onIntersection( closestTag ); } current = closestTag; @@ -119,10 +105,10 @@ function sectionObserver( props ) { if ( !inThrottle ) { inThrottle = true; - setTimeout( () => { + requestAnimationFrame( () => { calcIntersection(); inThrottle = false; - }, props.throttleMs ); + } ); } } From 8ba6b55770d17bfd5ce6cf1bea50454538df4050 Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Sat, 25 May 2024 23:51:50 -0400 Subject: [PATCH 192/254] =?UTF-8?q?refactor(core):=20=E2=99=BB=EF=B8=8F=20?= =?UTF-8?q?clean=20up=20section=20functions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- includes/Partials/BodyContent.php | 2 +- resources/skins.citizen.scripts/sections.js | 50 ++++++++++++--------- 2 files changed, 30 insertions(+), 22 deletions(-) diff --git a/includes/Partials/BodyContent.php b/includes/Partials/BodyContent.php index eb85db132..e172e60ce 100644 --- a/includes/Partials/BodyContent.php +++ b/includes/Partials/BodyContent.php @@ -204,7 +204,7 @@ private function prepareHeading( DOMDocument $doc, DOMElement $heading ) { private function createSectionBodyElement( DOMDocument $doc, $sectionNumber ) { $sectionBody = $doc->createElement( 'section' ); $sectionBody->setAttribute( 'class', self::SECTION_CLASS ); - $sectionBody->setAttribute( 'id', 'citizen-section-collapsible-' . $sectionNumber ); + $sectionBody->setAttribute( 'id', 'citizen-section-' . $sectionNumber ); return $sectionBody; } diff --git a/resources/skins.citizen.scripts/sections.js b/resources/skins.citizen.scripts/sections.js index 009d6c2a7..41733dd60 100644 --- a/resources/skins.citizen.scripts/sections.js +++ b/resources/skins.citizen.scripts/sections.js @@ -12,31 +12,34 @@ function init( bodyContent ) { const headings = bodyContent.querySelectorAll( '.citizen-section-heading' ); const sections = bodyContent.querySelectorAll( '.citizen-section' ); - const setHeadlineAttributes = ( heading, collapsibleID, i ) => { - const headline = heading.querySelector( '.mw-headline' ) || - heading.querySelector( '.mw-heading' ); + const setHeadlineAttributes = ( heading, collapsibleID, sectionIndex ) => { + const headline = heading.querySelector( '.mw-headline, .mw-heading' ); if ( !headline ) { return; } - headline.setAttribute( 'tabindex', 0 ); + headline.setAttribute( 'tabindex', '0' ); headline.setAttribute( 'role', 'button' ); headline.setAttribute( 'aria-controls', collapsibleID ); - headline.setAttribute( 'aria-expanded', true ); - headline.setAttribute( 'data-mw-citizen-section-heading-index', i ); + headline.setAttribute( 'aria-expanded', 'true' ); + headline.setAttribute( 'data-mw-citizen-section-heading-index', sectionIndex ); }; - const toggleClasses = ( i ) => { - if ( sections[ i + 1 ] ) { - headings[ i ].classList.toggle( 'citizen-section-heading--collapsed' ); - sections[ i + 1 ].classList.toggle( 'citizen-section--collapsed' ); + const setSectionAttributes = ( section ) => { + section.setAttribute( 'aria-hidden', 'false' ); + }; + + const toggleClasses = ( heading, section ) => { + if ( section ) { + heading.classList.toggle( 'citizen-section-heading--collapsed' ); + section.classList.toggle( 'citizen-section--collapsed' ); } }; - const toggleAriaExpanded = ( el ) => { - const isExpanded = el.getAttribute( 'aria-expanded' ) === 'true'; - el.setAttribute( 'aria-expanded', isExpanded ? 'false' : 'true' ); + const toggleAriaAttribute = ( el, attribute ) => { + const isAttributeSet = el.getAttribute( attribute ) === 'true'; + el.setAttribute( attribute, isAttributeSet ? 'false' : 'true' ); }; const onEditSectionClick = ( e ) => { @@ -52,16 +55,17 @@ function init( bodyContent ) { return; } - const heading = target.closest( '.citizen-section-heading' ); + const selectedHeading = target.closest( '.citizen-section-heading' ); - if ( heading ) { - const headline = heading.querySelector( '.mw-headline' ) || - heading.querySelector( '.mw-heading' ); + if ( selectedHeading ) { + const selectedHeadline = selectedHeading.querySelector( '.mw-headline, .mw-heading' ); - if ( headline ) { - const i = +headline.getAttribute( 'data-mw-citizen-section-heading-index' ); - toggleClasses( i ); - toggleAriaExpanded( headline ); + if ( selectedHeadline ) { + const sectionIndex = +selectedHeadline.dataset.mwCitizenSectionHeadingIndex; + const selectedSection = sections[ sectionIndex + 1 ]; + toggleClasses( selectedHeading, selectedSection ); + toggleAriaAttribute( selectedHeadline, 'aria-expanded' ); + toggleAriaAttribute( selectedSection, 'aria-hidden' ); } } }; @@ -71,6 +75,10 @@ function init( bodyContent ) { setHeadlineAttributes( headings[ i ], `citizen-section-${ i + 1 }`, i ); } + sections.forEach( ( section ) => { + setSectionAttributes( section ); + } ); + bodyContent.addEventListener( 'click', handleClick, false ); } From d34fb7b6f9cf25b03b0e7c96ee0e9c085e71d632 Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Sun, 26 May 2024 00:37:54 -0400 Subject: [PATCH 193/254] =?UTF-8?q?refactor(core):=20=E2=99=BB=EF=B8=8F=20?= =?UTF-8?q?clean=20up=20responsive=20table=20code?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/skins.citizen.scripts/tables.js | 40 ++++++++++++++--------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/resources/skins.citizen.scripts/tables.js b/resources/skins.citizen.scripts/tables.js index 6374b3a6d..d2ac8f91c 100644 --- a/resources/skins.citizen.scripts/tables.js +++ b/resources/skins.citizen.scripts/tables.js @@ -8,19 +8,25 @@ const config = require( './config.json' ); * @return {void} */ function setupOverflowState( element ) { - if ( !element.parentNode ) { - mw.log.error( '[Citizen] Parent node is null or undefined. Cannot proceed with setupOverflowState.' ); + if ( !element.parentElement ) { + mw.log.error( '[Citizen] Parent element is null or undefined. Cannot proceed with setupOverflowState.' ); return; } - const parentNode = element.parentNode; - let cachedContainerWidth; - let cachedContentWidth; - let cachedScrollPosition; - - const updateOverflowClasses = ( isLeft, isRight ) => { - parentNode.classList.toggle( 'citizen-overflow--left', isLeft ); - parentNode.classList.toggle( 'citizen-overflow--right', isRight ); + const parentNode = element.parentElement; + let cachedContainerWidth = 0; + let cachedContentWidth = 0; + let cachedScrollPosition = 0; + + const toggleClasses = ( classes ) => { + classes.forEach( ( [ condition, className ] ) => { + const hasClass = parentNode.classList.contains( className ); + if ( condition && !hasClass ) { + parentNode.classList.add( className ); + } else if ( !condition && hasClass ) { + parentNode.classList.remove( className ); + } + } ); }; const updateState = () => { @@ -28,7 +34,8 @@ function setupOverflowState( element ) { const contentWidth = element.scrollWidth; const currentPosition = Math.round( parentNode.scrollLeft ); - if ( isNaN( containerWidth ) || isNaN( contentWidth ) ) { + const areWidthsInvalid = Number.isNaN( containerWidth ) || Number.isNaN( contentWidth ); + if ( areWidthsInvalid ) { mw.log.error( '[Citizen] Invalid width values. Cannot calculate overflow state.' ); return; } @@ -45,9 +52,11 @@ function setupOverflowState( element ) { cachedContentWidth = contentWidth; cachedScrollPosition = currentPosition; - const isAtStart = currentPosition <= 0; - const isAtEnd = currentPosition + containerWidth >= contentWidth; - updateOverflowClasses( !isAtStart, !isAtEnd ); + const updateClasses = [ + [ currentPosition > 0, 'citizen-overflow--left' ], + [ currentPosition + containerWidth < contentWidth, 'citizen-overflow--right' ] + ]; + toggleClasses( updateClasses ); }; updateState(); @@ -62,7 +71,6 @@ function setupOverflowState( element ) { const overflowResizeObserver = new ResizeObserver( debouncedUpdateState ); overflowResizeObserver.observe( element ); } else { - // Fallback mechanism or error handling for environments without ResizeObserver support mw.log.warn( '[Citizen] ResizeObserver is not supported in this environment.' ); } } @@ -134,7 +142,7 @@ function init( bodyContent ) { const tables = bodyContent.querySelectorAll( 'table:not( table table )' ); if ( tables.length > 0 ) { - Array.from( tables ).forEach( ( table ) => { + tables.forEach( ( table ) => { wrapTable( table ); } ); } From be01d5bb6c920108a9cdcb186d6dc2ddfb0aa0b2 Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Sun, 26 May 2024 22:32:26 -0400 Subject: [PATCH 194/254] =?UTF-8?q?feat(TabberNeue):=20=E2=9C=A8=20update?= =?UTF-8?q?=20Tabber=20styles?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- .../extensions/TabberNeue/ext.tabberNeue.less | 55 ++++--------------- 2 files changed, 12 insertions(+), 45 deletions(-) diff --git a/README.md b/README.md index 812ee9e3f..9362bc1bb 100644 --- a/README.md +++ b/README.md @@ -78,7 +78,7 @@ Name | Grade | Version | Last updated [SyntaxHighlight](https://www.mediawiki.org/wiki/Extension:SyntaxHighlight) | A | REL1_35 `05598b3` | 2023-05-22 [Tabs](https://www.mediawiki.org/wiki/Extension:Tabs) | A | REL1_39 `63ccef2` | 2023-07-11 [Tabber](https://www.mediawiki.org/wiki/Extension:Tabber) | A | N/A | N/A -[TabberNeue](https://www.mediawiki.org/wiki/Extension:TabberNeue) | A | 2.0.0 | 2024-05-25 +[TabberNeue](https://www.mediawiki.org/wiki/Extension:TabberNeue) | A | 2.1.1 | 2024-05-26 [TemplateData](https://www.mediawiki.org/wiki/Extension:TemplateData) | A | REL1_39 `e2c12b5` | 2023-05-01 [TimedMediaHandler](https://www.mediawiki.org/wiki/Extension:TimedMediaHandler) | B | N/A | N/A [Translate](https://www.mediawiki.org/wiki/Extension:Translate) | A | MLEB 2023.01 | 2023-02-17 diff --git a/skinStyles/extensions/TabberNeue/ext.tabberNeue.less b/skinStyles/extensions/TabberNeue/ext.tabberNeue.less index 553bfef0f..3d0f1457e 100644 --- a/skinStyles/extensions/TabberNeue/ext.tabberNeue.less +++ b/skinStyles/extensions/TabberNeue/ext.tabberNeue.less @@ -3,45 +3,26 @@ * * SkinStyles for Extension:TabberNeue * Module: ext.tabberNeue - * Version: 2.0.0 + * Version: 2.1.1 * - * Date: 2024-05-25 + * Date: 2024-05-26 */ .tabber { + --tabber-color-progressive: var( --color-primary ); + --tabber-color-progressive--hover: var( --color-primary--hover ); + --tabber-color-progressive--active: var( --color-primary--active ); + --tabber-color-base: var( --color-base ); + --tabber-color-subtle: var( --color-base--subtle ); + --tabber-background-color-button-quiet--hover: var( --background-color-quiet--hover ); + --tabber-background-color-button-quiet--active: var( --background-color-quiet--active ); + --tabber-border-color-base: var( --border-color-base ); + &__tab { font-weight: var( --font-weight-medium ); - color: var( --color-base ); - - &:visited { - color: var( --color-base ); - } - - &[ aria-selected='true' ], - &[ aria-selected='true' ]:visited { - color: var( --color-primary ); - } - } - - &__panel { - &--loading { - .tabber__transclusion { - a, - &::before, - &::after { - background: linear-gradient( to right, var( --color-base ) 8%, var( --color-base--subtle ) 18%, var( --color-base ) 33% ); - } - } - } - } - - &__indicator { - background: var( --color-primary ); } &__header { - box-shadow: inset 0 -1px 0 0 var( --border-color-interactive ); - &__prev, &__next { &::after { @@ -53,30 +34,16 @@ @media ( hover: hover ) { .tabber { - &__tab { - &:hover { - color: var( --color-primary--hover ); - } - - &:active { - color: var( --color-primary--active ); - } - } - &__header { &__prev, &__next { &:hover { - background-color: var( --background-color-quiet--hover ); - &::after { opacity: var( --opacity-icon-base--hover ); } } &:active { - background-color: var( --background-color-quiet--active ); - &::after { opacity: var( --opacity-icon-base--active ); } From 58087a4db6ea3aeca316068a18d890f1c4406896 Mon Sep 17 00:00:00 2001 From: "translatewiki.net" Date: Mon, 27 May 2024 14:12:46 +0200 Subject: [PATCH 195/254] Localisation updates from https://translatewiki.net. --- i18n/zh-hans.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/i18n/zh-hans.json b/i18n/zh-hans.json index 62be6cb96..ffa6369c3 100644 --- a/i18n/zh-hans.json +++ b/i18n/zh-hans.json @@ -42,8 +42,8 @@ "citizen-search-mediasearch": "搜索媒体文件", "citizen-search-editpage": "编辑或创建页面", "citizen-search-empty-desc": "请输入要搜索的内容", - "citizen-search-noresults-title": "啊哦!“$1”没有搜索结果", - "citizen-search-noresults-desc": "还可以试试上方选项", + "citizen-search-noresults-title": "不妙!没有“$1”的搜索结果", + "citizen-search-noresults-desc": "还可以尝试上面的选项", "citizen-tagline-ns-talk": "{{SUBJECTPAGENAME}}的讨论页面", "citizen-tagline-ns-project": "有关{{SITENAME}}的信息", "citizen-tagline-ns-file": "{{SITENAME}}上的文件", @@ -68,7 +68,7 @@ "citizen-feature-custom-width-name": "宽度", "citizen-feature-custom-width-standard-label": "标准", "citizen-feature-custom-width-wide-label": "宽", - "citizen-feature-custom-width-full-label": "全屏", + "citizen-feature-custom-width-full-label": "全宽", "citizen-user-info-text-anon": "如果您进行任何编辑,您的IP地址会公开展示。", "citizen-user-info-text-temp": "此临时账号是因您在此浏览器及设备上进行了无账号编辑而创建。" } From 7a4d43392d60a816be5b441cac74655c0dae0775 Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Mon, 27 May 2024 15:46:49 -0400 Subject: [PATCH 196/254] =?UTF-8?q?perf(core):=20=E2=9A=A1=EF=B8=8F=20remo?= =?UTF-8?q?ve=20scroll=20eventListener=20and=20resizeObserver=20on=20table?= =?UTF-8?q?s=20when=20not=20needed?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Also started to refactor the table script to be more generic for overflow elements. --- .../skins.citizen.scripts/overflowElements.js | 241 ++++++++++++++++++ resources/skins.citizen.scripts/skin.js | 6 +- resources/skins.citizen.scripts/tables.js | 153 ----------- skin.json | 4 +- 4 files changed, 246 insertions(+), 158 deletions(-) create mode 100644 resources/skins.citizen.scripts/overflowElements.js delete mode 100644 resources/skins.citizen.scripts/tables.js diff --git a/resources/skins.citizen.scripts/overflowElements.js b/resources/skins.citizen.scripts/overflowElements.js new file mode 100644 index 000000000..f4392cbec --- /dev/null +++ b/resources/skins.citizen.scripts/overflowElements.js @@ -0,0 +1,241 @@ +const config = require( './config.json' ); + +/** + * Class representing an OverflowElement. + * + * @class + */ +class OverflowElement { + constructor( element ) { + this.element = element; + this.elementWidth = 0; + this.wrapperScrollLeft = 0; + this.wrapperWidth = 0; + this.onScroll = this.onScroll.bind( this ); + this.updateState = this.updateState.bind( this ); + } + + /** + * Toggles classes on the wrapper element based on the provided conditions. + * + * @param {Array} classes - An array of conditions and class names to toggle. + * Each element in the array should be a tuple where the first element is a boolean condition + * and the second element is the class name to toggle. + * + * @return {void} + */ + toggleClasses( classes ) { + classes.forEach( ( [ condition, className ] ) => { + const hasClass = this.wrapper.classList.contains( className ); + if ( condition && !hasClass ) { + this.wrapper.classList.add( className ); + } else if ( !condition && hasClass ) { + this.wrapper.classList.remove( className ); + } + } ); + } + + /** + * Updates the state of the overflow element by calculating the element width, wrapper scroll left, and wrapper width. + * If the width values are invalid, logs an error and returns. + * Compares the current state with the previous state and updates the cache if there is a change. + * Toggles classes on the wrapper element based on the overflow state (left or right). + * + * @return {void} + */ + updateState() { + const elementWidth = this.element.scrollWidth; + const wrapperScrollLeft = Math.round( this.wrapper.scrollLeft ); + const wrapperWidth = this.wrapper.offsetWidth; + + const areWidthsInvalid = Number.isNaN( wrapperWidth ) || Number.isNaN( elementWidth ); + if ( areWidthsInvalid ) { + mw.log.error( '[Citizen] Invalid width values. Cannot calculate overflow state.' ); + return; + } + + // State. State never changes. + if ( + elementWidth === this.elementWidth && + wrapperScrollLeft === this.wrapperScrollLeft && + wrapperWidth === this.wrapperWidth + ) { + return; + } + + // State has changed. Save it to cache. + this.elementWidth = elementWidth; + this.wrapperScrollLeft = wrapperScrollLeft; + this.wrapperWidth = wrapperWidth; + + const updateClasses = [ + [ this.wrapperScrollLeft > 0, 'citizen-overflow--left' ], + [ this.wrapperScrollLeft + this.wrapperWidth < this.elementWidth, 'citizen-overflow--right' ] + ]; + this.toggleClasses( updateClasses ); + } + + /** + * Wraps the element in a div container with the class 'citizen-table-wrapper'. + * Checks if the element or its parent node is null or undefined, logs an error if so. + * Verifies the existence of $wgCitizenTableNowrapClasses in the config and if it is an array, logs an error if not. + * Skips wrapping if the element contains any of the ignored classes specified in $wgCitizenTableNowrapClasses. + * Creates a wrapper div element, adds the class 'citizen-table-wrapper' to it. + * Filters and adds inherited classes ('floatleft', 'floatright') from the element to the wrapper. + * Inserts the wrapper before the element in the DOM and appends the element to the wrapper. + * Sets the wrapper element as a property of the class instance. + * Logs an error if an exception occurs during the wrapping process. + * + * @return {void} + */ + wrap() { + if ( !this.element || !this.element.parentNode ) { + mw.log.error( '[Citizen] Element or element.parentNode is null or undefined. Please check if the element or element.parentNode is null or undefined.' ); + return; + } + try { + if ( + !config.wgCitizenTableNowrapClasses || + !Array.isArray( config.wgCitizenTableNowrapClasses ) + ) { + mw.log.error( '[Citizen] Invalid or missing $wgCitizenTableNowrapClasses. Cannot proceed with wrapping table.' ); + return; + } + + const parentNode = this.element.parentNode; + + const ignoredClasses = config.wgCitizenTableNowrapClasses; + + if ( ignoredClasses.some( ( cls ) => this.element.classList.contains( cls ) ) ) { + return; + } + + const wrapper = document.createElement( 'div' ); + wrapper.className = 'citizen-table-wrapper'; + + const inheritedClasses = [ + 'floatleft', + 'floatright' + ]; + + const filteredClasses = inheritedClasses.filter( ( cls ) => this.element.classList.contains( cls ) ); + + filteredClasses.forEach( ( cls ) => { + if ( !wrapper.classList.contains( cls ) ) { + wrapper.classList.add( cls ); + } + if ( this.element.classList.contains( cls ) ) { + this.element.classList.remove( cls ); + } + } ); + + parentNode.insertBefore( wrapper, this.element ); + wrapper.appendChild( this.element ); + this.wrapper = wrapper; + } catch ( error ) { + mw.log.error( `[Citizen] Error occurred while wrapping element: ${ error.message }` ); + } + } + + /** + * Handles the scroll event by requesting an animation frame to update the state of the overflow element. + * + * @return {void} + */ + onScroll() { + window.requestAnimationFrame( this.updateState ); + } + + /** + * Resumes the functionality of the overflow element by updating its state, adding a scroll event listener, and observing element resize. + * Calls the 'updateState' method to update the state of the overflow element. + * Adds a scroll event listener to the wrapper element to handle scroll events by calling the 'onScroll' method. + * Observes the element for resize changes using the 'resizeObserver'. + * + * @return {void} + */ + resume() { + this.updateState(); + this.wrapper.addEventListener( 'scroll', this.onScroll ); + this.resizeObserver.observe( this.element ); + } + + /** + * Pauses the functionality of the overflow element by removing the scroll event listener and stopping observation of element resize. + * Removes the scroll event listener from the wrapper element that triggers the 'onScroll' method. + * Stops observing resize changes of the element using the 'resizeObserver'. + * + * @return {void} + */ + pause() { + this.wrapper.removeEventListener( 'scroll', this.onScroll ); + this.resizeObserver.unobserve( this.element ); + } + + /** + * Sets up an IntersectionObserver to handle intersection changes for the overflow element. + * When the element intersects with the viewport, resumes the functionality by calling the 'resume' method. + * When the element is not intersecting with the viewport, pauses the functionality by calling the 'pause' method. + * Observes the intersection changes for the element using the IntersectionObserver. + * + * @return {void} + */ + setupIntersectionObserver() { + // eslint-disable-next-line compat/compat + this.intersectionObserver = new IntersectionObserver( ( entries ) => { + entries.forEach( ( entry ) => { + if ( entry.isIntersecting ) { + this.resume(); + } else { + this.pause(); + } + } ); + } ); + this.intersectionObserver.observe( this.element ); + } + + /** + * Sets up a ResizeObserver to monitor changes in the size of the element and triggers the 'updateState' method accordingly. + * + * @return {void} + */ + setupResizeObserver() { + // eslint-disable-next-line compat/compat + this.resizeObserver = new ResizeObserver( this.updateState ); + } + + /** + * Initializes the OverflowElement by wrapping the element, setting up a ResizeObserver to monitor size changes, + * setting up an IntersectionObserver to handle intersection changes, and resuming the functionality of the overflow element. + * + * @return {void} + */ + init() { + this.wrap(); + this.setupResizeObserver(); + this.setupIntersectionObserver(); + this.resume(); + } +} + +/** + * Initializes the process of wrapping overflow elements within the given body content. + * + * @param {HTMLElement} bodyContent - The body content element containing tables to be wrapped. + * @return {void} + */ +function init( bodyContent ) { + const tables = bodyContent.querySelectorAll( 'table:not( table table )' ); + + // Wrap tables + if ( tables.length > 0 ) { + tables.forEach( ( table ) => { + const overflowElement = new OverflowElement( table ); + overflowElement.init(); + } ); + } +} + +module.exports = { + init: init +}; diff --git a/resources/skins.citizen.scripts/skin.js b/resources/skins.citizen.scripts/skin.js index bc3eae74c..2757995b5 100644 --- a/resources/skins.citizen.scripts/skin.js +++ b/resources/skins.citizen.scripts/skin.js @@ -86,13 +86,13 @@ function registerServiceWorker() { function initBodyContent( bodyContent ) { const sections = require( './sections.js' ), - tables = require( './tables.js' ), + overflowElements = require( './overflowElements.js' ), toc = require( './tableOfContents.js' ); // Collapsable sections sections.init( bodyContent ); - // Table enhancements - tables.init( bodyContent ); + // Overflow element enhancements + overflowElements.init( bodyContent ); // Table of contents toc.init( bodyContent ); } diff --git a/resources/skins.citizen.scripts/tables.js b/resources/skins.citizen.scripts/tables.js deleted file mode 100644 index d2ac8f91c..000000000 --- a/resources/skins.citizen.scripts/tables.js +++ /dev/null @@ -1,153 +0,0 @@ -const config = require( './config.json' ); - -/** - * Set up scroll affordance for an overflowed element - * TODO: Move this out of tables when this is used by more stuff - * - * @param {HTMLElement} element - * @return {void} - */ -function setupOverflowState( element ) { - if ( !element.parentElement ) { - mw.log.error( '[Citizen] Parent element is null or undefined. Cannot proceed with setupOverflowState.' ); - return; - } - - const parentNode = element.parentElement; - let cachedContainerWidth = 0; - let cachedContentWidth = 0; - let cachedScrollPosition = 0; - - const toggleClasses = ( classes ) => { - classes.forEach( ( [ condition, className ] ) => { - const hasClass = parentNode.classList.contains( className ); - if ( condition && !hasClass ) { - parentNode.classList.add( className ); - } else if ( !condition && hasClass ) { - parentNode.classList.remove( className ); - } - } ); - }; - - const updateState = () => { - const containerWidth = parentNode.offsetWidth; - const contentWidth = element.scrollWidth; - const currentPosition = Math.round( parentNode.scrollLeft ); - - const areWidthsInvalid = Number.isNaN( containerWidth ) || Number.isNaN( contentWidth ); - if ( areWidthsInvalid ) { - mw.log.error( '[Citizen] Invalid width values. Cannot calculate overflow state.' ); - return; - } - - if ( - containerWidth === cachedContainerWidth && - contentWidth === cachedContentWidth && - currentPosition === cachedScrollPosition - ) { - return; - } - - cachedContainerWidth = containerWidth; - cachedContentWidth = contentWidth; - cachedScrollPosition = currentPosition; - - const updateClasses = [ - [ currentPosition > 0, 'citizen-overflow--left' ], - [ currentPosition + containerWidth < contentWidth, 'citizen-overflow--right' ] - ]; - toggleClasses( updateClasses ); - }; - - updateState(); - - parentNode.addEventListener( 'scroll', () => { - window.requestAnimationFrame( updateState ); - } ); - - const debouncedUpdateState = mw.util.debounce( 250, updateState ); - const isResizeObserverSupported = typeof ResizeObserver === 'function'; - if ( isResizeObserverSupported ) { - const overflowResizeObserver = new ResizeObserver( debouncedUpdateState ); - overflowResizeObserver.observe( element ); - } else { - mw.log.warn( '[Citizen] ResizeObserver is not supported in this environment.' ); - } -} - -/** - * Wraps a given HTML table element in a new div container with specific classes, - * ensuring it does not wrap tables with certain ignored classes. It also manages - * class inheritance from the table to the wrapper and sets up overflow handling. - * - * @param {HTMLTableElement} table - The HTML table element to be wrapped. - * @return {void} - */ -function wrapTable( table ) { - try { - if ( - !config.wgCitizenTableNowrapClasses || - !Array.isArray( config.wgCitizenTableNowrapClasses ) - ) { - mw.log.error( '[Citizen] Invalid or missing $wgCitizenTableNowrapClasses. Cannot proceed with wrapping table.' ); - return; - } - - if ( !table || !table.parentNode ) { - mw.log.error( '[Citizen] Table or table.parentNode is null or undefined.' ); - return; - } - - const ignoredClasses = config.wgCitizenTableNowrapClasses; - - if ( ignoredClasses.some( ( cls ) => table.classList.contains( cls ) ) ) { - return; - } - - const wrapper = document.createElement( 'div' ); - wrapper.className = 'citizen-table-wrapper'; - - const inheritedClasses = [ - 'floatleft', - 'floatright' - ]; - - const filteredClasses = inheritedClasses.filter( ( cls ) => table.classList.contains( cls ) ); - - filteredClasses.forEach( ( cls ) => { - if ( !wrapper.classList.contains( cls ) ) { - wrapper.classList.add( cls ); - } - if ( table.classList.contains( cls ) ) { - table.classList.remove( cls ); - } - } ); - - table.parentNode.insertBefore( wrapper, table ); - wrapper.appendChild( table ); - - setupOverflowState( table ); - } catch ( error ) { - mw.log.error( `[Citizen] Error occurred while wrapping table: ${ error.message }` ); - } -} - -/** - * Initializes the process of wrapping tables within the given body content. - * - * @param {HTMLElement} bodyContent - The body content element containing tables to be wrapped. - * @return {void} - */ -function init( bodyContent ) { - const tables = bodyContent.querySelectorAll( 'table:not( table table )' ); - - if ( tables.length > 0 ) { - tables.forEach( ( table ) => { - wrapTable( table ); - } ); - } -} - -module.exports = { - init: init -}; diff --git a/skin.json b/skin.json index 440aa9f8f..6b706e626 100644 --- a/skin.json +++ b/skin.json @@ -159,12 +159,12 @@ }, "resources/skins.citizen.scripts/checkbox.js", "resources/skins.citizen.scripts/lastModified.js", + "resources/skins.citizen.scripts/overflowElements.js", "resources/skins.citizen.scripts/scrollObserver.js", "resources/skins.citizen.scripts/sectionObserver.js", "resources/skins.citizen.scripts/search.js", "resources/skins.citizen.scripts/sections.js", - "resources/skins.citizen.scripts/tableOfContents.js", - "resources/skins.citizen.scripts/tables.js" + "resources/skins.citizen.scripts/tableOfContents.js" ], "dependencies": [ "mediawiki.util", From c17aeab3fd7ae5afdd3f9e1d591c35696a9f1f4b Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Mon, 27 May 2024 15:54:26 -0400 Subject: [PATCH 197/254] =?UTF-8?q?feat(core):=20=E2=9C=A8=20rename=20wgCi?= =?UTF-8?q?tizenTableNowrapClasses=20to=20wgCitizenOverflowNowrapClasses?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Allow this config to use for more generic elements in the future --- README.md | 2 +- includes/Hooks/ResourceLoaderHooks.php | 4 ++-- resources/skins.citizen.scripts/overflowElements.js | 12 ++++++------ .../integration/Hooks/ResourceLoaderHooksTest.php | 8 ++++---- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 9362bc1bb..6576d19a0 100644 --- a/README.md +++ b/README.md @@ -121,7 +121,7 @@ Name | Description | Values | Default `$wgCitizenEnableARFonts` | Enable included Noto Naskh Arabic for wikis that serve Arabic | `true` - enable; `false` - disable | `false` `$wgCitizenEnableCJKFonts` | Enable included Noto Sans CJK for wikis that serves CJK languages | `true` - enable; `false` - disable | `false` `$wgCitizenEnablePreferences` | Enable the preferences menu | `true` - enable; `false` - disable | `true` -`$wgCitizenTableNowrapClasses` | Defines table css classes ignored by citizen table wrapper | List of css classes. Extend with `$wgCitizenTableNowrapClasses[] = 'my_class';` | `["citizen-table-nowrap", "diff", "mw-changeslist-line", "mw-recentchanges-table", "infobox", "cargoDynamicTable", "dataTable", "srf-datatable", "smw-datatable", "mw-capiunto-infobox" ]` +`$wgCitizenOverflowNowrapClasses` | Defines css classes ignored by the overflow wrapper | List of css classes. Extend with `$wgCitizenOverflowNowrapClasses[] = 'my_class';` | `["citizen-table-nowrap", "diff", "mw-changeslist-line", "mw-recentchanges-table", "infobox", "cargoDynamicTable", "dataTable", "srf-datatable", "smw-datatable", "mw-capiunto-infobox" ]` ### Search suggestions Name | Description | Values | Default diff --git a/includes/Hooks/ResourceLoaderHooks.php b/includes/Hooks/ResourceLoaderHooks.php index 1c9ad6e39..0a70b57c8 100644 --- a/includes/Hooks/ResourceLoaderHooks.php +++ b/includes/Hooks/ResourceLoaderHooks.php @@ -47,8 +47,8 @@ public static function getCitizenResourceLoaderConfig( ) { return [ 'wgCitizenEnablePreferences' => $config->get( 'CitizenEnablePreferences' ), - 'wgCitizenSearchModule' => $config->get( 'CitizenSearchModule' ), - 'wgCitizenTableNowrapClasses' => $config->get( 'CitizenTableNowrapClasses' ), + 'wgCitizenOverflowNowrapClasses' => $config->get( 'CitizenOverflowNowrapClasses' ), + 'wgCitizenSearchModule' => $config->get( 'CitizenSearchModule' ) ]; } diff --git a/resources/skins.citizen.scripts/overflowElements.js b/resources/skins.citizen.scripts/overflowElements.js index f4392cbec..622e492ca 100644 --- a/resources/skins.citizen.scripts/overflowElements.js +++ b/resources/skins.citizen.scripts/overflowElements.js @@ -78,8 +78,8 @@ class OverflowElement { /** * Wraps the element in a div container with the class 'citizen-table-wrapper'. * Checks if the element or its parent node is null or undefined, logs an error if so. - * Verifies the existence of $wgCitizenTableNowrapClasses in the config and if it is an array, logs an error if not. - * Skips wrapping if the element contains any of the ignored classes specified in $wgCitizenTableNowrapClasses. + * Verifies the existence of $wgCitizenOverflowNowrapClasses in the config and if it is an array, logs an error if not. + * Skips wrapping if the element contains any of the ignored classes specified in $wgCitizenOverflowNowrapClasses. * Creates a wrapper div element, adds the class 'citizen-table-wrapper' to it. * Filters and adds inherited classes ('floatleft', 'floatright') from the element to the wrapper. * Inserts the wrapper before the element in the DOM and appends the element to the wrapper. @@ -95,16 +95,16 @@ class OverflowElement { } try { if ( - !config.wgCitizenTableNowrapClasses || - !Array.isArray( config.wgCitizenTableNowrapClasses ) + !config.wgCitizenOverflowNowrapClasses || + !Array.isArray( config.wgCitizenOverflowNowrapClasses ) ) { - mw.log.error( '[Citizen] Invalid or missing $wgCitizenTableNowrapClasses. Cannot proceed with wrapping table.' ); + mw.log.error( '[Citizen] Invalid or missing $wgCitizenOverflowNowrapClasses. Cannot proceed with wrapping table.' ); return; } const parentNode = this.element.parentNode; - const ignoredClasses = config.wgCitizenTableNowrapClasses; + const ignoredClasses = config.wgCitizenOverflowNowrapClasses; if ( ignoredClasses.some( ( cls ) => this.element.classList.contains( cls ) ) ) { return; diff --git a/tests/phpunit/integration/Hooks/ResourceLoaderHooksTest.php b/tests/phpunit/integration/Hooks/ResourceLoaderHooksTest.php index f0e10dbfc..cfb0350bf 100644 --- a/tests/phpunit/integration/Hooks/ResourceLoaderHooksTest.php +++ b/tests/phpunit/integration/Hooks/ResourceLoaderHooksTest.php @@ -19,8 +19,8 @@ class ResourceLoaderHooksTest extends MediaWikiIntegrationTestCase { public function testCitizenResourceLoaderConfig() { $this->overrideConfigValues( [ 'CitizenEnablePreferences' => false, + 'CitizenOverflowNowrapClasses' => false, 'CitizenSearchModule' => false, - 'CitizenTableNowrapClasses' => false, ] ); $rlCtxMock = $this->getMockBuilder( Context::class )->disableOriginalConstructor()->getMock(); @@ -33,7 +33,7 @@ public function testCitizenResourceLoaderConfig() { $this->assertArraySubmapSame( [ 'wgCitizenEnablePreferences' => false, 'wgCitizenSearchModule' => false, - 'wgCitizenTableNowrapClasses' => false, + 'wgCitizenOverflowNowrapClasses' => false, ], $config ); } @@ -44,8 +44,8 @@ public function testCitizenResourceLoaderConfig() { public function testCitizenResourceLoaderConfigAllTrue() { $this->overrideConfigValues( [ 'CitizenEnablePreferences' => true, + 'CitizenOverflowNowrapClasses' => true, 'CitizenSearchModule' => true, - 'CitizenTableNowrapClasses' => true, ] ); $rlCtxMock = $this->getMockBuilder( Context::class )->disableOriginalConstructor()->getMock(); @@ -57,8 +57,8 @@ public function testCitizenResourceLoaderConfigAllTrue() { $this->assertArraySubmapSame( [ 'wgCitizenEnablePreferences' => true, + 'wgCitizenOverflowNowrapClasses' => true, 'wgCitizenSearchModule' => true, - 'wgCitizenTableNowrapClasses' => true, ], $config ); } From c1582a8ddcf70d440cca9dfa12be76d7bf8b982a Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Mon, 27 May 2024 15:56:47 -0400 Subject: [PATCH 198/254] =?UTF-8?q?fix(core):=20=F0=9F=90=9B=20update=20ov?= =?UTF-8?q?erflow=20config=20name=20in=20skin.json?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- skin.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/skin.json b/skin.json index 6b706e626..10f8b042e 100644 --- a/skin.json +++ b/skin.json @@ -687,7 +687,7 @@ "descriptionmsg": "citizen-config-enablepreferences", "public": true }, - "TableNowrapClasses": { + "OverflowNowrapClasses": { "value": [ "citizen-table-nowrap", "diff", @@ -700,8 +700,8 @@ "smw-datatable", "mw-capiunto-infobox" ], - "description": "Defines table css classes ignored by citizen table wrapper", - "descriptionmsg": "citizen-config-tablenowrapclasses", + "description": "Defines css classes ignored by overflow wrapper", + "descriptionmsg": "citizen-config-overflownowrapclasses", "public": true } }, From cb1cfde785e00112843128e554e9177bece78c73 Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Mon, 27 May 2024 16:10:25 -0400 Subject: [PATCH 199/254] =?UTF-8?q?fix(core):=20=F0=9F=90=9B=20remove=20ta?= =?UTF-8?q?ble=20border=20expansion=20before=20the=20JS=20is=20loaded?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../skins.citizen.scripts/overflowElements.js | 1 + .../{Tables.less => OverflowElements.less} | 21 +++++++++---------- resources/skins.citizen.styles/skin.less | 2 +- 3 files changed, 12 insertions(+), 12 deletions(-) rename resources/skins.citizen.styles/components/{Tables.less => OverflowElements.less} (67%) diff --git a/resources/skins.citizen.scripts/overflowElements.js b/resources/skins.citizen.scripts/overflowElements.js index 622e492ca..cd0d6d148 100644 --- a/resources/skins.citizen.scripts/overflowElements.js +++ b/resources/skins.citizen.scripts/overflowElements.js @@ -225,6 +225,7 @@ class OverflowElement { * @return {void} */ function init( bodyContent ) { + // Do not wrap nested tables const tables = bodyContent.querySelectorAll( 'table:not( table table )' ); // Wrap tables diff --git a/resources/skins.citizen.styles/components/Tables.less b/resources/skins.citizen.styles/components/OverflowElements.less similarity index 67% rename from resources/skins.citizen.styles/components/Tables.less rename to resources/skins.citizen.styles/components/OverflowElements.less index 8c110d2c4..9f0987b84 100644 --- a/resources/skins.citizen.styles/components/Tables.less +++ b/resources/skins.citizen.styles/components/OverflowElements.less @@ -1,22 +1,21 @@ -// Responsive table for no js -// Avoid clipping when script is not yet loaded +// TODO: Revisit on MW 1.43 since Minerva table styles are merged upstream table { display: block; overflow-x: auto; + max-width: max-content; // Needed for the border } -// JS-enhanced responsive table -.citizen-table-wrapper { - overflow-x: auto; +// Elements enhanced by overflowElements.js +.citizen-overflow { + &-wrapper { + overflow-x: auto; - table { - display: table; - overflow: initial; + table { + display: table; + overflow: initial; + } } -} -// TODO: Move this out of tables styles when this is used by more stuff -.citizen-overflow { &--left { -webkit-mask-image: linear-gradient( 90deg, transparent, #000 15% ); mask-image: linear-gradient( 90deg, transparent, #000 15% ); diff --git a/resources/skins.citizen.styles/skin.less b/resources/skins.citizen.styles/skin.less index 791e33b50..ce974073f 100644 --- a/resources/skins.citizen.styles/skin.less +++ b/resources/skins.citizen.styles/skin.less @@ -40,7 +40,7 @@ @import 'components/StickyHeader.less'; @import 'components/Sitestats.less'; @import 'components/Sections.less'; - @import 'components/Tables.less'; + @import 'components/OverflowElements.less'; @import 'components/UserInfo.less'; // Mediawiki.skinning From 3cd8d20d1d1d7b192f277caf0061771f2004eaad Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 27 May 2024 20:11:41 +0000 Subject: [PATCH 200/254] =?UTF-8?q?ci:=20=F0=9F=91=B7=20lint=20code=20to?= =?UTF-8?q?=20MediaWiki=20standards?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Check commit and GitHub actions for more details --- resources/skins.citizen.styles/components/OverflowElements.less | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/skins.citizen.styles/components/OverflowElements.less b/resources/skins.citizen.styles/components/OverflowElements.less index 9f0987b84..a207ec2a9 100644 --- a/resources/skins.citizen.styles/components/OverflowElements.less +++ b/resources/skins.citizen.styles/components/OverflowElements.less @@ -1,8 +1,8 @@ // TODO: Revisit on MW 1.43 since Minerva table styles are merged upstream table { display: block; - overflow-x: auto; max-width: max-content; // Needed for the border + overflow-x: auto; } // Elements enhanced by overflowElements.js From bc356f915de50d7e7a6dc4a1b8fac1e392cdd614 Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Mon, 27 May 2024 16:11:55 -0400 Subject: [PATCH 201/254] =?UTF-8?q?fix(core):=20=F0=9F=90=9B=20fix=20incor?= =?UTF-8?q?rect=20overflow=20wrapper=20class=20name?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/skins.citizen.scripts/overflowElements.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/resources/skins.citizen.scripts/overflowElements.js b/resources/skins.citizen.scripts/overflowElements.js index cd0d6d148..19da5a98d 100644 --- a/resources/skins.citizen.scripts/overflowElements.js +++ b/resources/skins.citizen.scripts/overflowElements.js @@ -76,11 +76,11 @@ class OverflowElement { } /** - * Wraps the element in a div container with the class 'citizen-table-wrapper'. + * Wraps the element in a div container with the class 'citizen-overflow-wrapper'. * Checks if the element or its parent node is null or undefined, logs an error if so. * Verifies the existence of $wgCitizenOverflowNowrapClasses in the config and if it is an array, logs an error if not. * Skips wrapping if the element contains any of the ignored classes specified in $wgCitizenOverflowNowrapClasses. - * Creates a wrapper div element, adds the class 'citizen-table-wrapper' to it. + * Creates a wrapper div element, adds the class 'citizen-overflow-wrapper' to it. * Filters and adds inherited classes ('floatleft', 'floatright') from the element to the wrapper. * Inserts the wrapper before the element in the DOM and appends the element to the wrapper. * Sets the wrapper element as a property of the class instance. @@ -98,7 +98,7 @@ class OverflowElement { !config.wgCitizenOverflowNowrapClasses || !Array.isArray( config.wgCitizenOverflowNowrapClasses ) ) { - mw.log.error( '[Citizen] Invalid or missing $wgCitizenOverflowNowrapClasses. Cannot proceed with wrapping table.' ); + mw.log.error( '[Citizen] Invalid or missing $wgCitizenOverflowNowrapClasses. Cannot proceed with wrapping element.' ); return; } @@ -111,7 +111,7 @@ class OverflowElement { } const wrapper = document.createElement( 'div' ); - wrapper.className = 'citizen-table-wrapper'; + wrapper.className = 'citizen-overflow-wrapper'; const inheritedClasses = [ 'floatleft', @@ -221,7 +221,7 @@ class OverflowElement { /** * Initializes the process of wrapping overflow elements within the given body content. * - * @param {HTMLElement} bodyContent - The body content element containing tables to be wrapped. + * @param {HTMLElement} bodyContent - The body content element containing elements to be wrapped. * @return {void} */ function init( bodyContent ) { From 523140f62f2ce412937f9217dd502c4aca4ce343 Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Mon, 27 May 2024 17:04:28 -0400 Subject: [PATCH 202/254] =?UTF-8?q?perf(core):=20=E2=9A=A1=EF=B8=8F=20only?= =?UTF-8?q?=20toggle=20class=20when=20the=20element=20is=20overflowing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../skins.citizen.scripts/overflowElements.js | 60 ++++++++++++------- 1 file changed, 40 insertions(+), 20 deletions(-) diff --git a/resources/skins.citizen.scripts/overflowElements.js b/resources/skins.citizen.scripts/overflowElements.js index 19da5a98d..e017a1948 100644 --- a/resources/skins.citizen.scripts/overflowElements.js +++ b/resources/skins.citizen.scripts/overflowElements.js @@ -11,7 +11,7 @@ class OverflowElement { this.elementWidth = 0; this.wrapperScrollLeft = 0; this.wrapperWidth = 0; - this.onScroll = this.onScroll.bind( this ); + this.onScroll = mw.util.throttle( this.onScroll.bind( this ), 250 ); this.updateState = this.updateState.bind( this ); } @@ -35,6 +35,29 @@ class OverflowElement { } ); } + /** + * Checks if the state of the overflow element has changed by comparing the current element width, wrapper scroll left, + * and wrapper width with the cached values. Returns true if any of the values have changed, otherwise returns false. + * + * @return {boolean} - True if the state has changed, false otherwise. + */ + hasStateChanged() { + return ( + this.element.scrollWidth !== this.elementWidth || + Math.round( this.wrapper.scrollLeft ) !== this.wrapperScrollLeft || + this.wrapper.offsetWidth !== this.wrapperWidth + ); + } + + /** + * Checks if the element has overflowed horizontally by comparing the element width with the wrapper width. + * + * @return {boolean} - True if the element has overflowed, false otherwise. + */ + hasOverflowed() { + return this.elementWidth > this.wrapperWidth; + } + /** * Updates the state of the overflow element by calculating the element width, wrapper scroll left, and wrapper width. * If the width values are invalid, logs an error and returns. @@ -48,31 +71,28 @@ class OverflowElement { const wrapperScrollLeft = Math.round( this.wrapper.scrollLeft ); const wrapperWidth = this.wrapper.offsetWidth; - const areWidthsInvalid = Number.isNaN( wrapperWidth ) || Number.isNaN( elementWidth ); - if ( areWidthsInvalid ) { - mw.log.error( '[Citizen] Invalid width values. Cannot calculate overflow state.' ); + if ( !this.hasStateChanged() ) { return; } - // State. State never changes. - if ( - elementWidth === this.elementWidth && - wrapperScrollLeft === this.wrapperScrollLeft && - wrapperWidth === this.wrapperWidth - ) { - return; - } - - // State has changed. Save it to cache. this.elementWidth = elementWidth; this.wrapperScrollLeft = wrapperScrollLeft; this.wrapperWidth = wrapperWidth; - const updateClasses = [ - [ this.wrapperScrollLeft > 0, 'citizen-overflow--left' ], - [ this.wrapperScrollLeft + this.wrapperWidth < this.elementWidth, 'citizen-overflow--right' ] - ]; - this.toggleClasses( updateClasses ); + if ( !this.hasOverflowed() ) { + return; + } + + const isLeftOverflowing = this.wrapperScrollLeft > 0; + const isRightOverflowing = this.wrapperScrollLeft + this.wrapperWidth < this.elementWidth; + + window.requestAnimationFrame( () => { + const updateClasses = [ + [ isLeftOverflowing, 'citizen-overflow--left' ], + [ isRightOverflowing, 'citizen-overflow--right' ] + ]; + this.toggleClasses( updateClasses ); + } ); } /** @@ -143,7 +163,7 @@ class OverflowElement { * @return {void} */ onScroll() { - window.requestAnimationFrame( this.updateState ); + this.updateState(); } /** From c9210bd0dd65d452c2cb419ecd6347055545733e Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Mon, 27 May 2024 17:10:04 -0400 Subject: [PATCH 203/254] =?UTF-8?q?refactor(core):=20=E2=99=BB=EF=B8=8F=20?= =?UTF-8?q?separate=20inherited=20class=20function?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../skins.citizen.scripts/overflowElements.js | 59 +++++++++---------- 1 file changed, 29 insertions(+), 30 deletions(-) diff --git a/resources/skins.citizen.scripts/overflowElements.js b/resources/skins.citizen.scripts/overflowElements.js index e017a1948..9703acab5 100644 --- a/resources/skins.citizen.scripts/overflowElements.js +++ b/resources/skins.citizen.scripts/overflowElements.js @@ -95,16 +95,33 @@ class OverflowElement { } ); } + /** + * Filters and adds inherited classes to the wrapper element. + * + * @param {Array} inheritedClasses - An array of inherited classes to handle. + * @return {void} + */ + handleInheritedClasses( inheritedClasses ) { + const filteredClasses = inheritedClasses.filter( ( cls ) => this.element.classList.contains( cls ) ); + + filteredClasses.forEach( ( cls ) => { + if ( !this.wrapper.classList.contains( cls ) ) { + this.wrapper.classList.add( cls ); + } + if ( this.element.classList.contains( cls ) ) { + this.element.classList.remove( cls ); + } + } ); + } + /** * Wraps the element in a div container with the class 'citizen-overflow-wrapper'. - * Checks if the element or its parent node is null or undefined, logs an error if so. - * Verifies the existence of $wgCitizenOverflowNowrapClasses in the config and if it is an array, logs an error if not. - * Skips wrapping if the element contains any of the ignored classes specified in $wgCitizenOverflowNowrapClasses. - * Creates a wrapper div element, adds the class 'citizen-overflow-wrapper' to it. - * Filters and adds inherited classes ('floatleft', 'floatright') from the element to the wrapper. - * Inserts the wrapper before the element in the DOM and appends the element to the wrapper. - * Sets the wrapper element as a property of the class instance. - * Logs an error if an exception occurs during the wrapping process. + * Checks if the element or its parent node is null or undefined, and logs an error if so. + * Verifies the existence of the necessary configuration classes for wrapping and logs an error if missing. + * Creates a new div wrapper element, adds the class 'citizen-overflow-wrapper', and appends it to the parent node before the element. + * Moves the element inside the wrapper. + * Handles inherited classes such as 'floatleft' and 'floatright' by adding them to the wrapper and removing them from the element. + * Logs any errors that occur during the wrapping process. * * @return {void} */ @@ -114,40 +131,22 @@ class OverflowElement { return; } try { - if ( - !config.wgCitizenOverflowNowrapClasses || - !Array.isArray( config.wgCitizenOverflowNowrapClasses ) - ) { + const nowrapClasses = config.wgCitizenOverflowNowrapClasses; + if ( !nowrapClasses || !Array.isArray( nowrapClasses ) ) { mw.log.error( '[Citizen] Invalid or missing $wgCitizenOverflowNowrapClasses. Cannot proceed with wrapping element.' ); return; } const parentNode = this.element.parentNode; - const ignoredClasses = config.wgCitizenOverflowNowrapClasses; - - if ( ignoredClasses.some( ( cls ) => this.element.classList.contains( cls ) ) ) { + if ( nowrapClasses.some( ( cls ) => this.element.classList.contains( cls ) ) ) { return; } const wrapper = document.createElement( 'div' ); wrapper.className = 'citizen-overflow-wrapper'; - const inheritedClasses = [ - 'floatleft', - 'floatright' - ]; - - const filteredClasses = inheritedClasses.filter( ( cls ) => this.element.classList.contains( cls ) ); - - filteredClasses.forEach( ( cls ) => { - if ( !wrapper.classList.contains( cls ) ) { - wrapper.classList.add( cls ); - } - if ( this.element.classList.contains( cls ) ) { - this.element.classList.remove( cls ); - } - } ); + this.handleInheritedClasses( [ 'floatleft', 'floatright' ] ); parentNode.insertBefore( wrapper, this.element ); wrapper.appendChild( this.element ); From 974e6b27508caf60116548f2342ebb49ae226e48 Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Mon, 27 May 2024 17:16:23 -0400 Subject: [PATCH 204/254] =?UTF-8?q?feat(core):=20=E2=9C=A8=20add=20config?= =?UTF-8?q?=20to=20change=20overflow=20inherited=20classes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + includes/Hooks/ResourceLoaderHooks.php | 1 + resources/skins.citizen.scripts/overflowElements.js | 6 +++--- skin.json | 9 +++++++++ .../integration/Hooks/ResourceLoaderHooksTest.php | 4 ++++ 5 files changed, 18 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 6576d19a0..b9e0ffe6d 100644 --- a/README.md +++ b/README.md @@ -121,6 +121,7 @@ Name | Description | Values | Default `$wgCitizenEnableARFonts` | Enable included Noto Naskh Arabic for wikis that serve Arabic | `true` - enable; `false` - disable | `false` `$wgCitizenEnableCJKFonts` | Enable included Noto Sans CJK for wikis that serves CJK languages | `true` - enable; `false` - disable | `false` `$wgCitizenEnablePreferences` | Enable the preferences menu | `true` - enable; `false` - disable | `true` +`$wgCitizenOverflowInheritedClasses` | Defines css classes inherited by the overflow wrapper | List of css classes. Extend with `$wgCitizenOverflowInheritedClasses[] = 'my_class';` | `["floatleft", "floatright" ]` `$wgCitizenOverflowNowrapClasses` | Defines css classes ignored by the overflow wrapper | List of css classes. Extend with `$wgCitizenOverflowNowrapClasses[] = 'my_class';` | `["citizen-table-nowrap", "diff", "mw-changeslist-line", "mw-recentchanges-table", "infobox", "cargoDynamicTable", "dataTable", "srf-datatable", "smw-datatable", "mw-capiunto-infobox" ]` ### Search suggestions diff --git a/includes/Hooks/ResourceLoaderHooks.php b/includes/Hooks/ResourceLoaderHooks.php index 0a70b57c8..592936307 100644 --- a/includes/Hooks/ResourceLoaderHooks.php +++ b/includes/Hooks/ResourceLoaderHooks.php @@ -47,6 +47,7 @@ public static function getCitizenResourceLoaderConfig( ) { return [ 'wgCitizenEnablePreferences' => $config->get( 'CitizenEnablePreferences' ), + 'wgCitizenOverflowInheritedClasses' => $config->get( 'CitizenOverflowInheritedClasses' ), 'wgCitizenOverflowNowrapClasses' => $config->get( 'CitizenOverflowNowrapClasses' ), 'wgCitizenSearchModule' => $config->get( 'CitizenSearchModule' ) ]; diff --git a/resources/skins.citizen.scripts/overflowElements.js b/resources/skins.citizen.scripts/overflowElements.js index 9703acab5..16e2a8777 100644 --- a/resources/skins.citizen.scripts/overflowElements.js +++ b/resources/skins.citizen.scripts/overflowElements.js @@ -98,10 +98,10 @@ class OverflowElement { /** * Filters and adds inherited classes to the wrapper element. * - * @param {Array} inheritedClasses - An array of inherited classes to handle. * @return {void} */ - handleInheritedClasses( inheritedClasses ) { + handleInheritedClasses() { + const inheritedClasses = config.wgCitizenOverflowInheritedClasses; const filteredClasses = inheritedClasses.filter( ( cls ) => this.element.classList.contains( cls ) ); filteredClasses.forEach( ( cls ) => { @@ -146,7 +146,7 @@ class OverflowElement { const wrapper = document.createElement( 'div' ); wrapper.className = 'citizen-overflow-wrapper'; - this.handleInheritedClasses( [ 'floatleft', 'floatright' ] ); + this.handleInheritedClasses(); parentNode.insertBefore( wrapper, this.element ); wrapper.appendChild( this.element ); diff --git a/skin.json b/skin.json index 10f8b042e..8ae2bd920 100644 --- a/skin.json +++ b/skin.json @@ -687,6 +687,15 @@ "descriptionmsg": "citizen-config-enablepreferences", "public": true }, + "OverflowInheritedClasses": { + "value": [ + "floatleft", + "floatright" + ], + "description": "Defines css classes inherited by overflow wrapper", + "descriptionmsg": "citizen-config-overflowinheritedclasses", + "public": true + }, "OverflowNowrapClasses": { "value": [ "citizen-table-nowrap", diff --git a/tests/phpunit/integration/Hooks/ResourceLoaderHooksTest.php b/tests/phpunit/integration/Hooks/ResourceLoaderHooksTest.php index cfb0350bf..e0e15d4ca 100644 --- a/tests/phpunit/integration/Hooks/ResourceLoaderHooksTest.php +++ b/tests/phpunit/integration/Hooks/ResourceLoaderHooksTest.php @@ -19,6 +19,7 @@ class ResourceLoaderHooksTest extends MediaWikiIntegrationTestCase { public function testCitizenResourceLoaderConfig() { $this->overrideConfigValues( [ 'CitizenEnablePreferences' => false, + 'CitizenOverflowInheritedClasses' => false, 'CitizenOverflowNowrapClasses' => false, 'CitizenSearchModule' => false, ] ); @@ -33,6 +34,7 @@ public function testCitizenResourceLoaderConfig() { $this->assertArraySubmapSame( [ 'wgCitizenEnablePreferences' => false, 'wgCitizenSearchModule' => false, + 'wgCitizenOverflowInheritedClasses' => false, 'wgCitizenOverflowNowrapClasses' => false, ], $config ); } @@ -44,6 +46,7 @@ public function testCitizenResourceLoaderConfig() { public function testCitizenResourceLoaderConfigAllTrue() { $this->overrideConfigValues( [ 'CitizenEnablePreferences' => true, + 'CitizenOverflowInheritedClasses' => true, 'CitizenOverflowNowrapClasses' => true, 'CitizenSearchModule' => true, ] ); @@ -57,6 +60,7 @@ public function testCitizenResourceLoaderConfigAllTrue() { $this->assertArraySubmapSame( [ 'wgCitizenEnablePreferences' => true, + 'whCitizenOverflowInheritedClasses' => true, 'wgCitizenOverflowNowrapClasses' => true, 'wgCitizenSearchModule' => true, ], $config ); From c3943ca7cf639f47942491bd47cc11f927ee997e Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Mon, 27 May 2024 17:53:55 -0400 Subject: [PATCH 205/254] =?UTF-8?q?feat(core):=20=E2=9C=A8=20change=20over?= =?UTF-8?q?flow=20gradient=20to=20fixed=20size?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/OverflowElements.less | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/resources/skins.citizen.styles/components/OverflowElements.less b/resources/skins.citizen.styles/components/OverflowElements.less index a207ec2a9..594f4046d 100644 --- a/resources/skins.citizen.styles/components/OverflowElements.less +++ b/resources/skins.citizen.styles/components/OverflowElements.less @@ -1,3 +1,15 @@ +@overflow-affordnance-size: 2rem; + +.mask-gradient(@direction, @color1, @color2, @color3: null , @color4: null) { + -webkit-mask-image: linear-gradient( @direction, @color1, @color2 ); + mask-image: linear-gradient( @direction, @color1, @color2 ); + + & when not(@color3 = null), not(@color4 = null) { + -webkit-mask-image: linear-gradient( @direction, @color1, @color2, @color3, @color4 ); + mask-image: linear-gradient( @direction, @color1, @color2, @color3, @color4 ); + } +} + // TODO: Revisit on MW 1.43 since Minerva table styles are merged upstream table { display: block; @@ -17,17 +29,14 @@ table { } &--left { - -webkit-mask-image: linear-gradient( 90deg, transparent, #000 15% ); - mask-image: linear-gradient( 90deg, transparent, #000 15% ); + .mask-gradient(90deg, transparent, #000 @overflow-affordnance-size); } &--right { - -webkit-mask-image: linear-gradient( 90deg, #000 85%, transparent ); - mask-image: linear-gradient( 90deg, #000 85%, transparent ); + .mask-gradient(270deg, transparent, #000 @overflow-affordnance-size); } &--left&--right { - -webkit-mask-image: linear-gradient( 90deg, transparent, #000 15%, #000 85%, transparent ); - mask-image: linear-gradient( 90deg, transparent, #000 15%, #000 85%, transparent ); + .mask-gradient(90deg, transparent, #000 @overflow-affordnance-size, #000 ~'calc( 100% - @{overflow-affordnance-size} )', transparent); } } From 7b32aeec7d1753574472114ef8d271c5abe5f83f Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Mon, 27 May 2024 17:58:04 -0400 Subject: [PATCH 206/254] =?UTF-8?q?fix(core):=20=F0=9F=90=9B=20always=20re?= =?UTF-8?q?set=20overflow=20state?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/skins.citizen.scripts/overflowElements.js | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/resources/skins.citizen.scripts/overflowElements.js b/resources/skins.citizen.scripts/overflowElements.js index 16e2a8777..7383328ee 100644 --- a/resources/skins.citizen.scripts/overflowElements.js +++ b/resources/skins.citizen.scripts/overflowElements.js @@ -79,13 +79,16 @@ class OverflowElement { this.wrapperScrollLeft = wrapperScrollLeft; this.wrapperWidth = wrapperWidth; + let isLeftOverflowing, isRightOverflowing; + if ( !this.hasOverflowed() ) { - return; + isLeftOverflowing = false; + isRightOverflowing = false; + } else { + isLeftOverflowing = this.wrapperScrollLeft > 0; + isRightOverflowing = this.wrapperScrollLeft + this.wrapperWidth < this.elementWidth; } - const isLeftOverflowing = this.wrapperScrollLeft > 0; - const isRightOverflowing = this.wrapperScrollLeft + this.wrapperWidth < this.elementWidth; - window.requestAnimationFrame( () => { const updateClasses = [ [ isLeftOverflowing, 'citizen-overflow--left' ], From 4ed68a924d54a40716933a77736be84485f69c7c Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Mon, 27 May 2024 18:01:09 -0400 Subject: [PATCH 207/254] =?UTF-8?q?feat(core):=20=E2=9C=A8=20wrap=20any=20?= =?UTF-8?q?elements=20tagged=20with=20the=20class=20citizen-overflow?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/skins.citizen.scripts/overflowElements.js | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/resources/skins.citizen.scripts/overflowElements.js b/resources/skins.citizen.scripts/overflowElements.js index 7383328ee..f08875101 100644 --- a/resources/skins.citizen.scripts/overflowElements.js +++ b/resources/skins.citizen.scripts/overflowElements.js @@ -247,13 +247,10 @@ class OverflowElement { * @return {void} */ function init( bodyContent ) { - // Do not wrap nested tables - const tables = bodyContent.querySelectorAll( 'table:not( table table )' ); - - // Wrap tables - if ( tables.length > 0 ) { - tables.forEach( ( table ) => { - const overflowElement = new OverflowElement( table ); + const overflowElements = bodyContent.querySelectorAll( '.citizen-overflow, table:not( table table )' ); + if ( overflowElements.length > 0 ) { + overflowElements.forEach( ( el ) => { + const overflowElement = new OverflowElement( el ); overflowElement.init(); } ); } From 1b4159051b1e8578f733b29bc2606dbe2293a0f8 Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Mon, 27 May 2024 18:05:24 -0400 Subject: [PATCH 208/254] build: release 2.15.0 (#853) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * build: release 2.15.0 * ci: 👷 lint code to MediaWiki standards Check commit and GitHub actions for more details --------- Co-authored-by: github-actions --- .release-please-manifest.json | 2 +- CHANGELOG.md | 30 ++++++++++++++++++++++++++++++ package-lock.json | 4 ++-- package.json | 2 +- skin.json | 2 +- 5 files changed, 35 insertions(+), 5 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 24878e4ef..4dc14a377 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "2.14.1" + ".": "2.15.0" } diff --git a/CHANGELOG.md b/CHANGELOG.md index c34df32a6..fbe639453 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,36 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +## [2.15.0](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/compare/v2.14.1...v2.15.0) (2024-05-27) + + +### Features + +* ✨ improve scrolling performance ([27bca0f](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/27bca0fc6624908f0294f14347238967147b1fee)) +* **core:** ✨ add config to change overflow inherited classes ([974e6b2](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/974e6b27508caf60116548f2342ebb49ae226e48)) +* **core:** ✨ change overflow gradient to fixed size ([c3943ca](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/c3943ca7cf639f47942491bd47cc11f927ee997e)) +* **core:** ✨ rename wgCitizenTableNowrapClasses to wgCitizenOverflowNowrapClasses ([c17aeab](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/c17aeab3fd7ae5afdd3f9e1d591c35696a9f1f4b)) +* **core:** ✨ wrap any elements tagged with the class citizen-overflow ([4ed68a9](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/4ed68a924d54a40716933a77736be84485f69c7c)) +* **TabberNeue:** ✨ add init styles ([45ee5f8](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/45ee5f897c6f17df8479600319fef5181b72d4b2)) +* **TabberNeue:** ✨ update Tabber styles ([be01d5b](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/be01d5bb6c920108a9cdcb186d6dc2ddfb0aa0b2)) + + +### Bug Fixes + +* **core:** 🐛 always reset overflow state ([7b32aee](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/7b32aeec7d1753574472114ef8d271c5abe5f83f)) +* **core:** 🐛 escape double quotes for toc selector ([ae6d207](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/ae6d207fb4d42601e78a51c8d721e00a0c2ba046)) +* **core:** 🐛 fix incorrect overflow wrapper class name ([bc356f9](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/bc356f915de50d7e7a6dc4a1b8fac1e392cdd614)) +* **core:** 🐛 incorrect sticky header class assignment ([af3d72a](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/af3d72ad7501f5329b18bf90f6e4aaa8cd58085e)) +* **core:** 🐛 remove table border expansion before the JS is loaded ([cb1cfde](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/cb1cfde785e00112843128e554e9177bece78c73)) +* **core:** 🐛 update overflow config name in skin.json ([c1582a8](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/c1582a8ddcf70d440cca9dfa12be76d7bf8b982a)) + + +### Performance Improvements + +* **core:** ⚡️ further improvements to scroll and section observers ([e9289b1](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/e9289b149a70783ed2f6596bd7d2d7563f0cf0d9)) +* **core:** ⚡️ only toggle class when the element is overflowing ([523140f](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/523140f62f2ce412937f9217dd502c4aca4ce343)) +* **core:** ⚡️ remove scroll eventListener and resizeObserver on tables when not needed ([7a4d433](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/commit/7a4d43392d60a816be5b441cac74655c0dae0775)) + ## [2.14.1](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/compare/v2.14.0...v2.14.1) (2024-05-25) diff --git a/package-lock.json b/package-lock.json index bb6d40b07..51386e78f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "Citizen", - "version": "2.14.1", + "version": "2.15.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "Citizen", - "version": "2.14.1", + "version": "2.15.0", "devDependencies": { "@commitlint/cli": "^19.3.0", "@commitlint/config-conventional": "^19.2.2", diff --git a/package.json b/package.json index 7cbde81a8..0a1a3b5c3 100644 --- a/package.json +++ b/package.json @@ -24,5 +24,5 @@ "stylelint-config-wikimedia": "0.16.1", "stylelint-order": "^6.0.3" }, - "version": "2.14.1" + "version": "2.15.0" } diff --git a/skin.json b/skin.json index 8ae2bd920..56e6ca7b0 100644 --- a/skin.json +++ b/skin.json @@ -1,6 +1,6 @@ { "name": "Citizen", - "version": "2.14.1", + "version": "2.15.0", "author": [ "[https://www.mediawiki.org/wiki/User:Alistair3149 Alistair3149]", "[https://www.mediawiki.org/wiki/User:Octfx Octfx]", From defc1ced312565c751d7175585b1579b13939e38 Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Mon, 27 May 2024 18:28:07 -0400 Subject: [PATCH 209/254] =?UTF-8?q?chore(composer):=20=F0=9F=94=A7=20use?= =?UTF-8?q?=20starcitizentools=20as=20vendor=20since=20mediawiki=20is=20di?= =?UTF-8?q?sallowed?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index a3148a461..544d9df9f 100644 --- a/composer.json +++ b/composer.json @@ -1,5 +1,5 @@ { - "name": "mediawiki/citizen-skin", + "name": "starcitizentools/citizen-skin", "type": "mediawiki-skin", "description": "A responsive skin developed for the Star Citizen Wiki", "keywords": [ From 1794ab72abd10f1516cf86529e2e6f8806ce077a Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Mon, 27 May 2024 18:37:28 -0400 Subject: [PATCH 210/254] =?UTF-8?q?docs(readme):=20=F0=9F=93=9A=EF=B8=8F?= =?UTF-8?q?=20remove=20CI=20badge=20and=20add=20screenshot?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b9e0ffe6d..15b3dec2a 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # Citizen -[![](https://img.shields.io/github/contributors/StarCitizenTools/mediawiki-skins-Citizen?style=flat-square&logo=github)](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/graphs/contributors) ![](https://img.shields.io/github/actions/workflow/status/StarCitizenTools/mediawiki-skins-Citizen/mediawiki.yml?branch=main&label=MediaWiki%20CI&style=flat-square&logo=GithubActions) [![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg?style=flat-square&logo=GNU)](https://www.gnu.org/licenses/gpl-3.0) [![MediaWiki: >=1.39.4](https://img.shields.io/badge/MediaWiki-%3E%3D1.39.4-%2336c?style=flat-square&logo=Wikipedia)](https://www.mediawiki.org) [![](https://img.shields.io/badge/translations-translatewiki-%23013467?style=flat-square&logo=GoogleTranslate)](https://translatewiki.net/w/i.php?title=Special:Translate&group=mwgithub-star-citizen) +[![](https://img.shields.io/github/contributors/StarCitizenTools/mediawiki-skins-Citizen?style=flat-square&logo=github)](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/graphs/contributors) [![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg?style=flat-square&logo=GNU)](https://www.gnu.org/licenses/gpl-3.0) [![MediaWiki: >=1.39.4](https://img.shields.io/badge/MediaWiki-%3E%3D1.39.4-%2336c?style=flat-square&logo=Wikipedia)](https://www.mediawiki.org) [![](https://img.shields.io/badge/translations-translatewiki-%23013467?style=flat-square&logo=GoogleTranslate)](https://translatewiki.net/w/i.php?title=Special:Translate&group=mwgithub-star-citizen) + +![](https://upload.wikimedia.org/wikipedia/commons/0/07/Screenshot-skin-citizen.png) Citizen is a beautiful, usable, responsive [MediaWiki](https://www.mediawiki.org) skin that makes [extensions](https://www.mediawiki.org/wiki/Manual:Extensions) part of the cohesive experience. It was initially created for the [Star Citizen Wiki](https://starcitizen.tools) but is flexible to run on various MediaWiki configurations. From e95d3d39bd52ca06b5d60073a99a17401b2c1601 Mon Sep 17 00:00:00 2001 From: alistair3149 Date: Mon, 27 May 2024 22:47:46 -0400 Subject: [PATCH 211/254] =?UTF-8?q?perf(core):=20=E2=9A=A1=EF=B8=8F=20cons?= =?UTF-8?q?olidate=20citizen-menu=20card=20shared=20styles?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/mixins.less | 20 +++-------- .../skins.citizen.preferences.js | 1 + .../skins.citizen.preferences.less | 23 +++++++++---- .../skins.citizen.search.less | 26 +++++--------- .../components/Drawer.less | 14 ++++---- .../skins.citizen.styles/components/Menu.less | 34 +++++++++++++++++++ .../components/Pagetools.less | 10 +++--- .../components/Search.less | 20 +++++------ .../components/UserMenu.less | 8 ++++- templates/Drawer.mustache | 2 +- templates/PageTools.mustache | 2 +- templates/Search.mustache | 2 +- templates/UserMenu.mustache | 2 +- 13 files changed, 95 insertions(+), 69 deletions(-) diff --git a/resources/mixins.less b/resources/mixins.less index 2f3461a62..fedd5152b 100644 --- a/resources/mixins.less +++ b/resources/mixins.less @@ -71,24 +71,14 @@ right: 0; bottom: 100%; left: 0; - min-width: 16rem; max-height: var( --header-card-maxheight ); - margin: var( --space-xs ); - overflow: auto; - overscroll-behavior: contain; - -webkit-user-select: none; - user-select: none; - contain: content; - .citizen-card(); - .citizen-card-hide( bottom @position ); - .citizen-card-transition(); @media ( min-width: @min-width-breakpoint-tablet ) { - & when ( @position = left ) { + & when ( @position = start ) { right: unset; } - & when ( @position = right ) { + & when ( @position = end ) { left: unset; } } @@ -96,15 +86,13 @@ @media ( min-width: @min-width-breakpoint-desktop ) { right: unset; left: 100%; - & when ( @position = left ) { + & when ( @position = start ) { top: 0; bottom: unset; - .citizen-card-hide( top left ); } - & when ( @position = right ) { + & when ( @position = end ) { bottom: 0; - .citizen-card-hide( bottom left ); } } } diff --git a/resources/skins.citizen.preferences/skins.citizen.preferences.js b/resources/skins.citizen.preferences/skins.citizen.preferences.js index fb4557038..e600058fb 100644 --- a/resources/skins.citizen.preferences/skins.citizen.preferences.js +++ b/resources/skins.citizen.preferences/skins.citizen.preferences.js @@ -76,6 +76,7 @@ function createPanel() { const panel = document.createElement( 'aside' ); panel.id = 'citizen-pref-panel'; panel.classList.add( 'citizen-pref-panel' ); + panel.classList.add( 'citizen-menu__card' ); const header = document.createElement( 'header' ); header.id = 'citizen-pref-header'; diff --git a/resources/skins.citizen.preferences/skins.citizen.preferences.less b/resources/skins.citizen.preferences/skins.citizen.preferences.less index fcf142112..f61161cbb 100644 --- a/resources/skins.citizen.preferences/skins.citizen.preferences.less +++ b/resources/skins.citizen.preferences/skins.citizen.preferences.less @@ -18,10 +18,25 @@ // TODO: unify the dropdown menu style somewhere &-panel { - .citizen-header-card( right ); + .citizen-header-card( end ); + transform-origin: var( --transform-origin-offset-end ) var( --transform-origin-offset-end ); + @media ( min-width: @min-width-breakpoint-desktop ) { + transform-origin: var( --transform-origin-offset-start ) var( --transform-origin-offset-end ); + } + + // TODO: Somehow refactor this module to use citizen-menu__Card &.citizen-pref-panel--active { - .citizen-card-show; + z-index: @z-index-overlay; + transition: var( --transition-menu ); + transition-property: transform; + transform: none; + + > * { + opacity: 1; + transition: var( --transition-menu ); + transition-property: opacity; + } } fieldset { @@ -31,10 +46,6 @@ appearance: none; border: 0; } - - > * { - opacity: 0; - } } } diff --git a/resources/skins.citizen.search/skins.citizen.search.less b/resources/skins.citizen.search/skins.citizen.search.less index 7891f15da..acc62baf6 100644 --- a/resources/skins.citizen.search/skins.citizen.search.less +++ b/resources/skins.citizen.search/skins.citizen.search.less @@ -4,18 +4,17 @@ .citizen-typeahead { position: absolute; top: 100%; + left: -1px; // IDK why is it off by 1px box-sizing: content-box; // Magic to align with search input width: 100%; max-height: ~'calc( var( --header-card-maxheight ) - var( --height-search-bar ) )'; - margin: 0 0 0 -1px; // Reset
      styles, fix alignment + margin: 0; // Reset
        styles overflow: auto; overscroll-behavior: contain; + border-top-color: transparent; border-bottom-right-radius: var( --border-radius--medium ); border-bottom-left-radius: var( --border-radius--medium ); .citizen-card( false ); - .citizen-card-hide( 50% 0, Y, false ); - // Well this won't be loaded before .citizen-animation-ready anyways - .citizen-card-transition(); a { &:hover, @@ -271,22 +270,15 @@ background-color: var( --color-surface-1 ); border-radius: var( --border-radius--small ); } - - .citizen-search__card--expanded & { - .citizen-card-show( false ); - } } -// Merge searchform with typeahead -.citizen-search__card { - &&--expanded { - border-bottom-color: transparent; - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; +.citizen-search__card:has( .citizen-typeahead ) { + border-bottom-color: transparent; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; - .citizen-typeahead { - border-top-color: transparent; // Reset citizen-card style - } + .citizen-typeahead { + border-top-color: transparent; } } diff --git a/resources/skins.citizen.styles/components/Drawer.less b/resources/skins.citizen.styles/components/Drawer.less index 8682c7b74..5227290f3 100644 --- a/resources/skins.citizen.styles/components/Drawer.less +++ b/resources/skins.citizen.styles/components/Drawer.less @@ -1,6 +1,11 @@ .citizen-drawer { &__card { - .citizen-header-card( left ); + .citizen-header-card( start ); + transform-origin: var( --transform-origin-offset-start ) var( --transform-origin-offset-end ); + + @media ( min-width: @min-width-breakpoint-desktop ) { + transform-origin: var( --transform-origin-offset-start ) var( --transform-origin-offset-start ); + } } &__header { @@ -46,13 +51,6 @@ } } -// Checkbox hack -#citizen-drawer__checkbox:checked { - ~ .citizen-drawer__card { - .citizen-card-show; - } -} - @media ( min-width: @min-width-breakpoint-tablet ) { .citizen-drawer { &__logo img { diff --git a/resources/skins.citizen.styles/components/Menu.less b/resources/skins.citizen.styles/components/Menu.less index a68a8f6f1..e5bd0e416 100644 --- a/resources/skins.citizen.styles/components/Menu.less +++ b/resources/skins.citizen.styles/components/Menu.less @@ -1,6 +1,40 @@ .citizen-menu { font-size: var( --font-size-small ); + &__card { + --transform-origin-offset-start: var( --space-xs ); + --transform-origin-offset-end: ~'calc( 100% - var( --space-xs ) )'; + margin: var( --space-xs ); + overflow: auto; + overscroll-behavior: contain; + user-select: none; + background-color: var( --color-surface-1 ); + border: 1px solid var( --border-color-base ); + border-radius: var( --border-radius--medium ); + box-shadow: var( --box-shadow-dialog ); + transform: scale( 0 ); + will-change: transform; + contain: content; + + > * { + opacity: 0; + will-change: opacity; + } + + .citizen-menu-checkbox-checkbox:checked ~ & { + z-index: @z-index-overlay; + transition: var( --transition-menu ); + transition-property: transform; + transform: none; + + > * { + opacity: 1; + transition: var( --transition-menu ); + transition-property: opacity; + } + } + } + &__heading { display: block; padding: var( --space-xs ) var( --space-md ); diff --git a/resources/skins.citizen.styles/components/Pagetools.less b/resources/skins.citizen.styles/components/Pagetools.less index 8e935b069..16553e697 100644 --- a/resources/skins.citizen.styles/components/Pagetools.less +++ b/resources/skins.citizen.styles/components/Pagetools.less @@ -42,11 +42,11 @@ gap: var( --space-xs ); max-height: 60vh; padding: var( --space-xs ) 0; - margin: var( --space-xs ); - overflow: auto; - .citizen-card; - .citizen-card-hide( top right ); - .citizen-card-transition(); + transform-origin: var( --transform-origin-offset-end ) var( --transform-origin-offset-end ); + + @media ( min-width: @min-width-breakpoint-desktop ) { + transform-origin: var( --transform-origin-offset-end ) var( --transform-origin-offset-start ); + } } // Visible page tools styles diff --git a/resources/skins.citizen.styles/components/Search.less b/resources/skins.citizen.styles/components/Search.less index 335dff56d..37ab9894d 100644 --- a/resources/skins.citizen.styles/components/Search.less +++ b/resources/skins.citizen.styles/components/Search.less @@ -12,10 +12,14 @@ width: var( --width-search-bar ); max-width: ~'calc(100vw - var( --padding-page ) )'; height: var( --height-search-bar ); - margin: var( --space-md ) auto; - .citizen-card(); - .citizen-card-hide( top center, '', false ); - .citizen-card-transition(); + transform-origin: center var( --transform-origin-offset-start ); + + &.citizen-menu__card { + margin-right: auto; + margin-left: auto; + overflow: initial; + contain: none; + } .citizen-ui-icon { width: var( --height-search-bar ); @@ -111,18 +115,10 @@ } } -// Checkbox hack -#citizen-search__checkbox:checked { - ~ .citizen-search__card { - .citizen-card-show( false ); - } -} - @media ( max-width: @max-width-breakpoint-tablet ) { .citizen-search__card { z-index: 1; // So that overlay does not cover card width: auto; - margin: var( --space-xs ); // Remove searchbox open animation on mobile // But keep suggestion animation diff --git a/resources/skins.citizen.styles/components/UserMenu.less b/resources/skins.citizen.styles/components/UserMenu.less index eba8c4ef4..77333fae8 100644 --- a/resources/skins.citizen.styles/components/UserMenu.less +++ b/resources/skins.citizen.styles/components/UserMenu.less @@ -1,6 +1,12 @@ .citizen-userMenu { &__card { - .citizen-header-card( right ); + .citizen-header-card( end ); + min-width: 16rem; + transform-origin: var( --transform-origin-offset-end ) var( --transform-origin-offset-end ); + + @media ( min-width: @min-width-breakpoint-desktop ) { + transform-origin: var( --transform-origin-offset-start ) var( --transform-origin-offset-end ); + } .citizen-menu__heading { .mixin-screen-reader-text; diff --git a/templates/Drawer.mustache b/templates/Drawer.mustache index 12c9d478c..40515572c 100644 --- a/templates/Drawer.mustache +++ b/templates/Drawer.mustache @@ -12,7 +12,7 @@ aria-haspopup="true"> {{>Drawer__button}} {{! ID needed for a11y and checkbox hack }} -