diff --git a/.github/workflows/monkey-ci.yml b/.github/workflows/monkey-ci.yml index 02217993414e..44ab4a0e6808 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' @@ -62,23 +63,19 @@ 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: | 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 +221,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 +233,10 @@ jobs: id: filter with: filters: | + styles: + - '**/*.{scss,css}' + json: + - 'frontend/static/**/*.json' languages: - 'frontend/static/languages/**' quotes: @@ -273,7 +274,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/backend/private/style.css b/backend/private/style.css index 1b274ef00684..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; @@ -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/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/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 6e779672f650..54f8a28f2fdc 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,10 +170,8 @@ padding: 0.5rem; border-radius: var(--roundness); cursor: pointer; - -webkit-transition: 0.25s; transition: 0.25s; - -webkit-user-select: none; - display: -ms-grid; + user-select: none; 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 b14263e1ae91..b2a0a8f82b36 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: @@ -38,11 +37,9 @@ 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; - height: -moz-min-content; height: min-content; line-height: 1.25; appearance: none; @@ -115,10 +112,8 @@ 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; height: min-content; line-height: 1.25; appearance: none; 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..670662cc52fb 100644 --- a/frontend/src/styles/commandline.scss +++ b/frontend/src/styles/commandline.scss @@ -60,13 +60,11 @@ } .suggestions { - display: block; @extend .ffscroll; overflow-y: scroll; 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 fef770be07df..a7b63a408713 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; @@ -321,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; @@ -375,7 +373,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); @@ -401,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/fontawesome-5.scss b/frontend/src/styles/fontawesome-5.scss index 933587471119..fb3105a3ab7f 100644 --- a/frontend/src/styles/fontawesome-5.scss +++ b/frontend/src/styles/fontawesome-5.scss @@ -2,7 +2,7 @@ @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 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/inputs.scss b/frontend/src/styles/inputs.scss index ca0768d7920c..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%; @@ -110,14 +109,13 @@ input[type="checkbox"] { position: relative; transition: background 0.125s; flex-shrink: 0; - &:after { + &::after { font-family: "Font Awesome"; content: "\f00c"; top: 0; left: 0; width: 100%; height: 100%; - display: block; border-radius: calc((var(--roundness) / 2) - 0.1em); font-weight: 900; position: absolute; @@ -129,23 +127,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); } } @@ -176,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; } @@ -202,13 +196,12 @@ 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); } // slim-select styles .ss-main { - border-radius: var(--roundness); outline: none; border: none; border-radius: var(--roundness); @@ -316,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/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/frontend/src/styles/popups.scss b/frontend/src/styles/popups.scss index 5de0f1b4f917..304c7a6d87e0 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; @@ -329,7 +328,6 @@ body.darkMode { width: 100%; max-width: 1000px; aspect-ratio: 16/9; - display: grid; grid-template-areas: "middle"; .preloader { grid-area: middle; @@ -480,7 +478,6 @@ body.darkMode { td { padding: 0.5rem; background: var(--bg-color); - position: -webkit-sticky; position: sticky; top: 0; z-index: 99; @@ -498,7 +495,6 @@ body.darkMode { tfoot { td { padding: 1rem 0.5rem; - position: -webkit-sticky; position: sticky; bottom: -5px; background: var(--bg-color); @@ -712,7 +708,6 @@ body.darkMode { } .badgeSelectionItem { - margin-bottom: 0.5rem; width: max-content; opacity: 25%; cursor: pointer; diff --git a/frontend/src/styles/standalone.scss b/frontend/src/styles/standalone.scss index 262b4514e306..a55889b402e5 100644 --- a/frontend/src/styles/standalone.scss +++ b/frontend/src/styles/standalone.scss @@ -2,18 +2,18 @@ @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"); + 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; - src: url(/webfonts/LexendDeca-Regular.woff2) format("woff2"); + src: url("/webfonts/LexendDeca-Regular.woff2") format("woff2"); } :root { @@ -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/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/frontend/src/styles/test.scss b/frontend/src/styles/test.scss index 317e16f7b67e..9b9961a7a9af 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; @@ -193,13 +191,11 @@ #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; width: 100%; align-content: flex-start; - -webkit-user-select: none; user-select: none; .newline { @@ -345,7 +341,6 @@ &.blurred { opacity: 0.25; filter: blur(4px); - -webkit-filter: blur(4px); } &.blind { @@ -691,7 +686,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 @@ -743,8 +737,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; } } @@ -899,7 +893,6 @@ #resultReplay .words { user-select: none; - -webkit-user-select: none; } .chart { @@ -1028,7 +1021,6 @@ text-align: center; color: var(--sub-color); // grid-area: login; - grid-column: 1/3; .link { text-decoration: underline; display: inline-block; @@ -1341,7 +1333,6 @@ &.blurred { opacity: 0.25; - -webkit-filter: blur(4px); filter: blur(4px); } } @@ -1358,13 +1349,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%, @@ -1392,7 +1376,6 @@ position: absolute; transform: translateX(-50%); top: -6rem; - -webkit-user-select: none; user-select: none; pointer-events: none; opacity: 0; @@ -1405,7 +1388,6 @@ z-index: 999; position: absolute; width: 100%; - -webkit-user-select: none; user-select: none; pointer-events: none; } @@ -1419,7 +1401,6 @@ margin-bottom: 0.5rem; transition: opacity 0.125s; justify-content: center; - -webkit-user-select: none; user-select: none; .textButton { 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/frontend/static/funbox/crt.css b/frontend/static/funbox/crt.css index 1413c4f9f024..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, +body.crtmode kbd, body.crtmode #bannerCenter .banner { box-shadow: 3px 0 1px var(--crt-sub-color-glow), 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..d1ef620de959 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; @@ -36,7 +20,7 @@ header[data-focused] { } #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; @@ -47,18 +31,21 @@ header[data-focused] { 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, @@ -68,8 +55,9 @@ header[data-focused] { 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); @@ -128,6 +116,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/moonlight.css b/frontend/static/themes/moonlight.css index c76ad99f3125..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); } } @@ -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/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..adeb41c2cb93 100644 --- a/frontend/static/themes/rainbow_trail.css +++ b/frontend/static/themes/rainbow_trail.css @@ -31,7 +31,11 @@ header [data-ui-element="logoSubtext"], button.text:hover, .textButton:hover, -#restartTestButton:hover > i, +footer a:hover, +footer a:hover > i, +footer button:hover, +footer button:hover > i, +footer button:hover > .relative > i, #restartTestButton:hover > i, #showWordHistoryButton:hover > i, #saveScreenshotButton:hover > i, @@ -39,12 +43,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 +77,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 +107,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 +125,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/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/frontend/static/themes/snes.css b/frontend/static/themes/snes.css index de84a0e10d1a..b3c8c38be949 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/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", ], }, } diff --git a/package.json b/package.json index 6d904664f6b4..6acab1ed0ed0 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", @@ -72,6 +74,9 @@ "oxlint": "1.57.0", "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", "yaml": "2.8.2" @@ -82,6 +87,9 @@ ], "*.{ts,tsx,js}": [ "oxlint --type-aware --type-check" + ], + "*.{scss,css}": [ + "stylelint" ] }, "engines": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 50270802713f..46773efdd82f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -53,6 +53,15 @@ 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: + 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)) turbo: specifier: 2.7.5 version: 2.7.5 @@ -1387,6 +1396,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'} @@ -1501,6 +1516,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'} @@ -1514,14 +1536,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==} @@ -2405,6 +2464,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==} @@ -3412,6 +3480,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'} @@ -4883,6 +4955,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'} @@ -5116,6 +5191,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==} @@ -5357,6 +5435,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'} @@ -5401,6 +5488,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==} @@ -5411,6 +5502,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'} @@ -5418,6 +5513,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'} @@ -6077,6 +6177,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==} @@ -6103,6 +6207,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'} @@ -6175,12 +6282,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==} @@ -6331,6 +6444,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'} @@ -6432,6 +6549,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'} @@ -6452,6 +6577,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'} @@ -6519,6 +6651,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==} @@ -6544,6 +6680,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'} @@ -6563,6 +6703,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==} @@ -6604,6 +6750,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==} @@ -6686,6 +6836,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==} @@ -6917,10 +7071,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==} @@ -7224,6 +7386,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'} @@ -7236,6 +7401,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==} @@ -7515,6 +7683,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==} @@ -7673,9 +7844,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'} @@ -7694,6 +7871,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'} @@ -8650,6 +8831,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==} @@ -8795,6 +8998,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'} @@ -9369,6 +9576,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'} @@ -9598,6 +9809,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==} @@ -9689,6 +9904,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==} @@ -9721,6 +9979,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'} @@ -9737,10 +9999,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: @@ -9753,6 +10022,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==} @@ -10200,6 +10473,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} @@ -10722,6 +10999,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'} @@ -11546,13 +11827,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 @@ -11588,6 +11869,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 @@ -11746,6 +12039,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 @@ -11757,10 +12055,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 @@ -12753,6 +13074,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) @@ -13610,6 +13939,8 @@ snapshots: '@sindresorhus/is@4.6.0': {} + '@sindresorhus/merge-streams@4.0.0': {} + '@snyk/github-codeowners@1.1.0': dependencies: commander: 4.1.1 @@ -15378,6 +15709,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 @@ -15605,6 +15944,8 @@ snapshots: color-convert: 1.9.3 color-string: 1.9.1 + colord@2.9.3: {} + colorette@1.4.0: {} colorette@2.0.20: {} @@ -15855,6 +16196,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 @@ -15900,6 +16250,8 @@ snapshots: css-color-keywords@1.0.0: {} + css-functions-list@3.3.3: {} + css-select@5.1.0: dependencies: boolbase: 1.0.0 @@ -15919,10 +16271,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 @@ -16305,8 +16664,7 @@ snapshots: entities@6.0.1: {} - env-paths@2.2.1: - optional: true + env-paths@2.2.1: {} environment@1.1.0: {} @@ -16782,6 +17140,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 @@ -16821,6 +17181,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 @@ -17037,10 +17401,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): @@ -17200,6 +17572,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 @@ -17334,6 +17708,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: {} @@ -17360,6 +17744,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 @@ -17451,6 +17846,8 @@ snapshots: has-flag@4.0.0: {} + has-flag@5.0.1: {} + has-own-property@0.1.0: {} has-property-descriptors@1.0.2: @@ -17471,6 +17868,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 @@ -17483,6 +17884,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: @@ -17530,6 +17935,8 @@ snapshots: html-tags@3.3.1: {} + html-tags@5.1.0: {} + htmlparser2@5.0.1: dependencies: domelementtype: 2.3.0 @@ -17626,6 +18033,8 @@ snapshots: ignore@5.3.2: {} + ignore@7.0.5: {} + immutable@4.3.8: {} immutable@5.1.5: @@ -17862,8 +18271,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: {} @@ -18190,6 +18603,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: @@ -18214,6 +18631,8 @@ snapshots: known-css-properties@0.30.0: {} + known-css-properties@0.37.0: {} + kuler@2.0.0: {} lazystream@1.0.1: @@ -18438,6 +18857,8 @@ snapshots: lodash.startcase@4.4.0: {} + lodash.truncate@4.4.2: {} + lodash.uniq@4.5.0: {} lodash.upperfirst@4.3.1: {} @@ -18607,8 +19028,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: {} @@ -18619,6 +19044,8 @@ snapshots: meow@13.2.0: {} + meow@14.1.0: {} + meow@8.1.2: dependencies: '@types/minimist': 1.2.5 @@ -19594,14 +20021,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 @@ -19785,6 +20212,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): @@ -19950,6 +20394,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 @@ -20683,6 +21131,8 @@ snapshots: slash@4.0.0: {} + slash@5.1.0: {} + slice-ansi@3.0.0: dependencies: ansi-styles: 4.3.0 @@ -20953,6 +21403,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: @@ -21059,6 +21514,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: @@ -21131,6 +21667,8 @@ snapshots: transitivePeerDependencies: - supports-color + supports-color@10.2.2: {} + supports-color@5.5.0: dependencies: has-flag: 3.0.0 @@ -21148,8 +21686,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) @@ -21183,6 +21728,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: {} @@ -21632,6 +22185,8 @@ snapshots: unicorn-magic@0.1.0: {} + unicorn-magic@0.4.0: {} + unique-filename@3.0.0: dependencies: unique-slug: 4.0.0 @@ -22349,6 +22904,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..5aacf8e9a154 --- /dev/null +++ b/stylelint.config.mjs @@ -0,0 +1,76 @@ +/** @type {import('stylelint').Config} */ +export default { + extends: ["stylelint-config-standard"], + rules: { + "font-family-no-missing-generic-family-keyword": [ + true, + { + ignoreFontFamilies: [ + "Font Awesome", + "Font Awesome Brands", + "Gallaudet", + ], + }, + ], //default: true + + "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"] }, + ], // default: [true, {ignore: ['custom-elements'],},] + + "length-zero-no-unit": null, // default: [true, {ignore: ['custom-properties'], ignorePreludeOfAtRules: ['function', 'mixin'],},] + + "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'],},] + "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 + "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 + + // 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, + + "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: { + "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, + "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/**"], +}; 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"] },