From 7e4ab3a0985aecc4dc834f7d78907ccbda175cca Mon Sep 17 00:00:00 2001 From: Christian Fehmer Date: Tue, 13 Jan 2026 14:23:25 +0100 Subject: [PATCH 1/5] chore: update testcontainers to v11.11.0 (@fehmer) (#7352) --- .../__tests__/__integration__/global-setup.ts | 7 ++++++ backend/package.json | 2 +- pnpm-lock.yaml | 22 +++++++++---------- 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/backend/__tests__/__integration__/global-setup.ts b/backend/__tests__/__integration__/global-setup.ts index 659b9a6fe780..b3e95ab1ca2c 100644 --- a/backend/__tests__/__integration__/global-setup.ts +++ b/backend/__tests__/__integration__/global-setup.ts @@ -7,6 +7,7 @@ export async function setup(): Promise { process.env.TZ = "UTC"; //use testcontainer to start mongodb + console.log("\x1b[36mMongoDB starting...\x1b[0m"); const mongoContainer = new GenericContainer("mongo:5.0.13") .withExposedPorts(27017) .withWaitStrategy(Wait.forListeningPorts()); @@ -17,8 +18,10 @@ export async function setup(): Promise { 27017, )}`; process.env["TEST_DB_URL"] = mongoUrl; + console.log(`\x1b[32mMongoDB is running on ${mongoUrl}\x1b[0m`); //use testcontainer to start redis + console.log("\x1b[36mRedis starting...\x1b[0m"); const redisContainer = new GenericContainer("redis:6.2.6") .withExposedPorts(6379) .withWaitStrategy(Wait.forLogMessage("Ready to accept connections")); @@ -29,11 +32,15 @@ export async function setup(): Promise { 6379, )}`; process.env["REDIS_URI"] = redisUrl; + console.log(`\x1b[32mRedis is running on ${redisUrl}\x1b[0m`); } async function stopContainers(): Promise { + console.log("\x1b[36mMongoDB stopping...\x1b[0m"); await startedMongoContainer?.stop(); + console.log("\x1b[36mRedis stopping...\x1b[0m"); await startedRedisContainer?.stop(); + console.log(`\x1b[32mContainers stopped.\x1b[0m`); } export async function teardown(): Promise { diff --git a/backend/package.json b/backend/package.json index 1ba06915a223..69eba1c1356b 100644 --- a/backend/package.json +++ b/backend/package.json @@ -84,7 +84,7 @@ "oxlint-tsgolint": "0.11.0", "readline-sync": "1.4.10", "supertest": "7.1.4", - "testcontainers": "11.10.0", + "testcontainers": "11.11.0", "tsx": "4.16.2", "typescript": "5.9.3", "vitest": "4.0.15" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f32fdcc22847..c74133ad3ca5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -224,7 +224,7 @@ importers: version: 10.0.0 '@vitest/coverage-v8': specifier: 4.0.15 - version: 4.0.15(vitest@4.0.15(@types/node@24.9.1)(happy-dom@20.0.10)(jsdom@27.4.0)(sass@1.70.0)(terser@5.44.1)(tsx@4.16.2)(yaml@2.8.1)) + version: 4.0.15(vitest@4.0.15(@opentelemetry/api@1.8.0)(@types/node@24.9.1)(happy-dom@20.0.10)(jsdom@27.4.0)(sass@1.70.0)(terser@5.44.1)(tsx@4.16.2)(yaml@2.8.1)) concurrently: specifier: 8.2.2 version: 8.2.2 @@ -244,8 +244,8 @@ importers: specifier: 7.1.4 version: 7.1.4 testcontainers: - specifier: 11.10.0 - version: 11.10.0 + specifier: 11.11.0 + version: 11.11.0 tsx: specifier: 4.16.2 version: 4.16.2 @@ -411,7 +411,7 @@ importers: version: 5.0.2 '@vitest/coverage-v8': specifier: 4.0.15 - version: 4.0.15(vitest@4.0.15(@types/node@24.9.1)(happy-dom@20.0.10)(jsdom@27.4.0)(sass@1.70.0)(terser@5.44.1)(tsx@4.16.2)(yaml@2.8.1)) + version: 4.0.15(vitest@4.0.15(@opentelemetry/api@1.8.0)(@types/node@24.9.1)(happy-dom@20.0.10)(jsdom@27.4.0)(sass@1.70.0)(terser@5.44.1)(tsx@4.16.2)(yaml@2.8.1)) autoprefixer: specifier: 10.4.20 version: 10.4.20(postcss@8.4.31) @@ -8917,8 +8917,8 @@ packages: engines: {node: '>=10'} hasBin: true - testcontainers@11.10.0: - resolution: {integrity: sha512-8hwK2EnrOZfrHPpDC7CPe03q7H8Vv8j3aXdcmFFyNV8dzpBzgZYmqyDtduJ8YQ5kbzj+A+jUXMQ6zI8B5U3z+g==} + testcontainers@11.11.0: + resolution: {integrity: sha512-nKTJn3n/gkyGg/3SVkOwX+isPOGSHlfI+CWMobSmvQrsj7YW01aWvl2pYIfV4LMd+C8or783yYrzKSK2JlP+Qw==} text-decoder@1.1.1: resolution: {integrity: sha512-8zll7REEv4GDD3x4/0pW+ppIxSNs7H1J10IKFZsuOMscumCdM2a+toDGLPA3T+1+fLBql4zbt5z83GEQGGV5VA==} @@ -13063,7 +13063,7 @@ snapshots: '@typescript-eslint/types': 8.52.0 eslint-visitor-keys: 4.2.1 - '@vitest/coverage-v8@4.0.15(vitest@4.0.15(@types/node@20.5.1)(happy-dom@20.0.10)(jsdom@27.4.0)(sass@1.70.0)(terser@5.44.1)(tsx@4.16.2)(yaml@2.8.1))': + '@vitest/coverage-v8@4.0.15(vitest@4.0.15(@opentelemetry/api@1.8.0)(@types/node@24.9.1)(happy-dom@20.0.10)(jsdom@27.4.0)(sass@1.70.0)(terser@5.44.1)(tsx@4.16.2)(yaml@2.8.1))': dependencies: '@bcoe/v8-coverage': 1.0.2 '@vitest/utils': 4.0.15 @@ -13076,11 +13076,11 @@ snapshots: obug: 2.1.1 std-env: 3.10.0 tinyrainbow: 3.0.3 - vitest: 4.0.15(@types/node@20.5.1)(happy-dom@20.0.10)(jsdom@27.4.0)(sass@1.70.0)(terser@5.44.1)(tsx@4.16.2)(yaml@2.8.1) + vitest: 4.0.15(@opentelemetry/api@1.8.0)(@types/node@24.9.1)(happy-dom@20.0.10)(jsdom@27.4.0)(sass@1.70.0)(terser@5.44.1)(tsx@4.16.2)(yaml@2.8.1) transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@4.0.15(vitest@4.0.15(@types/node@24.9.1)(happy-dom@20.0.10)(jsdom@27.4.0)(sass@1.70.0)(terser@5.44.1)(tsx@4.16.2)(yaml@2.8.1))': + '@vitest/coverage-v8@4.0.15(vitest@4.0.15(@types/node@20.5.1)(happy-dom@20.0.10)(jsdom@27.4.0)(sass@1.70.0)(terser@5.44.1)(tsx@4.16.2)(yaml@2.8.1))': dependencies: '@bcoe/v8-coverage': 1.0.2 '@vitest/utils': 4.0.15 @@ -13093,7 +13093,7 @@ snapshots: obug: 2.1.1 std-env: 3.10.0 tinyrainbow: 3.0.3 - vitest: 4.0.15(@opentelemetry/api@1.8.0)(@types/node@24.9.1)(happy-dom@20.0.10)(jsdom@27.4.0)(sass@1.70.0)(terser@5.44.1)(tsx@4.16.2)(yaml@2.8.1) + vitest: 4.0.15(@types/node@20.5.1)(happy-dom@20.0.10)(jsdom@27.4.0)(sass@1.70.0)(terser@5.44.1)(tsx@4.16.2)(yaml@2.8.1) transitivePeerDependencies: - supports-color @@ -19538,7 +19538,7 @@ snapshots: commander: 2.20.3 source-map-support: 0.5.21 - testcontainers@11.10.0: + testcontainers@11.11.0: dependencies: '@balena/dockerignore': 1.0.2 '@types/dockerode': 3.3.47 From 68dfc5c3a1a2fe47eddb5729cfcb8f5d87ab89fb Mon Sep 17 00:00:00 2001 From: Christian Fehmer Date: Tue, 13 Jan 2026 14:27:16 +0100 Subject: [PATCH 2/5] chore: extract media queries to sass mixin (@fehmer) (#7351) --- frontend/src/styles/media-queries-blue.scss | 4 +++- frontend/src/styles/media-queries-brown.scss | 4 +++- frontend/src/styles/media-queries-gray.scss | 4 +++- frontend/src/styles/media-queries-green.scss | 4 +++- frontend/src/styles/media-queries-orange.scss | 4 +++- frontend/src/styles/media-queries-purple.scss | 4 +++- frontend/src/styles/media-queries-yellow.scss | 4 +++- frontend/src/styles/media.scss | 15 +++++++++++++++ 8 files changed, 36 insertions(+), 7 deletions(-) create mode 100644 frontend/src/styles/media.scss diff --git a/frontend/src/styles/media-queries-blue.scss b/frontend/src/styles/media-queries-blue.scss index 529289c2eac6..0460209f2d56 100644 --- a/frontend/src/styles/media-queries-blue.scss +++ b/frontend/src/styles/media-queries-blue.scss @@ -1,4 +1,6 @@ -@media only screen and (max-width: calc(768px + 5rem)) { +@use "./media.scss" as *; + +@include media-query(blue) { #mediaQueryDebug { background: #29b6f6; &::before { diff --git a/frontend/src/styles/media-queries-brown.scss b/frontend/src/styles/media-queries-brown.scss index 8fdeb33500ef..2dd85a1b2740 100644 --- a/frontend/src/styles/media-queries-brown.scss +++ b/frontend/src/styles/media-queries-brown.scss @@ -1,5 +1,7 @@ //this is very overkill for the modern world so dont worry too much about this width -@media only screen and (max-width: 425px) { +@use "./media.scss" as *; + +@include media-query(brown) { #mediaQueryDebug { background: #8d6e63; &::before { diff --git a/frontend/src/styles/media-queries-gray.scss b/frontend/src/styles/media-queries-gray.scss index cab090e32650..72813ed15f52 100644 --- a/frontend/src/styles/media-queries-gray.scss +++ b/frontend/src/styles/media-queries-gray.scss @@ -1,5 +1,7 @@ //this is very overkill for the modern world so dont worry too much about this width -@media only screen and (max-width: 330px) { +@use "./media.scss" as *; + +@include media-query(gray) { #mediaQueryDebug { background: gray; &::before { diff --git a/frontend/src/styles/media-queries-green.scss b/frontend/src/styles/media-queries-green.scss index 9ff1b056e0bb..f264c265bf70 100644 --- a/frontend/src/styles/media-queries-green.scss +++ b/frontend/src/styles/media-queries-green.scss @@ -1,4 +1,6 @@ -@media only screen and (max-width: calc(1024px + 5rem)) { +@use "./media.scss" as *; + +@include media-query(green) { #mediaQueryDebug { background: #9ccc65; &::before { diff --git a/frontend/src/styles/media-queries-orange.scss b/frontend/src/styles/media-queries-orange.scss index f1ba7174efe2..e06e50945655 100644 --- a/frontend/src/styles/media-queries-orange.scss +++ b/frontend/src/styles/media-queries-orange.scss @@ -1,4 +1,6 @@ -@media only screen and (max-width: calc(1536px + 5rem)) { +@use "./media.scss" as *; + +@include media-query(orange) { #mediaQueryDebug { background: #ffa726; &::before { diff --git a/frontend/src/styles/media-queries-purple.scss b/frontend/src/styles/media-queries-purple.scss index 9798f3403765..ab1c3b34adc6 100644 --- a/frontend/src/styles/media-queries-purple.scss +++ b/frontend/src/styles/media-queries-purple.scss @@ -1,4 +1,6 @@ -@media only screen and (max-width: calc(640px + 5rem)) { +@use "./media.scss" as *; + +@include media-query(purple) { #mediaQueryDebug { background: #7e57c2; &::before { diff --git a/frontend/src/styles/media-queries-yellow.scss b/frontend/src/styles/media-queries-yellow.scss index e3df58e2a8c4..9c688f44afe0 100644 --- a/frontend/src/styles/media-queries-yellow.scss +++ b/frontend/src/styles/media-queries-yellow.scss @@ -1,4 +1,6 @@ -@media only screen and (max-width: calc(1280px + 5rem)) { +@use "./media.scss" as *; + +@include media-query(yellow) { #mediaQueryDebug { background: #ffee58; &::before { diff --git a/frontend/src/styles/media.scss b/frontend/src/styles/media.scss new file mode 100644 index 000000000000..c08e7fa41dd7 --- /dev/null +++ b/frontend/src/styles/media.scss @@ -0,0 +1,15 @@ +$breakpoints: ( + orange: calc(1536px + 5rem), + yellow: calc(1280px + 5rem), + green: calc(1024px + 5rem), + blue: calc(768px + 5rem), + purple: calc(640px + 5rem), + brown: 425px, + gray: 330px, +); + +@mixin media-query($size) { + @media only screen and (max-width: map-get($breakpoints, $size)) { + @content; + } +} From 6af2c2dcae0c78fcda06ef3ed213fcd6851b7261 Mon Sep 17 00:00:00 2001 From: Leonabcd123 <156839416+Leonabcd123@users.noreply.github.com> Date: Tue, 13 Jan 2026 15:28:35 +0200 Subject: [PATCH 3/5] fix(tamil-old): set ligatures to true in tamil old (@Leonabcd123) (#7349) ### Description Closes #7347 --- frontend/static/languages/tamil_old.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/static/languages/tamil_old.json b/frontend/static/languages/tamil_old.json index cc04ad9c8c1b..d50df940c15d 100644 --- a/frontend/static/languages/tamil_old.json +++ b/frontend/static/languages/tamil_old.json @@ -1,7 +1,7 @@ { "name": "tamil_old", "rightToLeft": false, - "ligatures": false, + "ligatures": true, "bcp47": "ta", "words": [ "அஞ்சல்", From 560768eb38db38e8597056a42e54cb4e74afb935 Mon Sep 17 00:00:00 2001 From: Miodec Date: Tue, 13 Jan 2026 14:34:48 +0100 Subject: [PATCH 4/5] chore: remove unused code --- frontend/src/styles/media-queries.scss | 833 ------------------------- 1 file changed, 833 deletions(-) diff --git a/frontend/src/styles/media-queries.scss b/frontend/src/styles/media-queries.scss index 95afb8451281..c7fd13d0e7f7 100644 --- a/frontend/src/styles/media-queries.scss +++ b/frontend/src/styles/media-queries.scss @@ -64,839 +64,6 @@ body { } } -// //1450px -// @media only screen and (max-width: 90.625rem) { -// -// } - -// //1330px -// @media only screen and (max-width: 83.125rem) { -// .ad.ad-v { -// display: none; -// } -// #app { -// grid-template-columns: auto; -// } -// // #customTextModal { -// // padding: 2rem; -// // .modal { -// // grid-template-columns: 1fr 1fr 2fr; -// // width: 100%; -// // } -// // } -// } - -// //1250px -// @media only screen and (max-width: 78.125rem) { -// #customTextModal .modal { -// textarea { -// min-height: 426px; -// } -// .buttonsTop { -// grid-template-columns: 1fr 1fr; -// } -// } -// } - -// //1050px -// @media only screen and (max-width: 65.625rem) { -// .profile .pbsWords, -// .profile .pbsTime { -// font-size: 0.8rem; -// } -// .profile .details.bioAndKey { -// .bioAndKeyboard .value { -// font-size: 0.75rem; -// } -// } -// #result .morestats { -// gap: 1rem; -// grid-template-rows: 1fr 1fr; -// } -// } - -// //1000px -// @media only screen and (max-width: 62.5rem) { -// .pageSettings .settingsGroup.quickNav .links { -// grid-template-columns: 1fr 1fr 1fr; -// grid-auto-flow: unset; -// justify-items: center; -// } -// .pageAccount { -// .group.chart .below { -// grid-template-columns: 1fr; -// } -// } -// } - -// //900px -// @media only screen and (max-width: 56.25rem) { -// #customTextModal .modal { -// grid-template-areas: -// "topButtons topButtons topButtons" -// "textArea textArea textArea" -// "checkboxes checkboxes checkboxes" -// "ok ok ok"; -// } -// #testConfig { -// .mode, -// .time, -// .wordCount, -// .puncAndNum, -// .customText, -// .zen, -// .quoteLength { -// .textButton { -// padding: 0.75rem 0.3rem 0.7rem 0.3rem; - -// &:first-child { -// padding: 0.75rem 0.3rem 0.7rem 0.6rem; -// } -// &:last-child { -// padding: 0.75rem 0.6rem 0.7rem 0.3rem; -// } -// &:only-child { -// padding: 0.75rem 0.6rem 0.7rem 0.6rem; -// } -// } -// } -// } -// .ad.ad-h { -// display: none; -// } -// .ad.ad-h-s { -// display: grid; -// } -// .profile .pbsWords, -// .profile .pbsTime { -// font-size: 1rem; -// } -// .profile { -// grid-template-columns: 1fr; -// grid-template-rows: auto auto auto; -// grid-template-areas: -// "info" -// "leaderboards" -// "pbsTime" -// "pbsWords"; -// .details .bioAndKeyboard { -// height: 100%; //dumb safari fix -// } -// .details.soc { -// grid-template-columns: 1.25fr auto 1fr auto auto; -// .typingStats { -// grid-template-columns: 1fr; -// } -// } -// .details.bioAndKey { -// grid-template-columns: 1.25fr auto auto auto 1fr; -// .typingStats { -// grid-template-columns: 1fr; -// } -// } -// .details.both { -// grid-template-columns: 1.25fr auto 1.25fr auto; -// grid-template-areas: -// "avAndName sep2 bioAndKey bioAndKey" -// "typingStats typingStats typingStats socials"; -// .sep1, -// .sep3 { -// display: none; -// } -// .typingStats { -// grid-template-columns: 1fr 1fr 1fr; -// width: 100%; -// } -// .socials { -// justify-content: start; -// .title { -// display: block; -// } -// .value { -// grid-auto-flow: column; -// } -// } -// } -// .details.none { -// grid-template-columns: 1fr auto 1fr; -// .typingStats { -// grid-template-columns: 1fr; -// // grid-template-areas: -// // "avAndName" -// // "typingStats"; -// // grid-template-columns: 1fr; -// // .separator { -// // display: none; -// // } -// } -// } -// .leaderboardsPositions { -// grid-template-areas: "title title" "t15 t60"; -// } -// } -// #bannerCenter .banner .container { -// grid-template-columns: 1fr auto; -// .image { -// display: none; -// } -// .lefticon, -// .righticon { -// display: none; -// } -// .text { -// margin-left: 1.5rem; -// text-align: left; -// justify-self: start; -// } -// } -// .merchBanner { -// img { -// display: none; -// } -// .text { -// padding: 0.25rem 0; -// } -// } -// .pageSettings { -// .section { -// grid-template-columns: 1.5fr 1fr; -// } -// .section[data-config-name="autoSwitchThemeInputs"] { -// grid-template-columns: 1fr 3fr; -// } -// } -// .pageAccount { -// .group.personalBestTables { -// .tables { -// grid-template-columns: 1fr; -// } -// } -// .group.history { -// table { -// thead, -// tbody { -// td:nth-child(1), -// td:nth-child(8), -// td:nth-child(9) { -// display: none; -// } -// } -// } -// } -// } -// .pageSettings .settingsGroup.quickNav .links { -// grid-auto-flow: unset; -// grid-template-columns: 1fr 1fr; -// justify-items: center; -// } -// } - -// //800px -// @media only screen and (max-width: 50rem) { -// header #logo .text { -// font-size: 1.5rem; -// line-height: 1.5rem; -// margin-top: -0.1em; -// } -// nav { -// gap: 0; -// } -// #testConfig { -// .spacer { -// display: none; -// } -// .row { -// display: grid; -// justify-items: center; -// padding: 0.25rem 1rem; -// } -// .mode, -// .time, -// .wordCount, -// .puncAndNum, -// .customText, -// .zen, -// .quoteLength { -// .textButton { -// padding: 0.5rem 0.75rem 0.45rem 0.75rem; - -// &:first-child { -// padding: 0.5rem 0.75rem 0.45rem 0.75rem; -// } -// &:last-child { -// padding: 0.5rem 0.75rem 0.45rem 0.75rem; -// } -// &:only-child { -// padding: 0.5rem 0.75rem 0.45rem 0.75rem; -// } -// } -// } -// } -// #testModesNotice { -// font-size: 0.75rem; -// } - -// .page404 .content { -// grid-auto-flow: row; -// grid-template-columns: 300px; -// gap: 1rem; -// } - -// .pageAbout { -// .section { -// .contributors, -// .supporters { -// grid-template-columns: 1fr 1fr 1fr; -// } -// .contactButtons { -// grid-template-columns: 1fr 1fr; -// } -// } -// } - -// .pageSettings .section[data-config-name="customBackgroundFilter"] { -// .groups { -// grid-template-columns: 1fr; -// } -// .saveContainer { -// grid-column: -1/-2; -// } -// } - -// #customTextModal .modal { -// .buttonsTop { -// grid-template-columns: 1fr; -// } -// } -// } - -// //750px -// @media only screen and (max-width: 46.875rem) { -// #quoteSearchModal .modal #quoteSearchControlsWrapper { -// grid-template-columns: 1fr; -// } -// .pageAbout { -// .triplegroup { -// grid-template-columns: 1fr; -// .group { -// display: grid; -// grid-template-columns: 1fr 1fr; -// align-items: center; -// gap: 0rem 1rem; -// .label { -// grid-column: span 2; -// } -// } -// } -// } -// } - -// //700px -// @media only screen and (max-width: 43.75rem) { -// #wordFilterModal .modal { -// .divider { -// width: 100%; -// height: 0.25rem; -// } -// grid-template-areas: "top" "right" "divider" "left" "bottom"; -// grid-template-columns: 1fr; -// } -// .pageAccount .presetFilterButtons .buttons { -// grid-template-columns: 1fr; -// } -// .pageAccount .group.filterButtons { -// grid-template-columns: 1fr; -// } - -// .pageAccount { -// .triplegroup { -// grid-template-columns: 1fr 1fr; -// .emptygroup { -// display: none; -// } -// } -// .group.topFilters .buttonsAndTitle .buttons { -// display: grid; -// justify-content: unset; -// } -// .group.history { -// table { -// thead, -// tbody { -// td:nth-child(6) { -// display: none; -// } -// } -// } -// } -// .group.estimatedWordsTyped { -// flex-direction: column; -// .title { -// margin-right: unset; -// } -// } -// } -// .badge::after, -// .badge::before { -// display: none; -// } -// } - -// //650px -// @media only screen and (max-width: 40.625rem) { -// header { -// nav { -// .textButton.view-account { -// .text { -// display: none; -// } -// .levelAndBar { -// display: none; -// } -// } -// } -// } -// .profile { -// grid-template-columns: 1fr; -// grid-template-rows: auto auto auto; -// grid-template-areas: -// "info" -// "leaderboards" -// "pbsTime" -// "pbsWords"; -// .details.none { -// grid-template-areas: -// "avAndName" -// "typingStats"; -// grid-template-columns: 1fr; -// .separator { -// display: none; -// } -// .typingStats { -// grid-template-columns: 1fr 1fr 1fr; -// } -// } -// .details.bioAndKey { -// grid-template-areas: -// "avAndName bioAndKey" -// "typingStats typingStats"; -// grid-template-columns: 1fr 1fr; -// .separator { -// display: none; -// } -// .typingStats { -// grid-template-columns: 1fr 1fr 1fr; -// } -// } -// .details.soc { -// grid-template-areas: -// "avAndName" -// "typingStats" -// "socials"; -// grid-template-columns: 1fr; -// .separator { -// display: none; -// } -// .typingStats { -// grid-template-columns: 1fr 1fr 1fr; -// } -// .socials { -// justify-content: start; -// .title { -// display: block; -// } -// .value { -// grid-auto-flow: column; -// } -// } -// } -// .details.both { -// grid-template-areas: -// "avAndName bioAndKey" -// "typingStats typingStats" -// "socials socials"; -// grid-template-columns: 1fr 1fr; -// .separator { -// display: none; -// } -// .typingStats { -// grid-template-columns: 1fr 1fr 1fr; -// } -// .socials { -// height: 100%; //dumb safari fix -// justify-content: start; -// .title { -// display: block; -// } -// .value { -// grid-auto-flow: column; -// } -// } -// } -// } -// #quoteRateModal { -// .ratingStats { -// grid-template-columns: 1fr 1fr !important; -// } -// .quote { -// grid-template-areas: -// "text text text" -// "source source source" -// "id length length" !important; -// } -// } -// .pageSettings .section { -// grid-template-columns: 1fr; -// grid-template-areas: -// "title" -// "text" -// "buttons"; - -// & > .text { -// margin-bottom: 0.25em; -// } - -// & .customThemeEdit { -// .customThemeInputs { -// grid-template-columns: 1fr 1.5fr; -// } -// .spacer { -// grid-column: span 2; -// } -// .customThemeButtons { -// grid-template-columns: 1fr; -// } -// } -// } - -// #result { -// .buttons { -// grid-template-rows: 1fr 1fr 1fr; -// #nextTestButton { -// grid-column: 1/5; -// width: 100%; -// text-align: center; -// } -// } -// } -// } - -// //600px -// @media only screen and (max-width: 37.5rem) { -// .pageAbout .section .supporters, -// .pageAbout .section .contributors { -// grid-template-columns: 1fr 1fr; -// } -// header #logo .bottom { -// margin-top: 0; -// } -// .pageLogin { -// display: grid; -// gap: 5rem; -// grid-auto-flow: unset; -// } -// main { -// #result { -// grid-template-areas: -// "stats stats" -// "chart chart" -// "morestats morestats"; -// .stats { -// grid-template-areas: "wpm acc"; -// gap: 2rem; -// } -// .stats.morestats { -// grid-template-rows: 1fr 1fr 1fr; -// gap: 1rem; -// } -// } -// } - -// .pageAccount { -// .group.history { -// table { -// thead, -// tbody { -// td:nth-child(7), -// td:nth-child(5) { -// display: none; -// } -// } -// } -// } -// } -// } - -// //550px -// @media only screen and (max-width: 34.375rem) { -// header { -// #logo { -// grid-template-columns: auto; -// .text { -// display: none; -// } -// } -// // nav { -// // .textButton.view-account { -// // .text { -// // display: none; -// // } -// // .levelAndBar { -// // display: none; -// // } -// // } -// // } -// } - -// .modalWrapper { -// padding: 1rem; -// .modal { -// padding: 1rem; -// } -// } - -// #commandLineWrapper { -// padding: 5rem 1rem; -// } -// .pageSettings .section.themes .customTheme.button.active, -// .pageSettings .section.themes .theme.button.active { -// transform: scale(1.025); -// } -// .pageSettings .section.themes .buttons div.theme:hover { -// transform: scale(1.025); -// } -// .profile .pbsWords, -// .profile .pbsTime { -// font-size: 0.9rem; -// } -// .profile { -// .pbsWords, -// .pbsTime { -// grid-template-columns: 1fr 1fr; -// } -// .details.none .typingStats { -// grid-template-columns: 1fr; -// } -// .details.bioAndKey { -// grid-template-areas: -// "avAndName" -// "bioAndKey" -// "typingStats"; -// grid-template-columns: 1fr; -// .typingStats { -// grid-template-columns: 1fr; -// } -// } -// .details.both { -// grid-template-areas: -// "avAndName" -// "bioAndKey" -// "typingStats" -// "socials"; -// grid-template-columns: 1fr; -// .typingStats { -// grid-template-columns: 1fr; -// } -// } -// .leaderboardsPositions { -// grid-template-areas: "title" "t15" "t60"; -// } -// } -// #keymap { -// .row { -// height: 1.25rem; -// } -// .keymapKey { -// width: 1.25rem; -// height: 1.25rem; -// border-radius: 0.3rem; -// font-size: 0.6rem; -// } - -// &.split_matrix .keymapSplitSpacer { -// width: 1.25rem; -// height: 1.25rem; -// border-radius: 0.3rem; -// font-size: 0.6rem; -// } -// } - -// .pageAbout .section .supporters, -// .pageAbout .section .contributors { -// grid-template-columns: 1fr; -// } - -// .pageSettings { -// .section[data-config-name="customBackgroundFilter"] .groups .group { -// grid-template-columns: auto 1fr; -// .title { -// grid-column: 1/3; -// } -// } -// } - -// .pageAbout .section { -// .contactButtons, -// .supportButtons { -// grid-template-columns: 1fr; -// } -// } - -// .pageAccount { -// .triplegroup { -// grid-template-columns: 1fr; -// } -// .group.history { -// table { -// thead, -// tbody { -// td:nth-child(3) { -// display: none; -// } -// } -// } -// } -// } - -// header { -// nav { -// font-size: 1rem; -// } -// } -// footer { -// .leftright { -// .left { -// display: grid; -// grid-template-rows: 1fr 1fr 1fr; -// grid-template-columns: auto auto auto; -// grid-auto-flow: row; -// } -// .right { -// display: grid; -// grid-template-rows: 1fr 1fr 1fr; -// } -// } -// } -// #contentWrapper { -// header { -// // grid-template-columns: 1fr auto; -// .desktopConfig { -// display: none; -// } -// .mobileConfig { -// display: block; -// } -// } -// gap: 1rem; -// padding: 1rem; -// } -// main { -// #result { -// .stats { -// grid-template-areas: -// "wpm" -// "acc"; -// gap: 1rem; -// } -// } -// } -// #result { -// .buttons { -// grid-template-rows: 1fr 1fr 1fr 1fr; -// #nextTestButton { -// grid-column: 1/3; -// width: 100%; -// text-align: center; -// } -// } -// } -// } - -// //450px -// @media only screen and (max-width: 28.125rem) { -// #testConfig { -// display: none; -// } - -// #mobileTestConfigButton { -// display: block; -// } -// #alertsPopupWrapper { -// #alertsPopup { -// border-radius: 0; -// width: 100%; -// .mobileClose { -// display: block; -// } -// } -// } -// } - -// //400px -// @media only screen and (max-width: 25rem) { -// header .config { -// grid-gap: 0.25rem; -// .group .buttons { -// font-size: 0.65rem; -// line-height: 0.65rem; -// } -// } - -// header nav { -// font-size: 0.75rem; -// } - -// footer { -// font-size: 0.65rem; -// .leftright { -// grid-template-columns: 1fr 1fr; -// .left { -// grid-template-rows: 1fr 1fr 1fr 1fr; -// grid-template-columns: 1fr 1fr; -// grid-auto-flow: row; -// } -// .right { -// grid-template-rows: 1fr 1fr 1fr 1fr; -// } -// } -// } -// .page404 .content { -// grid-template-columns: 1fr; -// } -// } - -// //350px -// @media only screen and (max-width: 21.875rem) { -// .pageSettings .settingsGroup.quickNav .links { -// grid-template-columns: 1fr; -// } -// .ad.ad-h-s { -// display: none; -// } -// #keymap { -// display: none !important; -// } -// .pageLogin .side { -// input[type="email"], -// input[type="password"], -// input[type="text"] { -// width: 90vw; -// } -// } -// .page404 { -// .content { -// width: 100%; -// .image { -// width: 100%; -// } -// .big { -// font-size: 7rem; -// line-height: 7rem; -// } -// } -// } -// } - @media (hover: none) and (pointer: coarse) { #commandLineMobileButton { display: block !important; From 68fe2caf83cb26557bd981a6fd98bcbbf1d0ce5b Mon Sep 17 00:00:00 2001 From: Miodec Date: Tue, 13 Jan 2026 17:24:42 +0100 Subject: [PATCH 5/5] chore: dont check github version in dev --- frontend/src/ts/utils/version.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/frontend/src/ts/utils/version.ts b/frontend/src/ts/utils/version.ts index 6f2a7db84d5b..2227057c256b 100644 --- a/frontend/src/ts/utils/version.ts +++ b/frontend/src/ts/utils/version.ts @@ -2,7 +2,7 @@ import { z } from "zod"; import { getLatestReleaseFromGitHub } from "./json-data"; import { LocalStorageWithSchema } from "./local-storage-with-schema"; import { tryCatch } from "@monkeytype/util/trycatch"; -import { createErrorMessage } from "./misc"; +import { createErrorMessage, isDevEnvironment } from "./misc"; import { setVersion } from "../signals/core"; const memoryLS = new LocalStorageWithSchema({ @@ -19,6 +19,8 @@ function purgeCaches(): void { } export async function fetchLatestVersion(): Promise { + if (isDevEnvironment()) return; + const { data: currentVersion, error } = await tryCatch( getLatestReleaseFromGitHub(), );