diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index a7357b416..b2be09e48 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -105,7 +105,7 @@ jobs: cache-dependency-path: "ui/package-lock.json" - name: Test Node JS code - run: ${{ matrix.env }} make -C ui test-js + run: ${{ matrix.env }} make -C ui test env: NODE_ENV: test @@ -162,7 +162,7 @@ jobs: cache-dependency-path: "ui/package-lock.json" - name: Lint Node JS code - run: make -C ui lint-js + run: make -C ui lint format-go: name: Check Go code formatting diff --git a/Makefile b/Makefile index f5f7c21d7..42bbe1522 100644 --- a/Makefile +++ b/Makefile @@ -6,12 +6,12 @@ include make/lint-versions.mk .PHONY: lint lint: lint-go lint-bootstrap-version - make -C ui lint-js + make -C ui lint .PHONY: test test: lint make test-go - make -C ui test-js + make -C ui test .PHONY: clean clean: diff --git a/ui/.depcheckrc.yaml b/ui/.depcheckrc.yaml index 6d668cb1d..012d13543 100644 --- a/ui/.depcheckrc.yaml +++ b/ui/.depcheckrc.yaml @@ -20,3 +20,5 @@ ignores: - jest - "@playwright/test" - terser + - stylelint + - stylelint-config-standard-scss diff --git a/ui/Makefile b/ui/Makefile index 4207d2935..84e7598fe 100644 --- a/ui/Makefile +++ b/ui/Makefile @@ -28,8 +28,8 @@ dist/index.html: $(NODE_INSTALL) $(NODE_PATH)/vite $(call rwildcard, public src, .PHONY: build build: dist/index.html -.PHONY: test-js -test-js: $(NODE_PATH)/vite $(NODE_PATH)/jest +.PHONY: test +test: $(NODE_PATH)/vite $(NODE_PATH)/jest CI=true npm test -- --coverage .PHONY: e2e @@ -46,10 +46,11 @@ update-e2e: npx playwright install npx playwright test --update-snapshots -.PHONY: lint-js -lint-js: $(NODE_PATH)/eslint +.PHONY: lint +lint: $(NODE_PATH)/eslint $(NODE_PATH)/stylelint eslint tsc --noEmit -p . + stylelint 'src/**/*.scss' 'src/**/*.css' .PHONY: lint-typescript lint-typescript: diff --git a/ui/package-lock.json b/ui/package-lock.json index b57ef8c54..5eafa59d2 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -80,6 +80,8 @@ "node-fetch": "3.3.2", "prettier": "3.8.1", "sass": "1.98.0", + "stylelint": "17.5.0", + "stylelint-config-standard-scss": "17.0.0", "terser": "5.46.1", "ts-jest": "29.4.6", "typescript": "5.9.3", @@ -1926,6 +1928,67 @@ "dev": true, "license": "MIT" }, + "node_modules/@cacheable/memory": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@cacheable/memory/-/memory-2.0.8.tgz", + "integrity": "sha512-FvEb29x5wVwu/Kf93IWwsOOEuhHh6dYCJF3vcKLzXc0KXIW181AOzv6ceT4ZpBHDvAfG60eqb+ekmrnLHIy+jw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cacheable/utils": "^2.4.0", + "@keyv/bigmap": "^1.3.1", + "hookified": "^1.15.1", + "keyv": "^5.6.0" + } + }, + "node_modules/@cacheable/memory/node_modules/@keyv/bigmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@keyv/bigmap/-/bigmap-1.3.1.tgz", + "integrity": "sha512-WbzE9sdmQtKy8vrNPa9BRnwZh5UF4s1KTmSK0KUVLo3eff5BlQNNWDnFOouNpKfPKDnms9xynJjsMYjMaT/aFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "hashery": "^1.4.0", + "hookified": "^1.15.0" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "keyv": "^5.6.0" + } + }, + "node_modules/@cacheable/memory/node_modules/keyv": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.6.0.tgz", + "integrity": "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@keyv/serialize": "^1.1.1" + } + }, + "node_modules/@cacheable/utils": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@cacheable/utils/-/utils-2.4.0.tgz", + "integrity": "sha512-PeMMsqjVq+bF0WBsxFBxr/WozBJiZKY0rUojuaCoIaKnEl3Ju1wfEwS+SV1DU/cSe8fqHIPiYJFif8T3MVt4cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "hashery": "^1.5.0", + "keyv": "^5.6.0" + } + }, + "node_modules/@cacheable/utils/node_modules/keyv": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.6.0.tgz", + "integrity": "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@keyv/serialize": "^1.1.1" + } + }, "node_modules/@csstools/color-helpers": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", @@ -2021,6 +2084,31 @@ "@csstools/css-tokenizer": "^3.0.4" } }, + "node_modules/@csstools/css-syntax-patches-for-csstree": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.1.tgz", + "integrity": "sha512-BvqN0AMWNAnLk9G8jnUT77D+mUbY/H2b3uDTvg2isJkHaOufUE2R3AOwxWo7VBQKT1lOdwdvorddo2B/lk64+w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "peerDependencies": { + "css-tree": "^3.2.1" + }, + "peerDependenciesMeta": { + "css-tree": { + "optional": true + } + } + }, "node_modules/@csstools/css-tokenizer": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", @@ -2041,6 +2129,52 @@ "node": ">=18" } }, + "node_modules/@csstools/selector-resolve-nested": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-4.0.0.tgz", + "integrity": "sha512-9vAPxmp+Dx3wQBIUwc1v7Mdisw1kbbaGqXUM8QLTgWg7SoPGYtXBsMXvsFs/0Bn5yoFhcktzxNZGNaUt0VjgjA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.1.1" + } + }, + "node_modules/@csstools/selector-specificity": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-6.0.0.tgz", + "integrity": "sha512-4sSgl78OtOXEX/2d++8A83zHNTgwCJMaR24FvsYL7Uf/VS8HZk9PTwR51elTbGqMuwH3szLvvOXEaVnqn0Z3zA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.1.1" + } + }, "node_modules/@date-fns/tz": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/@date-fns/tz/-/tz-1.4.1.tgz", @@ -3162,17 +3296,66 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@keyv/serialize": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.1.1.tgz", + "integrity": "sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==", + "dev": true, + "license": "MIT" + }, "node_modules/@napi-rs/wasm-runtime": { - "version": "0.2.12", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", - "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.1.tgz", + "integrity": "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==", "dev": true, "license": "MIT", "optional": true, "dependencies": { - "@emnapi/core": "^1.4.3", - "@emnapi/runtime": "^1.4.3", - "@tybys/wasm-util": "^0.10.0" + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1", + "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" } }, "node_modules/@oxc-project/types": { @@ -3767,23 +3950,6 @@ "node": ">=14.0.0" } }, - "node_modules/@rolldown/binding-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.1.tgz", - "integrity": "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "^1.7.1", - "@emnapi/runtime": "^1.7.1", - "@tybys/wasm-util": "^0.10.1" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - } - }, "node_modules/@rolldown/binding-win32-arm64-msvc": { "version": "1.0.0-rc.10", "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.10.tgz", @@ -3832,6 +3998,19 @@ "dev": true, "license": "MIT" }, + "node_modules/@sindresorhus/merge-streams": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", + "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@sinonjs/commons": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", @@ -4758,6 +4937,19 @@ "node": ">=14.0.0" } }, + "node_modules/@unrs/resolver-binding-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", + "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@tybys/wasm-util": "^0.10.0" + } + }, "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", @@ -4996,6 +5188,16 @@ "dequal": "^2.0.3" } }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/babel-jest": { "version": "30.3.0", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-30.3.0.tgz", @@ -5236,6 +5438,19 @@ "node": "18 || 20 || >=22" } }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/bricks.js": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/bricks.js/-/bricks.js-1.8.0.tgz", @@ -5328,6 +5543,30 @@ "dev": true, "license": "MIT" }, + "node_modules/cacheable": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-2.3.4.tgz", + "integrity": "sha512-djgxybDbw9fL/ZWMI3+CE8ZilNxcwFkVtDc1gJ+IlOSSWkSMPQabhV/XCHTQ6pwwN6aivXPZ43omTooZiX06Ew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cacheable/memory": "^2.0.8", + "@cacheable/utils": "^2.4.0", + "hookified": "^1.15.0", + "keyv": "^5.6.0", + "qified": "^0.9.0" + } + }, + "node_modules/cacheable/node_modules/keyv": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.6.0.tgz", + "integrity": "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@keyv/serialize": "^1.1.1" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -5540,6 +5779,13 @@ "dev": true, "license": "MIT" }, + "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, + "license": "MIT" + }, "node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -5649,6 +5895,30 @@ "node": ">= 8" } }, + "node_modules/css-functions-list": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.3.3.tgz", + "integrity": "sha512-8HFEBPKhOpJPEPu70wJJetjKta86Gw9+CCyCnB3sui2qQfOvRyqBy4IKLKKAwdMpWb2lHXWk9Wb4Z6AmaUT1Pg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/css-tree": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", + "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.27.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, "node_modules/css.escape": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", @@ -5656,6 +5926,19 @@ "dev": true, "license": "MIT" }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/csshake": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/csshake/-/csshake-1.7.0.tgz", @@ -5889,6 +6172,16 @@ "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", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/err-code": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", @@ -6408,6 +6701,36 @@ "dev": true, "license": "MIT" }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -6422,6 +6745,43 @@ "dev": true, "license": "MIT" }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, "node_modules/favico.js": { "version": "0.3.10", "resolved": "https://registry.npmjs.org/favico.js/-/favico.js-0.3.10.tgz", @@ -6509,6 +6869,19 @@ "node": ">=16.0.0" } }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/find-root": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", @@ -6640,6 +7013,19 @@ "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/get-east-asian-width": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz", + "integrity": "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-package-type": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", @@ -6738,6 +7124,98 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globby": { + "version": "16.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-16.1.1.tgz", + "integrity": "sha512-dW7vl+yiAJSp6aCekaVnVJxurRv7DCOLyXqEG3RYMYUg7AuJ2jCqPkZTA8ooqC2vtnkaMcV5WfFBMuEnTu1OQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/merge-streams": "^4.0.0", + "fast-glob": "^3.3.3", + "ignore": "^7.0.5", + "is-path-inside": "^4.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.4.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/globby/node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globjoin": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", + "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==", + "dev": true, + "license": "MIT" + }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -6794,6 +7272,19 @@ "node": ">=8" } }, + "node_modules/hashery": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/hashery/-/hashery-1.5.1.tgz", + "integrity": "sha512-iZyKG96/JwPz1N55vj2Ie2vXbhu440zfUfJvSwEqEbeLluk7NnapfGqa7LH0mOsnDxTF85Mx8/dyR6HfqcbmbQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "hookified": "^1.15.0" + }, + "engines": { + "node": ">=20" + } + }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -6838,6 +7329,13 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "license": "MIT" }, + "node_modules/hookified": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.15.1.tgz", + "integrity": "sha512-MvG/clsADq1GPM2KGo2nyfaWVyn9naPiXrqIe4jYjXNZQt238kWyOGrsyc/DmRAQ+Re6yeo6yX/yoNCG5KAEVg==", + "dev": true, + "license": "MIT" + }, "node_modules/html-encoding-sniffer": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", @@ -6858,6 +7356,19 @@ "dev": true, "license": "MIT" }, + "node_modules/html-tags": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-5.1.0.tgz", + "integrity": "sha512-n6l5uca7/y5joxZ3LUePhzmBFUJ+U2YWzhMa8XUTecSeSlQiZdF5XAd/Q3/WUl0VsXgUwWi8I7CNIwdI5WN1SQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/http-proxy-agent": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", @@ -6984,6 +7495,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/import-meta-resolve": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", + "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -7023,6 +7545,13 @@ "dev": true, "license": "ISC" }, + "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, + "license": "ISC" + }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -7103,6 +7632,39 @@ "typescript": ">=4.7.4" } }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", + "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-potential-custom-element-name": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", @@ -8193,12 +8755,29 @@ "json-buffer": "3.0.1" } }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/knot.js": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/knot.js/-/knot.js-1.1.5.tgz", "integrity": "sha512-ptGtvTrgLNtQj9ilUR+tSyHWTCPp2xu/EHkeo3OvpczzNqBSwjQKz8G7vUhzlRbasXVULBWSejsj6QRQb1pakw==", "license": "MIT" }, + "node_modules/known-css-properties": { + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.37.0.tgz", + "integrity": "sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==", + "dev": true, + "license": "MIT" + }, "node_modules/leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", @@ -8540,6 +9119,13 @@ "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", "license": "MIT" }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "dev": true, + "license": "MIT" + }, "node_modules/lodash.uniqueid": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/lodash.uniqueid/-/lodash.uniqueid-4.0.1.tgz", @@ -8622,6 +9208,24 @@ "tmpl": "1.0.5" } }, + "node_modules/mathml-tag-names": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-4.0.0.tgz", + "integrity": "sha512-aa6AU2Pcx0VP/XWnh8IGL0SYSgQHDT6Ucror2j2mXeFAlN3ahaNs8EZtG1YiticMkSLj3Gt6VPFfZogt7G5iFQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdn-data": { + "version": "2.27.1", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", + "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", + "dev": true, + "license": "CC0-1.0" + }, "node_modules/memoize-one": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", @@ -8648,6 +9252,43 @@ "dev": true, "license": "MIT" }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", @@ -9274,6 +9915,95 @@ "node": "^10 || ^12 || >=14" } }, + "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": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", + "dev": true, + "license": "MIT" + }, + "node_modules/postcss-resolve-nested-selector": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz", + "integrity": "sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==", + "dev": true, + "license": "MIT" + }, + "node_modules/postcss-safe-parser": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.1.tgz", + "integrity": "sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==", + "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" + } + ], + "license": "MIT", + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-scss": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.9.tgz", + "integrity": "sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss-scss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.4.29" + } + }, + "node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -9395,6 +10125,47 @@ ], "license": "MIT" }, + "node_modules/qified": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/qified/-/qified-0.9.0.tgz", + "integrity": "sha512-4q61YgkHbY6gmwkqm0BsxyLDO3UYdrdiJTJ7JiaZb3xpW1duxn135SB7KqUEkCiuu5O4W+TtwEWP2VjmSRanvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hookified": "^2.1.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/qified/node_modules/hookified": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hookified/-/hookified-2.1.0.tgz", + "integrity": "sha512-ootKng4eaxNxa7rx6FJv2YKef3DuhqbEj3l70oGXwddPQEEnISm50TEZQclqiLTAtilT2nu7TErtCO523hHkyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, "node_modules/react": { "version": "19.2.4", "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", @@ -9681,6 +10452,16 @@ "node": ">=0.10.0" } }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/resolve": { "version": "1.22.11", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", @@ -9733,6 +10514,17 @@ "node": ">= 4" } }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, "node_modules/rolldown": { "version": "1.0.0-rc.10", "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.10.tgz", @@ -9781,6 +10573,30 @@ "dev": true, "license": "MIT" }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -9887,6 +10703,24 @@ "node": ">=8" } }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, "node_modules/source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -10134,6 +10968,400 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/stylelint": { + "version": "17.5.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-17.5.0.tgz", + "integrity": "sha512-o/NS6zhsPZFmgUm5tXX4pVNg1XDOZSlucLdf2qow/lVn4JIyzZIQ5b3kad1ugqUj3GSIgr2u5lQw7X8rjqw33g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/stylelint" + }, + { + "type": "github", + "url": "https://github.com/sponsors/stylelint" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/css-calc": "^3.1.1", + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-syntax-patches-for-csstree": "^1.0.29", + "@csstools/css-tokenizer": "^4.0.0", + "@csstools/media-query-list-parser": "^5.0.0", + "@csstools/selector-resolve-nested": "^4.0.0", + "@csstools/selector-specificity": "^6.0.0", + "colord": "^2.9.3", + "cosmiconfig": "^9.0.1", + "css-functions-list": "^3.3.3", + "css-tree": "^3.2.1", + "debug": "^4.4.3", + "fast-glob": "^3.3.3", + "fastest-levenshtein": "^1.0.16", + "file-entry-cache": "^11.1.2", + "global-modules": "^2.0.0", + "globby": "^16.1.1", + "globjoin": "^0.1.4", + "html-tags": "^5.1.0", + "ignore": "^7.0.5", + "import-meta-resolve": "^4.2.0", + "imurmurhash": "^0.1.4", + "is-plain-object": "^5.0.0", + "mathml-tag-names": "^4.0.0", + "meow": "^14.1.0", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.5.8", + "postcss-safe-parser": "^7.0.1", + "postcss-selector-parser": "^7.1.1", + "postcss-value-parser": "^4.2.0", + "string-width": "^8.2.0", + "supports-hyperlinks": "^4.4.0", + "svg-tags": "^1.0.0", + "table": "^6.9.0", + "write-file-atomic": "^7.0.0" + }, + "bin": { + "stylelint": "bin/stylelint.mjs" + }, + "engines": { + "node": ">=20.19.0" + } + }, + "node_modules/stylelint-config-recommended": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-18.0.0.tgz", + "integrity": "sha512-mxgT2XY6YZ3HWWe3Di8umG6aBmWmHTblTgu/f10rqFXnyWxjKWwNdjSWkgkwCtxIKnqjSJzvFmPT5yabVIRxZg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/stylelint" + }, + { + "type": "github", + "url": "https://github.com/sponsors/stylelint" + } + ], + "license": "MIT", + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "stylelint": "^17.0.0" + } + }, + "node_modules/stylelint-config-recommended-scss": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-17.0.0.tgz", + "integrity": "sha512-VkVD9r7jfUT/dq3mA3/I1WXXk2U71rO5wvU2yIil9PW5o1g3UM7Xc82vHmuVJHV7Y8ok5K137fmW5u3HbhtTOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-scss": "^4.0.9", + "stylelint-config-recommended": "^18.0.0", + "stylelint-scss": "^7.0.0" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "postcss": "^8.3.3", + "stylelint": "^17.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + } + } + }, + "node_modules/stylelint-config-standard": { + "version": "40.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-40.0.0.tgz", + "integrity": "sha512-EznGJxOUhtWck2r6dJpbgAdPATIzvpLdK9+i5qPd4Lx70es66TkBPljSg4wN3Qnc6c4h2n+WbUrUynQ3fanjHw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/stylelint" + }, + { + "type": "github", + "url": "https://github.com/sponsors/stylelint" + } + ], + "license": "MIT", + "dependencies": { + "stylelint-config-recommended": "^18.0.0" + }, + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "stylelint": "^17.0.0" + } + }, + "node_modules/stylelint-config-standard-scss": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-standard-scss/-/stylelint-config-standard-scss-17.0.0.tgz", + "integrity": "sha512-uLJS6xgOCBw5EMsDW7Ukji8l28qRoMnkRch15s0qwZpskXvWt9oPzMmcYM307m9GN4MxuWLsQh4I6hU9yI53cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "stylelint-config-recommended-scss": "^17.0.0", + "stylelint-config-standard": "^40.0.0" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "postcss": "^8.3.3", + "stylelint": "^17.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + } + } + }, + "node_modules/stylelint-scss": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-7.0.0.tgz", + "integrity": "sha512-H88kCC+6Vtzj76NsC8rv6x/LW8slBzIbyeSjsKVlS+4qaEJoDrcJR4L+8JdrR2ORdTscrBzYWiiT2jq6leYR1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-tree": "^3.0.1", + "is-plain-object": "^5.0.0", + "known-css-properties": "^0.37.0", + "mdn-data": "^2.25.0", + "postcss-media-query-parser": "^0.2.3", + "postcss-resolve-nested-selector": "^0.1.6", + "postcss-selector-parser": "^7.1.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "stylelint": "^16.8.2 || ^17.0.0" + } + }, + "node_modules/stylelint/node_modules/@csstools/css-calc": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.1.1.tgz", + "integrity": "sha512-HJ26Z/vmsZQqs/o3a6bgKslXGFAungXGbinULZO3eMsOyNJHeBBZfup5FiZInOghgoM4Hwnmw+OgbJCNg1wwUQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" + } + }, + "node_modules/stylelint/node_modules/@csstools/css-parser-algorithms": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-4.0.0.tgz", + "integrity": "sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^4.0.0" + } + }, + "node_modules/stylelint/node_modules/@csstools/css-tokenizer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-4.0.0.tgz", + "integrity": "sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=20.19.0" + } + }, + "node_modules/stylelint/node_modules/@csstools/media-query-list-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-5.0.0.tgz", + "integrity": "sha512-T9lXmZOfnam3eMERPsszjY5NK0jX8RmThmmm99FZ8b7z8yMaFZWKwLWGZuTwdO3ddRY5fy13GmmEYZXB4I98Eg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" + } + }, + "node_modules/stylelint/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/stylelint/node_modules/cosmiconfig": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.1.tgz", + "integrity": "sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ==", + "dev": true, + "license": "MIT", + "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/stylelint/node_modules/file-entry-cache": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-11.1.2.tgz", + "integrity": "sha512-N2WFfK12gmrK1c1GXOqiAJ1tc5YE+R53zvQ+t5P8S5XhnmKYVB5eZEiLNZKDSmoG8wqqbF9EXYBBW/nef19log==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^6.1.20" + } + }, + "node_modules/stylelint/node_modules/flat-cache": { + "version": "6.1.21", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.21.tgz", + "integrity": "sha512-2u7cJfSf7Th7NxEk/VzQjnPoglok2YCsevS7TSbJjcDQWJPbqUUnSYtriHSvtnq+fRZHy1s0ugk4ApnQyhPGoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "cacheable": "^2.3.3", + "flatted": "^3.4.1", + "hookified": "^1.15.0" + } + }, + "node_modules/stylelint/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/stylelint/node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/stylelint/node_modules/meow": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-14.1.0.tgz", + "integrity": "sha512-EDYo6VlmtnumlcBCbh1gLJ//9jvM/ndXHfVXIFrZVr6fGcwTUyCTFNTLCKuY3ffbK8L/+3Mzqnd58RojiZqHVw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stylelint/node_modules/string-width": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.0.tgz", + "integrity": "sha512-6hJPQ8N0V0P3SNmP6h2J99RLuzrWz2gvT7VnK5tKvrNqJoyS9W4/Fb8mo31UiPvy00z7DQXkP2hnKBVav76thw==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stylelint/node_modules/write-file-atomic": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-7.0.1.tgz", + "integrity": "sha512-OTIk8iR8/aCRWBqvxrzxR0hgxWpnYBblY1S5hDWBQfk/VFmJwzmJgQFN3WsoUKHISv2eAwe+PpbUzyL1CKTLXg==", + "dev": true, + "license": "ISC", + "dependencies": { + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, "node_modules/stylis": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", @@ -10153,6 +11381,49 @@ "node": ">=8" } }, + "node_modules/supports-hyperlinks": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-4.4.0.tgz", + "integrity": "sha512-UKbpT93hN5Nr9go5UY7bopIB9YQlMz9nm/ct4IXt/irb5YRkn9WaqrOBJGZ5Pwvsd5FQzSVeYlGdXoCAPQZrPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^5.0.1", + "supports-color": "^10.2.2" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/chalk/supports-hyperlinks?sponsor=1" + } + }, + "node_modules/supports-hyperlinks/node_modules/has-flag": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-5.0.1.tgz", + "integrity": "sha512-CsNUt5x9LUdx6hnk/E2SZLsDyvfqANZSUq4+D3D8RzDJ2M+HDTIkF60ibS1vHaK55vzgiZw1bEPFG9yH7l33wA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-hyperlinks/node_modules/supports-color": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.2.2.tgz", + "integrity": "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", @@ -10165,6 +11436,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", + "dev": true + }, "node_modules/symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", @@ -10195,6 +11472,82 @@ "dev": true, "license": "MIT" }, + "node_modules/table": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", + "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "node_modules/table/node_modules/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, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/table/node_modules/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, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/terser": { "version": "5.46.1", "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.1.tgz", @@ -10356,6 +11709,19 @@ "dev": true, "license": "BSD-3-Clause" }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/toggle-selection": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", @@ -10654,6 +12020,19 @@ "node": ">=4" } }, + "node_modules/unicorn-magic": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.4.0.tgz", + "integrity": "sha512-wH590V9VNgYH9g3lH9wWjTrUoKsjLF6sGLjhR4sH1LWpLmCOH0Zf7PukhDA8BiS7KHe4oPNkcTHqYkj7SOGUOw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/unrs-resolver": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", @@ -10753,6 +12132,13 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, "node_modules/v8-to-istanbul": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", diff --git a/ui/package.json b/ui/package.json index a7f5403f6..a6f9aa6f8 100644 --- a/ui/package.json +++ b/ui/package.json @@ -76,6 +76,8 @@ "node-fetch": "3.3.2", "prettier": "3.8.1", "sass": "1.98.0", + "stylelint": "17.5.0", + "stylelint-config-standard-scss": "17.0.0", "terser": "5.46.1", "ts-jest": "29.4.6", "typescript": "5.9.3", diff --git a/ui/src/Components/Labels/LabelWithPercent/__snapshots__/index.test.tsx.snap b/ui/src/Components/Labels/LabelWithPercent/__snapshots__/index.test.tsx.snap index f8a97acc3..fd88518f4 100644 --- a/ui/src/Components/Labels/LabelWithPercent/__snapshots__/index.test.tsx.snap +++ b/ui/src/Components/Labels/LabelWithPercent/__snapshots__/index.test.tsx.snap @@ -9,7 +9,7 @@ exports[` matches snapshot with isActive=true 1`] = ` class="components-label badge bg-default components-label-dark components-label-with-hover mb-0 ps-0 text-start" > 25 @@ -36,7 +36,7 @@ exports[` matches snapshot with isActive=true 1`] = `
matches snapshot with offset=0 1`] = ` class="components-label badge bg-default components-label-dark components-label-with-hover mb-0 ps-0 text-start" > 25 @@ -73,7 +73,7 @@ exports[` matches snapshot with offset=0 1`] = `
matches snapshot with offset=25 1`] = ` class="components-label badge bg-default components-label-dark components-label-with-hover mb-0 ps-0 text-start" > 25 @@ -110,7 +110,7 @@ exports[` matches snapshot with offset=25 1`] = `
- + {hits} @@ -71,7 +71,7 @@ const LabelWithPercent: FC<{ /> ) : null} -
+
{offset === 0 ? null : (
- + {nameStats.hits} {nameStats.name} diff --git a/ui/src/Components/OverviewModal/__snapshots__/OverviewModalContent.test.tsx.snap b/ui/src/Components/OverviewModal/__snapshots__/OverviewModalContent.test.tsx.snap index 2724a942c..bea59bd9e 100644 --- a/ui/src/Components/OverviewModal/__snapshots__/OverviewModalContent.test.tsx.snap +++ b/ui/src/Components/OverviewModal/__snapshots__/OverviewModalContent.test.tsx.snap @@ -35,7 +35,7 @@ exports[` matches snapshot with labels to show 1`] = ` class="badge bg-light components-label mx-0 mt-0 mb-auto ps-0 text-start" > 16 @@ -53,7 +53,7 @@ exports[` matches snapshot with labels to show 1`] = ` class="components-label badge bg-default components-label-dark components-label-with-hover mb-0 ps-0 text-start" > 8 @@ -66,7 +66,7 @@ exports[` matches snapshot with labels to show 1`] = `
matches snapshot with labels to show 1`] = ` class="components-label badge bg-default components-label-dark components-label-with-hover mb-0 ps-0 text-start" > 4 @@ -98,7 +98,7 @@ exports[` matches snapshot with labels to show 1`] = `
matches snapshot with labels to show 1`] = ` class="components-label badge bg-default components-label-dark components-label-with-hover mb-0 ps-0 text-start" > 4 @@ -138,7 +138,7 @@ exports[` matches snapshot with labels to show 1`] = `
matches snapshot with labels to show 1`] = ` class="badge bg-light components-label mx-0 mt-0 mb-auto ps-0 text-start" > 20 @@ -187,7 +187,7 @@ exports[` matches snapshot with labels to show 1`] = ` class="components-label badge bg-default components-label-dark components-label-with-hover mb-0 ps-0 text-start" > 1 @@ -200,7 +200,7 @@ exports[` matches snapshot with labels to show 1`] = `
matches snapshot with labels to show 1`] = ` class="components-label badge bg-default components-label-dark components-label-with-hover mb-0 ps-0 text-start" > 1 @@ -232,7 +232,7 @@ exports[` matches snapshot with labels to show 1`] = `
matches snapshot with labels to show 1`] = ` class="components-label badge bg-default components-label-dark components-label-with-hover mb-0 ps-0 text-start" > 1 @@ -272,7 +272,7 @@ exports[` matches snapshot with labels to show 1`] = `
matches snapshot with labels to show 1`] = ` class="components-label badge bg-default components-label-dark components-label-with-hover mb-0 ps-0 text-start" > 1 @@ -312,7 +312,7 @@ exports[` matches snapshot with labels to show 1`] = `
matches snapshot with labels to show 1`] = ` class="components-label badge bg-default components-label-dark components-label-with-hover mb-0 ps-0 text-start" > 1 @@ -352,7 +352,7 @@ exports[` matches snapshot with labels to show 1`] = `
matches snapshot with labels to show 1`] = ` class="components-label badge bg-default components-label-dark components-label-with-hover mb-0 ps-0 text-start" > 1 @@ -392,7 +392,7 @@ exports[` matches snapshot with labels to show 1`] = `
matches snapshot with labels to show 1`] = ` class="components-label badge bg-default components-label-dark components-label-with-hover mb-0 ps-0 text-start" > 1 @@ -432,7 +432,7 @@ exports[` matches snapshot with labels to show 1`] = `
matches snapshot with labels to show 1`] = ` class="components-label badge bg-default components-label-dark components-label-with-hover mb-0 ps-0 text-start" > 1 @@ -472,7 +472,7 @@ exports[` matches snapshot with labels to show 1`] = `
matches snapshot with labels to show 1`] = ` class="components-label badge bg-default components-label-dark components-label-with-hover mb-0 ps-0 text-start" > 1 @@ -512,7 +512,7 @@ exports[` matches snapshot with labels to show 1`] = `
matches snapshot with labels to show 1`] = ` class="badge bg-light components-label mx-0 mt-0 mb-auto ps-0 text-start" > 5 @@ -566,7 +566,7 @@ exports[` matches snapshot with labels to show 1`] = ` class="components-label badge bg-dark components-label-dark components-label-with-hover mb-0 ps-0 text-start" > 5 @@ -579,7 +579,7 @@ exports[` matches snapshot with labels to show 1`] = `
= 768px) { .mw-md-25 { max-width: 25%; } diff --git a/ui/src/Styles/Components/_AlertGrid.scss b/ui/src/Styles/Components/_AlertGrid.scss index 99a7999af..9bb1bd87a 100644 --- a/ui/src/Styles/Components/_AlertGrid.scss +++ b/ui/src/Styles/Components/_AlertGrid.scss @@ -2,10 +2,11 @@ font-size: 1.4rem; background-color: var(--karma-grid-swimlane-bg); color: $white; + --bs-secondary-color: #{rgba($white, .75)}; + margin-left: 0.3rem; margin-right: 0.3rem; - position: sticky; z-index: 101; } diff --git a/ui/src/Styles/Components/_AlertHistory.scss b/ui/src/Styles/Components/_AlertHistory.scss index cb8ae016a..5331e8ffb 100644 --- a/ui/src/Styles/Components/_AlertHistory.scss +++ b/ui/src/Styles/Components/_AlertHistory.scss @@ -5,6 +5,7 @@ height: 4px; line-height: 4px; } + svg.alert-history { height: 4px; line-height: 4px; @@ -15,6 +16,7 @@ svg.alert-history { &:not(:first-child) { margin-left: 1px; } + &:not(:last-child) { margin-right: 1px; } @@ -28,7 +30,6 @@ svg.alert-history { rect { width: 100%; height: 100%; - transition-property: fill; transition-duration: 0.3s; @@ -36,31 +37,39 @@ svg.alert-history { &.firing-0 { fill: #fadbd8; } + &.firing-1 { fill: #f3a69e; } + &.firing-2 { fill: #ee8277; } + &.firing-3 { fill: #e95e50; } + &.firing-4 { fill: #d04436; } + &.firing-5 { fill: #a2352a; } } + &.inactive { fill: var(--karma-alert-history-inactive); } + &.fetching { fill: var(--karma-alert-history-inactive); animation-timing-function: ease-out; animation-duration: 12s; animation-iteration-count: infinite; } + &.error { fill: $warning; } @@ -73,6 +82,7 @@ svg.alert-history { $start: ($step * $i) - $step; $middle: ($step * $i); $stop: ($step * $i) + $step; + 0% { opacity: 1; } @@ -85,6 +95,7 @@ svg.alert-history { #{$stop * 1%} { opacity: 1; } + 100% { opacity: 1; } diff --git a/ui/src/Styles/Components/_Annotation.scss b/ui/src/Styles/Components/_Annotation.scss index 23c54bfd9..6c25d9fcc 100644 --- a/ui/src/Styles/Components/_Annotation.scss +++ b/ui/src/Styles/Components/_Annotation.scss @@ -6,10 +6,12 @@ .components-grid-annotation-link { text-decoration: none; color: var(--karma-link-color); + &.border { border-color: var(--karma-annotation-link-border) !important; } } + .components-grid-annotation-link:hover { text-decoration: none; } diff --git a/ui/src/Styles/Components/_BaseLabel.scss b/ui/src/Styles/Components/_BaseLabel.scss index 8c16f4dcb..dfcd0c939 100644 --- a/ui/src/Styles/Components/_BaseLabel.scss +++ b/ui/src/Styles/Components/_BaseLabel.scss @@ -1,3 +1,5 @@ +@use "sass:color"; + .components-label-with-hover:hover { filter: brightness(0.85); cursor: pointer; @@ -9,6 +11,7 @@ .components-label { border: 1px solid transparent; + &:hover { border: 1px solid transparent; } @@ -17,9 +20,9 @@ max-width: 100%; text-overflow: ellipsis; white-space: nowrap; + /* https://stackoverflow.com/a/20566810 */ vertical-align: bottom !important; - margin-top: 2px; margin-bottom: 2px; } @@ -28,6 +31,7 @@ .bg-default { background-color: var(--karma-color-default); } + .border-default { border: 1px solid var(--karma-color-default); } @@ -42,27 +46,33 @@ &.btn-primary { border: 1px solid var(--karma-label-primary-border); } + &.bg-secondary, &.btn-secondary { border: 1px solid var(--karma-label-secondary-border); background-color: var(--karma-label-secondary-bg) !important; } + &.bg-success, &.btn-success { border: 1px solid var(--karma-label-success-border); } + &.bg-danger, &.btn-danger { border: 1px solid var(--karma-label-danger-border); } + &.bg-warning, &.btn-warning { border: 1px solid var(--karma-label-warning-border); } + &.bg-info, &.btn-info { border: 1px solid var(--karma-label-info-border); } + &.bg-dark, &.btn-dark { border: 1px solid var(--karma-label-dark-border); @@ -74,10 +84,12 @@ span.badge.components-label:not(.rounded-pill) { padding-left: 0.4rem; padding-right: 0.4rem; } + span.badge.components-label.rounded-pill { padding-right: 0.6rem; padding-left: 0.6rem; } + span.badge.components-label { padding-top: 0.25rem; padding-bottom: 0.25rem; @@ -87,20 +99,24 @@ button.components-label-bright, span.components-label-bright, .components-label-bright { color: $black; + &:hover { color: $black; } &.components-label-name, .components-label-name { - color: lighten($black, 20%); + color: color.adjust($black, $lightness: 20%); + &:hover { - color: lighten($black, 20%); + color: color.adjust($black, $lightness: 20%); } } + &.components-label-value, .components-label-value { color: $black; + &:hover { color: $black; } @@ -108,7 +124,7 @@ span.components-label-bright, @for $i from 10 through 11 { &.components-label-brightness-#{$i} { - border: 1px solid darken(#fff, $i * 1.1%); + border: 1px solid color.adjust(#fff, $lightness: (-$i * 1.1%)); } } } @@ -117,21 +133,24 @@ button.components-label-dark, span.components-label-dark, .components-label-dark { color: $white; + &:hover { color: $white; } &.components-label-name, .components-label-name { - color: darken($white, 10%); + color: color.adjust($white, $lightness: -10%); + &:hover { - color: darken($white, 10%); + color: color.adjust($white, $lightness: -10%); } } &.components-label-value, .components-label-value { color: $white; + &:hover { color: $white; } diff --git a/ui/src/Styles/Components/_DateTimeSelect.scss b/ui/src/Styles/Components/_DateTimeSelect.scss index bf17f0746..7e26e0243 100644 --- a/ui/src/Styles/Components/_DateTimeSelect.scss +++ b/ui/src/Styles/Components/_DateTimeSelect.scss @@ -1,3 +1,4 @@ +/* stylelint-disable selector-class-pattern, custom-property-pattern -- react-day-picker uses underscore class names */ .components-date-range { &.rdp-root { --rdp-cell-size: 40px; @@ -61,7 +62,7 @@ border-radius: 0.5rem; } - &:not(.rdp-disabled):not(.rdp-range_middle):not(.rdp-selected):hover { + &:not(.rdp-disabled, .rdp-range_middle, .rdp-selected):hover { background-color: var(--bs-light); } } @@ -107,7 +108,7 @@ color: var(--bs-white); } - .rdp-day.rdp-selected.rdp-range_middle:not(.rdp-range_start):not(.rdp-range_end) .rdp-day_button { + .rdp-day.rdp-selected.rdp-range_middle:not(.rdp-range_start, .rdp-range_end) .rdp-day_button { background-color: var(--bs-light); color: var(--karma-components-date-range-sub-color); } diff --git a/ui/src/Styles/Components/_DropdownSlide.scss b/ui/src/Styles/Components/_DropdownSlide.scss index cb1fa76e1..a2d0987e3 100644 --- a/ui/src/Styles/Components/_DropdownSlide.scss +++ b/ui/src/Styles/Components/_DropdownSlide.scss @@ -5,6 +5,7 @@ $duration: 0.15s; opacity: 0; transform: scale(0.95) translateY(-0.25em); } + .components-animation-slide-enter-active, .components-animation-slide-appear-active { opacity: 1; @@ -18,6 +19,7 @@ $duration: 0.15s; opacity: 1; transform: scale(1) translateY(0); } + .components-animation-slide-exit-active { opacity: 0; transform: scale(0.95) translateY(-0.25em); diff --git a/ui/src/Styles/Components/_Fade.scss b/ui/src/Styles/Components/_Fade.scss index 55c2b1dd4..171931104 100644 --- a/ui/src/Styles/Components/_Fade.scss +++ b/ui/src/Styles/Components/_Fade.scss @@ -4,6 +4,7 @@ $duration: 0.5s; .components-animation-fade-enter { opacity: 0; } + .components-animation-fade-appear-active, .components-animation-fade-enter-active { opacity: 1; @@ -13,6 +14,7 @@ $duration: 0.5s; .components-animation-fade-exit { opacity: 1; } + .components-animation-fade-exit-active { opacity: 0; transition: opacity $duration ease-out; @@ -22,6 +24,7 @@ $duration: 0.5s; from { opacity: 0; } + to { opacity: 1; } diff --git a/ui/src/Styles/Components/_FadeAlertGroup.scss b/ui/src/Styles/Components/_FadeAlertGroup.scss index dcf8580d0..63b50bda2 100644 --- a/ui/src/Styles/Components/_FadeAlertGroup.scss +++ b/ui/src/Styles/Components/_FadeAlertGroup.scss @@ -6,6 +6,7 @@ $duration: 0.5s; .components-animation-alergroup-enter { opacity: 0; } + .components-animation-alergroup-appear-active, .components-animation-alergroup-enter-active { opacity: 1; @@ -15,6 +16,7 @@ $duration: 0.5s; .components-animation-alergroup-exit { opacity: 1; } + .components-animation-alergroup-exit-active { opacity: 0; transition: opacity $duration ease-out; diff --git a/ui/src/Styles/Components/_Fetcher.scss b/ui/src/Styles/Components/_Fetcher.scss index b54f227ac..b772abe9c 100644 --- a/ui/src/Styles/Components/_Fetcher.scss +++ b/ui/src/Styles/Components/_Fetcher.scss @@ -1,17 +1,17 @@ @use "sass:math"; -$totalWidth: 2.6rem; -$fetcherWidth: 2rem; -$pixSize: math.div($fetcherWidth, 5); +$total-width: 2.6rem; +$fetcher-width: 2rem; +$pix-size: math.div($fetcher-width, 5); .invisible .components-fetcher { display: none; } .components-fetcher { - padding: math.div($totalWidth - $fetcherWidth, 2); - width: ($pixSize * 5); - height: ($pixSize * 5); + padding: math.div($total-width - $fetcher-width, 2); + width: ($pix-size * 5); + height: ($pix-size * 5); &.fetching, &.processing, @@ -19,6 +19,7 @@ $pixSize: math.div($fetcherWidth, 5); & > .dot.dot-middle { opacity: 0; } + & > .dot:not(.dot-middle) { animation-name: dots; } @@ -27,9 +28,11 @@ $pixSize: math.div($fetcherWidth, 5); &.fetching > .dot { background-color: var(--bs-warning); } + &.processing > .dot { background-color: var(--bs-success); } + &.retrying > .dot { background-color: var(--bs-danger); } @@ -37,32 +40,30 @@ $pixSize: math.div($fetcherWidth, 5); .dot { position: absolute; margin: 0.1rem; - width: ($pixSize - 0.1rem); - height: ($pixSize - 0.1rem); + width: ($pix-size - 0.1rem); + height: ($pix-size - 0.1rem); border-radius: 100%; - transition-property: opacity, background-color; transition-duration: 0.2s; transition-timing-function: ease-in-out; - background-color: var(--bs-white); - animation-duration: 0.9s; animation-iteration-count: infinite; - opacity: 0; + &.visible { opacity: 1; } $num: 0; + @for $i from 1 through 9 { - @if $i%3 == 1 { + @if $i % 3 == 1 { $num: 0; } - $tx: (($pixSize * 2) * $num); - $ty: (($pixSize * 2) * (floor(math.div(($i - 1), 3)))); + $tx: (($pix-size * 2) * $num); + $ty: (($pix-size * 2) * (math.floor(math.div(($i - 1), 3)))); &:nth-of-type(#{$i}) { transform: translate($tx, $ty); @@ -74,24 +75,31 @@ $pixSize: math.div($fetcherWidth, 5); &:nth-of-type(1) { animation-delay: (0.1s); } + &:nth-of-type(2) { animation-delay: (0.2s); } + &:nth-of-type(3) { animation-delay: (0.3s); } + &:nth-of-type(6) { animation-delay: (0.4s); } + &:nth-of-type(9) { animation-delay: (0.5s); } + &:nth-of-type(8) { animation-delay: (0.6s); } + &:nth-of-type(7) { animation-delay: (0.7s); } + &:nth-of-type(4) { animation-delay: (0.8s); } @@ -104,6 +112,7 @@ $pixSize: math.div($fetcherWidth, 5); 100% { opacity: 0; } + 70% { opacity: 1; } diff --git a/ui/src/Styles/Components/_FilterInput.scss b/ui/src/Styles/Components/_FilterInput.scss index e52e46a52..db6f43f8d 100644 --- a/ui/src/Styles/Components/_FilterInput.scss +++ b/ui/src/Styles/Components/_FilterInput.scss @@ -12,14 +12,9 @@ .form-control.components-filterinput { cursor: text; height: auto; - box-shadow: none; background-clip: unset; - - padding-top: 1px; - padding-bottom: 1px; - padding-left: 0.25rem; - padding-right: 0.25rem; + padding: 1px 0.25rem; } input.components-filterinput-wrapper { @@ -40,8 +35,9 @@ input.components-filterinput-wrapper { .bg-focused { @supports (backdrop-filter: blur(12px)) { // TODO: why is this hardcoding colors? - background-color: rgba(var(--karma-bg-focused-rgb, 81, 113, 132), 0.5); + background-color: rgb(var(--karma-bg-focused-rgb, 81, 113, 132), 0.5); } + @supports not (backdrop-filter: blur(12px)) { background-color: var(--karma-bg-focused); } diff --git a/ui/src/Styles/Components/_FilterInputLabel.scss b/ui/src/Styles/Components/_FilterInputLabel.scss index 51deb401d..77d4c4c5e 100644 --- a/ui/src/Styles/Components/_FilterInputLabel.scss +++ b/ui/src/Styles/Components/_FilterInputLabel.scss @@ -55,24 +55,31 @@ button.components-label.btn { &.btn-primary:hover { background-color: var(--bs-primary); } + &.btn-secondary:hover { background-color: var(--bs-secondary); } + &.btn-success:hover { background-color: var(--bs-success); } + &.btn-info:hover { background-color: var(--bs-info); } + &.btn-warning:hover { background-color: var(--bs-warning); } + &.btn-danger:hover { background-color: var(--bs-danger); } + &.btn-light:hover { background-color: var(--bs-light); } + &.btn-dark:hover { background-color: var(--bs-dark); } diff --git a/ui/src/Styles/Components/_Flash.scss b/ui/src/Styles/Components/_Flash.scss index 0ab874ec4..60929a6a0 100644 --- a/ui/src/Styles/Components/_Flash.scss +++ b/ui/src/Styles/Components/_Flash.scss @@ -11,15 +11,19 @@ $duration: 800ms; 0% { opacity: 1; } + 25% { opacity: 0; } + 50% { opacity: 1; } + 75% { opacity: 0; } + 100% { opacity: 1; } diff --git a/ui/src/Styles/Components/_History.scss b/ui/src/Styles/Components/_History.scss index e49b44b95..f13351c0b 100644 --- a/ui/src/Styles/Components/_History.scss +++ b/ui/src/Styles/Components/_History.scss @@ -1,6 +1,6 @@ .dropdown-menu.components-navbar-historymenu { white-space: nowrap; - overflow: overlay; + overflow: auto; width: 100%; } @@ -16,17 +16,19 @@ border-left: 3px solid; } -@media screen and (min-width: 1px) and (max-width: 599px) { +@media screen and (width >= 1px) and (width <= 599px) { .dropdown-menu.components-navbar-historymenu { max-width: 100%; } } -@media screen and (min-width: 600px) and (max-width: 999px) { + +@media screen and (width >= 600px) and (width <= 999px) { .dropdown-menu.components-navbar-historymenu { max-width: 500px; } } -@media screen and (min-width: 1000px) { + +@media screen and (width >= 1000px) { .dropdown-menu.components-navbar-historymenu { max-width: 600px; } @@ -36,6 +38,7 @@ button.btn.component-history-button { margin-right: 0.5rem; margin-bottom: 0.5rem; } + button.btn.component-history-button:last-child { margin-right: 0; } diff --git a/ui/src/Styles/Components/_LabelWithPercent.scss b/ui/src/Styles/Components/_LabelWithPercent.scss index 2fcebfd0d..46d576390 100644 --- a/ui/src/Styles/Components/_LabelWithPercent.scss +++ b/ui/src/Styles/Components/_LabelWithPercent.scss @@ -1,14 +1,14 @@ -.components-labelWithPercent-percent { +.components-label-with-percent-percent { padding-top: 0.25rem; padding-bottom: 0.25rem; } -.components-labelWithPercent-progress.progress { +.components-label-with-percent-progress.progress { height: 2px; margin-top: 2px; background-color: var(--karma-progress-bg); } -.components-labelWithPercent-progress.progress > .progress-bar { +.components-label-with-percent-progress.progress > .progress-bar { height: 2px; } diff --git a/ui/src/Styles/Components/_ManagedSilence.scss b/ui/src/Styles/Components/_ManagedSilence.scss index ace1928d4..ec919a918 100644 --- a/ui/src/Styles/Components/_ManagedSilence.scss +++ b/ui/src/Styles/Components/_ManagedSilence.scss @@ -16,6 +16,7 @@ .silence-matcher-equal { background-color: #28c45c; } + .silence-matcher-negative { background-color: #e4372e; } diff --git a/ui/src/Styles/Components/_MountModal.scss b/ui/src/Styles/Components/_MountModal.scss index afdfc50e5..f1a4e0b47 100644 --- a/ui/src/Styles/Components/_MountModal.scss +++ b/ui/src/Styles/Components/_MountModal.scss @@ -1,9 +1,7 @@ $duration-modal: 0.2s; $move: -50px; $opacity-modal: 0; - $duration-bg: 0.2s; - $easing-enter: ease-out; $easing-exit: ease-in; @@ -11,20 +9,24 @@ $easing-exit: ease-in; will-change: opacity, transform; transform: translateZ(0) scale(1); } + .components-animation-modal-enter .modal-dialog { opacity: $opacity-modal; transform: translate(0, $move) scale(0.95); } + .components-animation-modal-enter-active .modal-dialog { opacity: 1; transition: transform $duration-modal $easing-enter, opacity $duration-modal $easing-enter; transform: translate(0, 0) scale(1); } + .components-animation-modal-exit .modal-dialog { opacity: 1; transform: translate(0, 0) scale(1); } + .components-animation-modal-exit-active .modal-dialog { opacity: $opacity-modal; transform: translate(0, $move) scale(0.95); @@ -36,23 +38,28 @@ $easing-exit: ease-in; will-change: background-color; transform: translateZ(0); } + .components-animation-backdrop-enter { - background-color: rgba(30, 30, 30, 0.01); + background-color: rgb(30 30 30 / 1%); } + .components-animation-backdrop-enter-active { - background-color: rgba(30, 30, 30, 0.8); + background-color: rgb(30 30 30 / 80%); transition: opacity $duration-bg $easing-exit; backdrop-filter: saturate(50%) blur(12px); } + .components-animation-backdrop-enter-done { - background-color: rgba(30, 30, 30, 0.8); + background-color: rgb(30 30 30 / 80%); transition: opacity $duration-bg $easing-exit; backdrop-filter: saturate(50%) blur(12px); } + .components-animation-backdrop-exit { - background-color: rgba(30, 30, 30, 0.8); + background-color: rgb(30 30 30 / 80%); } + .components-animation-backdrop-exit-active { - background-color: rgba(30, 30, 30, 0.01); + background-color: rgb(30 30 30 / 1%); transition: opacity $duration-bg $easing-exit; } diff --git a/ui/src/Styles/Components/_NavBar.scss b/ui/src/Styles/Components/_NavBar.scss index 246b4fe17..8d0ac2c3e 100644 --- a/ui/src/Styles/Components/_NavBar.scss +++ b/ui/src/Styles/Components/_NavBar.scss @@ -13,6 +13,7 @@ background-color: rgba($primary, 0.85); backdrop-filter: saturate(50%) blur(12px); } + @supports not (backdrop-filter: blur(12px)) { background-color: rgba($primary, 0.95); } @@ -29,18 +30,17 @@ & .components-navbar-button { &.navbar-brand { - padding-top: 0.4rem; - padding-bottom: 0.4rem; - padding-left: 0.3rem; - padding-right: 0.3rem; + padding: 0.4rem 0.3rem; line-height: 1.8rem; } &:hover { border-radius: 0.4rem; + @supports (backdrop-filter: blur(12px)) { - background-color: rgba(var(--karma-bg-focused-rgb, 81, 113, 132), 0.5); + background-color: rgb(var(--karma-bg-focused-rgb, 81, 113, 132), 0.5); } + @supports not (backdrop-filter: blur(12px)) { background-color: var(--karma-bg-focused); } diff --git a/ui/src/Styles/Components/_NavBarSlide.scss b/ui/src/Styles/Components/_NavBarSlide.scss index c9971c5be..91eaebb85 100644 --- a/ui/src/Styles/Components/_NavBarSlide.scss +++ b/ui/src/Styles/Components/_NavBarSlide.scss @@ -5,6 +5,7 @@ $duration: 0.5s; opacity: 0.01; transform: translateY(-100%); } + .components-animation-navbar-appear-active, .components-animation-navbar-enter-active { opacity: 1; @@ -16,6 +17,7 @@ $duration: 0.5s; opacity: 1; transform: translateY(0); } + .components-animation-navbar-exit-active { opacity: 0.01; transform: translateY(-100%); diff --git a/ui/src/Styles/Components/_Toast.scss b/ui/src/Styles/Components/_Toast.scss index 565b5cdeb..43ef60edd 100644 --- a/ui/src/Styles/Components/_Toast.scss +++ b/ui/src/Styles/Components/_Toast.scss @@ -2,9 +2,7 @@ position: fixed; bottom: 0.5rem; right: 0.6rem; - z-index: 2500; - max-width: 500px; code { @@ -12,7 +10,7 @@ } } -@media screen and (max-width: 600px) { +@media screen and (width <= 600px) { .components-toast-container { max-width: 100%; bottom: 0; @@ -22,9 +20,10 @@ .bg-toast { @supports (backdrop-filter: blur(12px)) { - background-color: rgba(var(--karma-toast-bg-rgb, 21, 21, 21), 0.85); + background-color: rgb(var(--karma-toast-bg-rgb, 21, 21, 21), 0.85); backdrop-filter: saturate(50%) blur(12px); } + @supports not (backdrop-filter: blur(12px)) { background-color: var(--karma-toast-bg); } @@ -32,14 +31,15 @@ .toast-upgrade-progressbar { animation-duration: 20s; - animation-name: upgradeProgress; + animation-name: upgrade-progress; animation-timing-function: linear; } -@keyframes upgradeProgress { +@keyframes upgrade-progress { 0% { width: 100%; } + 100% { width: 0%; } diff --git a/ui/src/Styles/Components/_Tooltip.scss b/ui/src/Styles/Components/_Tooltip.scss index f06838f44..64d51bef5 100644 --- a/ui/src/Styles/Components/_Tooltip.scss +++ b/ui/src/Styles/Components/_Tooltip.scss @@ -4,15 +4,18 @@ } $duration: 0.2s; + .components-animation-tooltip-appear, .components-animation-tooltip-enter { opacity: 0; } + .components-animation-tooltip-appear-active, .components-animation-tooltip-enter-active { opacity: 1; transition: opacity $duration ease-in; } + .components-animation-tooltip-appear-done, .components-animation-tooltip-enter-done { opacity: 1; diff --git a/ui/src/Styles/Components/_WithClick.scss b/ui/src/Styles/Components/_WithClick.scss index a9f61adb0..9a355ff74 100644 --- a/ui/src/Styles/Components/_WithClick.scss +++ b/ui/src/Styles/Components/_WithClick.scss @@ -4,7 +4,7 @@ overflow: hidden; transform: translate3d(0, 0, 0); - &:after { + &::after { content: ""; display: block; position: absolute; @@ -25,7 +25,7 @@ transition: transform 0.4s, opacity 0.4s; } - &.with-click-dark:after { + &.with-click-dark::after { background-image: radial-gradient( circle, var(--karma-with-click-dark) 10%, @@ -33,7 +33,7 @@ ); } - &.with-click-light:after { + &.with-click-light::after { background-image: radial-gradient( circle, var(--karma-with-click-light) 10%, @@ -41,7 +41,7 @@ ); } - &:active:after { + &:active::after { transform: scale(0, 0); opacity: 0.2; transition: 0s; diff --git a/ui/src/Styles/Fonts.scss b/ui/src/Styles/Fonts.scss index e48c4439c..71cfc94bd 100644 --- a/ui/src/Styles/Fonts.scss +++ b/ui/src/Styles/Fonts.scss @@ -5,13 +5,13 @@ $web-font-path: false; // Default for Bootstrap is 700 and it's a bit too thick for Open Sans $font-weight-bold: 600; + // Use normal font weight for badges $badge-font-weight: 400; // this is vaniall flatly but Lato was replaced by Open Sans // the rest was kept for fallback used by "font-display: swap;" -$font-family-sans-serif: "Open Sans", -apple-system, BlinkMacSystemFont, - "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", +$font-family-sans-serif: "Open Sans", -apple-system, blinkmacsystemfont, + "Segoe UI", roboto, "Helvetica Neue", arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; - $font-family-base: $font-family-sans-serif; diff --git a/ui/src/Styles/Theme.scss b/ui/src/Styles/Theme.scss index e2b69e5a1..5369d82d6 100644 --- a/ui/src/Styles/Theme.scss +++ b/ui/src/Styles/Theme.scss @@ -1,3 +1,4 @@ +@use "sass:color"; @use "bootswatch/dist/flatly/variables" as flatly; @use "bootswatch/dist/darkly/variables" as darkly; @@ -5,25 +6,21 @@ $lead-font-weight: 400; // custom "dark" color, little less dark than flatly $blue: #455a64; + // default is ~0.97rem $font-size-base: 1rem; // make dark darker, default it's $gray-700 $dark: #3b4247; - $enable-shadows: true; $enable-dark-mode: false; - $btn-box-shadow: 0; $btn-focus-box-shadow: 0; $btn-active-box-shadow: 0; - $tooltip-max-width: 400px; - $body-bg: #455a64; @import "./Fonts"; - @import "bootstrap/scss/functions"; // Import flatly (light) variables as base @@ -31,7 +28,6 @@ $body-bg: #455a64; // make links light gray by default instead of green $link-color: $gray-700; - $navbar-dark-brand-color: $navbar-dark-color; $navbar-dark-brand-hover-color: $gray-200; $navbar-dark-hover-color: $gray-200; @@ -49,21 +45,15 @@ $pagination-hover-bg: $gray-700; $pagination-active-bg: $pagination-hover-bg; $pagination-disabled-color: $white; $pagination-disabled-bg: $gray-300; - -$progress-bg: darken($light, 10%); - +$progress-bg: color.adjust($light, $lightness: -10%); $accordion-active-bg: $gray-100; $accordion-button-bg: $gray-100; $accordion-button-active-bg: $gray-100; $accordion-border-color: $gray-300; - $modal-header-border-color: $gray-300; - $table-bg: transparent; $table-accent-bg: transparent; - $card-cap-bg: inherit; - $kbd-color: $white; $kbd-bg: $dark; @@ -96,6 +86,7 @@ $body-secondary-color: $gray-600; @import "bootstrap/scss/navbar"; @import "bootstrap/scss/card"; @import "bootstrap/scss/accordion"; + // @import "bootstrap/scss/breadcrumb"; // unused @import "bootstrap/scss/pagination"; @import "bootstrap/scss/badge"; @@ -107,8 +98,10 @@ $body-secondary-color: $gray-600; @import "bootstrap/scss/modal"; @import "bootstrap/scss/tooltip"; @import "bootstrap/scss/popover"; + // @import "bootstrap/scss/carousel"; // unused @import "bootstrap/scss/spinners"; + // @import "bootstrap/scss/offcanvas"; // unused // @import "bootstrap/scss/placeholders"; // unused @@ -122,25 +115,25 @@ $body-secondary-color: $gray-600; // Light color mode — flatly colors [data-bs-theme="light"] { background-color: #455a64; + --bs-body-bg: #455a64; --bs-body-bg-rgb: 69, 90, 100; - --karma-alert-bg: #{$white}; - --karma-alert-history-inactive: #{lighten($light, 1%)}; + --karma-alert-history-inactive: #{color.adjust($light, $lightness: 1%)}; --karma-alertgroup-body-bg: #{$white}; --karma-alertgroup-footer-bg: #{$gray-100}; --karma-silence-id: #{$dark}; --karma-silence-color: #{$dark}; - --karma-silence-bg: #{lighten($gray-200, 4%)}; + --karma-silence-bg: #{color.adjust($gray-200, $lightness: 4%)}; --karma-silence-border: #{$gray-700}; --karma-silence-comment-color: #{$gray-800}; --karma-filter-input-hoover-bg: #{$white}; --karma-filter-input-hoover-color: #{$black}; --karma-placeholder-color: #{$secondary}; --karma-filterinput-border: #{$navbar-dark-color}; - --karma-grid-swimlane-bg: #{lighten($dark, 2%)}; - --karma-bg-focused: #{lighten($blue, 5%)}; - --karma-bg-focused-rgb: #{red(lighten($blue, 5%))}, #{green(lighten($blue, 5%))}, #{blue(lighten($blue, 5%))}; + --karma-grid-swimlane-bg: #{color.adjust($dark, $lightness: 2%)}; + --karma-bg-focused: #{color.adjust($blue, $lightness: 5%)}; + --karma-bg-focused-rgb: #{color.red(color.adjust($blue, $lightness: 5%))}, #{color.green(color.adjust($blue, $lightness: 5%))}, #{color.blue(color.adjust($blue, $lightness: 5%))}; --karma-annotation-link-border: #{$light}; --karma-components-date-range-sub-color: #{$black}; --karma-input-range-track-background: #{$gray-400}; @@ -151,17 +144,17 @@ $body-secondary-color: $gray-600; --karma-with-click-light: #{$black}; --karma-accordion-border-color: #{$gray-300}; --karma-link-color: #{$gray-700}; - --karma-toast-bg: #{darken($dark, 5%)}; - --karma-toast-bg-rgb: #{red(darken($dark, 5%))}, #{green(darken($dark, 5%))}, #{blue(darken($dark, 5%))}; - --karma-progress-bg: #{darken($light, 10%)}; - --karma-label-primary-border: #{lighten($primary, 2%)}; - --karma-label-secondary-border: #{darken($secondary, 1%)}; - --karma-label-secondary-bg: #{darken($secondary, 2%)}; - --karma-label-success-border: #{darken($success, 2%)}; - --karma-label-danger-border: #{lighten($danger, 2%)}; - --karma-label-warning-border: #{lighten($warning, 3%)}; - --karma-label-info-border: #{darken($info, 2%)}; - --karma-label-dark-border: #{darken($dark, 2%)}; + --karma-toast-bg: #{color.adjust($dark, $lightness: -5%)}; + --karma-toast-bg-rgb: #{color.red(color.adjust($dark, $lightness: -5%))}, #{color.green(color.adjust($dark, $lightness: -5%))}, #{color.blue(color.adjust($dark, $lightness: -5%))}; + --karma-progress-bg: #{color.adjust($light, $lightness: -10%)}; + --karma-label-primary-border: #{color.adjust($primary, $lightness: 2%)}; + --karma-label-secondary-border: #{color.adjust($secondary, $lightness: -1%)}; + --karma-label-secondary-bg: #{color.adjust($secondary, $lightness: -2%)}; + --karma-label-success-border: #{color.adjust($success, $lightness: -2%)}; + --karma-label-danger-border: #{color.adjust($danger, $lightness: 2%)}; + --karma-label-warning-border: #{color.adjust($warning, $lightness: 3%)}; + --karma-label-info-border: #{color.adjust($info, $lightness: -2%)}; + --karma-label-dark-border: #{color.adjust($dark, $lightness: -2%)}; .modal { --bs-modal-bg: #{$white}; @@ -221,51 +214,50 @@ $body-secondary-color: $gray-600; [data-bs-theme="dark"] { background-color: #455a64; color: #{darkly.$body-color}; + --bs-body-bg: #455a64; --bs-body-bg-rgb: 69, 90, 100; - --bs-body-color: #{darkly.$body-color}; --bs-emphasis-color: #{darkly.$white}; --bs-secondary-color: #{rgba(darkly.$gray-300, 0.75)}; --bs-secondary-bg: #{darkly.$secondary}; --bs-tertiary-color: #{rgba(darkly.$gray-300, 0.5)}; - --bs-tertiary-bg: #{darken(darkly.$gray-800, 2%)}; + --bs-tertiary-bg: #{color.adjust(darkly.$gray-800, $lightness: -2%)}; --bs-primary: #455a64; --bs-secondary: #{darkly.$secondary}; --bs-success: #{darkly.$success}; --bs-info: #{darkly.$info}; --bs-warning: #{darkly.$warning}; --bs-danger: #{darkly.$danger}; - --bs-light: #{lighten(darkly.$gray-800, 5%)}; - --bs-dark: #{darken(darkly.$dark, 4%)}; + --bs-light: #{color.adjust(darkly.$gray-800, $lightness: 5%)}; + --bs-dark: #{color.adjust(darkly.$dark, $lightness: -4%)}; --bs-primary-rgb: 69, 90, 100; - --bs-secondary-rgb: #{red(darkly.$secondary)}, #{green(darkly.$secondary)}, #{blue(darkly.$secondary)}; - --bs-success-rgb: #{red(darkly.$success)}, #{green(darkly.$success)}, #{blue(darkly.$success)}; - --bs-info-rgb: #{red(darkly.$info)}, #{green(darkly.$info)}, #{blue(darkly.$info)}; - --bs-warning-rgb: #{red(darkly.$warning)}, #{green(darkly.$warning)}, #{blue(darkly.$warning)}; - --bs-danger-rgb: #{red(darkly.$danger)}, #{green(darkly.$danger)}, #{blue(darkly.$danger)}; - --bs-light-rgb: #{red(lighten(darkly.$gray-800, 5%))}, #{green(lighten(darkly.$gray-800, 5%))}, #{blue(lighten(darkly.$gray-800, 5%))}; - --bs-dark-rgb: #{red(darken(darkly.$dark, 4%))}, #{green(darken(darkly.$dark, 4%))}, #{blue(darken(darkly.$dark, 4%))}; + --bs-secondary-rgb: #{color.red(darkly.$secondary)}, #{color.green(darkly.$secondary)}, #{color.blue(darkly.$secondary)}; + --bs-success-rgb: #{color.red(darkly.$success)}, #{color.green(darkly.$success)}, #{color.blue(darkly.$success)}; + --bs-info-rgb: #{color.red(darkly.$info)}, #{color.green(darkly.$info)}, #{color.blue(darkly.$info)}; + --bs-warning-rgb: #{color.red(darkly.$warning)}, #{color.green(darkly.$warning)}, #{color.blue(darkly.$warning)}; + --bs-danger-rgb: #{color.red(darkly.$danger)}, #{color.green(darkly.$danger)}, #{color.blue(darkly.$danger)}; + --bs-light-rgb: #{color.red(color.adjust(darkly.$gray-800, $lightness: 5%))}, #{color.green(color.adjust(darkly.$gray-800, $lightness: 5%))}, #{color.blue(color.adjust(darkly.$gray-800, $lightness: 5%))}; + --bs-dark-rgb: #{color.red(color.adjust(darkly.$dark, $lightness: -4%))}, #{color.green(color.adjust(darkly.$dark, $lightness: -4%))}, #{color.blue(color.adjust(darkly.$dark, $lightness: -4%))}; --bs-link-color: #{darkly.$gray-400}; - --bs-link-hover-color: #{lighten(darkly.$gray-400, 10%)}; + --bs-link-hover-color: #{color.adjust(darkly.$gray-400, $lightness: 10%)}; --bs-border-color: #{darkly.$secondary}; - --karma-alert-bg: #{darkly.$gray-800}; - --karma-alert-history-inactive: #{lighten(darkly.$gray-700, 2%)}; - --karma-alertgroup-body-bg: #{lighten(darkly.$gray-700, 5%)}; - --karma-alertgroup-footer-bg: #{lighten(darkly.$gray-700, 2%)}; + --karma-alert-history-inactive: #{color.adjust(darkly.$gray-700, $lightness: 2%)}; + --karma-alertgroup-body-bg: #{color.adjust(darkly.$gray-700, $lightness: 5%)}; + --karma-alertgroup-footer-bg: #{color.adjust(darkly.$gray-700, $lightness: 2%)}; --karma-silence-id: #{darkly.$white}; --karma-silence-color: #{darkly.$white}; - --karma-silence-bg: #{lighten(darkly.$gray-900, 4%)}; + --karma-silence-bg: #{color.adjust(darkly.$gray-900, $lightness: 4%)}; --karma-silence-border: #{darkly.$black}; --karma-silence-comment-color: #{darkly.$gray-500}; --karma-filter-input-hoover-bg: #{darkly.$gray-700}; --karma-filter-input-hoover-color: #{darkly.$white}; --karma-placeholder-color: #{darkly.$gray-600}; --karma-filterinput-border: #{darkly.$navbar-dark-color}; - --karma-grid-swimlane-bg: #{lighten(darken(darkly.$dark, 4%), 2%)}; - --karma-bg-focused: #{darken(#455a64, 5%)}; - --karma-bg-focused-rgb: #{red(darken(#455a64, 5%))}, #{green(darken(#455a64, 5%))}, #{blue(darken(#455a64, 5%))}; + --karma-grid-swimlane-bg: #{color.adjust(color.adjust(darkly.$dark, $lightness: -4%), $lightness: 2%)}; + --karma-bg-focused: #{color.adjust(#455a64, $lightness: -5%)}; + --karma-bg-focused-rgb: #{color.red(color.adjust(#455a64, $lightness: -5%))}, #{color.green(color.adjust(#455a64, $lightness: -5%))}, #{color.blue(color.adjust(#455a64, $lightness: -5%))}; --karma-annotation-link-border: #{darkly.$secondary}; --karma-components-date-range-sub-color: #{darkly.$white}; --karma-input-range-track-background: #{darkly.$secondary}; @@ -274,19 +266,19 @@ $body-secondary-color: $gray-600; --karma-with-click-default: #{darkly.$white}; --karma-with-click-dark: #{darkly.$white}; --karma-with-click-light: #{darkly.$dark}; - --karma-accordion-border-color: #{lighten(darkly.$gray-700, 5%)}; + --karma-accordion-border-color: #{color.adjust(darkly.$gray-700, $lightness: 5%)}; --karma-link-color: #{darkly.$gray-400}; - --karma-toast-bg: #{darken(darken(darkly.$dark, 4%), 5%)}; - --karma-toast-bg-rgb: #{red(darken(darken(darkly.$dark, 4%), 5%))}, #{green(darken(darken(darkly.$dark, 4%), 5%))}, #{blue(darken(darken(darkly.$dark, 4%), 5%))}; + --karma-toast-bg: #{color.adjust(color.adjust(darkly.$dark, $lightness: -4%), $lightness: -5%)}; + --karma-toast-bg-rgb: #{color.red(color.adjust(color.adjust(darkly.$dark, $lightness: -4%), $lightness: -5%))}, #{color.green(color.adjust(color.adjust(darkly.$dark, $lightness: -4%), $lightness: -5%))}, #{color.blue(color.adjust(color.adjust(darkly.$dark, $lightness: -4%), $lightness: -5%))}; --karma-progress-bg: #{darkly.$black}; - --karma-label-primary-border: #{lighten(darkly.$primary, 2%)}; - --karma-label-secondary-border: #{darken(darkly.$secondary, 1%)}; - --karma-label-secondary-bg: #{darken(darkly.$secondary, 2%)}; - --karma-label-success-border: #{darken(darkly.$success, 2%)}; - --karma-label-danger-border: #{lighten(darkly.$danger, 2%)}; - --karma-label-warning-border: #{lighten(darkly.$warning, 3%)}; - --karma-label-info-border: #{darken(darkly.$info, 2%)}; - --karma-label-dark-border: #{darken(darkly.$dark, 2%)}; + --karma-label-primary-border: #{color.adjust(darkly.$primary, $lightness: 2%)}; + --karma-label-secondary-border: #{color.adjust(darkly.$secondary, $lightness: -1%)}; + --karma-label-secondary-bg: #{color.adjust(darkly.$secondary, $lightness: -2%)}; + --karma-label-success-border: #{color.adjust(darkly.$success, $lightness: -2%)}; + --karma-label-danger-border: #{color.adjust(darkly.$danger, $lightness: 2%)}; + --karma-label-warning-border: #{color.adjust(darkly.$warning, $lightness: 3%)}; + --karma-label-info-border: #{color.adjust(darkly.$info, $lightness: -2%)}; + --karma-label-dark-border: #{color.adjust(darkly.$dark, $lightness: -2%)}; // Component overrides for dark theme .badge, @@ -298,6 +290,7 @@ $body-secondary-color: $gray-600; @supports (backdrop-filter: blur(12px)) { background-color: rgba(#455a64, 0.85); } + @supports not (backdrop-filter: blur(12px)) { background-color: rgba(#455a64, 0.95); } @@ -353,7 +346,7 @@ $body-secondary-color: $gray-600; } .dropdown-menu { - --bs-dropdown-bg: #{darken(darkly.$gray-800, 2%)}; + --bs-dropdown-bg: #{color.adjust(darkly.$gray-800, $lightness: -2%)}; --bs-dropdown-border-color: #{darkly.$gray-700}; --bs-dropdown-divider-bg: #{darkly.$gray-700}; --bs-dropdown-link-color: #{darkly.$white}; @@ -369,10 +362,10 @@ $body-secondary-color: $gray-600; .btn-secondary { --bs-btn-bg: #{darkly.$secondary}; --bs-btn-border-color: #{darkly.$secondary}; - --bs-btn-hover-bg: #{lighten(darkly.$secondary, 5%)}; - --bs-btn-hover-border-color: #{lighten(darkly.$secondary, 5%)}; - --bs-btn-active-bg: #{lighten(darkly.$secondary, 8%)}; - --bs-btn-active-border-color: #{lighten(darkly.$secondary, 8%)}; + --bs-btn-hover-bg: #{color.adjust(darkly.$secondary, $lightness: 5%)}; + --bs-btn-hover-border-color: #{color.adjust(darkly.$secondary, $lightness: 5%)}; + --bs-btn-active-bg: #{color.adjust(darkly.$secondary, $lightness: 8%)}; + --bs-btn-active-border-color: #{color.adjust(darkly.$secondary, $lightness: 8%)}; --bs-btn-disabled-bg: #{darkly.$secondary}; --bs-btn-disabled-border-color: #{darkly.$secondary}; } @@ -409,7 +402,7 @@ $body-secondary-color: $gray-600; --bs-accordion-bg: #{darkly.$gray-800}; --bs-accordion-btn-bg: #{darkly.$gray-700}; --bs-accordion-active-bg: #{darkly.$gray-700}; - --bs-accordion-border-color: #{lighten(darkly.$gray-700, 5%)}; + --bs-accordion-border-color: #{color.adjust(darkly.$gray-700, $lightness: 5%)}; --bs-accordion-btn-color: #{darkly.$white}; } @@ -451,7 +444,7 @@ $body-secondary-color: $gray-600; --bs-pagination-hover-color: #{darkly.$white}; --bs-pagination-hover-bg: #455a64; --bs-pagination-active-bg: #455a64; - --bs-pagination-border-color: #{darken(darkly.$dark, 4%)}; + --bs-pagination-border-color: #{color.adjust(darkly.$dark, $lightness: -4%)}; --bs-pagination-disabled-color: #{darkly.$gray-600}; --bs-pagination-disabled-bg: #{darkly.$gray-700}; } @@ -504,6 +497,7 @@ $body-secondary-color: $gray-600; // } } +/* stylelint-disable-next-line no-invalid-position-at-import-rule */ @import "./Components"; a { diff --git a/ui/stylelint.config.mjs b/ui/stylelint.config.mjs new file mode 100644 index 000000000..7b625c9db --- /dev/null +++ b/ui/stylelint.config.mjs @@ -0,0 +1,4 @@ +/** @type {import("stylelint").Config} */ +export default { + "extends": ["stylelint-config-standard-scss"] +};