diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 8ce5711..d73364b 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -20,5 +20,5 @@ jobs:
- run: pnpm install --frozen-lockfile
- run: pnpm lint
- - run: pnpm test:run
+ - run: pnpm test
- run: pnpm build
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 5a63e01..6f8053b 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -9,5 +9,7 @@
},
"editor.formatOnSave": true,
"editor.defaultFormatter": "esbenp.prettier-vscode",
- "oxc.enable": true
+ "oxc.enable": true,
+ "oxc.configPath": "oxlint.config.ts",
+ "typescript.tsdk": "node_modules/typescript/lib"
}
diff --git a/eslint.config.ts b/eslint.config.ts
index 796e300..81f89b7 100644
--- a/eslint.config.ts
+++ b/eslint.config.ts
@@ -10,6 +10,7 @@ export default defineConfig([
js.configs.recommended,
...tseslint.configs.recommended,
...astro.configs.recommended,
+
...oxlint.configs["flat/recommended"],
prettierConfig,
diff --git a/oxlint.config.ts b/oxlint.config.ts
new file mode 100644
index 0000000..061d5d3
--- /dev/null
+++ b/oxlint.config.ts
@@ -0,0 +1,7 @@
+import { defineConfig } from "oxlint";
+
+export default defineConfig({
+ rules: {
+ "no-unused-expressions": "off",
+ },
+});
diff --git a/package.json b/package.json
index 1f67c2b..24cba2b 100644
--- a/package.json
+++ b/package.json
@@ -14,8 +14,8 @@
"lint:eslint": "eslint . --fix",
"lint:oxlint": "oxlint . --fix",
"lint": "pnpm lint:eslint && pnpm lint:oxlint",
- "test": "vitest",
- "test:run": "vitest run",
+ "test": "vitest run",
+ "test:watch": "vitest",
"typecheck": "astro check",
"test:coverage": "vitest run --coverage",
"format": "prettier . --write",
@@ -29,6 +29,7 @@
"@types/react": "^19.2.17",
"@types/react-dom": "^19.2.3",
"astro": "^6.4.4",
+ "gsap": "^3.15.0",
"react": "^19.2.7",
"react-dom": "^19.2.7",
"tailwindcss": "^4.3.0",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index adec7ca..7b8c7e1 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -28,6 +28,9 @@ importers:
astro:
specifier: ^6.4.4
version: 6.4.4(@types/node@25.9.3)(jiti@2.7.0)(lightningcss@1.32.0)(rollup@4.61.1)(yaml@2.9.0)
+ gsap:
+ specifier: ^3.15.0
+ version: 3.15.0
react:
specifier: ^19.2.7
version: 19.2.7
@@ -3454,6 +3457,12 @@ packages:
integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==,
}
+ gsap@3.15.0:
+ resolution:
+ {
+ integrity: sha512-dMW4CWBTUK1AEEDeZc1g4xpPGIrSf9fJF960qbTZmN/QwZIWY5wgliS6JWl9/25fpTGJrMRtSjGtOmPnfjZB+A==,
+ }
+
h3@1.15.11:
resolution:
{
@@ -7934,6 +7943,8 @@ snapshots:
graceful-fs@4.2.11: {}
+ gsap@3.15.0: {}
+
h3@1.15.11:
dependencies:
cookie-es: 1.2.3
diff --git a/src/components/astro/DiscordCTA.astro b/src/components/discord/DiscordCTA.astro
similarity index 100%
rename from src/components/astro/DiscordCTA.astro
rename to src/components/discord/DiscordCTA.astro
diff --git a/src/components/astro/DiscordCTA.astro.test.ts b/src/components/discord/DiscordCTA.astro.test.ts
similarity index 86%
rename from src/components/astro/DiscordCTA.astro.test.ts
rename to src/components/discord/DiscordCTA.astro.test.ts
index edbb567..a496d82 100644
--- a/src/components/astro/DiscordCTA.astro.test.ts
+++ b/src/components/discord/DiscordCTA.astro.test.ts
@@ -1,5 +1,5 @@
+import { createTestContainer } from "@test/createTestContainer";
import { describe, expect, it } from "vitest";
-import { createTestContainer } from "../../test/createTestContainer";
import DiscordCTA from "./DiscordCTA.astro";
describe("DiscordCTA", () => {
diff --git a/src/components/astro/DiscordWidget.astro b/src/components/discord/DiscordWidget.astro
similarity index 98%
rename from src/components/astro/DiscordWidget.astro
rename to src/components/discord/DiscordWidget.astro
index b0d42e7..0aa3c1b 100644
--- a/src/components/astro/DiscordWidget.astro
+++ b/src/components/discord/DiscordWidget.astro
@@ -3,8 +3,8 @@ import {
countMembersByStatus,
formatPresenceCount,
sortMembersByStatus,
-} from "../../lib/discordWidget";
-import type { DiscordWidgetData } from "../../schemas/discordWidget";
+} from "@lib/discordWidget";
+import type { DiscordWidgetData } from "@schemas/discordWidget";
import DiscordCTA from "./DiscordCTA.astro";
interface Props {
diff --git a/src/components/astro/DiscordWidget.astro.test.ts b/src/components/discord/DiscordWidget.astro.test.ts
similarity index 100%
rename from src/components/astro/DiscordWidget.astro.test.ts
rename to src/components/discord/DiscordWidget.astro.test.ts
diff --git a/src/components/astro/Footer.astro b/src/components/footer/Footer.astro
similarity index 94%
rename from src/components/astro/Footer.astro
rename to src/components/footer/Footer.astro
index c8ba908..784b8dc 100644
--- a/src/components/astro/Footer.astro
+++ b/src/components/footer/Footer.astro
@@ -1,5 +1,5 @@
---
-import DiscordCTA from "./DiscordCTA.astro";
+import DiscordCTA from "@components/discord/DiscordCTA.astro";
interface Props {
siteName: string;
diff --git a/src/components/astro/Header.astro b/src/components/header/Header.astro
similarity index 78%
rename from src/components/astro/Header.astro
rename to src/components/header/Header.astro
index 423c01e..b310ec5 100644
--- a/src/components/astro/Header.astro
+++ b/src/components/header/Header.astro
@@ -1,8 +1,8 @@
---
-import DiscordCTA from "./DiscordCTA.astro";
-import ServerLogo from "./ServerLogo.astro";
-import MobileNav from "../react/MobileNav";
-import { navLinks } from "../../lib/nav";
+import DiscordCTA from "@components/discord/DiscordCTA.astro";
+import ServerLogo from "@components/icons/ServerLogo.astro";
+import { navLinks } from "@lib/nav";
+import MobileNav from "./MobileNav.astro";
interface Props {
siteName: string;
@@ -44,6 +44,6 @@ const { siteName, discordUrl } = Astro.props;
-
+
diff --git a/src/components/astro/Header.astro.test.ts b/src/components/header/Header.astro.test.ts
similarity index 90%
rename from src/components/astro/Header.astro.test.ts
rename to src/components/header/Header.astro.test.ts
index e0d3b2e..e684cf7 100644
--- a/src/components/astro/Header.astro.test.ts
+++ b/src/components/header/Header.astro.test.ts
@@ -1,5 +1,5 @@
+import { createTestContainer } from "@test/createTestContainer";
import { describe, expect, it } from "vitest";
-import { createTestContainer } from "../../test/createTestContainer";
import Header from "./Header.astro";
describe("Header", () => {
diff --git a/src/components/header/MobileNav.astro b/src/components/header/MobileNav.astro
new file mode 100644
index 0000000..aeca2a9
--- /dev/null
+++ b/src/components/header/MobileNav.astro
@@ -0,0 +1,114 @@
+---
+import type { NavLink } from "@lib/nav";
+
+interface Props {
+ navLinks: NavLink[];
+ discordUrl: string;
+}
+
+const { navLinks, discordUrl } = Astro.props;
+const menuId = "mobile-nav-menu";
+---
+
+
+
+
+
+
+
+
diff --git a/src/components/react/MobileNav.test.tsx b/src/components/header/MobileNav.test.tsx
similarity index 95%
rename from src/components/react/MobileNav.test.tsx
rename to src/components/header/MobileNav.test.tsx
index b1a7508..d07e5a7 100644
--- a/src/components/react/MobileNav.test.tsx
+++ b/src/components/header/MobileNav.test.tsx
@@ -1,7 +1,7 @@
// @vitest-environment jsdom
+import { navLinks } from "@lib/nav";
import { fireEvent, render, screen } from "@testing-library/react";
import { describe, expect, it } from "vitest";
-import { navLinks } from "../../lib/nav";
import MobileNav from "./MobileNav";
describe("MobileNav", () => {
diff --git a/src/components/react/MobileNav.tsx b/src/components/header/MobileNav.tsx
similarity index 98%
rename from src/components/react/MobileNav.tsx
rename to src/components/header/MobileNav.tsx
index fc664a2..c573cd6 100644
--- a/src/components/react/MobileNav.tsx
+++ b/src/components/header/MobileNav.tsx
@@ -1,5 +1,5 @@
+import type { NavLink } from "@lib/nav";
import { useEffect, useId, useRef, useState } from "react";
-import type { NavLink } from "../../lib/nav";
interface MobileNavProps {
navLinks: NavLink[];
diff --git a/src/components/astro/ServerLogo.astro b/src/components/icons/ServerLogo.astro
similarity index 100%
rename from src/components/astro/ServerLogo.astro
rename to src/components/icons/ServerLogo.astro
diff --git a/src/components/astro/CommunityCallout.astro b/src/components/landing/CommunityCallout.astro
similarity index 98%
rename from src/components/astro/CommunityCallout.astro
rename to src/components/landing/CommunityCallout.astro
index f69d9bd..957ccfa 100644
--- a/src/components/astro/CommunityCallout.astro
+++ b/src/components/landing/CommunityCallout.astro
@@ -1,7 +1,3 @@
----
-
----
-