From 1cc832867dbe93945ad3c31e6b8f521045e11ea3 Mon Sep 17 00:00:00 2001 From: Nad Alaba <37968805+nadalaba@users.noreply.github.com> Date: Wed, 25 Mar 2026 18:33:07 +0300 Subject: [PATCH 01/29] add stylelint for scss with all rules disabled --- package.json | 2 + pnpm-lock.yaml | 624 ++++++++++++++++++++++++++++++++++++++----- stylelint.config.mjs | 57 ++++ 3 files changed, 622 insertions(+), 61 deletions(-) create mode 100644 stylelint.config.mjs diff --git a/package.json b/package.json index 45a9bab2499c..8bbbbb5b2a30 100644 --- a/package.json +++ b/package.json @@ -72,6 +72,8 @@ "oxlint": "1.57.0", "oxlint-tsgolint": "0.17.3", "prettier": "3.7.1", + "stylelint": "17.5.0", + "stylelint-config-standard-scss": "17.0.0", "turbo": "2.7.5", "vitest": "4.1.0" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1e40af4d5068..314993eb21df 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -53,6 +53,12 @@ importers: prettier: specifier: 3.7.1 version: 3.7.1 + stylelint: + specifier: 17.5.0 + version: 17.5.0(typescript@5.9.3) + stylelint-config-standard-scss: + specifier: 17.0.0 + version: 17.0.0(postcss@8.5.8)(stylelint@17.5.0(typescript@5.9.3)) turbo: specifier: 2.7.5 version: 2.7.5 @@ -659,7 +665,7 @@ importers: version: 6.0.2 vitest: specifier: 4.1.0 - version: 4.1.0(@types/node@24.9.1)(happy-dom@20.0.10)(jsdom@27.4.0)(vite@8.0.1(@types/node@24.9.1)(esbuild@0.25.11)(jiti@2.6.1)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 4.1.0(@opentelemetry/api@1.8.0)(@types/node@24.9.1)(happy-dom@20.0.10)(jsdom@27.4.0)(vite@8.0.1(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)) packages/funbox: dependencies: @@ -1384,6 +1390,12 @@ packages: resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} + '@cacheable/memory@2.0.8': + resolution: {integrity: sha512-FvEb29x5wVwu/Kf93IWwsOOEuhHh6dYCJF3vcKLzXc0KXIW181AOzv6ceT4ZpBHDvAfG60eqb+ekmrnLHIy+jw==} + + '@cacheable/utils@2.4.0': + resolution: {integrity: sha512-PeMMsqjVq+bF0WBsxFBxr/WozBJiZKY0rUojuaCoIaKnEl3Ju1wfEwS+SV1DU/cSe8fqHIPiYJFif8T3MVt4cQ==} + '@chromatic-com/storybook@5.0.1': resolution: {integrity: sha512-v80QBwVd8W6acH5NtDgFlUevIBaMZAh1pYpBiB40tuNzS242NTHeQHBDGYwIAbWKDnt1qfjJpcpL6pj5kAr4LA==} engines: {node: '>=20.0.0', yarn: '>=1.22.18'} @@ -1498,6 +1510,13 @@ packages: '@csstools/css-parser-algorithms': ^3.0.5 '@csstools/css-tokenizer': ^3.0.4 + '@csstools/css-calc@3.1.1': + resolution: {integrity: sha512-HJ26Z/vmsZQqs/o3a6bgKslXGFAungXGbinULZO3eMsOyNJHeBBZfup5FiZInOghgoM4Hwnmw+OgbJCNg1wwUQ==} + engines: {node: '>=20.19.0'} + peerDependencies: + '@csstools/css-parser-algorithms': ^4.0.0 + '@csstools/css-tokenizer': ^4.0.0 + '@csstools/css-color-parser@3.1.0': resolution: {integrity: sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==} engines: {node: '>=18'} @@ -1511,14 +1530,51 @@ packages: peerDependencies: '@csstools/css-tokenizer': ^3.0.4 + '@csstools/css-parser-algorithms@4.0.0': + resolution: {integrity: sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==} + engines: {node: '>=20.19.0'} + peerDependencies: + '@csstools/css-tokenizer': ^4.0.0 + '@csstools/css-syntax-patches-for-csstree@1.0.23': resolution: {integrity: sha512-YEmgyklR6l/oKUltidNVYdjSmLSW88vMsKx0pmiS3r71s8ZZRpd8A0Yf0U+6p/RzElmMnPBv27hNWjDQMSZRtQ==} engines: {node: '>=18'} + '@csstools/css-syntax-patches-for-csstree@1.1.1': + resolution: {integrity: sha512-BvqN0AMWNAnLk9G8jnUT77D+mUbY/H2b3uDTvg2isJkHaOufUE2R3AOwxWo7VBQKT1lOdwdvorddo2B/lk64+w==} + peerDependencies: + css-tree: ^3.2.1 + peerDependenciesMeta: + css-tree: + optional: true + '@csstools/css-tokenizer@3.0.4': resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} engines: {node: '>=18'} + '@csstools/css-tokenizer@4.0.0': + resolution: {integrity: sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==} + engines: {node: '>=20.19.0'} + + '@csstools/media-query-list-parser@5.0.0': + resolution: {integrity: sha512-T9lXmZOfnam3eMERPsszjY5NK0jX8RmThmmm99FZ8b7z8yMaFZWKwLWGZuTwdO3ddRY5fy13GmmEYZXB4I98Eg==} + engines: {node: '>=20.19.0'} + peerDependencies: + '@csstools/css-parser-algorithms': ^4.0.0 + '@csstools/css-tokenizer': ^4.0.0 + + '@csstools/selector-resolve-nested@4.0.0': + resolution: {integrity: sha512-9vAPxmp+Dx3wQBIUwc1v7Mdisw1kbbaGqXUM8QLTgWg7SoPGYtXBsMXvsFs/0Bn5yoFhcktzxNZGNaUt0VjgjA==} + engines: {node: '>=20.19.0'} + peerDependencies: + postcss-selector-parser: ^7.1.1 + + '@csstools/selector-specificity@6.0.0': + resolution: {integrity: sha512-4sSgl78OtOXEX/2d++8A83zHNTgwCJMaR24FvsYL7Uf/VS8HZk9PTwR51elTbGqMuwH3szLvvOXEaVnqn0Z3zA==} + engines: {node: '>=20.19.0'} + peerDependencies: + postcss-selector-parser: ^7.1.1 + '@dabh/diagnostics@2.0.3': resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} @@ -2402,6 +2458,15 @@ packages: '@jsdevtools/ono@7.1.3': resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} + '@keyv/bigmap@1.3.1': + resolution: {integrity: sha512-WbzE9sdmQtKy8vrNPa9BRnwZh5UF4s1KTmSK0KUVLo3eff5BlQNNWDnFOouNpKfPKDnms9xynJjsMYjMaT/aFQ==} + engines: {node: '>= 18'} + peerDependencies: + keyv: ^5.6.0 + + '@keyv/serialize@1.1.1': + resolution: {integrity: sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==} + '@kwsites/file-exists@1.1.1': resolution: {integrity: sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==} @@ -3409,6 +3474,10 @@ packages: resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} engines: {node: '>=10'} + '@sindresorhus/merge-streams@4.0.0': + resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} + engines: {node: '>=18'} + '@snyk/github-codeowners@1.1.0': resolution: {integrity: sha512-lGFf08pbkEac0NYgVf4hdANpAgApRjNByLXB+WBip3qj1iendOIyAwP2GKkKbQMNVy2r1xxDf0ssfWscoiC+Vw==} engines: {node: '>=8.10'} @@ -4880,6 +4949,9 @@ packages: resolution: {integrity: sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ==} engines: {node: ^16.14.0 || >=18.0.0} + cacheable@2.3.4: + resolution: {integrity: sha512-djgxybDbw9fL/ZWMI3+CE8ZilNxcwFkVtDc1gJ+IlOSSWkSMPQabhV/XCHTQ6pwwN6aivXPZ43omTooZiX06Ew==} + call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} @@ -5113,6 +5185,9 @@ packages: color@3.2.1: resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} + colord@2.9.3: + resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} + colorette@1.4.0: resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} @@ -5354,6 +5429,15 @@ packages: typescript: optional: true + cosmiconfig@9.0.1: + resolution: {integrity: sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + cpu-features@0.0.10: resolution: {integrity: sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA==} engines: {node: '>=10.0.0'} @@ -5398,6 +5482,10 @@ packages: resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} engines: {node: '>=4'} + css-functions-list@3.3.3: + resolution: {integrity: sha512-8HFEBPKhOpJPEPu70wJJetjKta86Gw9+CCyCnB3sui2qQfOvRyqBy4IKLKKAwdMpWb2lHXWk9Wb4Z6AmaUT1Pg==} + engines: {node: '>=12'} + css-select@5.1.0: resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} @@ -5408,6 +5496,10 @@ packages: resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + css-tree@3.2.1: + resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + css-what@6.1.0: resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} engines: {node: '>= 6'} @@ -5415,6 +5507,11 @@ packages: css.escape@1.5.1: resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + cssstyle@5.3.7: resolution: {integrity: sha512-7D2EPVltRrsTkhpQmksIu+LxeWAIEk6wRDMJ1qljlv+CKHJM+cJLlfhWIzNA44eAsHXSNe3+vO6DW1yCYx8SuQ==} engines: {node: '>=20'} @@ -6074,6 +6171,10 @@ packages: resolution: {integrity: sha512-Z7Fh2nVQSb2d+poDViM063ix2ZGt9jmY1nWhPfHBOK2Hgnb/OW3P4Et3P/81SEej0J7QbWtJqxO05h8QYfK7LQ==} hasBin: true + fastest-levenshtein@1.0.16: + resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} + engines: {node: '>= 4.9.1'} + fastify@3.29.5: resolution: {integrity: sha512-FBDgb1gkenZxxh4sTD6AdI6mFnZnsgckpjIXzIvfLSYCa4isfQeD8QWGPib63dxq6btnY0l1j8I0xYhMvUb+sw==} @@ -6100,6 +6201,9 @@ packages: resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} engines: {node: '>=8'} + file-entry-cache@11.1.2: + resolution: {integrity: sha512-N2WFfK12gmrK1c1GXOqiAJ1tc5YE+R53zvQ+t5P8S5XhnmKYVB5eZEiLNZKDSmoG8wqqbF9EXYBBW/nef19log==} + file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} @@ -6172,12 +6276,18 @@ packages: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} + flat-cache@6.1.21: + resolution: {integrity: sha512-2u7cJfSf7Th7NxEk/VzQjnPoglok2YCsevS7TSbJjcDQWJPbqUUnSYtriHSvtnq+fRZHy1s0ugk4ApnQyhPGoQ==} + flatstr@1.0.12: resolution: {integrity: sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw==} flatted@3.3.3: resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + flatted@3.4.2: + resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} + fn.name@1.1.0: resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} @@ -6328,6 +6438,10 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} + get-east-asian-width@1.5.0: + resolution: {integrity: sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==} + engines: {node: '>=18'} + get-intrinsic@1.3.0: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} @@ -6429,6 +6543,14 @@ packages: resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} engines: {node: '>=10'} + global-modules@2.0.0: + resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} + engines: {node: '>=6'} + + global-prefix@3.0.0: + resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} + engines: {node: '>=6'} + globals@14.0.0: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} @@ -6449,6 +6571,13 @@ packages: resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + globby@16.1.1: + resolution: {integrity: sha512-dW7vl+yiAJSp6aCekaVnVJxurRv7DCOLyXqEG3RYMYUg7AuJ2jCqPkZTA8ooqC2vtnkaMcV5WfFBMuEnTu1OQg==} + engines: {node: '>=20'} + + globjoin@0.1.4: + resolution: {integrity: sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==} + gonzales-pe@4.3.0: resolution: {integrity: sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==} engines: {node: '>=0.6.0'} @@ -6516,6 +6645,10 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} + has-flag@5.0.1: + resolution: {integrity: sha512-CsNUt5x9LUdx6hnk/E2SZLsDyvfqANZSUq4+D3D8RzDJ2M+HDTIkF60ibS1vHaK55vzgiZw1bEPFG9yH7l33wA==} + engines: {node: '>=12'} + has-own-property@0.1.0: resolution: {integrity: sha512-14qdBKoonU99XDhWcFKZTShK+QV47qU97u8zzoVo9cL5TZ3BmBHXogItSt9qJjR0KUMFRhcCW8uGIGl8nkl7Aw==} @@ -6541,6 +6674,10 @@ packages: resolution: {integrity: sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==} engines: {node: '>=8'} + hashery@1.5.1: + resolution: {integrity: sha512-iZyKG96/JwPz1N55vj2Ie2vXbhu440zfUfJvSwEqEbeLluk7NnapfGqa7LH0mOsnDxTF85Mx8/dyR6HfqcbmbQ==} + engines: {node: '>=20'} + hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} @@ -6560,6 +6697,12 @@ packages: highlight.js@10.7.3: resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} + hookified@1.15.1: + resolution: {integrity: sha512-MvG/clsADq1GPM2KGo2nyfaWVyn9naPiXrqIe4jYjXNZQt238kWyOGrsyc/DmRAQ+Re6yeo6yX/yoNCG5KAEVg==} + + hookified@2.1.0: + resolution: {integrity: sha512-ootKng4eaxNxa7rx6FJv2YKef3DuhqbEj3l70oGXwddPQEEnISm50TEZQclqiLTAtilT2nu7TErtCO523hHkyg==} + hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} @@ -6601,6 +6744,10 @@ packages: resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} engines: {node: '>=8'} + html-tags@5.1.0: + resolution: {integrity: sha512-n6l5uca7/y5joxZ3LUePhzmBFUJ+U2YWzhMa8XUTecSeSlQiZdF5XAd/Q3/WUl0VsXgUwWi8I7CNIwdI5WN1SQ==} + engines: {node: '>=20.10'} + htmlparser2@5.0.1: resolution: {integrity: sha512-vKZZra6CSe9qsJzh0BjBGXo8dvzNsq/oGvsjfRdOrrryfeD9UOBEEQdeoqCRmKZchF5h2zOBMQ6YuQ0uRUmdbQ==} @@ -6683,6 +6830,10 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + immutable@4.3.8: resolution: {integrity: sha512-d/Ld9aLbKpNwyl0KiM2CT1WYvkitQ1TSvmRtkcV8FKStiDoA7Slzgjmb/1G2yhKM1p0XeNOieaTbFZmU1d3Xuw==} @@ -6914,10 +7065,18 @@ packages: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} + is-path-inside@4.0.0: + resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==} + engines: {node: '>=12'} + is-plain-obj@1.1.0: resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} engines: {node: '>=0.10.0'} + is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} @@ -7221,6 +7380,9 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + keyv@5.6.0: + resolution: {integrity: sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==} + kind-of@6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} @@ -7233,6 +7395,9 @@ packages: known-css-properties@0.30.0: resolution: {integrity: sha512-VSWXYUnsPu9+WYKkfmJyLKtIvaRJi1kXUqVmBACORXZQxT5oZDsoZ2vQP+bQFDnWtpI/4eq3MLoRMjI2fnLzTQ==} + known-css-properties@0.37.0: + resolution: {integrity: sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==} + kuler@2.0.0: resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} @@ -7512,6 +7677,9 @@ packages: lodash.startcase@4.4.0: resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + lodash.truncate@4.4.2: + resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} + lodash.uniq@4.5.0: resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} @@ -7670,9 +7838,15 @@ packages: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} + mathml-tag-names@4.0.0: + resolution: {integrity: sha512-aa6AU2Pcx0VP/XWnh8IGL0SYSgQHDT6Ucror2j2mXeFAlN3ahaNs8EZtG1YiticMkSLj3Gt6VPFfZogt7G5iFQ==} + mdn-data@2.12.2: resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} + mdn-data@2.27.1: + resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} + media-typer@0.3.0: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} @@ -7691,6 +7865,10 @@ packages: resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==} engines: {node: '>=18'} + meow@14.1.0: + resolution: {integrity: sha512-EDYo6VlmtnumlcBCbh1gLJ//9jvM/ndXHfVXIFrZVr6fGcwTUyCTFNTLCKuY3ffbK8L/+3Mzqnd58RojiZqHVw==} + engines: {node: '>=20'} + meow@8.1.2: resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} engines: {node: '>=10'} @@ -8647,6 +8825,28 @@ packages: yaml: optional: true + postcss-media-query-parser@0.2.3: + resolution: {integrity: sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==} + + postcss-resolve-nested-selector@0.1.6: + resolution: {integrity: sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==} + + postcss-safe-parser@7.0.1: + resolution: {integrity: sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==} + engines: {node: '>=18.0'} + peerDependencies: + postcss: 8.5.8 + + postcss-scss@4.0.9: + resolution: {integrity: sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: 8.5.8 + + postcss-selector-parser@7.1.1: + resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==} + engines: {node: '>=4'} + postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} @@ -8792,6 +8992,10 @@ packages: resolution: {integrity: sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==} engines: {node: '>=8'} + qified@0.9.0: + resolution: {integrity: sha512-4q61YgkHbY6gmwkqm0BsxyLDO3UYdrdiJTJ7JiaZb3xpW1duxn135SB7KqUEkCiuu5O4W+TtwEWP2VjmSRanvA==} + engines: {node: '>=20'} + qs@6.13.0: resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} engines: {node: '>=0.6'} @@ -9366,6 +9570,10 @@ packages: resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} engines: {node: '>=12'} + slash@5.1.0: + resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} + engines: {node: '>=14.16'} + slice-ansi@3.0.0: resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} engines: {node: '>=8'} @@ -9595,6 +9803,10 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} + string-width@8.2.0: + resolution: {integrity: sha512-6hJPQ8N0V0P3SNmP6h2J99RLuzrWz2gvT7VnK5tKvrNqJoyS9W4/Fb8mo31UiPvy00z7DQXkP2hnKBVav76thw==} + engines: {node: '>=20'} + string.fromcodepoint@0.2.1: resolution: {integrity: sha512-n69H31OnxSGSZyZbgBlvYIXlrMhJQ0dQAX1js1QDhpaUH6zmU3QYlj07bCwCNlPOu3oRXIubGPl2gDGnHsiCqg==} @@ -9686,6 +9898,49 @@ packages: react-dom: optional: true + stylelint-config-recommended-scss@17.0.0: + resolution: {integrity: sha512-VkVD9r7jfUT/dq3mA3/I1WXXk2U71rO5wvU2yIil9PW5o1g3UM7Xc82vHmuVJHV7Y8ok5K137fmW5u3HbhtTOA==} + engines: {node: '>=20'} + peerDependencies: + postcss: 8.5.8 + stylelint: ^17.0.0 + peerDependenciesMeta: + postcss: + optional: true + + stylelint-config-recommended@18.0.0: + resolution: {integrity: sha512-mxgT2XY6YZ3HWWe3Di8umG6aBmWmHTblTgu/f10rqFXnyWxjKWwNdjSWkgkwCtxIKnqjSJzvFmPT5yabVIRxZg==} + engines: {node: '>=20.19.0'} + peerDependencies: + stylelint: ^17.0.0 + + stylelint-config-standard-scss@17.0.0: + resolution: {integrity: sha512-uLJS6xgOCBw5EMsDW7Ukji8l28qRoMnkRch15s0qwZpskXvWt9oPzMmcYM307m9GN4MxuWLsQh4I6hU9yI53cQ==} + engines: {node: '>=20'} + peerDependencies: + postcss: 8.5.8 + stylelint: ^17.0.0 + peerDependenciesMeta: + postcss: + optional: true + + stylelint-config-standard@40.0.0: + resolution: {integrity: sha512-EznGJxOUhtWck2r6dJpbgAdPATIzvpLdK9+i5qPd4Lx70es66TkBPljSg4wN3Qnc6c4h2n+WbUrUynQ3fanjHw==} + engines: {node: '>=20.19.0'} + peerDependencies: + stylelint: ^17.0.0 + + stylelint-scss@7.0.0: + resolution: {integrity: sha512-H88kCC+6Vtzj76NsC8rv6x/LW8slBzIbyeSjsKVlS+4qaEJoDrcJR4L+8JdrR2ORdTscrBzYWiiT2jq6leYR1Q==} + engines: {node: '>=20.19.0'} + peerDependencies: + stylelint: ^16.8.2 || ^17.0.0 + + stylelint@17.5.0: + resolution: {integrity: sha512-o/NS6zhsPZFmgUm5tXX4pVNg1XDOZSlucLdf2qow/lVn4JIyzZIQ5b3kad1ugqUj3GSIgr2u5lQw7X8rjqw33g==} + engines: {node: '>=20.19.0'} + hasBin: true + stylis@4.3.6: resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==} @@ -9718,6 +9973,10 @@ packages: resolution: {integrity: sha512-tjLPs7dVyqgItVFirHYqe2T+MfWc2VOBQ8QFKKbWTA3PU7liZR8zoSpAi/C1k1ilm9RsXIKYf197oap9wXGVYg==} engines: {node: '>=14.18.0'} + supports-color@10.2.2: + resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==} + engines: {node: '>=18'} + supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -9734,10 +9993,17 @@ packages: resolution: {integrity: sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA==} engines: {node: '>=14.18'} + supports-hyperlinks@4.4.0: + resolution: {integrity: sha512-UKbpT93hN5Nr9go5UY7bopIB9YQlMz9nm/ct4IXt/irb5YRkn9WaqrOBJGZ5Pwvsd5FQzSVeYlGdXoCAPQZrPg==} + engines: {node: '>=20'} + supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + svg-tags@1.0.0: + resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==} + swagger-stats@0.99.7: resolution: {integrity: sha512-niP70m99Cwpz/Fyfk8ydul1jM0pOKD6UofSaDzW2Op6o6WYFsuAl/BhVbmLkZWOAZ7IloDVvFj6vaU5zA0xydg==} peerDependencies: @@ -9750,6 +10016,10 @@ packages: symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + table@6.9.0: + resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==} + engines: {node: '>=10.0.0'} + tailwind-merge@3.4.0: resolution: {integrity: sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==} @@ -10197,6 +10467,10 @@ packages: resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} engines: {node: '>=18'} + unicorn-magic@0.4.0: + resolution: {integrity: sha512-wH590V9VNgYH9g3lH9wWjTrUoKsjLF6sGLjhR4sH1LWpLmCOH0Zf7PukhDA8BiS7KHe4oPNkcTHqYkj7SOGUOw==} + engines: {node: '>=20'} + unique-filename@3.0.0: resolution: {integrity: sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -10719,6 +10993,10 @@ packages: write-file-atomic@3.0.3: resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + write-file-atomic@7.0.1: + resolution: {integrity: sha512-OTIk8iR8/aCRWBqvxrzxR0hgxWpnYBblY1S5hDWBQfk/VFmJwzmJgQFN3WsoUKHISv2eAwe+PpbUzyL1CKTLXg==} + engines: {node: ^20.17.0 || >=22.9.0} + ws@7.5.10: resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} engines: {node: '>=8.3.0'} @@ -11548,13 +11826,13 @@ snapshots: '@babel/template@7.28.6': dependencies: - '@babel/code-frame': 7.28.6 + '@babel/code-frame': 7.29.0 '@babel/parser': 7.28.6 '@babel/types': 7.28.6 '@babel/traverse@7.28.6': dependencies: - '@babel/code-frame': 7.28.6 + '@babel/code-frame': 7.29.0 '@babel/generator': 7.28.6 '@babel/helper-globals': 7.28.0 '@babel/parser': 7.28.6 @@ -11590,6 +11868,18 @@ snapshots: '@bcoe/v8-coverage@1.0.2': {} + '@cacheable/memory@2.0.8': + dependencies: + '@cacheable/utils': 2.4.0 + '@keyv/bigmap': 1.3.1(keyv@5.6.0) + hookified: 1.15.1 + keyv: 5.6.0 + + '@cacheable/utils@2.4.0': + dependencies: + hashery: 1.5.1 + keyv: 5.6.0 + '@chromatic-com/storybook@5.0.1(storybook@10.2.16(@testing-library/dom@10.4.1)(prettier@3.7.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': dependencies: '@neoconfetti/react': 1.0.0 @@ -11748,6 +12038,11 @@ snapshots: '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 + '@csstools/css-calc@3.1.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': + dependencies: + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) + '@csstools/css-tokenizer': 4.0.0 + '@csstools/css-color-parser@3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': dependencies: '@csstools/color-helpers': 5.1.0 @@ -11759,10 +12054,33 @@ snapshots: dependencies: '@csstools/css-tokenizer': 3.0.4 + '@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0)': + dependencies: + '@csstools/css-tokenizer': 4.0.0 + '@csstools/css-syntax-patches-for-csstree@1.0.23': {} + '@csstools/css-syntax-patches-for-csstree@1.1.1(css-tree@3.2.1)': + optionalDependencies: + css-tree: 3.2.1 + '@csstools/css-tokenizer@3.0.4': {} + '@csstools/css-tokenizer@4.0.0': {} + + '@csstools/media-query-list-parser@5.0.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': + dependencies: + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) + '@csstools/css-tokenizer': 4.0.0 + + '@csstools/selector-resolve-nested@4.0.0(postcss-selector-parser@7.1.1)': + dependencies: + postcss-selector-parser: 7.1.1 + + '@csstools/selector-specificity@6.0.0(postcss-selector-parser@7.1.1)': + dependencies: + postcss-selector-parser: 7.1.1 + '@dabh/diagnostics@2.0.3': dependencies: colorspace: 1.1.4 @@ -12755,6 +13073,14 @@ snapshots: '@jsdevtools/ono@7.1.3': {} + '@keyv/bigmap@1.3.1(keyv@5.6.0)': + dependencies: + hashery: 1.5.1 + hookified: 1.15.1 + keyv: 5.6.0 + + '@keyv/serialize@1.1.1': {} + '@kwsites/file-exists@1.1.1': dependencies: debug: 4.4.3(supports-color@5.5.0) @@ -13612,6 +13938,8 @@ snapshots: '@sindresorhus/is@4.6.0': {} + '@sindresorhus/merge-streams@4.0.0': {} + '@snyk/github-codeowners@1.1.0': dependencies: commander: 4.1.1 @@ -14727,14 +15055,6 @@ snapshots: optionalDependencies: vite: 8.0.1(@types/node@20.5.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2) - '@vitest/mocker@4.1.0(vite@8.0.1(@types/node@24.9.1)(esbuild@0.25.11)(jiti@2.6.1)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2))': - dependencies: - '@vitest/spy': 4.1.0 - estree-walker: 3.0.3 - magic-string: 0.30.21 - optionalDependencies: - vite: 8.0.1(@types/node@24.9.1)(esbuild@0.25.11)(jiti@2.6.1)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2) - '@vitest/mocker@4.1.0(vite@8.0.1(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@vitest/spy': 4.1.0 @@ -15388,6 +15708,14 @@ snapshots: unique-filename: 3.0.0 optional: true + cacheable@2.3.4: + dependencies: + '@cacheable/memory': 2.0.8 + '@cacheable/utils': 2.4.0 + hookified: 1.15.1 + keyv: 5.6.0 + qified: 0.9.0 + call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 @@ -15615,6 +15943,8 @@ snapshots: color-convert: 1.9.3 color-string: 1.9.1 + colord@2.9.3: {} + colorette@1.4.0: {} colorette@2.0.20: {} @@ -15865,6 +16195,15 @@ snapshots: optionalDependencies: typescript: 5.9.3 + cosmiconfig@9.0.1(typescript@5.9.3): + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.1 + js-yaml: 4.1.1 + parse-json: 5.2.0 + optionalDependencies: + typescript: 5.9.3 + cpu-features@0.0.10: dependencies: buildcheck: 0.0.6 @@ -15910,6 +16249,8 @@ snapshots: css-color-keywords@1.0.0: {} + css-functions-list@3.3.3: {} + css-select@5.1.0: dependencies: boolbase: 1.0.0 @@ -15929,10 +16270,17 @@ snapshots: mdn-data: 2.12.2 source-map-js: 1.2.1 + css-tree@3.2.1: + dependencies: + mdn-data: 2.27.1 + source-map-js: 1.2.1 + css-what@6.1.0: {} css.escape@1.5.1: {} + cssesc@3.0.0: {} + cssstyle@5.3.7: dependencies: '@asamuzakjp/css-color': 4.1.1 @@ -16315,8 +16663,7 @@ snapshots: entities@6.0.1: {} - env-paths@2.2.1: - optional: true + env-paths@2.2.1: {} environment@1.1.0: {} @@ -16792,6 +17139,8 @@ snapshots: path-expression-matcher: 1.2.0 strnum: 2.2.2 + fastest-levenshtein@1.0.16: {} + fastify@3.29.5: dependencies: '@fastify/ajv-compiler': 1.1.0 @@ -16831,6 +17180,10 @@ snapshots: dependencies: escape-string-regexp: 1.0.5 + file-entry-cache@11.1.2: + dependencies: + flat-cache: 6.1.21 + file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 @@ -17047,10 +17400,18 @@ snapshots: flatted: 3.3.3 keyv: 4.5.4 + flat-cache@6.1.21: + dependencies: + cacheable: 2.3.4 + flatted: 3.4.2 + hookified: 1.15.1 + flatstr@1.0.12: {} flatted@3.3.3: {} + flatted@3.4.2: {} + fn.name@1.1.0: {} follow-redirects@1.15.6(debug@4.4.3): @@ -17210,6 +17571,8 @@ snapshots: get-caller-file@2.0.5: {} + get-east-asian-width@1.5.0: {} + get-intrinsic@1.3.0: dependencies: call-bind-apply-helpers: 1.0.2 @@ -17344,6 +17707,16 @@ snapshots: dependencies: ini: 2.0.0 + global-modules@2.0.0: + dependencies: + global-prefix: 3.0.0 + + global-prefix@3.0.0: + dependencies: + ini: 1.3.8 + kind-of: 6.0.3 + which: 1.3.1 + globals@14.0.0: {} globals@15.15.0: {} @@ -17370,6 +17743,17 @@ snapshots: merge2: 1.4.1 slash: 4.0.0 + globby@16.1.1: + 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 + + globjoin@0.1.4: {} + gonzales-pe@4.3.0: dependencies: minimist: 1.2.8 @@ -17461,6 +17845,8 @@ snapshots: has-flag@4.0.0: {} + has-flag@5.0.1: {} + has-own-property@0.1.0: {} has-property-descriptors@1.0.2: @@ -17481,6 +17867,10 @@ snapshots: has-yarn@2.1.0: {} + hashery@1.5.1: + dependencies: + hookified: 1.15.1 + hasown@2.0.2: dependencies: function-bind: 1.1.2 @@ -17493,6 +17883,10 @@ snapshots: highlight.js@10.7.3: {} + hookified@1.15.1: {} + + hookified@2.1.0: {} + hosted-git-info@2.8.9: {} hosted-git-info@4.1.0: @@ -17540,6 +17934,8 @@ snapshots: html-tags@3.3.1: {} + html-tags@5.1.0: {} + htmlparser2@5.0.1: dependencies: domelementtype: 2.3.0 @@ -17636,6 +18032,8 @@ snapshots: ignore@5.3.2: {} + ignore@7.0.5: {} + immutable@4.3.8: {} immutable@5.1.5: @@ -17872,8 +18270,12 @@ snapshots: is-path-inside@3.0.3: {} + is-path-inside@4.0.0: {} + is-plain-obj@1.1.0: {} + is-plain-object@5.0.0: {} + is-potential-custom-element-name@1.0.1: {} is-promise@4.0.0: {} @@ -18200,6 +18602,10 @@ snapshots: dependencies: json-buffer: 3.0.1 + keyv@5.6.0: + dependencies: + '@keyv/serialize': 1.1.1 + kind-of@6.0.3: {} knip@2.19.2: @@ -18224,6 +18630,8 @@ snapshots: known-css-properties@0.30.0: {} + known-css-properties@0.37.0: {} + kuler@2.0.0: {} lazystream@1.0.1: @@ -18448,6 +18856,8 @@ snapshots: lodash.startcase@4.4.0: {} + lodash.truncate@4.4.2: {} + lodash.uniq@4.5.0: {} lodash.upperfirst@4.3.1: {} @@ -18617,8 +19027,12 @@ snapshots: math-intrinsics@1.1.0: {} + mathml-tag-names@4.0.0: {} + mdn-data@2.12.2: {} + mdn-data@2.27.1: {} + media-typer@0.3.0: {} media-typer@1.1.0: {} @@ -18629,6 +19043,8 @@ snapshots: meow@13.2.0: {} + meow@14.1.0: {} + meow@8.1.2: dependencies: '@types/minimist': 1.2.5 @@ -19604,14 +20020,14 @@ snapshots: parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.28.6 + '@babel/code-frame': 7.29.0 error-ex: 1.3.4 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 parse-json@8.3.0: dependencies: - '@babel/code-frame': 7.28.6 + '@babel/code-frame': 7.29.0 index-to-position: 1.2.0 type-fest: 4.41.0 @@ -19795,6 +20211,23 @@ snapshots: tsx: 4.21.0 yaml: 2.8.2 + postcss-media-query-parser@0.2.3: {} + + postcss-resolve-nested-selector@0.1.6: {} + + postcss-safe-parser@7.0.1(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + + postcss-scss@4.0.9(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + + postcss-selector-parser@7.1.1: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + postcss-value-parser@4.2.0: {} postcss-values-parser@6.0.2(postcss@8.5.8): @@ -19960,6 +20393,10 @@ snapshots: dependencies: escape-goat: 2.1.1 + qified@0.9.0: + dependencies: + hookified: 2.1.0 + qs@6.13.0: dependencies: side-channel: 1.1.0 @@ -20693,6 +21130,8 @@ snapshots: slash@4.0.0: {} + slash@5.1.0: {} + slice-ansi@3.0.0: dependencies: ansi-styles: 4.3.0 @@ -20963,6 +21402,11 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.2 + string-width@8.2.0: + dependencies: + get-east-asian-width: 1.5.0 + strip-ansi: 7.1.2 + string.fromcodepoint@0.2.1: {} string.prototype.matchall@4.0.12: @@ -21069,6 +21513,87 @@ snapshots: optionalDependencies: react-dom: 18.3.1(react@18.3.1) + stylelint-config-recommended-scss@17.0.0(postcss@8.5.8)(stylelint@17.5.0(typescript@5.9.3)): + dependencies: + postcss-scss: 4.0.9(postcss@8.5.8) + stylelint: 17.5.0(typescript@5.9.3) + stylelint-config-recommended: 18.0.0(stylelint@17.5.0(typescript@5.9.3)) + stylelint-scss: 7.0.0(stylelint@17.5.0(typescript@5.9.3)) + optionalDependencies: + postcss: 8.5.8 + + stylelint-config-recommended@18.0.0(stylelint@17.5.0(typescript@5.9.3)): + dependencies: + stylelint: 17.5.0(typescript@5.9.3) + + stylelint-config-standard-scss@17.0.0(postcss@8.5.8)(stylelint@17.5.0(typescript@5.9.3)): + dependencies: + stylelint: 17.5.0(typescript@5.9.3) + stylelint-config-recommended-scss: 17.0.0(postcss@8.5.8)(stylelint@17.5.0(typescript@5.9.3)) + stylelint-config-standard: 40.0.0(stylelint@17.5.0(typescript@5.9.3)) + optionalDependencies: + postcss: 8.5.8 + + stylelint-config-standard@40.0.0(stylelint@17.5.0(typescript@5.9.3)): + dependencies: + stylelint: 17.5.0(typescript@5.9.3) + stylelint-config-recommended: 18.0.0(stylelint@17.5.0(typescript@5.9.3)) + + stylelint-scss@7.0.0(stylelint@17.5.0(typescript@5.9.3)): + dependencies: + css-tree: 3.1.0 + is-plain-object: 5.0.0 + known-css-properties: 0.37.0 + mdn-data: 2.27.1 + 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 + stylelint: 17.5.0(typescript@5.9.3) + + stylelint@17.5.0(typescript@5.9.3): + dependencies: + '@csstools/css-calc': 3.1.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) + '@csstools/css-syntax-patches-for-csstree': 1.1.1(css-tree@3.2.1) + '@csstools/css-tokenizer': 4.0.0 + '@csstools/media-query-list-parser': 5.0.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/selector-resolve-nested': 4.0.0(postcss-selector-parser@7.1.1) + '@csstools/selector-specificity': 6.0.0(postcss-selector-parser@7.1.1) + colord: 2.9.3 + cosmiconfig: 9.0.1(typescript@5.9.3) + css-functions-list: 3.3.3 + css-tree: 3.2.1 + debug: 4.4.3(supports-color@5.5.0) + 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@8.5.8) + 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.1 + transitivePeerDependencies: + - supports-color + - typescript + stylis@4.3.6: {} stylus-lookup@6.0.0: @@ -21141,6 +21666,8 @@ snapshots: transitivePeerDependencies: - supports-color + supports-color@10.2.2: {} + supports-color@5.5.0: dependencies: has-flag: 3.0.0 @@ -21158,8 +21685,15 @@ snapshots: has-flag: 4.0.0 supports-color: 7.2.0 + supports-hyperlinks@4.4.0: + dependencies: + has-flag: 5.0.1 + supports-color: 10.2.2 + supports-preserve-symlinks-flag@1.0.0: {} + svg-tags@1.0.0: {} + swagger-stats@0.99.7(prom-client@15.1.3): dependencies: axios: 1.7.4(debug@4.4.3) @@ -21193,6 +21727,14 @@ snapshots: symbol-tree@3.2.4: {} + table@6.9.0: + dependencies: + ajv: 8.18.0 + lodash.truncate: 4.4.2 + slice-ansi: 4.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + tailwind-merge@3.4.0: {} tailwindcss@4.1.18: {} @@ -21642,6 +22184,8 @@ snapshots: unicorn-magic@0.1.0: {} + unicorn-magic@0.4.0: {} + unique-filename@3.0.0: dependencies: unique-slug: 4.0.0 @@ -21885,23 +22429,6 @@ snapshots: tsx: 4.21.0 yaml: 2.8.2 - vite@8.0.1(@types/node@24.9.1)(esbuild@0.25.11)(jiti@2.6.1)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2): - dependencies: - lightningcss: 1.32.0 - picomatch: 4.0.3 - postcss: 8.5.8 - rolldown: 1.0.0-rc.10 - tinyglobby: 0.2.15 - optionalDependencies: - '@types/node': 24.9.1 - esbuild: 0.25.11 - fsevents: 2.3.3 - jiti: 2.6.1 - sass: 1.98.0 - terser: 5.46.1 - tsx: 4.21.0 - yaml: 2.8.2 - vite@8.0.1(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2): dependencies: lightningcss: 1.32.0 @@ -22033,35 +22560,6 @@ snapshots: transitivePeerDependencies: - msw - vitest@4.1.0(@types/node@24.9.1)(happy-dom@20.0.10)(jsdom@27.4.0)(vite@8.0.1(@types/node@24.9.1)(esbuild@0.25.11)(jiti@2.6.1)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)): - dependencies: - '@vitest/expect': 4.1.0 - '@vitest/mocker': 4.1.0(vite@8.0.1(@types/node@24.9.1)(esbuild@0.25.11)(jiti@2.6.1)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)) - '@vitest/pretty-format': 4.1.0 - '@vitest/runner': 4.1.0 - '@vitest/snapshot': 4.1.0 - '@vitest/spy': 4.1.0 - '@vitest/utils': 4.1.0 - es-module-lexer: 2.0.0 - expect-type: 1.3.0 - magic-string: 0.30.21 - obug: 2.1.1 - pathe: 2.0.3 - picomatch: 4.0.3 - std-env: 4.0.0 - tinybench: 2.9.0 - tinyexec: 1.0.2 - tinyglobby: 0.2.15 - tinyrainbow: 3.0.3 - vite: 8.0.1(@types/node@24.9.1)(esbuild@0.25.11)(jiti@2.6.1)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2) - why-is-node-running: 2.3.0 - optionalDependencies: - '@types/node': 24.9.1 - happy-dom: 20.0.10 - jsdom: 27.4.0 - transitivePeerDependencies: - - msw - vitest@4.1.0(@types/node@24.9.1)(happy-dom@20.0.10)(jsdom@27.4.0)(vite@8.0.1(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)): dependencies: '@vitest/expect': 4.1.0 @@ -22405,6 +22903,10 @@ snapshots: signal-exit: 3.0.7 typedarray-to-buffer: 3.1.5 + write-file-atomic@7.0.1: + dependencies: + signal-exit: 4.1.0 + ws@7.5.10: {} ws@8.19.0: {} diff --git a/stylelint.config.mjs b/stylelint.config.mjs new file mode 100644 index 000000000000..147cbd88ba57 --- /dev/null +++ b/stylelint.config.mjs @@ -0,0 +1,57 @@ +/** @type {import('stylelint').Config} */ +export default { + extends: ["stylelint-config-standard-scss"], + rules: { + "declaration-block-no-duplicate-properties": null, // add // default: [true, {ignore: ['consecutive-duplicates-with-different-syntaxes'],},] + + "block-no-empty": null, // add + + "no-invalid-position-at-import-rule": null, // consider adding // default: [true, {ignoreAtRules: ['use', 'forward'],},] + + "font-family-no-missing-generic-family-keyword": null, // add + + "selector-type-no-unknown": null, // add // default: [true, {ignore: ['custom-elements'],},] + + "length-zero-no-unit": null, // default: [true, {ignore: ['custom-properties'], ignorePreludeOfAtRules: ['function', 'mixin'],},] + + "property-no-vendor-prefix": null, // add + "value-no-vendor-prefix": null, // add // default: [true, {ignoreValues: ['box', 'inline-box'],},] // `-webkit-box` is allowed as standard. See https://www.w3.org/TR/css-overflow-3/#webkit-line-clamp + + "at-rule-empty-line-before": null, // default: ['always', {except: ['blockless-after-same-name-blockless', 'first-nested'], ignore: ['after-comment'],},] + "comment-empty-line-before": null, // default: ['always', {except: ['first-nested'], ignore: ['stylelint-commands'],},] + "custom-property-empty-line-before": null, // default: 'custom-property-empty-line-before': ['always',{except: ['after-custom-property', 'first-nested'],ignore: ['after-comment', 'inside-single-line-block'],},] + "declaration-empty-line-before": null, // default: ['always', {except: ['after-declaration', 'first-nested'], ignore: ['after-comment', 'inside-single-line-block'],},] + "rule-empty-line-before": null, // default: ['always-multi-line', {except: ['first-nested'], ignore: ['after-comment'],},] + + "alpha-value-notation": null, // default: ['percentage',{exceptProperties: ['opacity','fill-opacity','flood-opacity','stop-opacity','stroke-opacity',],},] + "color-function-alias-notation": null, // default: without-alpha + "color-function-notation": null, // default: modern + "hue-degree-notation": null, // default: angle + "media-feature-range-notation": null, // default: context + "selector-not-notation": null, // default: complex + "selector-pseudo-element-colon-notation": null, // add // default: double + + // default pattern for these rules is a kebab case pattern + "custom-property-pattern": null, + "keyframes-name-pattern": null, + "selector-class-pattern": null, + "selector-id-pattern": null, + + "font-family-name-quotes": null, // add // default: always-where-recommended + "function-url-quotes": null, // add // default: always + + "declaration-block-no-redundant-longhand-properties": null, + "shorthand-property-no-redundant-values": null, + + "comment-whitespace-inside": null, // default: always + + "scss/at-extend-no-missing-placeholder": null, + "scss/load-no-partial-leading-underscore": null, + "scss/load-partial-extension": null, // default: never, + "scss/no-global-function-names": null, + + "scss/dollar-variable-pattern": null, // default pattern is a kebab case pattern + "scss/double-slash-comment-empty-line-before": null, // default: ['always', {except: ['first-nested'], ignore: ['between-comments', 'stylelint-commands'],},] + "scss/double-slash-comment-whitespace-inside": null, // default: always + }, +}; From 653516d7a71641c0c55cbfcc67f9e97b72729d4b Mon Sep 17 00:00:00 2001 From: Nad Alaba <37968805+nadalaba@users.noreply.github.com> Date: Wed, 25 Mar 2026 18:33:15 +0300 Subject: [PATCH 02/29] re-add declaration-block-no-duplicate-properties rule to its default --- frontend/src/styles/buttons.scss | 1 - frontend/src/styles/caret.scss | 1 - frontend/src/styles/commandline.scss | 1 - frontend/src/styles/core.scss | 1 - frontend/src/styles/inputs.scss | 2 -- frontend/src/styles/popups.scss | 2 -- frontend/src/styles/test.scss | 4 ---- stylelint.config.mjs | 2 -- 8 files changed, 14 deletions(-) diff --git a/frontend/src/styles/buttons.scss b/frontend/src/styles/buttons.scss index b14263e1ae91..ea1fbffaf46f 100644 --- a/frontend/src/styles/buttons.scss +++ b/frontend/src/styles/buttons.scss @@ -27,7 +27,6 @@ button, input[type="button"], input[type="reset"], input[type="submit"] { - text-align: center; color: var(--text-color); cursor: pointer; transition: diff --git a/frontend/src/styles/caret.scss b/frontend/src/styles/caret.scss index 89a2f3a8ebb6..5a109008aac5 100644 --- a/frontend/src/styles/caret.scss +++ b/frontend/src/styles/caret.scss @@ -65,7 +65,6 @@ &.block { width: 0.5em; - border-radius: 0; z-index: -1; border-radius: 0.05em; } diff --git a/frontend/src/styles/commandline.scss b/frontend/src/styles/commandline.scss index 5af927d771e2..15d7871ccc18 100644 --- a/frontend/src/styles/commandline.scss +++ b/frontend/src/styles/commandline.scss @@ -60,7 +60,6 @@ } .suggestions { - display: block; @extend .ffscroll; overflow-y: scroll; max-height: calc(100vh - 12rem - 3rem); diff --git a/frontend/src/styles/core.scss b/frontend/src/styles/core.scss index fef770be07df..a135c74d21c8 100644 --- a/frontend/src/styles/core.scss +++ b/frontend/src/styles/core.scss @@ -292,7 +292,6 @@ kbd { grid-column: 1/2; grid-row: 1/2; place-self: center center; - display: grid; place-content: center center; overflow: hidden; display: inline-block; diff --git a/frontend/src/styles/inputs.scss b/frontend/src/styles/inputs.scss index ca0768d7920c..5993a3e6fc22 100644 --- a/frontend/src/styles/inputs.scss +++ b/frontend/src/styles/inputs.scss @@ -117,7 +117,6 @@ input[type="checkbox"] { left: 0; width: 100%; height: 100%; - display: block; border-radius: calc((var(--roundness) / 2) - 0.1em); font-weight: 900; position: absolute; @@ -208,7 +207,6 @@ select:-webkit-autofill:focus { // slim-select styles .ss-main { - border-radius: var(--roundness); outline: none; border: none; border-radius: var(--roundness); diff --git a/frontend/src/styles/popups.scss b/frontend/src/styles/popups.scss index 5de0f1b4f917..dd97412e90f7 100644 --- a/frontend/src/styles/popups.scss +++ b/frontend/src/styles/popups.scss @@ -329,7 +329,6 @@ body.darkMode { width: 100%; max-width: 1000px; aspect-ratio: 16/9; - display: grid; grid-template-areas: "middle"; .preloader { grid-area: middle; @@ -712,7 +711,6 @@ body.darkMode { } .badgeSelectionItem { - margin-bottom: 0.5rem; width: max-content; opacity: 25%; cursor: pointer; diff --git a/frontend/src/styles/test.scss b/frontend/src/styles/test.scss index 317e16f7b67e..aad570f84d35 100644 --- a/frontend/src/styles/test.scss +++ b/frontend/src/styles/test.scss @@ -46,7 +46,6 @@ #barTimerProgress { opacity: 0; - z-index: -1; position: relative; z-index: 99; .bar { @@ -119,7 +118,6 @@ color: black; z-index: -1; text-align: center; - width: 100%; position: relative; display: grid; font-size: 10rem; @@ -691,7 +689,6 @@ pointer-events: none; border-radius: 0; caret-color: transparent; - resize: none; overflow: hidden; // if the text wraps, ctrl backspace will not work on firefox >:| // and holy shit do not use white-space: nowrap here because the hellspawn that is safari @@ -1028,7 +1025,6 @@ text-align: center; color: var(--sub-color); // grid-area: login; - grid-column: 1/3; .link { text-decoration: underline; display: inline-block; diff --git a/stylelint.config.mjs b/stylelint.config.mjs index 147cbd88ba57..9db22ff7bec0 100644 --- a/stylelint.config.mjs +++ b/stylelint.config.mjs @@ -2,8 +2,6 @@ export default { extends: ["stylelint-config-standard-scss"], rules: { - "declaration-block-no-duplicate-properties": null, // add // default: [true, {ignore: ['consecutive-duplicates-with-different-syntaxes'],},] - "block-no-empty": null, // add "no-invalid-position-at-import-rule": null, // consider adding // default: [true, {ignoreAtRules: ['use', 'forward'],},] From 57b94397deae73717cbd0ab5088c11e64b5b9634 Mon Sep 17 00:00:00 2001 From: Nad Alaba <37968805+nadalaba@users.noreply.github.com> Date: Wed, 25 Mar 2026 18:33:15 +0300 Subject: [PATCH 03/29] re-add block-no-empty rule --- frontend/src/styles/media-queries-gray.scss | 2 +- stylelint.config.mjs | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/frontend/src/styles/media-queries-gray.scss b/frontend/src/styles/media-queries-gray.scss index 2deefb6038bd..7159c19512e8 100644 --- a/frontend/src/styles/media-queries-gray.scss +++ b/frontend/src/styles/media-queries-gray.scss @@ -1,5 +1,5 @@ -//this is very overkill for the modern world so dont worry too much about this width @use "./media.scss" as *; @include media-query(gray) { + // this is very overkill for the modern world so dont worry too much about this width } diff --git a/stylelint.config.mjs b/stylelint.config.mjs index 9db22ff7bec0..c236a6799790 100644 --- a/stylelint.config.mjs +++ b/stylelint.config.mjs @@ -2,8 +2,6 @@ export default { extends: ["stylelint-config-standard-scss"], rules: { - "block-no-empty": null, // add - "no-invalid-position-at-import-rule": null, // consider adding // default: [true, {ignoreAtRules: ['use', 'forward'],},] "font-family-no-missing-generic-family-keyword": null, // add From d7a5c8722ae014d6f256193e38a7277b1ca06103 Mon Sep 17 00:00:00 2001 From: Nad Alaba <37968805+nadalaba@users.noreply.github.com> Date: Wed, 25 Mar 2026 18:33:15 +0300 Subject: [PATCH 04/29] re-add font-family-no-missing-generic-family-keyword --- stylelint.config.mjs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/stylelint.config.mjs b/stylelint.config.mjs index c236a6799790..0dd4cbd9f0f0 100644 --- a/stylelint.config.mjs +++ b/stylelint.config.mjs @@ -4,7 +4,10 @@ export default { rules: { "no-invalid-position-at-import-rule": null, // consider adding // default: [true, {ignoreAtRules: ['use', 'forward'],},] - "font-family-no-missing-generic-family-keyword": null, // add + "font-family-no-missing-generic-family-keyword": [ + true, + { ignoreFontFamilies: ["Font Awesome", "Font Awesome Brands"] }, + ], //default: true "selector-type-no-unknown": null, // add // default: [true, {ignore: ['custom-elements'],},] From 0a4118d018a184ad17e9a791858a8e54c53505de Mon Sep 17 00:00:00 2001 From: Nad Alaba <37968805+nadalaba@users.noreply.github.com> Date: Wed, 25 Mar 2026 18:33:15 +0300 Subject: [PATCH 05/29] re-add selector-type-no-unknown --- stylelint.config.mjs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/stylelint.config.mjs b/stylelint.config.mjs index 0dd4cbd9f0f0..9bba8f85f658 100644 --- a/stylelint.config.mjs +++ b/stylelint.config.mjs @@ -9,7 +9,10 @@ export default { { ignoreFontFamilies: ["Font Awesome", "Font Awesome Brands"] }, ], //default: true - "selector-type-no-unknown": null, // add // default: [true, {ignore: ['custom-elements'],},] + "selector-type-no-unknown": [ + true, + { ignore: ["custom-elements"], ignoreTypes: ["letter", "hint"] }, + ], // default: [true, {ignore: ['custom-elements'],},] "length-zero-no-unit": null, // default: [true, {ignore: ['custom-properties'], ignorePreludeOfAtRules: ['function', 'mixin'],},] From f2d3b355fd257c1593486243fa8a8d5dcbec6b37 Mon Sep 17 00:00:00 2001 From: Nad Alaba <37968805+nadalaba@users.noreply.github.com> Date: Wed, 25 Mar 2026 18:33:16 +0300 Subject: [PATCH 06/29] re-add selector-pseudo-element-colon-notation: double --- frontend/src/styles/core.scss | 2 +- frontend/src/styles/inputs.scss | 12 ++++++------ frontend/src/styles/test.scss | 4 ++-- stylelint.config.mjs | 1 - 4 files changed, 9 insertions(+), 10 deletions(-) diff --git a/frontend/src/styles/core.scss b/frontend/src/styles/core.scss index a135c74d21c8..c4b95239565e 100644 --- a/frontend/src/styles/core.scss +++ b/frontend/src/styles/core.scss @@ -374,7 +374,7 @@ kbd { } // mouseover texts -[aria-label][data-balloon-pos]:after { +[aria-label][data-balloon-pos]::after { font-family: var(--font); font-size: var(--balloon-font-size); line-height: var(--balloon-font-size); diff --git a/frontend/src/styles/inputs.scss b/frontend/src/styles/inputs.scss index 5993a3e6fc22..94eae070fbcf 100644 --- a/frontend/src/styles/inputs.scss +++ b/frontend/src/styles/inputs.scss @@ -110,7 +110,7 @@ input[type="checkbox"] { position: relative; transition: background 0.125s; flex-shrink: 0; - &:after { + &::after { font-family: "Font Awesome"; content: "\f00c"; top: 0; @@ -128,23 +128,23 @@ input[type="checkbox"] { color: transparent; } - &:checked:after { + &:checked::after { color: var(--main-color); } - &:hover:after { + &:hover::after { color: var(--bg-color); } - &:hover:checked:after { + &:hover:checked::after { color: var(--text-color); } &[disabled] { opacity: 0.33; pointer-events: none; - &:hover:after { + &:hover::after { color: var(--sub-alt-color); } - &:hover:checked:after { + &:hover:checked::after { color: var(--main-color); } } diff --git a/frontend/src/styles/test.scss b/frontend/src/styles/test.scss index aad570f84d35..386796989058 100644 --- a/frontend/src/styles/test.scss +++ b/frontend/src/styles/test.scss @@ -740,8 +740,8 @@ } &.noBalloons { - [aria-label][data-balloon-pos]:before, - [aria-label][data-balloon-pos]:after { + [aria-label][data-balloon-pos]::before, + [aria-label][data-balloon-pos]::after { display: none; } } diff --git a/stylelint.config.mjs b/stylelint.config.mjs index 9bba8f85f658..8ed9c7dca747 100644 --- a/stylelint.config.mjs +++ b/stylelint.config.mjs @@ -31,7 +31,6 @@ export default { "hue-degree-notation": null, // default: angle "media-feature-range-notation": null, // default: context "selector-not-notation": null, // default: complex - "selector-pseudo-element-colon-notation": null, // add // default: double // default pattern for these rules is a kebab case pattern "custom-property-pattern": null, From 35f9f5fbe00108d0c6cafca17a75ad5415c82b39 Mon Sep 17 00:00:00 2001 From: Nad Alaba <37968805+nadalaba@users.noreply.github.com> Date: Wed, 25 Mar 2026 18:33:16 +0300 Subject: [PATCH 07/29] re-add font-family-name-quotes: always-where-recommended --- frontend/src/styles/fonts.scss | 2 +- frontend/src/styles/standalone.scss | 4 ++-- stylelint.config.mjs | 1 - 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/frontend/src/styles/fonts.scss b/frontend/src/styles/fonts.scss index 625f601dd4cf..6b822e45f0a2 100644 --- a/frontend/src/styles/fonts.scss +++ b/frontend/src/styles/fonts.scss @@ -1,7 +1,7 @@ @use "sass:map"; @font-face { - font-family: "Vazirharf"; + font-family: Vazirharf; font-style: normal; font-weight: 400; font-display: block; diff --git a/frontend/src/styles/standalone.scss b/frontend/src/styles/standalone.scss index 262b4514e306..e82ce7d31aac 100644 --- a/frontend/src/styles/standalone.scss +++ b/frontend/src/styles/standalone.scss @@ -2,14 +2,14 @@ @import "core.scss"; @font-face { - font-family: Roboto Mono; + font-family: "Roboto Mono"; font-style: normal; font-weight: 400; font-display: block; src: url(/webfonts/RobotoMono-Regular.woff2) format("woff2"); } @font-face { - font-family: Lexend Deca; + font-family: "Lexend Deca"; font-style: normal; font-weight: 400; font-display: block; diff --git a/stylelint.config.mjs b/stylelint.config.mjs index 8ed9c7dca747..9ed7927f5fd4 100644 --- a/stylelint.config.mjs +++ b/stylelint.config.mjs @@ -38,7 +38,6 @@ export default { "selector-class-pattern": null, "selector-id-pattern": null, - "font-family-name-quotes": null, // add // default: always-where-recommended "function-url-quotes": null, // add // default: always "declaration-block-no-redundant-longhand-properties": null, From e8f679f3e605591b56ef82b6ea14b6db52f96d52 Mon Sep 17 00:00:00 2001 From: Nad Alaba <37968805+nadalaba@users.noreply.github.com> Date: Wed, 25 Mar 2026 18:33:16 +0300 Subject: [PATCH 08/29] re-add function-url-quotes: always --- frontend/src/styles/standalone.scss | 4 ++-- stylelint.config.mjs | 2 -- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/frontend/src/styles/standalone.scss b/frontend/src/styles/standalone.scss index e82ce7d31aac..201648ffa96c 100644 --- a/frontend/src/styles/standalone.scss +++ b/frontend/src/styles/standalone.scss @@ -6,14 +6,14 @@ font-style: normal; font-weight: 400; font-display: block; - src: url(/webfonts/RobotoMono-Regular.woff2) format("woff2"); + src: url("/webfonts/RobotoMono-Regular.woff2") format("woff2"); } @font-face { font-family: "Lexend Deca"; font-style: normal; font-weight: 400; font-display: block; - src: url(/webfonts/LexendDeca-Regular.woff2) format("woff2"); + src: url("/webfonts/LexendDeca-Regular.woff2") format("woff2"); } :root { diff --git a/stylelint.config.mjs b/stylelint.config.mjs index 9ed7927f5fd4..b92e3a128afb 100644 --- a/stylelint.config.mjs +++ b/stylelint.config.mjs @@ -38,8 +38,6 @@ export default { "selector-class-pattern": null, "selector-id-pattern": null, - "function-url-quotes": null, // add // default: always - "declaration-block-no-redundant-longhand-properties": null, "shorthand-property-no-redundant-values": null, From 03be1c99586d268ac68b87d07537ec9698833549 Mon Sep 17 00:00:00 2001 From: Nad Alaba <37968805+nadalaba@users.noreply.github.com> Date: Wed, 25 Mar 2026 18:33:17 +0300 Subject: [PATCH 09/29] re-add property-no-vendor-prefix --- frontend/src/styles/account.scss | 5 ++--- frontend/src/styles/buttons.scss | 2 -- frontend/src/styles/commandline.scss | 1 - frontend/src/styles/core.scss | 2 -- frontend/src/styles/inputs.scss | 15 +++++---------- frontend/src/styles/keymap.scss | 1 - frontend/src/styles/popups.scss | 1 - frontend/src/styles/standalone.scss | 2 -- frontend/src/styles/test.scss | 14 -------------- stylelint.config.mjs | 1 - 10 files changed, 7 insertions(+), 37 deletions(-) diff --git a/frontend/src/styles/account.scss b/frontend/src/styles/account.scss index 6e779672f650..69e7007c9069 100644 --- a/frontend/src/styles/account.scss +++ b/frontend/src/styles/account.scss @@ -152,7 +152,7 @@ &.history { table td { - -webkit-appearance: unset; + appearance: unset; } table tr { @@ -170,9 +170,8 @@ padding: 0.5rem; border-radius: var(--roundness); cursor: pointer; - -webkit-transition: 0.25s; transition: 0.25s; - -webkit-user-select: none; + user-select: none; display: -ms-grid; display: grid; -ms-flex-line-pack: center; diff --git a/frontend/src/styles/buttons.scss b/frontend/src/styles/buttons.scss index ea1fbffaf46f..6376c49b9da0 100644 --- a/frontend/src/styles/buttons.scss +++ b/frontend/src/styles/buttons.scss @@ -37,7 +37,6 @@ input[type="submit"] { border-radius: var(--roundness); background: var(--sub-alt-color); text-align: center; - -webkit-user-select: none; user-select: none; align-content: center; align-items: center; @@ -114,7 +113,6 @@ button.text, border-radius: var(--roundness); background: none; text-align: center; - -webkit-user-select: none; user-select: none; align-content: center; height: -moz-min-content; diff --git a/frontend/src/styles/commandline.scss b/frontend/src/styles/commandline.scss index 15d7871ccc18..670662cc52fb 100644 --- a/frontend/src/styles/commandline.scss +++ b/frontend/src/styles/commandline.scss @@ -65,7 +65,6 @@ max-height: calc(100vh - 12rem - 3rem); display: grid; cursor: pointer; - -webkit-user-select: none; user-select: none; .command { diff --git a/frontend/src/styles/core.scss b/frontend/src/styles/core.scss index c4b95239565e..a7b63a408713 100644 --- a/frontend/src/styles/core.scss +++ b/frontend/src/styles/core.scss @@ -320,7 +320,6 @@ kbd { color: var(--text-color); border-radius: calc(var(--roundness) / 2); // padding: 0.15em 0.5em; - -webkit-user-select: none; user-select: none; display: grid; grid-template-columns: max-content auto; @@ -400,7 +399,6 @@ table { z-index: 0; td.sortable:hover { cursor: pointer; - -webkit-user-select: none; user-select: none; background-color: var(--sub-alt-color); } diff --git a/frontend/src/styles/inputs.scss b/frontend/src/styles/inputs.scss index 94eae070fbcf..4bfd7b352233 100644 --- a/frontend/src/styles/inputs.scss +++ b/frontend/src/styles/inputs.scss @@ -25,7 +25,6 @@ textarea { top: -1.75rem; right: 0.25rem; color: var(--sub-color); - -webkit-user-select: none; user-select: none; &.error { color: var(--error-color); @@ -41,13 +40,13 @@ textarea { } input[type="range"] { - -webkit-appearance: none; + appearance: none; padding: 0; width: 100%; height: 1.25em; border-radius: var(--roundness); &::-webkit-slider-thumb { - -webkit-appearance: none; + appearance: none; padding: 0; border: none; width: 25%; @@ -63,7 +62,7 @@ input[type="range"] { } &::-moz-range-thumb { - -webkit-appearance: none; + appearance: none; padding: 0; border: none; width: 25%; @@ -175,15 +174,11 @@ textarea:disabled { input[type="number"]::-webkit-inner-spin-button, input[type="number"]::-webkit-outer-spin-button { - -webkit-appearance: none; - -moz-appearance: none; appearance: none; margin: 0; } input[type="number"] { - -moz-appearance: textfield; - -webkit-appearance: textfield; appearance: textfield; } @@ -201,7 +196,7 @@ select:-webkit-autofill:focus { outline: 0.15em solid var(--main-color); font-family: inherit; -webkit-text-fill-color: var(--text-color); - -webkit-box-shadow: 0 0 0 1000000px var(--sub-alt-color) inset; + box-shadow: 0 0 0 1000000px var(--sub-alt-color) inset; caret-color: var(--text-color); } @@ -314,7 +309,7 @@ select:-webkit-autofill:focus { color: var(--sub-color); } &::-webkit-search-cancel-button { - -webkit-appearance: none; + appearance: none; } } } diff --git a/frontend/src/styles/keymap.scss b/frontend/src/styles/keymap.scss index 078df6d6ceb8..30ce0988f5b4 100644 --- a/frontend/src/styles/keymap.scss +++ b/frontend/src/styles/keymap.scss @@ -7,7 +7,6 @@ // height: 140px; gap: 0.25rem; margin-top: 1rem; - -webkit-user-select: none; user-select: none; .row { diff --git a/frontend/src/styles/popups.scss b/frontend/src/styles/popups.scss index dd97412e90f7..b8fd7da14f6c 100644 --- a/frontend/src/styles/popups.scss +++ b/frontend/src/styles/popups.scss @@ -258,7 +258,6 @@ body.darkMode { max-width: 465px; z-index: 100000001; // outline: 0.5rem solid var(--bg-color) - -webkit-user-select: none; user-select: none; .main { display: grid; diff --git a/frontend/src/styles/standalone.scss b/frontend/src/styles/standalone.scss index 201648ffa96c..a55889b402e5 100644 --- a/frontend/src/styles/standalone.scss +++ b/frontend/src/styles/standalone.scss @@ -43,7 +43,6 @@ header { z-index: 3; align-items: center; gap: 0.5rem; - -webkit-user-select: none; user-select: none; #logo { @@ -92,7 +91,6 @@ header { margin-top: -0.23em; } white-space: nowrap; - -webkit-user-select: none; user-select: none; } } diff --git a/frontend/src/styles/test.scss b/frontend/src/styles/test.scss index 386796989058..fe475acba7d6 100644 --- a/frontend/src/styles/test.scss +++ b/frontend/src/styles/test.scss @@ -197,7 +197,6 @@ flex-wrap: wrap; width: 100%; align-content: flex-start; - -webkit-user-select: none; user-select: none; .newline { @@ -343,7 +342,6 @@ &.blurred { opacity: 0.25; filter: blur(4px); - -webkit-filter: blur(4px); } &.blind { @@ -896,7 +894,6 @@ #resultReplay .words { user-select: none; - -webkit-user-select: none; } .chart { @@ -1337,7 +1334,6 @@ &.blurred { opacity: 0.25; - -webkit-filter: blur(4px); filter: blur(4px); } } @@ -1354,13 +1350,6 @@ overflow: visible clip; &.tape { overflow: hidden; - -webkit-mask-image: linear-gradient( - 90deg, - rgba(0, 0, 0, 0) 1%, - rgb(0, 0, 0) 10%, - rgb(0, 0, 0) 90%, - rgba(0, 0, 0, 0) 99% - ); mask-image: linear-gradient( 90deg, rgba(0, 0, 0, 0) 1%, @@ -1388,7 +1377,6 @@ position: absolute; transform: translateX(-50%); top: -6rem; - -webkit-user-select: none; user-select: none; pointer-events: none; opacity: 0; @@ -1401,7 +1389,6 @@ z-index: 999; position: absolute; width: 100%; - -webkit-user-select: none; user-select: none; pointer-events: none; } @@ -1415,7 +1402,6 @@ margin-bottom: 0.5rem; transition: opacity 0.125s; justify-content: center; - -webkit-user-select: none; user-select: none; .textButton { diff --git a/stylelint.config.mjs b/stylelint.config.mjs index b92e3a128afb..76ff670304dc 100644 --- a/stylelint.config.mjs +++ b/stylelint.config.mjs @@ -16,7 +16,6 @@ export default { "length-zero-no-unit": null, // default: [true, {ignore: ['custom-properties'], ignorePreludeOfAtRules: ['function', 'mixin'],},] - "property-no-vendor-prefix": null, // add "value-no-vendor-prefix": null, // add // default: [true, {ignoreValues: ['box', 'inline-box'],},] // `-webkit-box` is allowed as standard. See https://www.w3.org/TR/css-overflow-3/#webkit-line-clamp "at-rule-empty-line-before": null, // default: ['always', {except: ['blockless-after-same-name-blockless', 'first-nested'], ignore: ['after-comment'],},] From 2071438a0fa6ca981ea8fecfa06a7ecd6f7970c2 Mon Sep 17 00:00:00 2001 From: Nad Alaba <37968805+nadalaba@users.noreply.github.com> Date: Wed, 25 Mar 2026 18:33:17 +0300 Subject: [PATCH 10/29] re-add value-no-vendor-prefix except for box and inline-box --- frontend/src/styles/account-settings.scss | 2 -- frontend/src/styles/account.scss | 1 - frontend/src/styles/buttons.scss | 2 -- frontend/src/styles/popups.scss | 2 -- frontend/src/styles/test.scss | 1 - stylelint.config.mjs | 2 -- 6 files changed, 10 deletions(-) diff --git a/frontend/src/styles/account-settings.scss b/frontend/src/styles/account-settings.scss index 68eb21dee253..6ecfef6d6a56 100644 --- a/frontend/src/styles/account-settings.scss +++ b/frontend/src/styles/account-settings.scss @@ -141,7 +141,6 @@ td { padding: 0.5rem; background: var(--bg-color); - position: -webkit-sticky; position: sticky; top: 0; z-index: 99; @@ -159,7 +158,6 @@ tfoot { td { padding: 1rem 0.5rem; - position: -webkit-sticky; position: sticky; bottom: -5px; background: var(--bg-color); diff --git a/frontend/src/styles/account.scss b/frontend/src/styles/account.scss index 69e7007c9069..54f8a28f2fdc 100644 --- a/frontend/src/styles/account.scss +++ b/frontend/src/styles/account.scss @@ -172,7 +172,6 @@ cursor: pointer; transition: 0.25s; user-select: none; - display: -ms-grid; display: grid; -ms-flex-line-pack: center; align-content: center; diff --git a/frontend/src/styles/buttons.scss b/frontend/src/styles/buttons.scss index 6376c49b9da0..b2a0a8f82b36 100644 --- a/frontend/src/styles/buttons.scss +++ b/frontend/src/styles/buttons.scss @@ -40,7 +40,6 @@ input[type="submit"] { user-select: none; align-content: center; align-items: center; - height: -moz-min-content; height: min-content; line-height: 1.25; appearance: none; @@ -115,7 +114,6 @@ button.text, text-align: center; user-select: none; align-content: center; - height: -moz-min-content; height: min-content; line-height: 1.25; appearance: none; diff --git a/frontend/src/styles/popups.scss b/frontend/src/styles/popups.scss index b8fd7da14f6c..304c7a6d87e0 100644 --- a/frontend/src/styles/popups.scss +++ b/frontend/src/styles/popups.scss @@ -478,7 +478,6 @@ body.darkMode { td { padding: 0.5rem; background: var(--bg-color); - position: -webkit-sticky; position: sticky; top: 0; z-index: 99; @@ -496,7 +495,6 @@ body.darkMode { tfoot { td { padding: 1rem 0.5rem; - position: -webkit-sticky; position: sticky; bottom: -5px; background: var(--bg-color); diff --git a/frontend/src/styles/test.scss b/frontend/src/styles/test.scss index fe475acba7d6..9b9961a7a9af 100644 --- a/frontend/src/styles/test.scss +++ b/frontend/src/styles/test.scss @@ -191,7 +191,6 @@ #words { height: fit-content; - height: -moz-fit-content; padding-bottom: 0.5em; // to account for hints of the bottom line display: flex; flex-wrap: wrap; diff --git a/stylelint.config.mjs b/stylelint.config.mjs index 76ff670304dc..721c06ce4c71 100644 --- a/stylelint.config.mjs +++ b/stylelint.config.mjs @@ -16,8 +16,6 @@ export default { "length-zero-no-unit": null, // default: [true, {ignore: ['custom-properties'], ignorePreludeOfAtRules: ['function', 'mixin'],},] - "value-no-vendor-prefix": null, // add // default: [true, {ignoreValues: ['box', 'inline-box'],},] // `-webkit-box` is allowed as standard. See https://www.w3.org/TR/css-overflow-3/#webkit-line-clamp - "at-rule-empty-line-before": null, // default: ['always', {except: ['blockless-after-same-name-blockless', 'first-nested'], ignore: ['after-comment'],},] "comment-empty-line-before": null, // default: ['always', {except: ['first-nested'], ignore: ['stylelint-commands'],},] "custom-property-empty-line-before": null, // default: 'custom-property-empty-line-before': ['always',{except: ['after-custom-property', 'first-nested'],ignore: ['after-comment', 'inside-single-line-block'],},] From e49a0bcea2be03cb05af8d04ba4942b752814ad2 Mon Sep 17 00:00:00 2001 From: Nad Alaba <37968805+nadalaba@users.noreply.github.com> Date: Wed, 25 Mar 2026 18:33:17 +0300 Subject: [PATCH 11/29] re-add no-invalid-position-at-import-rule --- frontend/src/styles/fontawesome-5.scss | 6 +++--- frontend/src/styles/index.scss | 26 +++++++++++++++++++++----- frontend/src/styles/media-queries.scss | 18 +++++++++--------- frontend/src/styles/vendor.scss | 8 +++----- stylelint.config.mjs | 2 -- 5 files changed, 36 insertions(+), 24 deletions(-) diff --git a/frontend/src/styles/fontawesome-5.scss b/frontend/src/styles/fontawesome-5.scss index 933587471119..1687cee3bfb0 100644 --- a/frontend/src/styles/fontawesome-5.scss +++ b/frontend/src/styles/fontawesome-5.scss @@ -2,12 +2,14 @@ @import "@fortawesome/fontawesome-free/scss/_mixins.scss"; @import "@fortawesome/fontawesome-free/scss/_core.scss"; -/** fixed-with **/ +/** fixed-width **/ @import "@fortawesome/fontawesome-free/scss/_fixed-width.scss"; //fa-fw /** animated **/ @import "@fortawesome/fontawesome-free/scss/_animated.scss"; //fa-spin /** rotated **/ @import "@fortawesome/fontawesome-free/scss/_rotated-flipped.scss"; //fa-rotate-90 +/** icons **/ +@import "@fortawesome/fontawesome-free/scss/_icons.scss"; @font-face { font-family: "Font Awesome"; @@ -57,5 +59,3 @@ src: url("/webfonts-generated/fa-brands-400.woff2") format("woff2"); } } - -@import "@fortawesome/fontawesome-free/scss/_icons.scss"; diff --git a/frontend/src/styles/index.scss b/frontend/src/styles/index.scss index 7e047a112b5c..edd6d813c01a 100644 --- a/frontend/src/styles/index.scss +++ b/frontend/src/styles/index.scss @@ -1,3 +1,24 @@ +@import "buttons" layer(custom-styles); +@import "404" layer(custom-styles); +@import "ads" layer(custom-styles); +@import "account" layer(custom-styles); +@import "animations" layer(custom-styles); +@import "caret" layer(custom-styles); +@import "commandline" layer(custom-styles); +@import "core" layer(custom-styles); +@import "fonts" layer(custom-styles); +@import "inputs" layer(custom-styles); +@import "keymap" layer(custom-styles); +@import "monkey" layer(custom-styles); +@import "popups" layer(custom-styles); +@import "scroll" layer(custom-styles); +@import "settings" layer(custom-styles); +@import "account-settings" layer(custom-styles); +@import "test" layer(custom-styles); +@import "loading" layer(custom-styles); +@import "friends" layer(custom-styles); +@import "media-queries" layer(custom-styles); + @layer hidden { // custom layer to hide elements without using !important // (as long as this layer is higher than custom-styles) @@ -16,11 +37,6 @@ } @layer custom-styles { - @import "buttons", "404", "ads", "account", "animations", "caret", - "commandline", "core", "fonts", "inputs", "keymap", "monkey", "popups", - "scroll", "settings", "account-settings", "test", "loading", "friends", - "media-queries"; - .chartCanvas { width: 100% !important; } diff --git a/frontend/src/styles/media-queries.scss b/frontend/src/styles/media-queries.scss index e9358c2d5290..70acabef9a4c 100644 --- a/frontend/src/styles/media-queries.scss +++ b/frontend/src/styles/media-queries.scss @@ -1,3 +1,12 @@ +//media queries based on tailwind breakpoints https://tailwindcss.com/docs/container +@import "media-queries-orange"; +@import "media-queries-yellow"; +@import "media-queries-green"; +@import "media-queries-blue"; +@import "media-queries-purple"; +@import "media-queries-brown"; +@import "media-queries-gray"; + body { &.mediaQueryDebugLevel1 { .content-grid { @@ -14,15 +23,6 @@ body { } } -//media queries based on tailwind breakpoints https://tailwindcss.com/docs/container -@import "media-queries-orange"; -@import "media-queries-yellow"; -@import "media-queries-green"; -@import "media-queries-blue"; -@import "media-queries-purple"; -@import "media-queries-brown"; -@import "media-queries-gray"; - @media only screen and (max-width: 1875px) { .ad.ad-v { display: none; diff --git a/frontend/src/styles/vendor.scss b/frontend/src/styles/vendor.scss index d3845c1879d7..db624d89b01d 100644 --- a/frontend/src/styles/vendor.scss +++ b/frontend/src/styles/vendor.scss @@ -1,6 +1,4 @@ @import "normalize.css" layer(normalize); -@layer vendor { - @import "fontawesome-5"; - @import "slim-select/styles"; - @import "balloon-css/src/balloon"; -} +@import "fontawesome-5" layer(vendor); +@import "slim-select/styles" layer(vendor); +@import "balloon-css/src/balloon" layer(vendor); diff --git a/stylelint.config.mjs b/stylelint.config.mjs index 721c06ce4c71..d81725b4bc92 100644 --- a/stylelint.config.mjs +++ b/stylelint.config.mjs @@ -2,8 +2,6 @@ export default { extends: ["stylelint-config-standard-scss"], rules: { - "no-invalid-position-at-import-rule": null, // consider adding // default: [true, {ignoreAtRules: ['use', 'forward'],},] - "font-family-no-missing-generic-family-keyword": [ true, { ignoreFontFamilies: ["Font Awesome", "Font Awesome Brands"] }, From 41bde16d1f36be979d4b6b3c07b8893d5e9ee262 Mon Sep 17 00:00:00 2001 From: Nad Alaba <37968805+nadalaba@users.noreply.github.com> Date: Wed, 25 Mar 2026 18:33:17 +0300 Subject: [PATCH 12/29] add stylelint for css with all rules disabled --- package.json | 1 + pnpm-lock.yaml | 3 +++ stylelint.config.mjs | 64 ++++++++++++++++++++++++++++++++------------ 3 files changed, 51 insertions(+), 17 deletions(-) diff --git a/package.json b/package.json index 8bbbbb5b2a30..196d2482db8a 100644 --- a/package.json +++ b/package.json @@ -73,6 +73,7 @@ "oxlint-tsgolint": "0.17.3", "prettier": "3.7.1", "stylelint": "17.5.0", + "stylelint-config-standard": "40.0.0", "stylelint-config-standard-scss": "17.0.0", "turbo": "2.7.5", "vitest": "4.1.0" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 314993eb21df..6624572faed9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -56,6 +56,9 @@ importers: stylelint: specifier: 17.5.0 version: 17.5.0(typescript@5.9.3) + stylelint-config-standard: + specifier: 40.0.0 + version: 40.0.0(stylelint@17.5.0(typescript@5.9.3)) stylelint-config-standard-scss: specifier: 17.0.0 version: 17.0.0(postcss@8.5.8)(stylelint@17.5.0(typescript@5.9.3)) diff --git a/stylelint.config.mjs b/stylelint.config.mjs index d81725b4bc92..07284fe1710e 100644 --- a/stylelint.config.mjs +++ b/stylelint.config.mjs @@ -1,19 +1,25 @@ /** @type {import('stylelint').Config} */ export default { - extends: ["stylelint-config-standard-scss"], + extends: ["stylelint-config-standard"], rules: { - "font-family-no-missing-generic-family-keyword": [ - true, - { ignoreFontFamilies: ["Font Awesome", "Font Awesome Brands"] }, - ], //default: true + "no-descending-specificity": null, // add - "selector-type-no-unknown": [ - true, - { ignore: ["custom-elements"], ignoreTypes: ["letter", "hint"] }, - ], // default: [true, {ignore: ['custom-elements'],},] + "no-duplicate-selectors": null, // add + + "font-family-no-missing-generic-family-keyword": null, // add + + "declaration-block-no-shorthand-property-overrides": null, // add + + "at-rule-no-unknown": null, // consider adding + "declaration-property-value-no-unknown": null, // add + "selector-type-no-unknown": null, // add // default: [true, {ignore: ['custom-elements'],},] "length-zero-no-unit": null, // default: [true, {ignore: ['custom-properties'], ignorePreludeOfAtRules: ['function', 'mixin'],},] + "property-no-vendor-prefix": null, // add + + "value-keyword-case": null, // default: lower + "at-rule-empty-line-before": null, // default: ['always', {except: ['blockless-after-same-name-blockless', 'first-nested'], ignore: ['after-comment'],},] "comment-empty-line-before": null, // default: ['always', {except: ['first-nested'], ignore: ['stylelint-commands'],},] "custom-property-empty-line-before": null, // default: 'custom-property-empty-line-before': ['always',{except: ['after-custom-property', 'first-nested'],ignore: ['after-comment', 'inside-single-line-block'],},] @@ -23,9 +29,12 @@ export default { "alpha-value-notation": null, // default: ['percentage',{exceptProperties: ['opacity','fill-opacity','flood-opacity','stop-opacity','stroke-opacity',],},] "color-function-alias-notation": null, // default: without-alpha "color-function-notation": null, // default: modern + "color-hex-length": null, // default: short "hue-degree-notation": null, // default: angle + "import-notation": null, // default: url "media-feature-range-notation": null, // default: context "selector-not-notation": null, // default: complex + "selector-pseudo-element-colon-notation": null, // add // default: double // default pattern for these rules is a kebab case pattern "custom-property-pattern": null, @@ -33,18 +42,39 @@ export default { "selector-class-pattern": null, "selector-id-pattern": null, + "font-family-name-quotes": null, // add // default: always-where-recommended + "function-url-quotes": null, // add // default: always + "declaration-block-no-redundant-longhand-properties": null, "shorthand-property-no-redundant-values": null, "comment-whitespace-inside": null, // default: always + }, + overrides: [ + { + files: ["**/*.scss"], + extends: ["stylelint-config-standard-scss"], + rules: { + "font-family-no-missing-generic-family-keyword": [ + true, + { ignoreFontFamilies: ["Font Awesome", "Font Awesome Brands"] }, + ], //default: true - "scss/at-extend-no-missing-placeholder": null, - "scss/load-no-partial-leading-underscore": null, - "scss/load-partial-extension": null, // default: never, - "scss/no-global-function-names": null, + "selector-type-no-unknown": [ + true, + { ignore: ["custom-elements"], ignoreTypes: ["letter", "hint"] }, + ], // default: [true, {ignore: ['custom-elements'],},] - "scss/dollar-variable-pattern": null, // default pattern is a kebab case pattern - "scss/double-slash-comment-empty-line-before": null, // default: ['always', {except: ['first-nested'], ignore: ['between-comments', 'stylelint-commands'],},] - "scss/double-slash-comment-whitespace-inside": null, // default: always - }, + "scss/at-extend-no-missing-placeholder": null, + "scss/load-no-partial-leading-underscore": null, + "scss/load-partial-extension": null, // default: never, + "scss/no-global-function-names": null, + + "scss/dollar-variable-pattern": null, + "scss/double-slash-comment-empty-line-before": null, + "scss/double-slash-comment-whitespace-inside": null, + }, + }, + ], + ignoreFiles: ["**/dist/**"], }; From dfbf1e7024d3f0712a37c3ae40621a1d7a7e613a Mon Sep 17 00:00:00 2001 From: Nad Alaba <37968805+nadalaba@users.noreply.github.com> Date: Wed, 25 Mar 2026 18:33:18 +0300 Subject: [PATCH 13/29] re-add no-descending-specificity --- backend/private/style.css | 8 +-- frontend/static/themes/aurora.css | 10 ++-- frontend/static/themes/chaos_theory.css | 32 ++++++------ frontend/static/themes/dark_note.css | 18 +++---- frontend/static/themes/dmg.css | 4 +- frontend/static/themes/fire.css | 10 ++-- frontend/static/themes/grape.css | 10 ++-- frontend/static/themes/phantom.css | 66 ++++++++++++------------ frontend/static/themes/rainbow_trail.css | 30 +++++------ frontend/static/themes/rgb.css | 42 ++++++++------- frontend/static/themes/snes.css | 12 ++--- frontend/static/themes/suisei.css | 9 ++-- frontend/static/themes/trance.css | 10 ++-- stylelint.config.mjs | 2 - 14 files changed, 135 insertions(+), 128 deletions(-) diff --git a/backend/private/style.css b/backend/private/style.css index 1b274ef00684..03e659fc33d9 100644 --- a/backend/private/style.css +++ b/backend/private/style.css @@ -189,10 +189,6 @@ input[type="checkbox"] { } } -.tooltip:hover .tooltip-text { - display: block; -} - .tooltip-text { display: none; color: var(--text-color); @@ -202,3 +198,7 @@ input[type="checkbox"] { padding: 10px; border-radius: var(--roundness); } + +.tooltip:hover .tooltip-text { + display: block; +} diff --git a/frontend/static/themes/aurora.css b/frontend/static/themes/aurora.css index 6bd63ad96ea3..2c93b2b2515f 100644 --- a/frontend/static/themes/aurora.css +++ b/frontend/static/themes/aurora.css @@ -68,6 +68,11 @@ a:not(.button):not([data-ui-variant="button"]):hover { --untyped-letter-animation: aurora 5s linear infinite; } +#words.highlight-off .word letter, +#words.highlight-off .word.typed letter { + animation: aurora 5s linear infinite; +} + #words .word.typed letter.correct, #words.highlight-word .word.typed letter, #words.highlight-next-word .word.typed letter, @@ -79,8 +84,3 @@ a:not(.button):not([data-ui-variant="button"]):hover { #words.flipped .word.typed letter { animation: none; } - -#words.highlight-off .word letter, -#words.highlight-off .word.typed letter { - animation: aurora 5s linear infinite; -} diff --git a/frontend/static/themes/chaos_theory.css b/frontend/static/themes/chaos_theory.css index f016618d7452..681c1d5aa9f1 100644 --- a/frontend/static/themes/chaos_theory.css +++ b/frontend/static/themes/chaos_theory.css @@ -13,22 +13,6 @@ transition: 0.5s; } -header[data-focused] { - & [data-ui-element="logo"] > div, - [data-ui-element="logo"] svg { - transform: rotateY(0deg); - direction: ltr; - } - & [data-nav-item] { - --nav-focus-opacity: 1; - background: var(--sub-color); - transform: rotateY(180deg); - } - & [data-nav-item="account"] { - --themable-button-bg: var(--sub-color); - } -} - #words .incorrect.extra { transform: rotateY(180deg); unicode-bidi: bidi-override; @@ -128,6 +112,22 @@ header[data-focused] { background: #ab92e1; } +header[data-focused] { + & [data-ui-element="logo"] > div, + [data-ui-element="logo"] svg { + transform: rotateY(0deg); + direction: ltr; + } + & [data-nav-item] { + --nav-focus-opacity: 1; + background: var(--sub-color); + transform: rotateY(180deg); + } + & [data-nav-item="account"] { + --themable-button-bg: var(--sub-color); + } +} + body.crtmode { & [data-nav-item="test"] { box-shadow: diff --git a/frontend/static/themes/dark_note.css b/frontend/static/themes/dark_note.css index 47c9483c1370..b522f4a7aa3e 100644 --- a/frontend/static/themes/dark_note.css +++ b/frontend/static/themes/dark_note.css @@ -63,18 +63,18 @@ body::before { text-shadow: none; } -#words:not(.blind).colorfulMode .word letter.incorrect:not(.extra), -#words:not(.blind) .word letter.incorrect:not(.extra) { - color: var(--current-color); -} - -#words:not(.blind) .word.error letter:not(.correct):not(.incorrect)::after { - background: var(--sub-color); -} - #words:not(.blind) .word letter.incorrect, #words:not(.blind).colorfulMode .word letter.incorrect { text-decoration: line-through; text-decoration-color: var(--error-color); text-decoration-thickness: 2px; } + +#words:not(.blind) .word letter.incorrect:not(.extra), +#words:not(.blind).colorfulMode .word letter.incorrect:not(.extra) { + color: var(--current-color); +} + +#words:not(.blind) .word.error letter:not(.correct):not(.incorrect)::after { + background: var(--sub-color); +} diff --git a/frontend/static/themes/dmg.css b/frontend/static/themes/dmg.css index 7f9588555cdd..7a0b14d6b77e 100644 --- a/frontend/static/themes/dmg.css +++ b/frontend/static/themes/dmg.css @@ -34,8 +34,8 @@ body.crtmode { 0 0 3px; } - & header[data-focused] [data-nav-item], - & [data-nav-item]:hover { + & [data-nav-item]:hover, + & header[data-focused] [data-nav-item] { box-shadow: none; } diff --git a/frontend/static/themes/fire.css b/frontend/static/themes/fire.css index d4a78109cdae..3dbd85f6c5f1 100644 --- a/frontend/static/themes/fire.css +++ b/frontend/static/themes/fire.css @@ -74,6 +74,11 @@ a:not(.button):not([data-ui-variant="button"]):hover { --untyped-letter-animation: fire 5s linear infinite; } +#words.highlight-off .word letter, +#words.highlight-off .word.typed letter { + animation: fire 5s linear infinite; +} + #words .word.typed letter.correct, #words.highlight-word .word.typed letter, #words.highlight-next-word .word.typed letter, @@ -85,8 +90,3 @@ a:not(.button):not([data-ui-variant="button"]):hover { #words.flipped .word.typed letter { animation: none; } - -#words.highlight-off .word letter, -#words.highlight-off .word.typed letter { - animation: fire 5s linear infinite; -} diff --git a/frontend/static/themes/grape.css b/frontend/static/themes/grape.css index 08f8aa161848..e4a186ca5bf8 100644 --- a/frontend/static/themes/grape.css +++ b/frontend/static/themes/grape.css @@ -69,6 +69,11 @@ a:not(.button):not([data-ui-variant="button"]):hover { --untyped-letter-animation: grape 5s linear infinite; } +#words.highlight-off .word letter, +#words.highlight-off .word.typed letter { + animation: grape 5s linear infinite; +} + #words .word.typed letter.correct, #words.highlight-word .word.typed letter, #words.highlight-next-word .word.typed letter, @@ -80,8 +85,3 @@ a:not(.button):not([data-ui-variant="button"]):hover { #words.flipped .word.typed letter { animation: none; } - -#words.highlight-off .word letter, -#words.highlight-off .word.typed letter { - animation: grape 5s linear infinite; -} diff --git a/frontend/static/themes/phantom.css b/frontend/static/themes/phantom.css index 836581a2d716..a3a7553567fb 100644 --- a/frontend/static/themes/phantom.css +++ b/frontend/static/themes/phantom.css @@ -59,6 +59,34 @@ header:not([data-focused]) [data-ui-element="logoText"] { animation: phantom-glow 3s infinite alternate; } +button:hover, +.button:hover, +input[type="button"]:hover, +input[type="reset"]:hover, +input[type="submit"]:hover { + color: var(--bg-color); + background: var(--caret-color); +} + +footer a:hover, +footer button:hover { + animation: phantom-glow 3s linear infinite; + background: none; +} + +[data-ui-element="accountMenu"] a:hover, +[data-ui-element="accountMenu"] button:hover { + animation: none; + background: var(--text-color); +} + +[data-ui-element="logoSubtext"], +#result .stats .group .bottom, +[data-nav-item]:hover, +a:not(.button):not([data-ui-variant="button"]):hover { + animation: phantom-glow 3s linear infinite; +} + header [data-ui-element="logoSubtext"] { color: inherit; animation: none; @@ -89,15 +117,6 @@ button.text:hover, animation: phantom-glow 5s linear infinite; } -button:hover, -.button:hover, -input[type="button"]:hover, -input[type="reset"]:hover, -input[type="submit"]:hover { - color: var(--bg-color); - background: var(--caret-color); -} - .scrollToTopButton:hover { background: var(--caret-color); color: var(--bg-color); @@ -107,19 +126,6 @@ input[type="submit"]:hover { animation: phantom-bg 3s linear infinite; } -[data-ui-element="logoSubtext"], -#result .stats .group .bottom, -[data-nav-item]:hover, -a:not(.button):not([data-ui-variant="button"]):hover { - animation: phantom-glow 3s linear infinite; -} - -footer a:hover, -footer button:hover { - animation: phantom-glow 3s linear infinite; - background: none; -} - [data-nav-item]:hover { background: none; } @@ -129,6 +135,11 @@ footer button:hover { animation: phantom-glow 3s linear infinite; } +#words.highlight-off .word letter, +#words.highlight-off .word.typed letter { + animation: phantom-glow 5s linear infinite; +} + .afk, .timeToday, #words .word letter.correct, @@ -147,14 +158,3 @@ footer button:hover { .incorrect { animation: phantom-glow-incorrect 5s linear infinite; } - -#words.highlight-off .word letter, -#words.highlight-off .word.typed letter { - animation: phantom-glow 5s linear infinite; -} - -[data-ui-element="accountMenu"] a:hover, -[data-ui-element="accountMenu"] button:hover { - animation: none; - background: var(--text-color); -} diff --git a/frontend/static/themes/rainbow_trail.css b/frontend/static/themes/rainbow_trail.css index 1c7110132c0d..f9c899ddab3f 100644 --- a/frontend/static/themes/rainbow_trail.css +++ b/frontend/static/themes/rainbow_trail.css @@ -31,6 +31,11 @@ header [data-ui-element="logoSubtext"], button.text:hover, .textButton:hover, +footer a:hover, +footer a:hover > i, +footer button:hover, +footer button:hover > i, +footer button:hover > .relative > i, #restartTestButton:hover > i, #restartTestButton:hover > i, #showWordHistoryButton:hover > i, @@ -39,12 +44,7 @@ button.text:hover, #nextTestButton:hover > i, #practiseWordsButton:hover > i, #watchReplayButton:hover > i, -#watchVideoAdButton:hover > i, -footer a:hover, -footer a:hover > i, -footer button:hover, -footer button:hover > i, -footer button:hover > .relative > i { +#watchVideoAdButton:hover > i { background: linear-gradient( 90deg, #60b6ce, @@ -78,6 +78,11 @@ footer button:hover > .relative > i { infinite; } +#words.highlight-off .word letter, +#words.highlight-off .word.typed letter { + animation: rainbow-infinite-loop 5s linear infinite; +} + #words .word.typed letter.correct, #words.highlight-word .word.typed letter, #words.highlight-next-word .word.typed letter, @@ -103,17 +108,16 @@ footer button:hover > .relative > i { animation: none; } +footer button:hover { + animation: none !important; +} + .button:hover, button:not(.textButton):not(.text):not([data-ui-variant="text"]):hover, [data-nav-item]:hover { animation: rainbow-button 2s alternate ease-in-out infinite; } -#words.highlight-off .word letter, -#words.highlight-off .word.typed letter { - animation: rainbow-infinite-loop 5s linear infinite; -} - .row .textButton:not(.active) { color: #999999; } @@ -122,10 +126,6 @@ button:not(.textButton):not(.text):not([data-ui-variant="text"]):hover, color: #111111; } -footer button:hover { - animation: none !important; -} - @keyframes rainbow { 0% { color: #60b6ce; diff --git a/frontend/static/themes/rgb.css b/frontend/static/themes/rgb.css index 482807bdc3dc..2fe20a20b286 100644 --- a/frontend/static/themes/rgb.css +++ b/frontend/static/themes/rgb.css @@ -71,6 +71,28 @@ animation: rgb-bg 5s linear infinite !important; } +[data-ui-element="logoSubtext"], +#result .stats .group .bottom, +[data-nav-item]:hover, +footer button:hover, +#words.flipped .word, +footer a:hover { + animation: rgb 5s linear infinite; +} + +[data-ui-element="accountMenu"] a:hover, +[data-ui-element="accountMenu"] button:hover { + animation: none; +} + +a:not(.button):not([data-ui-variant="button"]):hover { + animation: rgb 5s linear infinite; +} + +header [data-ui-element="logo"] svg path { + animation: rgb-fill 5s linear infinite; +} + header[data-focused] { & [data-ui-element="logoSubtext"] { animation: none; @@ -80,14 +102,8 @@ header[data-focused] { } } -[data-ui-element="logoSubtext"], -#result .stats .group .bottom, -[data-nav-item]:hover, -footer button:hover, -#words.flipped .word, -footer a:hover, -a:not(.button):not([data-ui-variant="button"]):hover { - animation: rgb 5s linear infinite; +header [data-nav-item="account"]:hover [data-ui-element="navAvatar"] svg path { + animation: rgb-fill 5s linear infinite; } #words { @@ -98,13 +114,3 @@ a:not(.button):not([data-ui-variant="button"]):hover { --correct-letter-animation: none; --untyped-letter-animation: rgb 5s linear infinite; } - -header [data-ui-element="logo"] svg path, -header [data-nav-item="account"]:hover [data-ui-element="navAvatar"] svg path { - animation: rgb-fill 5s linear infinite; -} - -[data-ui-element="accountMenu"] a:hover, -[data-ui-element="accountMenu"] button:hover { - animation: none; -} diff --git a/frontend/static/themes/snes.css b/frontend/static/themes/snes.css index de84a0e10d1a..dc66e7a2cbf7 100644 --- a/frontend/static/themes/snes.css +++ b/frontend/static/themes/snes.css @@ -1,9 +1,3 @@ -header[data-focused] [data-nav-item], -header[data-focused] nav:before, -header[data-focused] nav:after { - background: #99989f; -} - [data-nav-item] { border-radius: 10rem !important; --themable-button-text: var(--bg-color); @@ -13,6 +7,12 @@ header[data-focused] nav:after { filter: brightness(1.25); } +header[data-focused] [data-nav-item], +header[data-focused] nav:before, +header[data-focused] nav:after { + background: #99989f; +} + [data-nav-item="test"] { background: #553d94; } diff --git a/frontend/static/themes/suisei.css b/frontend/static/themes/suisei.css index eb69a9f698f7..25a33e983d00 100644 --- a/frontend/static/themes/suisei.css +++ b/frontend/static/themes/suisei.css @@ -30,20 +30,23 @@ header[data-focused] [data-ui-element="logoText"] { color: transparent; padding-bottom: 0.1em; } -header[data-focused] [data-nav-item] { - background: none; -} + [data-nav-item] { border-radius: 150px 150px 32px 32px; background-color: var(--sub-alt-color); color: var(--main-color); } + [data-nav-item]:hover { animation: suisei-pulse 800ms ease-out infinite; color: var(--main-color); background-color: var(--sub-alt-color); } +header[data-focused] [data-nav-item] { + background: none; +} + [data-nav-item="leaderboards"], [data-nav-item="leaderboards"]:hover { color: var(--sub-color); diff --git a/frontend/static/themes/trance.css b/frontend/static/themes/trance.css index 451df1ad0705..d35516ad6ac8 100644 --- a/frontend/static/themes/trance.css +++ b/frontend/static/themes/trance.css @@ -57,6 +57,11 @@ a:not(.button):not([data-ui-variant="button"]):hover { --untyped-letter-animation: trance 5s linear infinite; } +#words.highlight-off .word letter, +#words.highlight-off .word.typed letter { + animation: trance 5s linear infinite; +} + #words .word.typed letter.correct, #words.highlight-word .word.typed letter, #words.highlight-next-word .word.typed letter, @@ -68,8 +73,3 @@ a:not(.button):not([data-ui-variant="button"]):hover { #words.flipped .word.typed letter { animation: none; } - -#words.highlight-off .word letter, -#words.highlight-off .word.typed letter { - animation: trance 5s linear infinite; -} diff --git a/stylelint.config.mjs b/stylelint.config.mjs index 07284fe1710e..abdc991a9e12 100644 --- a/stylelint.config.mjs +++ b/stylelint.config.mjs @@ -2,8 +2,6 @@ export default { extends: ["stylelint-config-standard"], rules: { - "no-descending-specificity": null, // add - "no-duplicate-selectors": null, // add "font-family-no-missing-generic-family-keyword": null, // add From 7f05e709007cfd2b323e4a00bb97111f442a368a Mon Sep 17 00:00:00 2001 From: Nad Alaba <37968805+nadalaba@users.noreply.github.com> Date: Wed, 25 Mar 2026 18:33:19 +0300 Subject: [PATCH 14/29] re-add no-duplicate-selectors --- frontend/static/themes/rainbow_trail.css | 1 - stylelint.config.mjs | 2 -- 2 files changed, 3 deletions(-) diff --git a/frontend/static/themes/rainbow_trail.css b/frontend/static/themes/rainbow_trail.css index f9c899ddab3f..adeb41c2cb93 100644 --- a/frontend/static/themes/rainbow_trail.css +++ b/frontend/static/themes/rainbow_trail.css @@ -37,7 +37,6 @@ footer button:hover, footer button:hover > i, footer button:hover > .relative > i, #restartTestButton:hover > i, -#restartTestButton:hover > i, #showWordHistoryButton:hover > i, #saveScreenshotButton:hover > i, #restartTestButtonWithSameWordset:hover > i, diff --git a/stylelint.config.mjs b/stylelint.config.mjs index abdc991a9e12..56920c2c8c1a 100644 --- a/stylelint.config.mjs +++ b/stylelint.config.mjs @@ -2,8 +2,6 @@ export default { extends: ["stylelint-config-standard"], rules: { - "no-duplicate-selectors": null, // add - "font-family-no-missing-generic-family-keyword": null, // add "declaration-block-no-shorthand-property-overrides": null, // add From 38200c81107b12db50ca9df13c73cca837652a03 Mon Sep 17 00:00:00 2001 From: Nad Alaba <37968805+nadalaba@users.noreply.github.com> Date: Wed, 25 Mar 2026 18:33:19 +0300 Subject: [PATCH 15/29] re-add font-family-no-missing-generic-family-keyword --- stylelint.config.mjs | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/stylelint.config.mjs b/stylelint.config.mjs index 56920c2c8c1a..77158d063a1e 100644 --- a/stylelint.config.mjs +++ b/stylelint.config.mjs @@ -2,7 +2,16 @@ export default { extends: ["stylelint-config-standard"], rules: { - "font-family-no-missing-generic-family-keyword": null, // add + "font-family-no-missing-generic-family-keyword": [ + true, + { + ignoreFontFamilies: [ + "Font Awesome", + "Font Awesome Brands", + "Gallaudet", + ], + }, + ], //default: true "declaration-block-no-shorthand-property-overrides": null, // add @@ -51,11 +60,6 @@ export default { files: ["**/*.scss"], extends: ["stylelint-config-standard-scss"], rules: { - "font-family-no-missing-generic-family-keyword": [ - true, - { ignoreFontFamilies: ["Font Awesome", "Font Awesome Brands"] }, - ], //default: true - "selector-type-no-unknown": [ true, { ignore: ["custom-elements"], ignoreTypes: ["letter", "hint"] }, From 13d8a8e8386af624991aee0aaaecc1cadf2cecb7 Mon Sep 17 00:00:00 2001 From: Nad Alaba <37968805+nadalaba@users.noreply.github.com> Date: Wed, 25 Mar 2026 18:33:19 +0300 Subject: [PATCH 16/29] re-add declaration-block-no-shorthand-property-overrides --- frontend/static/themes/sewing_tin_light.css | 2 +- stylelint.config.mjs | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/frontend/static/themes/sewing_tin_light.css b/frontend/static/themes/sewing_tin_light.css index 870dd1ce59aa..1db4fd26357d 100644 --- a/frontend/static/themes/sewing_tin_light.css +++ b/frontend/static/themes/sewing_tin_light.css @@ -7,7 +7,7 @@ } header [data-ui-element="logoText"] { - background-color: #ffffff; /* fallback */ + background: #ffffff; /* fallback */ background: linear-gradient( #2d2076, #2d2076 25%, diff --git a/stylelint.config.mjs b/stylelint.config.mjs index 77158d063a1e..ae32fda5ab1d 100644 --- a/stylelint.config.mjs +++ b/stylelint.config.mjs @@ -13,8 +13,6 @@ export default { }, ], //default: true - "declaration-block-no-shorthand-property-overrides": null, // add - "at-rule-no-unknown": null, // consider adding "declaration-property-value-no-unknown": null, // add "selector-type-no-unknown": null, // add // default: [true, {ignore: ['custom-elements'],},] From fcd25fd3bb3baf4250e82c04dd0713baeba763df Mon Sep 17 00:00:00 2001 From: Nad Alaba <37968805+nadalaba@users.noreply.github.com> Date: Wed, 25 Mar 2026 18:33:19 +0300 Subject: [PATCH 17/29] re-add declaration-property-value-no-unknown --- backend/private/style.css | 2 +- frontend/static/themes/chaos_theory.css | 10 +++++++--- frontend/static/themes/moonlight.css | 4 ++-- stylelint.config.mjs | 1 - 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/backend/private/style.css b/backend/private/style.css index 03e659fc33d9..72bc15ae7bf9 100644 --- a/backend/private/style.css +++ b/backend/private/style.css @@ -81,7 +81,7 @@ body { bottom: 3rem; background-color: var(--sub-alt-color); color: var(--text-color); - font-style: bold; + font-weight: bold; border-radius: 3px; padding: 1rem 2rem; cursor: pointer; diff --git a/frontend/static/themes/chaos_theory.css b/frontend/static/themes/chaos_theory.css index 681c1d5aa9f1..d1c449bba752 100644 --- a/frontend/static/themes/chaos_theory.css +++ b/frontend/static/themes/chaos_theory.css @@ -31,18 +31,21 @@ width: 4px !important; } +/* this is not taking effect since 4 years ago because it is +refering to the old .config which does not exist anymore +did not try it on the new #testConfig yet .config .toggleButton { transform: rotateY(180deg); unicode-bidi: bidi-override; direction: rtl; - align-content: right; + //align-content: right; // there is no align-content: right } .config .mode .textButton { transform: rotateY(180deg); unicode-bidi: bidi-override; direction: rtl; - align-content: right; + //align-content: right; // there is no align-content: right } .config .wordCount .textButton, @@ -52,8 +55,9 @@ transform: rotateY(180deg); unicode-bidi: bidi-override; direction: rtl; - align-content: right; + //align-content: right; // there is no align-content: right } +*/ [data-nav-item] { color: var(--bg-color); diff --git a/frontend/static/themes/moonlight.css b/frontend/static/themes/moonlight.css index c76ad99f3125..ef248cc3b34e 100644 --- a/frontend/static/themes/moonlight.css +++ b/frontend/static/themes/moonlight.css @@ -12,11 +12,11 @@ header[data-focused] { [data-nav-item="leaderboards"], [data-nav-item="about"], [data-nav-item="settings"] { - border-radius: rem !important; + /* border-radius: rem !important; this is doing nothing */ color: #191f28 !important; background: #c69f68; &:hover { - border-radius: rem !important; + /* border-radius: rem !important; this is doing nothing */ color: #4b5975 !important; transition: 0.25s; } diff --git a/stylelint.config.mjs b/stylelint.config.mjs index ae32fda5ab1d..c2b6871c9e0b 100644 --- a/stylelint.config.mjs +++ b/stylelint.config.mjs @@ -14,7 +14,6 @@ export default { ], //default: true "at-rule-no-unknown": null, // consider adding - "declaration-property-value-no-unknown": null, // add "selector-type-no-unknown": null, // add // default: [true, {ignore: ['custom-elements'],},] "length-zero-no-unit": null, // default: [true, {ignore: ['custom-properties'], ignorePreludeOfAtRules: ['function', 'mixin'],},] From cd86c8b370ad517876809f95bf46a98d9ea742fa Mon Sep 17 00:00:00 2001 From: Nad Alaba <37968805+nadalaba@users.noreply.github.com> Date: Wed, 25 Mar 2026 18:33:20 +0300 Subject: [PATCH 18/29] re-add selector-type-no-unknown --- frontend/static/funbox/crt.css | 2 +- stylelint.config.mjs | 10 ++++------ 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/frontend/static/funbox/crt.css b/frontend/static/funbox/crt.css index 1413c4f9f024..5d0541489e68 100644 --- a/frontend/static/funbox/crt.css +++ b/frontend/static/funbox/crt.css @@ -101,7 +101,7 @@ body.crtmode #caret { } body.crtmode #paceCaret, -body.crtmode key, +body.crtmode key, /* cannot find what the key selector refers to */ body.crtmode #bannerCenter .banner { box-shadow: 3px 0 1px var(--crt-sub-color-glow), diff --git a/stylelint.config.mjs b/stylelint.config.mjs index c2b6871c9e0b..a77220698537 100644 --- a/stylelint.config.mjs +++ b/stylelint.config.mjs @@ -14,7 +14,10 @@ export default { ], //default: true "at-rule-no-unknown": null, // consider adding - "selector-type-no-unknown": null, // add // default: [true, {ignore: ['custom-elements'],},] + "selector-type-no-unknown": [ + true, + { ignore: ["custom-elements"], ignoreTypes: ["letter", "hint", "key"] }, + ], // default: [true, {ignore: ['custom-elements'],},] "length-zero-no-unit": null, // default: [true, {ignore: ['custom-properties'], ignorePreludeOfAtRules: ['function', 'mixin'],},] @@ -57,11 +60,6 @@ export default { files: ["**/*.scss"], extends: ["stylelint-config-standard-scss"], rules: { - "selector-type-no-unknown": [ - true, - { ignore: ["custom-elements"], ignoreTypes: ["letter", "hint"] }, - ], // default: [true, {ignore: ['custom-elements'],},] - "scss/at-extend-no-missing-placeholder": null, "scss/load-no-partial-leading-underscore": null, "scss/load-partial-extension": null, // default: never, From afa6f564701e19b8227cd663a7bdfcf83436452a Mon Sep 17 00:00:00 2001 From: Nad Alaba <37968805+nadalaba@users.noreply.github.com> Date: Wed, 25 Mar 2026 18:33:20 +0300 Subject: [PATCH 19/29] re-add property-no-vendor-prefix --- frontend/src/styles/tailwind.css | 2 +- stylelint.config.mjs | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/frontend/src/styles/tailwind.css b/frontend/src/styles/tailwind.css index 68ae21a5ea8d..77468db97091 100644 --- a/frontend/src/styles/tailwind.css +++ b/frontend/src/styles/tailwind.css @@ -99,6 +99,6 @@ @apply border-none font-(--font) caret-(--text-color) font-[inherit]; outline: 0.15em solid var(--main-color); -webkit-text-fill-color: var(--text-color); - -webkit-box-shadow: 0 0 0 1000000px var(--sub-alt-color) inset; + box-shadow: 0 0 0 1000000px var(--sub-alt-color) inset; } } diff --git a/stylelint.config.mjs b/stylelint.config.mjs index a77220698537..67a7f46b3175 100644 --- a/stylelint.config.mjs +++ b/stylelint.config.mjs @@ -21,8 +21,6 @@ export default { "length-zero-no-unit": null, // default: [true, {ignore: ['custom-properties'], ignorePreludeOfAtRules: ['function', 'mixin'],},] - "property-no-vendor-prefix": null, // add - "value-keyword-case": null, // default: lower "at-rule-empty-line-before": null, // default: ['always', {except: ['blockless-after-same-name-blockless', 'first-nested'], ignore: ['after-comment'],},] From f8b0120d7237b556da99929ef0a2c1d2b7a4d21f Mon Sep 17 00:00:00 2001 From: Nad Alaba <37968805+nadalaba@users.noreply.github.com> Date: Wed, 25 Mar 2026 18:33:20 +0300 Subject: [PATCH 20/29] re-add selector-pseudo-element-colon-notation: double --- frontend/static/themes/moonlight.css | 4 ++-- frontend/static/themes/snes.css | 4 ++-- stylelint.config.mjs | 1 - 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/frontend/static/themes/moonlight.css b/frontend/static/themes/moonlight.css index ef248cc3b34e..338c362ce344 100644 --- a/frontend/static/themes/moonlight.css +++ b/frontend/static/themes/moonlight.css @@ -2,8 +2,8 @@ header[data-focused] { & [data-nav-item], - & nav:before, - & nav:after { + & nav::before, + & nav::after { background: var(--bg-color); } } diff --git a/frontend/static/themes/snes.css b/frontend/static/themes/snes.css index dc66e7a2cbf7..b3c8c38be949 100644 --- a/frontend/static/themes/snes.css +++ b/frontend/static/themes/snes.css @@ -8,8 +8,8 @@ } header[data-focused] [data-nav-item], -header[data-focused] nav:before, -header[data-focused] nav:after { +header[data-focused] nav::before, +header[data-focused] nav::after { background: #99989f; } diff --git a/stylelint.config.mjs b/stylelint.config.mjs index 67a7f46b3175..99910a86426b 100644 --- a/stylelint.config.mjs +++ b/stylelint.config.mjs @@ -37,7 +37,6 @@ export default { "import-notation": null, // default: url "media-feature-range-notation": null, // default: context "selector-not-notation": null, // default: complex - "selector-pseudo-element-colon-notation": null, // add // default: double // default pattern for these rules is a kebab case pattern "custom-property-pattern": null, From bdf4ac963f3e95feeaa1db75779b6fdf0799e5d8 Mon Sep 17 00:00:00 2001 From: Nad Alaba <37968805+nadalaba@users.noreply.github.com> Date: Wed, 25 Mar 2026 18:33:21 +0300 Subject: [PATCH 21/29] re-add font-family-name-quotes: always-where-recommended --- frontend/static/funbox/asl.css | 4 ++-- stylelint.config.mjs | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/frontend/static/funbox/asl.css b/frontend/static/funbox/asl.css index d1161b8d15ad..fac24919085d 100644 --- a/frontend/static/funbox/asl.css +++ b/frontend/static/funbox/asl.css @@ -1,8 +1,8 @@ @font-face { - font-family: "Gallaudet"; + font-family: Gallaudet; src: url("/webfonts/GallaudetRegular.woff2") format("woff2"); } #wordsWrapper { - font-family: "Gallaudet" !important; + font-family: Gallaudet !important; } diff --git a/stylelint.config.mjs b/stylelint.config.mjs index 99910a86426b..d6b84d64fa05 100644 --- a/stylelint.config.mjs +++ b/stylelint.config.mjs @@ -44,7 +44,6 @@ export default { "selector-class-pattern": null, "selector-id-pattern": null, - "font-family-name-quotes": null, // add // default: always-where-recommended "function-url-quotes": null, // add // default: always "declaration-block-no-redundant-longhand-properties": null, From 0cdb1e7e592b43c7a3b583b2d17573795bcd6aca Mon Sep 17 00:00:00 2001 From: Nad Alaba <37968805+nadalaba@users.noreply.github.com> Date: Wed, 25 Mar 2026 18:33:21 +0300 Subject: [PATCH 22/29] re-add function-url-quotes: always --- frontend/static/themes/chaos_theory.css | 2 +- stylelint.config.mjs | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/frontend/static/themes/chaos_theory.css b/frontend/static/themes/chaos_theory.css index d1c449bba752..d1ef620de959 100644 --- a/frontend/static/themes/chaos_theory.css +++ b/frontend/static/themes/chaos_theory.css @@ -20,7 +20,7 @@ } #caret { - background-image: url(/images/themes/chaos_theory/caret.webp) !important; + background-image: url("/images/themes/chaos_theory/caret.webp") !important; background-color: transparent !important; background-size: 1rem !important; background-position: center !important; diff --git a/stylelint.config.mjs b/stylelint.config.mjs index d6b84d64fa05..43961a5aa020 100644 --- a/stylelint.config.mjs +++ b/stylelint.config.mjs @@ -44,8 +44,6 @@ export default { "selector-class-pattern": null, "selector-id-pattern": null, - "function-url-quotes": null, // add // default: always - "declaration-block-no-redundant-longhand-properties": null, "shorthand-property-no-redundant-values": null, From 5480020eeda05a13da76aeba71a6d5b081700aeb Mon Sep 17 00:00:00 2001 From: Nad Alaba <37968805+nadalaba@users.noreply.github.com> Date: Wed, 25 Mar 2026 18:33:21 +0300 Subject: [PATCH 23/29] re-add at-rule-no-unknown --- stylelint.config.mjs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/stylelint.config.mjs b/stylelint.config.mjs index 43961a5aa020..2191701e8345 100644 --- a/stylelint.config.mjs +++ b/stylelint.config.mjs @@ -13,7 +13,10 @@ export default { }, ], //default: true - "at-rule-no-unknown": null, // consider adding + "at-rule-no-unknown": [ + true, + { ignoreAtRules: ["theme", "utility", "tailwind", "apply", "source"] }, + ], // source for lightningCss and the rest for tailwind //default: true "selector-type-no-unknown": [ true, { ignore: ["custom-elements"], ignoreTypes: ["letter", "hint", "key"] }, @@ -54,6 +57,8 @@ export default { files: ["**/*.scss"], extends: ["stylelint-config-standard-scss"], rules: { + "at-rule-no-unknown": null, // use "scss/at-rule-no-unknown" to override this + "scss/at-extend-no-missing-placeholder": null, "scss/load-no-partial-leading-underscore": null, "scss/load-partial-extension": null, // default: never, From 1cb4f1481c46697c8b3019f22f8a74c26d374842 Mon Sep 17 00:00:00 2001 From: Nad Alaba <37968805+nadalaba@users.noreply.github.com> Date: Wed, 25 Mar 2026 18:33:21 +0300 Subject: [PATCH 24/29] add stylelint to lint-staged --- package.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/package.json b/package.json index 196d2482db8a..13cf281898ce 100644 --- a/package.json +++ b/package.json @@ -84,6 +84,9 @@ ], "*.{ts,tsx,js}": [ "oxlint --type-aware --type-check" + ], + "*.{scss,css}": [ + "stylelint" ] }, "engines": { From 84e23fea85643e3c9db2a0b2f56578cf8edaaeb3 Mon Sep 17 00:00:00 2001 From: Nad Alaba <37968805+nadalaba@users.noreply.github.com> Date: Wed, 25 Mar 2026 18:33:21 +0300 Subject: [PATCH 25/29] add stylelint to turbo, full-check and CI --- .github/workflows/monkey-ci.yml | 20 +++++++++++++++----- frontend/package.json | 2 ++ package.json | 4 +++- turbo.json | 3 +++ 4 files changed, 23 insertions(+), 6 deletions(-) diff --git a/.github/workflows/monkey-ci.yml b/.github/workflows/monkey-ci.yml index 02217993414e..5e8192502ae6 100644 --- a/.github/workflows/monkey-ci.yml +++ b/.github/workflows/monkey-ci.yml @@ -30,7 +30,7 @@ jobs: should-build-be: ${{ steps.export-changes.outputs.should-build-be }} should-build-fe: ${{ steps.export-changes.outputs.should-build-fe }} should-build-pkg: ${{ steps.export-changes.outputs.should-build-pkg }} - assets-json: ${{ steps.export-changes.outputs.assets-json }} + assetsAndStyles: ${{ steps.export-changes.outputs.assetsAndStyles }} steps: - name: Full checkout @@ -43,8 +43,9 @@ jobs: id: filter with: filters: | - json: + assetsAndStyles: - 'frontend/static/**/*' + - '**/*.{scss,css}' be-src: - 'backend/**/*.{ts,js,json,lua,css,html}' - 'backend/package.json' @@ -72,13 +73,13 @@ jobs: echo "should-build-pkg=${{ steps.filter.outputs.pkg-src }}" >> $GITHUB_OUTPUT echo "should-build-be=${{ steps.filter.outputs.be-src }}" >> $GITHUB_OUTPUT echo "should-build-fe=${{ steps.filter.outputs.fe-src }}" >> $GITHUB_OUTPUT - echo "assets-json=${{ steps.filter.outputs.json }}" >> $GITHUB_OUTPUT + echo "assetsAndStyles=${{ steps.filter.outputs.assetsAndStyles }}" >> $GITHUB_OUTPUT prime-cache: name: prime-cache runs-on: ubuntu-latest needs: [pre-ci] - if: needs.pre-ci.outputs.should-build-be == 'true' || needs.pre-ci.outputs.should-build-fe == 'true' || needs.pre-ci.outputs.should-build-pkg == 'true' || needs.pre-ci.outputs.assets-json == 'true' || contains(github.event.pull_request.labels.*.name, 'force-full-ci') + if: needs.pre-ci.outputs.should-build-be == 'true' || needs.pre-ci.outputs.should-build-fe == 'true' || needs.pre-ci.outputs.should-build-pkg == 'true' || needs.pre-ci.outputs.assetsAndStyles == 'true' || contains(github.event.pull_request.labels.*.name, 'force-full-ci') steps: - name: Checkout pnpm-lock uses: actions/checkout@v4 @@ -224,7 +225,7 @@ jobs: name: ci-assets needs: [pre-ci, prime-cache] runs-on: ubuntu-latest - if: needs.pre-ci.outputs.assets-json == 'true' || contains(github.event.pull_request.labels.*.name, 'force-full-ci') + if: needs.pre-ci.outputs.assetsAndStyles == 'true' || contains(github.event.pull_request.labels.*.name, 'force-full-ci') steps: - uses: actions/checkout@v4 with: @@ -236,6 +237,10 @@ jobs: id: filter with: filters: | + styles: + - '**/*.{scss,css}' + json: + - 'frontend/static/**/*.json' languages: - 'frontend/static/languages/**' quotes: @@ -273,7 +278,12 @@ jobs: - name: Install dependencies run: pnpm install + - name: Lint styles + if: steps.filter.outputs.styles == 'true' + run: npm run lint-styles + - name: Lint JSON + if: steps.filter.outputs.json == 'true' run: npm run lint-json-assets - name: Validate language assets diff --git a/frontend/package.json b/frontend/package.json index f21c61bc9744..b31ef6313fc3 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -6,6 +6,8 @@ "scripts": { "lint": "oxlint . --type-aware --type-check", "lint-fast": "oxlint .", + "lint-styles": "stylelint \"**/*.{scss,css}\"", + "lint-styles-fix": "stylelint \"**/*.{scss,css}\" --fix", "lint-json": "eslint static/**/*.json", "check-assets": "tsx ./scripts/check-assets.ts", "audit": "vite-bundle-visualizer", diff --git a/package.json b/package.json index 13cf281898ce..8c4763b7de21 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "type": "module", "scripts": { "preinstall": "npx only-allow pnpm", - "full-check": "turbo lint build test integration-test check-assets --force", + "full-check": "turbo lint build test integration-test lint-styles lint-json check-assets --force", "prepare": "husky install", "pre-commit": "lint-staged", "ts-check": "turbo run ts-check", @@ -49,6 +49,8 @@ "hotfix-dry": "monkeytype-release --hotfix --dry", "format-check": "oxfmt . --check", "format-fix": "oxfmt .", + "lint-styles": "stylelint \"**/*.{scss,css}\"", + "lint-styles-fix": "stylelint \"**/*.{scss,css}\" --fix", "lint-json-assets": "turbo lint-json --filter @monkeytype/frontend", "check-assets": "turbo check-assets --filter @monkeytype/frontend", "check-assets-quotes": "turbo check-assets --filter @monkeytype/frontend -- quotes", diff --git a/turbo.json b/turbo.json index f0013d056cb5..f3cf9386d268 100644 --- a/turbo.json +++ b/turbo.json @@ -42,6 +42,9 @@ "@monkeytype/frontend#check-assets": { "dependsOn": ["^parallel", "@monkeytype/schemas#build"] }, + "//#lint-styles": { + "dependsOn": ["^parallel"] + }, "@monkeytype/frontend#lint-json": { "dependsOn": ["^parallel"] }, From 5d41c8e46e8d309e2ac2af96f06cade5db65a7b4 Mon Sep 17 00:00:00 2001 From: Nad Alaba <37968805+nadalaba@users.noreply.github.com> Date: Wed, 25 Mar 2026 18:33:22 +0300 Subject: [PATCH 26/29] add stylelint vscode extension --- monkeytype.code-workspace | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/monkeytype.code-workspace b/monkeytype.code-workspace index 3ddff0b55d9b..cec61ca8c4ec 100644 --- a/monkeytype.code-workspace +++ b/monkeytype.code-workspace @@ -44,7 +44,7 @@ "testing.automaticallyOpenTestResults": "neverOpen", "vitest.maximumConfigs": 10, "oxc.typeAware": true, - "typescript.format.enable": false, + "js/ts.format.enabled": false, "oxc.fmt.configPath": ".oxfmtrc-editor.json", "oxc.fixKind": "safe_fix_or_suggestion", "[json]": { @@ -68,6 +68,11 @@ "[javascriptreact]": { "editor.defaultFormatter": "oxc.oxc-vscode", }, + "css.validate": false, + "scss.validate": false, + "stylelint.lintFiles.glob": "**/*.{css,scss}", + "stylelint.snippet": ["css", "postcss", "scss"], + "stylelint.validate": ["css", "postcss", "scss"], }, "launch": { @@ -101,6 +106,7 @@ "oxc.oxc-vscode", "bradlc.vscode-tailwindcss", "csstools.postcss", + "stylelint.vscode-stylelint", ], }, } From 605608d382017b478bc2faf651d546ca72b1a1a4 Mon Sep 17 00:00:00 2001 From: Nad Alaba <37968805+nadalaba@users.noreply.github.com> Date: Wed, 25 Mar 2026 20:07:22 +0300 Subject: [PATCH 27/29] Revert "re-add no-invalid-position-at-import-rule" This reverts commit e49a0bcea2be03cb05af8d04ba4942b752814ad2. --- frontend/src/styles/fontawesome-5.scss | 4 ++-- frontend/src/styles/index.scss | 26 +++++--------------------- frontend/src/styles/media-queries.scss | 18 +++++++++--------- frontend/src/styles/vendor.scss | 8 +++++--- stylelint.config.mjs | 2 ++ 5 files changed, 23 insertions(+), 35 deletions(-) diff --git a/frontend/src/styles/fontawesome-5.scss b/frontend/src/styles/fontawesome-5.scss index 1687cee3bfb0..fb3105a3ab7f 100644 --- a/frontend/src/styles/fontawesome-5.scss +++ b/frontend/src/styles/fontawesome-5.scss @@ -8,8 +8,6 @@ @import "@fortawesome/fontawesome-free/scss/_animated.scss"; //fa-spin /** rotated **/ @import "@fortawesome/fontawesome-free/scss/_rotated-flipped.scss"; //fa-rotate-90 -/** icons **/ -@import "@fortawesome/fontawesome-free/scss/_icons.scss"; @font-face { font-family: "Font Awesome"; @@ -59,3 +57,5 @@ src: url("/webfonts-generated/fa-brands-400.woff2") format("woff2"); } } + +@import "@fortawesome/fontawesome-free/scss/_icons.scss"; diff --git a/frontend/src/styles/index.scss b/frontend/src/styles/index.scss index edd6d813c01a..7e047a112b5c 100644 --- a/frontend/src/styles/index.scss +++ b/frontend/src/styles/index.scss @@ -1,24 +1,3 @@ -@import "buttons" layer(custom-styles); -@import "404" layer(custom-styles); -@import "ads" layer(custom-styles); -@import "account" layer(custom-styles); -@import "animations" layer(custom-styles); -@import "caret" layer(custom-styles); -@import "commandline" layer(custom-styles); -@import "core" layer(custom-styles); -@import "fonts" layer(custom-styles); -@import "inputs" layer(custom-styles); -@import "keymap" layer(custom-styles); -@import "monkey" layer(custom-styles); -@import "popups" layer(custom-styles); -@import "scroll" layer(custom-styles); -@import "settings" layer(custom-styles); -@import "account-settings" layer(custom-styles); -@import "test" layer(custom-styles); -@import "loading" layer(custom-styles); -@import "friends" layer(custom-styles); -@import "media-queries" layer(custom-styles); - @layer hidden { // custom layer to hide elements without using !important // (as long as this layer is higher than custom-styles) @@ -37,6 +16,11 @@ } @layer custom-styles { + @import "buttons", "404", "ads", "account", "animations", "caret", + "commandline", "core", "fonts", "inputs", "keymap", "monkey", "popups", + "scroll", "settings", "account-settings", "test", "loading", "friends", + "media-queries"; + .chartCanvas { width: 100% !important; } diff --git a/frontend/src/styles/media-queries.scss b/frontend/src/styles/media-queries.scss index 70acabef9a4c..e9358c2d5290 100644 --- a/frontend/src/styles/media-queries.scss +++ b/frontend/src/styles/media-queries.scss @@ -1,12 +1,3 @@ -//media queries based on tailwind breakpoints https://tailwindcss.com/docs/container -@import "media-queries-orange"; -@import "media-queries-yellow"; -@import "media-queries-green"; -@import "media-queries-blue"; -@import "media-queries-purple"; -@import "media-queries-brown"; -@import "media-queries-gray"; - body { &.mediaQueryDebugLevel1 { .content-grid { @@ -23,6 +14,15 @@ body { } } +//media queries based on tailwind breakpoints https://tailwindcss.com/docs/container +@import "media-queries-orange"; +@import "media-queries-yellow"; +@import "media-queries-green"; +@import "media-queries-blue"; +@import "media-queries-purple"; +@import "media-queries-brown"; +@import "media-queries-gray"; + @media only screen and (max-width: 1875px) { .ad.ad-v { display: none; diff --git a/frontend/src/styles/vendor.scss b/frontend/src/styles/vendor.scss index db624d89b01d..d3845c1879d7 100644 --- a/frontend/src/styles/vendor.scss +++ b/frontend/src/styles/vendor.scss @@ -1,4 +1,6 @@ @import "normalize.css" layer(normalize); -@import "fontawesome-5" layer(vendor); -@import "slim-select/styles" layer(vendor); -@import "balloon-css/src/balloon" layer(vendor); +@layer vendor { + @import "fontawesome-5"; + @import "slim-select/styles"; + @import "balloon-css/src/balloon"; +} diff --git a/stylelint.config.mjs b/stylelint.config.mjs index 2191701e8345..651fb80ddb9c 100644 --- a/stylelint.config.mjs +++ b/stylelint.config.mjs @@ -57,6 +57,8 @@ export default { files: ["**/*.scss"], extends: ["stylelint-config-standard-scss"], rules: { + "no-invalid-position-at-import-rule": null, // consider adding // default: [true, {ignoreAtRules: ['use', 'forward'],},] + "at-rule-no-unknown": null, // use "scss/at-rule-no-unknown" to override this "scss/at-extend-no-missing-placeholder": null, From fb5648c523e55a7910973d2d4990385707327732 Mon Sep 17 00:00:00 2001 From: Nad Alaba <37968805+nadalaba@users.noreply.github.com> Date: Wed, 25 Mar 2026 21:45:24 +0300 Subject: [PATCH 28/29] replace key type with kbd key tag is no longer used since 12e0035 --- frontend/static/funbox/crt.css | 2 +- stylelint.config.mjs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/static/funbox/crt.css b/frontend/static/funbox/crt.css index 5d0541489e68..0ca8f62f387b 100644 --- a/frontend/static/funbox/crt.css +++ b/frontend/static/funbox/crt.css @@ -101,7 +101,7 @@ body.crtmode #caret { } body.crtmode #paceCaret, -body.crtmode key, /* cannot find what the key selector refers to */ +body.crtmode kbd, body.crtmode #bannerCenter .banner { box-shadow: 3px 0 1px var(--crt-sub-color-glow), diff --git a/stylelint.config.mjs b/stylelint.config.mjs index 651fb80ddb9c..5aacf8e9a154 100644 --- a/stylelint.config.mjs +++ b/stylelint.config.mjs @@ -19,7 +19,7 @@ export default { ], // source for lightningCss and the rest for tailwind //default: true "selector-type-no-unknown": [ true, - { ignore: ["custom-elements"], ignoreTypes: ["letter", "hint", "key"] }, + { ignore: ["custom-elements"], ignoreTypes: ["letter", "hint"] }, ], // default: [true, {ignore: ['custom-elements'],},] "length-zero-no-unit": null, // default: [true, {ignore: ['custom-properties'], ignorePreludeOfAtRules: ['function', 'mixin'],},] From 4af37182478c49fd7462507150a72f3e9476f156 Mon Sep 17 00:00:00 2001 From: Nad Alaba <37968805+nadalaba@users.noreply.github.com> Date: Thu, 26 Mar 2026 21:07:21 +0300 Subject: [PATCH 29/29] allow ci to run --- .github/workflows/monkey-ci.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/workflows/monkey-ci.yml b/.github/workflows/monkey-ci.yml index 5e8192502ae6..44ab4a0e6808 100644 --- a/.github/workflows/monkey-ci.yml +++ b/.github/workflows/monkey-ci.yml @@ -63,10 +63,6 @@ jobs: if: steps.filter.outputs.anti-cheat == 'true' && !contains(github.event.pull_request.labels.*.name, 'force-ci') && !contains(github.event.pull_request.labels.*.name, 'force-full-ci') run: exit 1 - - name: Check Workflow Changes - if: steps.filter.outputs.workflows == 'true' && !contains(github.event.pull_request.labels.*.name, 'force-ci') && !contains(github.event.pull_request.labels.*.name, 'force-full-ci') - run: exit 1 - - name: Export changes id: export-changes run: |