Skip to content

Commit ed00b17

Browse files
authored
Merge branch 'master' into feature/remove-theme-color-duplicates
2 parents e5c94bc + 60fadf2 commit ed00b17

File tree

90 files changed

+1250
-1119
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

90 files changed

+1250
-1119
lines changed

.oxfmtrc.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,9 @@
1515
"logs",
1616
"coverage",
1717
"*.md"
18-
]
18+
],
19+
"experimentalTailwindcss": {
20+
"stylesheet": "./frontend/src/styles/tailwind.css",
21+
"functions": ["cn"]
22+
}
1923
}

README.md

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,22 @@
44
[![ChartJs](https://img.shields.io/badge/Chart.js-FF6384?style=for-the-badge&logo=chartdotjs&logoColor=white)](https://www.chartjs.org/)
55
[![Eslint](https://img.shields.io/badge/eslint-4B32C3?style=for-the-badge&logo=eslint&logoColor=white)](https://eslint.org/)
66
[![Express](https://img.shields.io/badge/-Express-373737?style=for-the-badge&logo=Express&logoColor=white)](https://expressjs.com/)
7-
[![Firebase](https://img.shields.io/badge/firebase-ffca28?style=for-the-badge&logo=firebase&logoColor=black)](https://firebase.google.com/)
7+
[![Firebase](https://img.shields.io/badge/firebase-DD2C00?style=for-the-badge&logo=firebase&logoColor=black)](https://firebase.google.com/)
88
[![Fontawesome](https://img.shields.io/badge/fontawesome-538DD7?style=for-the-badge&logo=fontawesome&logoColor=white)](https://fontawesome.com/)
9-
[![HTML5](https://img.shields.io/badge/html5-%23E34F26.svg?style=for-the-badge&logo=html5&logoColor=white)](https://developer.mozilla.org/en-US/docs/Web/HTML)
10-
[![MongoDB](https://img.shields.io/badge/-MongoDB-13aa52?style=for-the-badge&logo=mongodb&logoColor=white)](https://www.mongodb.com/)
11-
[![OXLint](https://img.shields.io/badge/%E2%9A%93%20oxlint-2b3c5a?style=for-the-badge&logoColor=white)](https://oxc.rs/docs/guide/usage/linter.html)
9+
[![HTML5](https://img.shields.io/badge/html5-E34F26?style=for-the-badge&logo=html5&logoColor=white)](https://developer.mozilla.org/en-US/docs/Web/HTML)
10+
[![MongoDB](https://img.shields.io/badge/-MongoDB-47A248?style=for-the-badge&logo=mongodb&logoColor=white)](https://www.mongodb.com/)
11+
[![OXLint](https://img.shields.io/badge/oxlint-2b3c5a?style=for-the-badge&logo=oxc&logoColor=white)](https://oxc.rs/docs/guide/usage/linter.html)
1212
[![PNPM](https://img.shields.io/badge/pnpm-F69220?style=for-the-badge&logo=pnpm&logoColor=white)](https://pnpm.io/)
13-
[![Redis](https://img.shields.io/badge/Redis-DC382D?style=for-the-badge&logo=redis&logoColor=white)](https://redis.io/)
14-
[![SASS](https://img.shields.io/badge/SASS-hotpink.svg?style=for-the-badge&logo=SASS&logoColor=white)](https://sass-lang.com/)
13+
[![Redis](https://img.shields.io/badge/Redis-FF4438?style=for-the-badge&logo=redis&logoColor=white)](https://redis.io/)
14+
[![SASS](https://img.shields.io/badge/SASS-CC6699?style=for-the-badge&logo=SASS&logoColor=white)](https://sass-lang.com/)
15+
[![Solid](https://img.shields.io/badge/solid-2C4F7C?style=for-the-badge&logo=solid&logoColor=white)](https://www.solidjs.com/)
16+
[![Tailwind](https://img.shields.io/badge/tailwind-06B6D4?style=for-the-badge&logo=tailwindcss&logoColor=white)](https://tailwindcss.com/)
1517
[![TsRest](https://img.shields.io/badge/-TSREST-9333ea?style=for-the-badge&logoColor=white&logo=data:image/svg%2bxml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB3aWR0aD0iMjAuMzA2Nzc4bW0iCiAgIGhlaWdodD0iMTIuMDgzMjMzbW0iCiAgIHZpZXdCb3g9IjAgMCAyMC4zMDY3NzggMTIuMDgzMjMzIgogICB2ZXJzaW9uPSIxLjEiCiAgIGlkPSJzdmcxIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBpZD0ibmFtZWR2aWV3MSIKICAgICBwYWdlY29sb3I9IiM1MDUwNTAiCiAgICAgYm9yZGVyY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMSIKICAgICBpbmtzY2FwZTpzaG93cGFnZXNoYWRvdz0iMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMCIKICAgICBpbmtzY2FwZTpwYWdlY2hlY2tlcmJvYXJkPSIxIgogICAgIGlua3NjYXBlOmRlc2tjb2xvcj0iI2QxZDFkMSIKICAgICBpbmtzY2FwZTpkb2N1bWVudC11bml0cz0ibW0iIC8+CiAgPGRlZnMKICAgICBpZD0iZGVmczEiIC8+CiAgPGcKICAgICBpbmtzY2FwZTpsYWJlbD0iTGF5ZXIgMSIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIgogICAgIGlkPSJsYXllcjEiCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTMuODE5ODA1NCwtMi4yMTQ3MTkzKSI+CiAgICA8cGF0aAogICAgICAgZD0ibSAxNS40NTgwMzUsOC45NzMzOTUzIDguNjMzMjUsMC4wNDQ4NyAwLjAwOSwtMS42NjgxOTggLTguNjMzMjIsLTAuMDQ0ODUgeiBtIDAuMDI2MywtNS4wNTYxMDggOC42MzMyNSwwLjA0NDg1IDAuMDA5LC0xLjcwMjU2OCAtOC42MzMyNSwtMC4wNDQ4NSB6IG0gLTAuMDQ0OCw4LjYzMzI0NzcgOC42MzMyMywwLjA0NDg1IC0wLjAwOSwxLjcwMjU2NyAtOC42MzMyNSwtMC4wNDQ4NSB6IgogICAgICAgZmlsbD0iI2ZmZmZmZiIKICAgICAgIGlkPSJwYXRoMSIKICAgICAgIHN0eWxlPSJzdHJva2Utd2lkdGg6MC4yNjQ1ODMiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSAxMS4xMTE3MjUsMTAuMjg2NjI4IGMgMS42NTEsLTAuNjE5MTI0NyAyLjU5Njg4LC0xLjk2MDU2MjcgMi41OTY4OCwtMy44MDA3Mzk3IDAsLTIuNjQ4NDc5IC0xLjkyNjE2LC00LjI0Nzg4NSAtNS4wNzMzNzk2LC00LjI0Nzg4NSBoIC00LjgxNTQyIHYgMS43MDI1OTQgaCA0Ljc0NjYzIGMgMi4wODA5Mzk2LDAgMy4xNjQ0MDk2LDAuOTI4Njg3IDMuMTY0NDA5NiwyLjU0NTI5MSAwLDEuNTk5NDA2IC0xLjA4MzQ3LDIuNTQ1MjkyIC0zLjE2NDQwOTYsMi41NDUyOTIgaCAtNC43NDY2MyB2IDUuMjQ1MzYzNyBoIDEuOTYwNTYgdiAtMy41NzcxNjYgaCAyLjg1NDg2IGMgMC4yMDYzNywwIDAuNDI5OTUsMCAwLjYxOTEyLC0wLjAxNzIgbCAyLjUyODA5OTYsMy41OTQzNjQgaCAyLjEzMjU0IHoiCiAgICAgICBmaWxsPSIjZmZmZmZmIgogICAgICAgaWQ9InBhdGgyIgogICAgICAgc3R5bGU9InN0cm9rZS13aWR0aDowLjI2NDU4MyIgLz4KICA8L2c+Cjwvc3ZnPgo=)](https://ts-rest.com/)
16-
[![Turborepo](https://img.shields.io/badge/-Turborepo-EF4444?style=for-the-badge&logo=turborepo&logoColor=white)](https://turborepo.org/)
17-
[![TypeScript](https://img.shields.io/badge/typescript-%23007ACC.svg?style=for-the-badge&logo=typescript&logoColor=white)](https://www.typescriptlang.org/)
18-
[![Vite](https://img.shields.io/badge/Vite-646CFF?style=for-the-badge&logo=Vite&logoColor=white)](https://vitejs.dev/)
19-
[![Vitest](https://img.shields.io/badge/vitest-6E9F18?style=for-the-badge&logo=vitest&logoColor=white)](https://vitest.dev/)
20-
[![Zod](https://img.shields.io/badge/-Zod-3E67B1?style=for-the-badge&logo=zod&logoColor=white)](https://zod.dev/)
18+
[![Turborepo](https://img.shields.io/badge/-Turborepo-FF1E56?style=for-the-badge&logo=turborepo&logoColor=white)](https://turborepo.org/)
19+
[![TypeScript](https://img.shields.io/badge/typescript-3178C6?style=for-the-badge&logo=typescript&logoColor=white)](https://www.typescriptlang.org/)
20+
[![Vite](https://img.shields.io/badge/Vite-9135FF?style=for-the-badge&logo=Vite&logoColor=white)](https://vitejs.dev/)
21+
[![Vitest](https://img.shields.io/badge/vitest-00FF74?style=for-the-badge&logo=vitest&logoColor=white)](https://vitest.dev/)
22+
[![Zod](https://img.shields.io/badge/-Zod-408AFF?style=for-the-badge&logo=zod&logoColor=white)](https://zod.dev/)
2123

2224
# About
2325

frontend/__tests__/components/AnimatedModal.spec.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ describe("AnimatedModal", () => {
1515
function renderModal(props: {
1616
onEscape?: (e: KeyboardEvent) => void;
1717
onBackdropClick?: (e: MouseEvent) => void;
18-
class?: string;
18+
wrapperClass?: string;
1919
beforeShow?: () => void | Promise<void>;
2020
afterShow?: () => void | Promise<void>;
2121
beforeHide?: () => void | Promise<void>;
@@ -46,7 +46,7 @@ describe("AnimatedModal", () => {
4646
const { dialog } = renderModal({});
4747

4848
expect(dialog).toHaveAttribute("id", "SupportModal");
49-
expect(dialog).toHaveClass("modalWrapper", "hidden");
49+
expect(dialog).toHaveClass("hidden");
5050
});
5151

5252
it("renders children inside modal div", () => {
@@ -71,10 +71,10 @@ describe("AnimatedModal", () => {
7171

7272
it("applies custom class to dialog", () => {
7373
const { dialog } = renderModal({
74-
class: "customClass",
74+
wrapperClass: "customClass",
7575
});
7676

77-
expect(dialog).toHaveClass("modalWrapper", "hidden", "customClass");
77+
expect(dialog).toHaveClass("customClass");
7878
});
7979

8080
it("renders with animationMode none", () => {

frontend/__tests__/components/ScrollToTop.spec.tsx

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,53 +21,53 @@ describe("ScrollToTop", () => {
2121
// oxlint-disable-next-line no-non-null-assertion
2222
container: container.children[0]! as HTMLElement,
2323
// oxlint-disable-next-line no-non-null-assertion
24-
button: container.querySelector("div.button")!,
24+
button: container.querySelector("button")!,
2525
};
2626
}
2727

2828
it("renders with correct classes and structure", () => {
2929
const { container, button } = renderElement();
3030

3131
expect(container).toHaveClass("content-grid", "ScrollToTop");
32-
expect(button).toHaveClass("breakout", "button");
32+
expect(button).toHaveClass("breakout");
3333
expect(button).toContainHTML(`<i class="fas fa-angle-double-up"></i>`);
3434
});
3535

3636
it("renders invisible when scrollY is 0", () => {
3737
const { button } = renderElement();
3838

39-
expect(button).toHaveClass("invisible");
39+
expect(button).toHaveClass("opacity-0");
4040
});
4141

4242
it("becomes visible when scrollY > 100 on non-test pages", () => {
4343
const { button } = renderElement();
4444
scrollTo(150);
4545

46-
expect(button).not.toHaveClass("invisible");
46+
expect(button).not.toHaveClass("opacity-0");
4747
});
4848

4949
it("stays invisible on test page at scroll 0", () => {
5050
getActivePageMock.mockReturnValue("test");
5151
const { button } = renderElement();
5252

53-
expect(button).toHaveClass("invisible");
53+
expect(button).toHaveClass("opacity-0");
5454
});
5555

5656
it("stays invisible on test page even with scroll > 100", () => {
5757
getActivePageMock.mockReturnValue("test");
5858
const { button } = renderElement();
5959
scrollTo(150);
6060

61-
expect(button).toHaveClass("invisible");
61+
expect(button).toHaveClass("opacity-0");
6262
});
6363

6464
it("becomes invisible when scroll < 100 on non-test pages", () => {
6565
const { button } = renderElement();
6666
scrollTo(150);
67-
expect(button).not.toHaveClass("invisible");
67+
expect(button).not.toHaveClass("opacity-0");
6868

6969
scrollTo(50);
70-
expect(button).toHaveClass("invisible");
70+
expect(button).toHaveClass("opacity-0");
7171
});
7272

7373
it("scrolls to top and hides button on click", async () => {
@@ -82,7 +82,7 @@ describe("ScrollToTop", () => {
8282
top: 0,
8383
behavior: "smooth",
8484
});
85-
expect(button).toHaveClass("invisible");
85+
expect(button).toHaveClass("opacity-0");
8686
});
8787

8888
it("cleans up scroll listener on unmount", () => {

frontend/package.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
"chartjs-adapter-date-fns": "3.0.0",
3939
"chartjs-plugin-annotation": "2.2.1",
4040
"chartjs-plugin-trendline": "1.0.2",
41+
"clsx": "2.1.1",
4142
"color-blend": "4.0.0",
4243
"damerau-levenshtein": "1.0.8",
4344
"date-fns": "3.6.0",
@@ -53,6 +54,7 @@
5354
"object-hash": "3.0.0",
5455
"slim-select": "2.9.2",
5556
"stemmer": "2.0.1",
57+
"tailwind-merge": "3.4.0",
5658
"throttle-debounce": "5.0.2",
5759
"zod": "3.23.8",
5860
"zod-urlsearchparams": "0.0.16"
@@ -63,6 +65,7 @@
6365
"@monkeytype/oxlint-config": "workspace:*",
6466
"@monkeytype/typescript-config": "workspace:*",
6567
"@solidjs/testing-library": "0.8.10",
68+
"@tailwindcss/vite": "4.1.18",
6669
"@testing-library/dom": "10.4.1",
6770
"@testing-library/jest-dom": "6.9.1",
6871
"@testing-library/user-event": "14.6.1",
@@ -94,6 +97,7 @@
9497
"sass": "1.70.0",
9598
"solid-js": "1.9.10",
9699
"subset-font": "2.3.0",
100+
"tailwindcss": "4.1.18",
97101
"tsx": "4.16.2",
98102
"typescript": "5.9.3",
99103
"unplugin-inject-preload": "3.0.0",

frontend/src/404.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
</script>
1313
<load src="html/warnings.html" />
1414
<div id="app" class="content-grid focus">
15+
<div id="backgroundLoader" class="hidden"></div>
1516
<header class="focus">
1617
<a id="logo" href="/" router-link="">
1718
<div class="icon">

frontend/src/html/head.html

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,14 @@
105105
<meta name="twitter:card" content="summary_large_image" />
106106
<meta name="darkreader-lock" />
107107
<meta http-equiv="Cache-Control" content="no-store" />
108-
<link rel="stylesheet" href="styles/vendor.scss" />
108+
109+
<!--
110+
order of the style imports is not important EXCEPT for index
111+
index has to be first because it contains the order of css layers
112+
-->
109113
<link rel="stylesheet" href="styles/index.scss" />
114+
<link rel="stylesheet" href="styles/tailwind.css" />
115+
<link rel="stylesheet" href="styles/vendor.scss" />
110116

111117
<style class="customFont" type="text/css"></style>
112118
</head>

frontend/src/html/pages/account.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<div class="page pageAccount hidden full-width" id="pageAccount">
1+
<div class="page pageAccount full-width hidden" id="pageAccount">
22
<div class="content full-width content-grid">
33
<div class="profile">
44
<div class="details both">

frontend/src/html/pages/friends.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
<div class="bigTitle">
3939
<i class="fas fa-user-friends fa-fw"></i>
4040
Friends
41-
<i class="spinner hidden fas fa-circle-notch fa-spin"></i>
41+
<i class="spinner fas fa-circle-notch fa-spin hidden"></i>
4242
</div>
4343
<button class="button friendAdd">
4444
<i class="fas fa-plus fa-fw"></i>

frontend/src/html/pages/leaderboards.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@
214214
</button>
215215
</div>
216216

217-
<div class="buttonGroup hidden modeButtons">
217+
<div class="buttonGroup modeButtons hidden">
218218
<div class="divider"></div>
219219
<button data-mode="15">
220220
<i class="fas fa-clock"></i>
@@ -226,7 +226,7 @@
226226
</button>
227227
</div>
228228

229-
<div class="buttonGroup hidden languageButtons">
229+
<div class="buttonGroup languageButtons hidden">
230230
<div class="divider"></div>
231231
<button data-language="english">
232232
<i class="fas fa-globe"></i>

0 commit comments

Comments
 (0)