From c6ae9f3da918669c55b7afea4c0c0bcccb7a2d17 Mon Sep 17 00:00:00 2001 From: No767 <73260931+No767@users.noreply.github.com> Date: Thu, 7 May 2026 04:25:24 -0700 Subject: [PATCH 1/3] done --- .dockerignore | 2 +- .oxfmtrc.json | 5 + .oxlintrc.json | 180 +++++---- eslint.config.js | 6 - index.old.tsx | 171 --------- package.json | 8 +- pnpm-lock.yaml | 339 ++++++++++++++++- src/assets/images/acm-logo-v2.svg | 29 ++ src/assets/images/beginnings_logo.png | Bin 0 -> 8083 bytes src/assets/images/hero-bg.jpg | Bin 0 -> 23422 bytes src/assets/images/sig-ai-logo.svg | 31 ++ src/assets/images/sig-arch-logo.svg | 31 ++ src/assets/images/sig-cyber-logo.svg | 31 ++ src/assets/images/sig-data-logo.svg | 31 ++ src/assets/images/sig-graph-logo.svg | 31 ++ src/assets/images/sig-swe-logo.svg | 31 ++ src/components/app/footer.tsx | 43 +++ src/components/app/navigation-bar.tsx | 187 ++++------ src/components/app/section-head.tsx | 19 + src/components/app/theme-toggle.tsx | 69 ++++ src/components/ui/carousel.tsx | 264 ++++++++++++++ src/index.css | 167 +++++---- src/routes/__root.tsx | 4 +- src/routes/index.tsx | 501 +++++++++++++++++++++++++- vite.config.ts | 4 + 25 files changed, 1739 insertions(+), 445 deletions(-) delete mode 100644 index.old.tsx create mode 100644 src/assets/images/acm-logo-v2.svg create mode 100644 src/assets/images/beginnings_logo.png create mode 100644 src/assets/images/hero-bg.jpg create mode 100644 src/assets/images/sig-ai-logo.svg create mode 100644 src/assets/images/sig-arch-logo.svg create mode 100644 src/assets/images/sig-cyber-logo.svg create mode 100644 src/assets/images/sig-data-logo.svg create mode 100644 src/assets/images/sig-graph-logo.svg create mode 100644 src/assets/images/sig-swe-logo.svg create mode 100644 src/components/app/footer.tsx create mode 100644 src/components/app/section-head.tsx create mode 100644 src/components/app/theme-toggle.tsx create mode 100644 src/components/ui/carousel.tsx diff --git a/.dockerignore b/.dockerignore index 45502ad8..b99e7de9 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,3 +1,3 @@ -react/node_modules +node_modules .git .gitignore diff --git a/.oxfmtrc.json b/.oxfmtrc.json index 50355c2d..4e8caa7b 100644 --- a/.oxfmtrc.json +++ b/.oxfmtrc.json @@ -31,5 +31,10 @@ ["alias-imports", "internal", "type-internal"], "unknown" ] + }, + "sortTailwindcss": { + "stylesheet": "src/index.css", + "functions": ["clsx", "cn"], + "preserveWhitespace": true } } diff --git a/.oxlintrc.json b/.oxlintrc.json index 77c12b93..3a394c77 100644 --- a/.oxlintrc.json +++ b/.oxlintrc.json @@ -17,13 +17,16 @@ // Automatically generated code "src/routeTree.gen.ts", - // Shadcn components + // Shadcn/ui components "src/components/ui", - "!src/components/ui/theme-provider.tsx" + "!src/components/ui/theme-provider.tsx", + "!src/components/ui/carousel.tsx" ], "overrides": [ { - "files": ["**/*.{ts,tsx}"], + "files": [ + "**/*.{ts,tsx}" + ], "rules": { "constructor-super": "error", "for-direction": "error", @@ -78,6 +81,7 @@ "no-unused-labels": "error", "no-unused-private-class-members": "error", "no-unused-vars": "error", + "no-useless-assignment": "error", "no-useless-backreference": "error", "no-useless-catch": "error", "no-useless-escape": "error", @@ -175,18 +179,85 @@ "allowRegExp": false } ], - "typescript/return-await": ["error", "error-handling-correctness-only"], + "typescript/return-await": [ + "error", + "error-handling-correctness-only" + ], "typescript/triple-slash-reference": "error", "typescript/unbound-method": "error", "typescript/unified-signatures": "error", "typescript/use-unknown-in-catch-callback-variable": "error", - "import/named": "error", + "react/rules-of-hooks": "error", + "react/exhaustive-deps": "warn", + "react-x/error-boundaries": "error", + "react-x/exhaustive-deps": "warn", + "react-x/no-access-state-in-setstate": "error", + "react-x/no-array-index-key": "warn", + "react-x/no-children-count": "warn", + "react-x/no-children-for-each": "warn", + "react-x/no-children-map": "warn", + "react-x/no-children-only": "warn", + "react-x/no-children-to-array": "warn", + "react-x/no-clone-element": "warn", + "react-x/no-component-will-mount": "error", + "react-x/no-component-will-receive-props": "error", + "react-x/no-component-will-update": "error", + "react-x/no-context-provider": "warn", + "react-x/no-create-ref": "error", + "react-x/no-direct-mutation-state": "error", + "react-x/no-forward-ref": "warn", + "react-x/no-missing-key": "error", + "react-x/no-nested-component-definitions": "error", + "react-x/no-nested-lazy-component-declarations": "error", + "react-x/no-set-state-in-component-did-mount": "warn", + "react-x/no-set-state-in-component-did-update": "warn", + "react-x/no-set-state-in-component-will-update": "warn", + "react-x/no-unnecessary-use-prefix": "warn", + "react-x/no-unsafe-component-will-mount": "warn", + "react-x/no-unsafe-component-will-receive-props": "warn", + "react-x/no-unsafe-component-will-update": "warn", + "react-x/no-unused-class-component-members": "warn", + "react-x/no-unused-state": "warn", + "react-x/no-use-context": "warn", + "react-x/purity": "warn", + "react-x/rules-of-hooks": "error", + "react-x/set-state-in-effect": "warn", + "react-x/set-state-in-render": "error", + "react-x/static-components": "error", + "react-x/unsupported-syntax": "error", + "react-x/use-memo": "error", + "react-x/use-state": "warn", + "react-dom/no-dangerously-set-innerhtml": "warn", + "react-dom/no-dangerously-set-innerhtml-with-children": "error", + "react-dom/no-find-dom-node": "error", + "react-dom/no-flush-sync": "error", + "react-dom/no-hydrate": "error", + "react-dom/no-render": "error", + "react-dom/no-render-return-value": "error", + "react-dom/no-script-url": "warn", + "react-dom/no-unsafe-iframe-sandbox": "warn", + "react-dom/no-use-form-state": "error", + "react-dom/no-void-elements-with-children": "error", + "react-naming-convention/context-name": "warn", + "react-naming-convention/id-name": "warn", + "react-naming-convention/ref-name": "warn", + "react-jsx/no-children-prop": "warn", + "react-jsx/no-children-prop-with-children": "error", + "react-jsx/no-comment-textnodes": "warn", + "react-jsx/no-key-after-spread": "error", + "react-jsx/no-leaked-dollar": "warn", + "react-jsx/no-leaked-semicolon": "warn", + "react-jsx/no-namespace": "error", + "import/named": "off", "import/namespace": "error", "import/default": "error", "import/export": "error", "import/no-named-as-default": "warn", "import/no-named-as-default-member": "warn", "import/no-duplicates": "warn", + "react-perf/jsx-no-new-object-as-prop": "error", + "react-perf/jsx-no-new-array-as-prop": "error", + "react-perf/jsx-no-new-function-as-prop": "error", "jsx-a11y/alt-text": "error", "jsx-a11y/anchor-ambiguous-text": "off", "jsx-a11y/anchor-has-content": "error", @@ -212,7 +283,9 @@ "error", { "tags": [], - "roles": ["tabpanel"], + "roles": [ + "tabpanel" + ], "allowExpressionValues": true } ], @@ -235,66 +308,6 @@ "jsx-a11y/role-supports-aria-props": "error", "jsx-a11y/scope": "error", "jsx-a11y/tabindex-no-positive": "error", - "react-dom/no-dangerously-set-innerhtml": "warn", - "react-dom/no-dangerously-set-innerhtml-with-children": "error", - "react-dom/no-find-dom-node": "error", - "react-dom/no-flush-sync": "error", - "react-dom/no-hydrate": "error", - "react-dom/no-render": "error", - "react-dom/no-render-return-value": "error", - "react-dom/no-script-url": "warn", - "react-dom/no-unsafe-iframe-sandbox": "warn", - "react-dom/no-use-form-state": "error", - "react-dom/no-void-elements-with-children": "error", - "react-perf/jsx-no-new-object-as-prop": "error", - "react-perf/jsx-no-new-array-as-prop": "error", - "react-perf/jsx-no-new-function-as-prop": "error", - "react-x/component-hook-factories": "error", - "react-x/error-boundaries": "error", - "react-x/exhaustive-deps": "warn", - "react-x/no-access-state-in-setstate": "error", - "react-x/no-array-index-key": "warn", - "react-x/no-children-count": "warn", - "react-x/no-children-for-each": "warn", - "react-x/no-children-map": "warn", - "react-x/no-children-only": "warn", - "react-x/no-children-to-array": "warn", - "react-x/no-clone-element": "warn", - "react-x/no-component-will-mount": "error", - "react-x/no-component-will-receive-props": "error", - "react-x/no-component-will-update": "error", - "react-x/no-context-provider": "warn", - "react-x/no-create-ref": "error", - "react-x/no-direct-mutation-state": "error", - "react-x/no-forward-ref": "warn", - "react-x/no-missing-key": "error", - "react-x/no-nested-component-definitions": "error", - "react-x/no-nested-lazy-component-declarations": "error", - "react-x/no-redundant-should-component-update": "error", - "react-x/no-set-state-in-component-did-mount": "warn", - "react-x/no-set-state-in-component-did-update": "warn", - "react-x/no-set-state-in-component-will-update": "warn", - "react-x/no-unnecessary-use-prefix": "warn", - "react-x/no-unsafe-component-will-mount": "warn", - "react-x/no-unsafe-component-will-receive-props": "warn", - "react-x/no-unsafe-component-will-update": "warn", - "react-x/no-unused-class-component-members": "warn", - "react-x/no-use-context": "warn", - "react-x/purity": "warn", - "react-x/rules-of-hooks": "error", - "react-x/set-state-in-effect": "warn", - "react-x/set-state-in-render": "error", - "react-x/unsupported-syntax": "error", - "react-x/use-memo": "error", - "react-x/use-state": "warn", - "react-x/no-class-component": "error", - "react-x/no-misused-capture-owner-stack": "error", - "react-x/no-unnecessary-use-callback": "warn", - "react-x/no-unnecessary-use-memo": "warn", - "react-x/no-unstable-context-value": "warn", - "react-x/no-unstable-default-props": "warn", - "react-x/no-unused-state": "warn", - "react-x/prefer-destructuring-assignment": "warn", "no-negated-condition": "off", "no-nested-ternary": "off", "unicorn/catch-error-name": "error", @@ -303,6 +316,7 @@ "unicorn/consistent-empty-array-spread": "error", "unicorn/consistent-existence-index-check": "error", "unicorn/consistent-function-scoping": "error", + "unicorn/consistent-template-literal-escape": "error", "unicorn/custom-error-definition": "off", "unicorn/empty-brace-spaces": "error", "unicorn/error-message": "error", @@ -353,6 +367,7 @@ "unicorn/no-useless-collection-argument": "error", "unicorn/no-useless-error-capture-stack-trace": "error", "unicorn/no-useless-fallback-in-spread": "error", + "unicorn/no-useless-iterator-to-array": "error", "unicorn/no-useless-length-check": "error", "unicorn/no-useless-promise-resolve-reject": "error", "unicorn/no-useless-spread": "error", @@ -381,6 +396,7 @@ "unicorn/prefer-dom-node-text-content": "error", "unicorn/prefer-event-target": "error", "unicorn/prefer-global-this": "error", + "unicorn/prefer-import-meta-properties": "off", "unicorn/prefer-includes": "error", "unicorn/prefer-keyboard-event-key": "error", "unicorn/prefer-logical-operator-over-ternary": "error", @@ -419,11 +435,35 @@ "unicorn/require-number-to-fixed-digits-argument": "error", "unicorn/require-post-message-target-origin": "off", "unicorn/switch-case-braces": "error", + "unicorn/switch-case-break-position": "error", "unicorn/text-encoding-identifier-case": "error", - "unicorn/throw-new-error": "error" + "unicorn/throw-new-error": "error", + "@tanstack/query/exhaustive-deps": "error", + "@tanstack/query/no-rest-destructuring": "warn", + "@tanstack/query/stable-query-client": "error", + "@tanstack/query/no-unstable-deps": "error", + "@tanstack/query/infinite-query-property-order": "error", + "@tanstack/query/no-void-query-fn": "error", + "@tanstack/query/mutation-property-order": "error", + "@tanstack/router/create-route-property-order": "warn", + "@tanstack/router/route-param-names": "error" }, - "plugins": ["typescript", "import", "jsx-a11y", "react-perf", "unicorn"], - "jsPlugins": ["eslint-plugin-react-dom", "eslint-plugin-react-x"], + "plugins": [ + "typescript", + "react", + "import", + "react-perf", + "jsx-a11y", + "unicorn" + ], + "jsPlugins": [ + "eslint-plugin-react-x", + "eslint-plugin-react-dom", + "eslint-plugin-react-naming-convention", + "eslint-plugin-react-jsx", + "@tanstack/eslint-plugin-query", + "@tanstack/eslint-plugin-router" + ], "env": { "es2026": true, "es2020": true, @@ -431,4 +471,4 @@ } } ] -} +} \ No newline at end of file diff --git a/eslint.config.js b/eslint.config.js index c6bdb34c..23a585b9 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -1,5 +1,3 @@ -import pluginQuery from "@tanstack/eslint-plugin-query"; -import pluginRouter from "@tanstack/eslint-plugin-router"; import oxlint from "eslint-plugin-oxlint"; import reactHooks from "eslint-plugin-react-hooks"; import { defineConfig, globalIgnores } from "eslint/config"; @@ -26,10 +24,6 @@ export default defineConfig([ // React-specific configurations reactHooks.configs.flat.recommended, - // Tanstack-specific ESLint configuration - pluginQuery.configs["flat/recommended"], - pluginRouter.configs["flat/recommended"], - oxlint.configs["flat/recommended"], ], languageOptions: { diff --git a/index.old.tsx b/index.old.tsx deleted file mode 100644 index bd70831e..00000000 --- a/index.old.tsx +++ /dev/null @@ -1,171 +0,0 @@ -import { ChevronDown } from "lucide-react"; -import { useId } from "react"; - - -import { - Accordion, - AccordionContent, - AccordionItem, - AccordionTrigger, -} from "@/components/ui/accordion"; -import { Button } from "@/components/ui/button"; - -import { cn } from "@/lib/utils"; - -interface MenuAnchorProps { - targetId: string; - className?: string; -} - -function MenuAnchorButton({ targetId, className }: Readonly) { - const handleClick = () => { - const targetElement = document.getElementById(targetId); - - if (targetElement) { - targetElement.scrollIntoView(); - } - }; - return ( - - ); -} -function Index() { - const aboutSection = useId(); - - return ( - <> - {/* Hero section */} -
-
-
-

- Where Theory and Practice Fuse -

-

- Central Valley's Flagship Computer Science Community at UC Merced -

- -
- -
- placeholder -
-
- -
- -
-
- - {/* Introduction section */} -
-
-
- placeholder -
- -
-
-

- Providing professional and community expertise in Computer - Science to you -

-

- ACM at UC Merced is an student-run computing organization that - fosters an community environment where individuals interested in - Computer Science can discuss, educate, and collaborate. We - strive to create and maintain and community where students are - prepared for practical CS skills and knowledge through - collaboration, workshops, seminars, and passion. -

-
-
-
-
- - {/* SIGs Intro */} -
-
-

Student Interest Groups

-

- ACM @ UC Merced has 6 groups, which all independently host workshops - and other events to support the goal. -

- -
-
- - {/* FAQ section */} -
-
-

- Frequently Asked Questions -

- - - Is it accessible? - - Yes. It adheres to the WAI-ARIA design pattern. - - - - Is it accessible? - - Yes. It adheres to the WAI-ARIA design pattern. - - - -
-
- - ); -} - -export { Index }; diff --git a/package.json b/package.json index dce2c5a1..ad121c02 100644 --- a/package.json +++ b/package.json @@ -11,11 +11,15 @@ "dependencies": { "@base-ui/react": "^1.3.0", "@fontsource-variable/raleway": "^5.2.8", + "@icons-pack/react-simple-icons": "^13.13.0", "@tanstack/react-query": "^5.96.2", "@tanstack/react-router": "^1.168.10", + "axios": "^1.16.0", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", + "embla-carousel-react": "^8.6.0", "lucide-react": "^1.0.0", + "motion": "^12.38.0", "next-themes": "^0.4.6", "react": "^19.2.4", "react-dom": "^19.2.4", @@ -39,7 +43,9 @@ "eslint-plugin-oxlint": "^1.58.0", "eslint-plugin-react-dom": "^5.0.0", "eslint-plugin-react-hooks": "^7.0.1", - "eslint-plugin-react-x": "^5.0.0", + "eslint-plugin-react-jsx": "^5.7.1", + "eslint-plugin-react-naming-convention": "^5.7.1", + "eslint-plugin-react-x": "^5.7.1", "globals": "^17.4.0", "oxfmt": "^0.47.0", "oxlint": "^1.58.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7433965f..50b7f013 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,21 +14,33 @@ importers: '@fontsource-variable/raleway': specifier: ^5.2.8 version: 5.2.8 + '@icons-pack/react-simple-icons': + specifier: ^13.13.0 + version: 13.13.0(react@19.2.5) '@tanstack/react-query': specifier: ^5.96.2 version: 5.100.9(react@19.2.5) '@tanstack/react-router': specifier: ^1.168.10 version: 1.169.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + axios: + specifier: ^1.16.0 + version: 1.16.0 class-variance-authority: specifier: ^0.7.1 version: 0.7.1 clsx: specifier: ^2.1.1 version: 2.1.1 + embla-carousel-react: + specifier: ^8.6.0 + version: 8.6.0(react@19.2.5) lucide-react: specifier: ^1.0.0 version: 1.14.0(react@19.2.5) + motion: + specifier: ^12.38.0 + version: 12.38.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) next-themes: specifier: ^0.4.6 version: 0.4.6(react-dom@19.2.5(react@19.2.5))(react@19.2.5) @@ -93,8 +105,14 @@ importers: eslint-plugin-react-hooks: specifier: ^7.0.1 version: 7.1.1(eslint@10.3.0(jiti@2.6.1)) + eslint-plugin-react-jsx: + specifier: ^5.7.1 + version: 5.7.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3) + eslint-plugin-react-naming-convention: + specifier: ^5.7.1 + version: 5.7.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3) eslint-plugin-react-x: - specifier: ^5.0.0 + specifier: ^5.7.1 version: 5.7.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3) globals: specifier: ^17.4.0 @@ -129,8 +147,9 @@ importers: packages: - '@antfu/ni@0.23.2': - resolution: {integrity: sha512-FSEVWXvwroExDXUu8qV6Wqp2X3D1nJ0Li4LFymCyvCVrm7I3lNfG0zZWSWvGU1RE7891eTnFTyh31L3igOwNKQ==} + '@antfu/ni@30.1.0': + resolution: {integrity: sha512-3VuAbPjgY52rQNn4wABaXMhBU2Oq91uy6L8nX49eJ35OLI68CyckGU+HZxcaHix4ymuGM2nFL1D6sLpgODK5xw==} + engines: {node: '>=20.19.0'} hasBin: true '@babel/code-frame@7.29.0': @@ -428,6 +447,12 @@ packages: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} + '@icons-pack/react-simple-icons@13.13.0': + resolution: {integrity: sha512-B5HhQMIpcSH4z8IZ8HFhD59CboHceKYMpPC9kAwGyKntvPdyJJv26DLu4Z1wAjcCLyrJhf11tMhiQGom9Rxb9g==} + engines: {node: '>=24', pnpm: '>=10'} + peerDependencies: + react: ^16.13 || ^17 || ^18 || ^19 + '@inquirer/ansi@2.0.5': resolution: {integrity: sha512-doc2sWgJpbFQ64UflSVd17ibMGDuxO1yKgOgLMwavzESnXjFWJqUeG8saYosqKpHp4kWiM5x1nXvEjbpx90gzw==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} @@ -820,8 +845,8 @@ packages: peerDependencies: preact: 10.x - '@react-grab/cli@0.1.32': - resolution: {integrity: sha512-TI4SHATLH2yM1DMRXgH3dt/8b3Rj51BplDOqOQiHQKAMOuKVAR9WE2WGWJRT3LwFpl8BXR9ytAM9vrGDrB7QGw==} + '@react-grab/cli@0.1.33': + resolution: {integrity: sha512-UOc3PwN11Osw0NzaxRLK8trP4X+5iW1Dst3gvHRCafe3wXHyadzHYH8H1hdkcXdlIx3gsoD9ASJ+G/JH+A/jqA==} hasBin: true '@rolldown/binding-android-arm64@1.0.0-rc.17': @@ -1312,6 +1337,12 @@ packages: resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} engines: {node: '>=4'} + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + axios@1.16.0: + resolution: {integrity: sha512-6hp5CwvTPlN2A31g5dxnwAX0orzM7pmCRDLnZSX772mv8WDqICwFjowHuPs04Mc8deIld1+ejhtaMn5vp6b+1w==} + babel-dead-code-elimination@1.0.12: resolution: {integrity: sha512-GERT7L2TiYcYDtYk1IpD+ASAYXjKbLTDPhBtYj7X1NuRMDTMtAx9kyBenub1Ev41lo91OHCKdmP+egTDmfQ7Ig==} @@ -1395,6 +1426,10 @@ packages: resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} engines: {node: '>=6'} + cli-spinners@3.4.0: + resolution: {integrity: sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw==} + engines: {node: '>=18.20'} + cli-width@4.1.0: resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} engines: {node: '>= 12'} @@ -1417,6 +1452,10 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + commander@11.1.0: resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} engines: {node: '>=16'} @@ -1519,6 +1558,10 @@ packages: resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} engines: {node: '>=12'} + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + depd@2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} @@ -1549,6 +1592,19 @@ packages: electron-to-chromium@1.5.349: resolution: {integrity: sha512-QsWVGyRuY07Aqb234QytTfwd5d9AJlfNIQ5wIOl1L+PZDzI9d9+Fn0FRale/QYlFxt/bUnB0/nLd1jFPGxGK1A==} + embla-carousel-react@8.6.0: + resolution: {integrity: sha512-0/PjqU7geVmo6F734pmPqpyHqiM99olvyecY7zdweCw+6tKEXnrE90pBiBbMMU8s5tICemzpQ3hi5EpxzGW+JA==} + peerDependencies: + react: ^16.8.0 || ^17.0.1 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + + embla-carousel-reactive-utils@8.6.0: + resolution: {integrity: sha512-fMVUDUEx0/uIEDM0Mz3dHznDhfX+znCCDCeIophYb1QGVM7YThSWX+wz11zlYwWFOr74b4QLGg0hrGPJeG2s4A==} + peerDependencies: + embla-carousel: 8.6.0 + + embla-carousel@8.6.0: + resolution: {integrity: sha512-SjWyZBHJPbqxHOzckOfo8lHisEaJWmwd23XppYFYVh10bU66/Pn5tkVkbkCMZVdbUE5eTCI2nD8OyIP4Z+uwkA==} + emoji-regex@10.6.0: resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} @@ -1582,6 +1638,10 @@ packages: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -1611,6 +1671,20 @@ packages: peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0 + eslint-plugin-react-jsx@5.7.1: + resolution: {integrity: sha512-pIDQQU5QZXLsaAShv7J2yVBpC9KAMQmOyBIEAPzDkOShVvH8p4Jyy/xQbvoTUE6UaOkpzsHRmOaTISLtdulmMA==} + engines: {node: '>=22.0.0'} + peerDependencies: + eslint: ^10.2.1 + typescript: '*' + + eslint-plugin-react-naming-convention@5.7.1: + resolution: {integrity: sha512-kmWTEgTyaCCmtpG0OvDzhQOCawSxLphX6Hs1cAskRFn2DO9So8JjHUX+/Q0D8MzR5rX6WL5jBu+I2AgdLXcpvw==} + engines: {node: '>=22.0.0'} + peerDependencies: + eslint: ^10.2.1 + typescript: '*' + eslint-plugin-react-x@5.7.1: resolution: {integrity: sha512-XskzY5TH6asFkAIqmUXXjrxJjJS74YIAm6Q1fIC835gOkPlPOPOLNG1Sy9eS4uJ1fFhGnZ5jzlRFL8WgdU9LOQ==} engines: {node: '>=22.0.0'} @@ -1766,6 +1840,19 @@ packages: flatted@3.4.2: resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} + follow-redirects@1.16.0: + resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + form-data@4.0.5: + resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} + engines: {node: '>= 6'} + formdata-polyfill@4.0.10: resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} engines: {node: '>=12.20.0'} @@ -1774,6 +1861,20 @@ packages: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} + framer-motion@12.38.0: + resolution: {integrity: sha512-rFYkY/pigbcswl1XQSb7q424kSTQ8q6eAC+YUsSKooHQYuLdzdHjrt6uxUC+PRAO++q5IS7+TamgIw1AphxR+g==} + peerDependencies: + '@emotion/is-prop-valid': '*' + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/is-prop-valid': + optional: true + react: + optional: true + react-dom: + optional: true + fresh@2.0.0: resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} engines: {node: '>= 0.8'} @@ -1793,6 +1894,9 @@ packages: fuzzysort@3.1.0: resolution: {integrity: sha512-sR9BNCjBg6LNgwvxlBd0sBABvQitkLzoVY9MYYROQVX/FvfJ4Mai9LsGhDgd8qYdds0bY77VzYd5iuB+v5rwQQ==} + fzf@0.5.2: + resolution: {integrity: sha512-Tt4kuxLXFKHy8KT40zwsUPUkg1CrsgY25FxA2U/j/0WgEDCk3ddc/zLTCCcbSHX9FcKtLuVaDGtGE/STWC+j3Q==} + gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} @@ -1852,6 +1956,10 @@ packages: resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} engines: {node: '>= 0.4'} + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + hasown@2.0.3: resolution: {integrity: sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==} engines: {node: '>= 0.4'} @@ -2154,6 +2262,10 @@ packages: resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} engines: {node: '>=18'} + log-symbols@7.0.1: + resolution: {integrity: sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==} + engines: {node: '>=18'} + lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -2188,10 +2300,18 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + mime-db@1.54.0: resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} engines: {node: '>= 0.6'} + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + mime-types@3.0.2: resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} engines: {node: '>=18'} @@ -2211,6 +2331,26 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + motion-dom@12.38.0: + resolution: {integrity: sha512-pdkHLD8QYRp8VfiNLb8xIBJis1byQ9gPT3Jnh2jqfFtAsWUA3dEepDlsWe/xMpO8McV+VdpKVcp+E+TGJEtOoA==} + + motion-utils@12.36.0: + resolution: {integrity: sha512-eHWisygbiwVvf6PZ1vhaHCLamvkSbPIeAYxWUuL3a2PD/TROgE7FvfHWTIH4vMl798QLfMw15nRqIaRDXTlYRg==} + + motion@12.38.0: + resolution: {integrity: sha512-uYfXzeHlgThchzwz5Te47dlv5JOUC7OB4rjJ/7XTUgtBZD8CchMN8qEJ4ZVsUmTyYA44zjV0fBwsiktRuFnn+w==} + peerDependencies: + '@emotion/is-prop-valid': '*' + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/is-prop-valid': + optional: true + react: + optional: true + react-dom: + optional: true + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -2309,6 +2449,10 @@ packages: resolution: {integrity: sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==} engines: {node: '>=18'} + ora@9.4.0: + resolution: {integrity: sha512-84cglkRILFxdtA8hAvLNdMrtBpPNBTrQ9/ulg0FA7xLMnD6mifv+enAIeRmvtv+WgdCE+LPGOfQmtJRrVaIVhQ==} + engines: {node: '>=20'} + outvariant@1.4.3: resolution: {integrity: sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==} @@ -2339,6 +2483,9 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} + package-manager-detector@1.6.0: + resolution: {integrity: sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==} + parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -2430,6 +2577,10 @@ packages: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} + proxy-from-env@2.1.0: + resolution: {integrity: sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==} + engines: {node: '>=10'} + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -2454,8 +2605,8 @@ packages: peerDependencies: react: ^19.2.5 - react-grab@0.1.32: - resolution: {integrity: sha512-ODZkzu4zjwX/5a1VxTdIkagPD6uPnp8IkSN2v5FDgFMZkH5r/YEMq43hIsdpHV5/R2ymqS9zLxp4H7SNSRx5ng==} + react-grab@0.1.33: + resolution: {integrity: sha512-ER919JMsE4TTrb2CpEivqsIjNMSycD4HtS8v7mS3pq67U7WL1K3+C8m9AYOwW4dpuYh+EanC2eJBmfuczHJZ0A==} hasBin: true peerDependencies: react: '>=17.0.0' @@ -2631,6 +2782,10 @@ packages: resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} engines: {node: '>=18'} + stdin-discarder@0.3.2: + resolution: {integrity: sha512-eCPu1qRxPVkl5605OTWF8Wz40b4Mf45NY5LQmVPQ599knfs5QhASUm9GbJ5BDMDOXgrnh0wyEdvzmL//YMlw0A==} + engines: {node: '>=18'} + strict-event-emitter@0.5.1: resolution: {integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==} @@ -2645,6 +2800,10 @@ packages: resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} engines: {node: '>=18'} + string-width@8.2.1: + resolution: {integrity: sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA==} + engines: {node: '>=20'} + stringify-object@5.0.0: resolution: {integrity: sha512-zaJYxz2FtcMb4f+g60KsRNFOpVMUyuJgA51Zi5Z1DOTC3S59+OQiVOzE9GZt0x72uBGWKsQIuBKeF9iusmKFsg==} engines: {node: '>=14.16'} @@ -2686,6 +2845,10 @@ packages: tiny-invariant@1.3.3: resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + tinyexec@1.1.2: + resolution: {integrity: sha512-dAqSqE/RabpBKI8+h26GfLq6Vb3JVXs30XYQjdMjaj/c2tS8IYYMbIzP599KtRj7c57/wYApb3QjgRgXmrCukA==} + engines: {node: '>=18'} + tinyglobby@0.2.16: resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} engines: {node: '>=12.0.0'} @@ -2931,7 +3094,12 @@ packages: snapshots: - '@antfu/ni@0.23.2': {} + '@antfu/ni@30.1.0': + dependencies: + fzf: 0.5.2 + package-manager-detector: 1.6.0 + tinyexec: 1.1.2 + tinyglobby: 0.2.16 '@babel/code-frame@7.29.0': dependencies: @@ -3319,6 +3487,10 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} + '@icons-pack/react-simple-icons@13.13.0(react@19.2.5)': + dependencies: + react: 19.2.5 + '@inquirer/ansi@2.0.5': {} '@inquirer/confirm@6.0.12(@types/node@25.6.0)': @@ -3575,13 +3747,13 @@ snapshots: '@preact/signals-core': 1.14.1 preact: 10.29.1 - '@react-grab/cli@0.1.32': + '@react-grab/cli@0.1.33': dependencies: - '@antfu/ni': 0.23.2 + '@antfu/ni': 30.1.0 commander: 14.0.3 ignore: 7.0.5 jsonc-parser: 3.3.1 - ora: 8.2.0 + ora: 9.4.0 picocolors: 1.1.1 prompts: 2.4.2 smol-toml: 1.6.1 @@ -4036,6 +4208,16 @@ snapshots: dependencies: tslib: 2.8.1 + asynckit@0.4.0: {} + + axios@1.16.0: + dependencies: + follow-redirects: 1.16.0 + form-data: 4.0.5 + proxy-from-env: 2.1.0 + transitivePeerDependencies: + - debug + babel-dead-code-elimination@1.0.12: dependencies: '@babel/core': 7.29.0 @@ -4133,6 +4315,8 @@ snapshots: cli-spinners@2.9.2: {} + cli-spinners@3.4.0: {} + cli-width@4.1.0: {} cliui@8.0.1: @@ -4151,6 +4335,10 @@ snapshots: color-name@1.1.4: {} + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + commander@11.1.0: {} commander@14.0.3: {} @@ -4216,6 +4404,8 @@ snapshots: define-lazy-prop@3.0.0: {} + delayed-stream@1.0.0: {} + depd@2.0.0: {} detect-libc@2.1.2: {} @@ -4241,6 +4431,18 @@ snapshots: electron-to-chromium@1.5.349: {} + embla-carousel-react@8.6.0(react@19.2.5): + dependencies: + embla-carousel: 8.6.0 + embla-carousel-reactive-utils: 8.6.0(embla-carousel@8.6.0) + react: 19.2.5 + + embla-carousel-reactive-utils@8.6.0(embla-carousel@8.6.0): + dependencies: + embla-carousel: 8.6.0 + + embla-carousel@8.6.0: {} + emoji-regex@10.6.0: {} emoji-regex@8.0.0: {} @@ -4266,6 +4468,13 @@ snapshots: dependencies: es-errors: 1.3.0 + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.3 + escalade@3.2.0: {} escape-html@1.0.3: {} @@ -4302,6 +4511,34 @@ snapshots: transitivePeerDependencies: - supports-color + eslint-plugin-react-jsx@5.7.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3): + dependencies: + '@eslint-react/ast': 5.7.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3) + '@eslint-react/core': 5.7.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3) + '@eslint-react/eslint': 5.7.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3) + '@eslint-react/jsx': 5.7.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3) + '@eslint-react/shared': 5.7.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3) + '@typescript-eslint/types': 8.59.1 + '@typescript-eslint/utils': 8.59.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3) + eslint: 10.3.0(jiti@2.6.1) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + eslint-plugin-react-naming-convention@5.7.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3): + dependencies: + '@eslint-react/ast': 5.7.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3) + '@eslint-react/core': 5.7.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3) + '@eslint-react/eslint': 5.7.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3) + '@eslint-react/var': 5.7.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3) + '@typescript-eslint/types': 8.59.1 + '@typescript-eslint/utils': 8.59.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3) + eslint: 10.3.0(jiti@2.6.1) + ts-pattern: 5.9.0 + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + eslint-plugin-react-x@5.7.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3): dependencies: '@eslint-react/ast': 5.7.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3) @@ -4541,12 +4778,31 @@ snapshots: flatted@3.4.2: {} + follow-redirects@1.16.0: {} + + form-data@4.0.5: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.3 + mime-types: 2.1.35 + formdata-polyfill@4.0.10: dependencies: fetch-blob: 3.2.0 forwarded@0.2.0: {} + framer-motion@12.38.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5): + dependencies: + motion-dom: 12.38.0 + motion-utils: 12.36.0 + tslib: 2.8.1 + optionalDependencies: + react: 19.2.5 + react-dom: 19.2.5(react@19.2.5) + fresh@2.0.0: {} fs-extra@11.3.4: @@ -4562,6 +4818,8 @@ snapshots: fuzzysort@3.1.0: {} + fzf@0.5.2: {} + gensync@1.0.0-beta.2: {} get-caller-file@2.0.5: {} @@ -4613,6 +4871,10 @@ snapshots: has-symbols@1.1.0: {} + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + hasown@2.0.3: dependencies: function-bind: 1.1.2 @@ -4831,6 +5093,11 @@ snapshots: chalk: 5.6.2 is-unicode-supported: 1.3.0 + log-symbols@7.0.1: + dependencies: + is-unicode-supported: 2.1.0 + yoctocolors: 2.1.2 + lru-cache@5.1.1: dependencies: yallist: 3.1.1 @@ -4858,8 +5125,14 @@ snapshots: braces: 3.0.3 picomatch: 2.3.2 + mime-db@1.52.0: {} + mime-db@1.54.0: {} + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + mime-types@3.0.2: dependencies: mime-db: 1.54.0 @@ -4874,6 +5147,20 @@ snapshots: minimist@1.2.8: {} + motion-dom@12.38.0: + dependencies: + motion-utils: 12.36.0 + + motion-utils@12.36.0: {} + + motion@12.38.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5): + dependencies: + framer-motion: 12.38.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + tslib: 2.8.1 + optionalDependencies: + react: 19.2.5 + react-dom: 19.2.5(react@19.2.5) + ms@2.1.3: {} msw@2.14.2(@types/node@25.6.0)(typescript@6.0.3): @@ -4987,6 +5274,17 @@ snapshots: string-width: 7.2.0 strip-ansi: 7.2.0 + ora@9.4.0: + dependencies: + chalk: 5.6.2 + cli-cursor: 5.0.0 + cli-spinners: 3.4.0 + is-interactive: 2.0.0 + is-unicode-supported: 2.1.0 + log-symbols: 7.0.1 + stdin-discarder: 0.3.2 + string-width: 8.2.1 + outvariant@1.4.3: {} oxfmt@0.47.0: @@ -5053,6 +5351,8 @@ snapshots: dependencies: p-limit: 3.1.0 + package-manager-detector@1.6.0: {} + parent-module@1.0.1: dependencies: callsites: 3.1.0 @@ -5123,6 +5423,8 @@ snapshots: forwarded: 0.2.0 ipaddr.js: 1.9.1 + proxy-from-env@2.1.0: {} + punycode@2.3.1: {} qs@6.15.1: @@ -5145,9 +5447,9 @@ snapshots: react: 19.2.5 scheduler: 0.27.0 - react-grab@0.1.32(react@19.2.5): + react-grab@0.1.33(react@19.2.5): dependencies: - '@react-grab/cli': 0.1.32 + '@react-grab/cli': 0.1.33 bippy: 0.5.39(react@19.2.5) optionalDependencies: react: 19.2.5 @@ -5165,7 +5467,7 @@ snapshots: prompts: 2.4.2 react: 19.2.5 react-dom: 19.2.5(react@19.2.5) - react-grab: 0.1.32(react@19.2.5) + react-grab: 0.1.33(react@19.2.5) optionalDependencies: unplugin: 2.1.0 transitivePeerDependencies: @@ -5381,6 +5683,8 @@ snapshots: stdin-discarder@0.2.2: {} + stdin-discarder@0.3.2: {} + strict-event-emitter@0.5.1: {} string-ts@2.3.1: {} @@ -5397,6 +5701,11 @@ snapshots: get-east-asian-width: 1.5.0 strip-ansi: 7.2.0 + string-width@8.2.1: + dependencies: + get-east-asian-width: 1.5.0 + strip-ansi: 7.2.0 + stringify-object@5.0.0: dependencies: get-own-enumerable-keys: 1.0.0 @@ -5427,6 +5736,8 @@ snapshots: tiny-invariant@1.3.3: {} + tinyexec@1.1.2: {} + tinyglobby@0.2.16: dependencies: fdir: 6.5.0(picomatch@4.0.4) diff --git a/src/assets/images/acm-logo-v2.svg b/src/assets/images/acm-logo-v2.svg new file mode 100644 index 00000000..0e760d81 --- /dev/null +++ b/src/assets/images/acm-logo-v2.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/images/beginnings_logo.png b/src/assets/images/beginnings_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..a510da662301cd09c10aa5a4972e6c7cb0090027 GIT binary patch literal 8083 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 F@jpkGAwB>A literal 0 HcmV?d00001 diff --git a/src/assets/images/sig-ai-logo.svg b/src/assets/images/sig-ai-logo.svg new file mode 100644 index 00000000..0cb287f8 --- /dev/null +++ b/src/assets/images/sig-ai-logo.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/images/sig-arch-logo.svg b/src/assets/images/sig-arch-logo.svg new file mode 100644 index 00000000..ba56d715 --- /dev/null +++ b/src/assets/images/sig-arch-logo.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/images/sig-cyber-logo.svg b/src/assets/images/sig-cyber-logo.svg new file mode 100644 index 00000000..93555c18 --- /dev/null +++ b/src/assets/images/sig-cyber-logo.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/images/sig-data-logo.svg b/src/assets/images/sig-data-logo.svg new file mode 100644 index 00000000..143e90c5 --- /dev/null +++ b/src/assets/images/sig-data-logo.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/images/sig-graph-logo.svg b/src/assets/images/sig-graph-logo.svg new file mode 100644 index 00000000..ed309d73 --- /dev/null +++ b/src/assets/images/sig-graph-logo.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/images/sig-swe-logo.svg b/src/assets/images/sig-swe-logo.svg new file mode 100644 index 00000000..0b937a82 --- /dev/null +++ b/src/assets/images/sig-swe-logo.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/components/app/footer.tsx b/src/components/app/footer.tsx new file mode 100644 index 00000000..36b20b3a --- /dev/null +++ b/src/components/app/footer.tsx @@ -0,0 +1,43 @@ +import { SiInstagram, SiDiscord, SiGithub, type IconType } from "@icons-pack/react-simple-icons"; + +import { ThemeToggle } from "@/components/app/theme-toggle"; + +interface SocialEntry { + label: string; + href: string; + Icon: IconType; +} + +const SOCIALS: SocialEntry[] = [ + { label: "Discord", href: "https://discord.com", Icon: SiDiscord }, + { label: "GitHub", href: "https://github.com/UCMercedACM", Icon: SiGithub }, + { label: "Instagram", href: "https://instagram.com", Icon: SiInstagram }, +]; + +export function Footer() { + return ( +
+
+
© 2026 ACM @ UC Merced
+ +
+ +
+ {SOCIALS.map(({ label, href, Icon }) => ( + + + + ))} +
+
+
+
+ ); +} diff --git a/src/components/app/navigation-bar.tsx b/src/components/app/navigation-bar.tsx index 24255888..b24b8dff 100644 --- a/src/components/app/navigation-bar.tsx +++ b/src/components/app/navigation-bar.tsx @@ -1,43 +1,58 @@ import { Link } from "@tanstack/react-router"; -import { ChevronDown, Menu } from "lucide-react"; +import { Menu } from "lucide-react"; import { memo, useCallback, useState } from "react"; -import Logo from "@/assets/logo-full.svg"; +import acmLogo from "@/assets/images/acm-logo-v2.svg"; import { Button } from "@/components/ui/button"; -import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@/components/ui/collapsible"; -import { - NavigationMenu, - NavigationMenuContent, - NavigationMenuItem, - NavigationMenuLink, - NavigationMenuList, - NavigationMenuTrigger, - navigationMenuTriggerStyle, -} from "@/components/ui/navigation-menu"; import { Sheet, SheetContent, SheetHeader, SheetTrigger } from "@/components/ui/sheet"; -interface NavItem { +interface NavEntry { href: string; label: string; } -interface NavGroup { - label: string; - items: NavItem[]; -} - -type NavEntry = NavItem | NavGroup; - -const NAVIGATION_ENTRIES: NavEntry[] = [ +const NAV_LINKS: NavEntry[] = [ + { href: "/about", label: "About" }, { href: "/events", label: "Events" }, - { href: "/about-us/sigs", label: "SIGs" }, + { href: "/sigs", label: "SIGs" }, + { href: "/projects", label: "Projects" }, { href: "/resources", label: "Resources" }, -] as const; +]; + +const NAV_LINK_CLASSES = + "relative cursor-pointer pb-1 text-[15px] font-bold tracking-[0.02em] transition-colors text-brand-text-sub hover:text-foreground data-[status=active]:text-foreground"; +const NAV_LINK_UNDERLINE_CLASSES = + "absolute -bottom-0.75 left-0 h-1.25 w-full rounded-[9px] bg-brand-sky opacity-0 [[data-status=active]>&]:opacity-100"; -function isNavGroup(entry: NavEntry): entry is NavGroup { - return "items" in entry; +const DesktopNavLink = memo(function DesktopNavLink({ entry }: Readonly<{ entry: NavEntry }>) { + return ( + + {entry.label} + + + ); +}); + +interface SheetNavLinkProps { + entry: NavEntry; + onNavigate: () => void; } +const SheetNavLink = memo(function SheetNavLink({ + entry, + onNavigate, +}: Readonly) { + return ( + + {entry.label} + + ); +}); + function MobileNav() { const [open, setOpen] = useState(false); const closeSheet = useCallback(() => { @@ -46,111 +61,53 @@ function MobileNav() { return ( - }> + + } + > Open menu - + ); } -const DesktopNavItems = memo(function DesktopNavItems() { - return ( - - {NAVIGATION_ENTRIES.map((entry) => { - if (isNavGroup(entry)) { - return ( - - {entry.label} - -
    - {entry.items.map((item) => ( -
  • - }> - {item.label} - -
  • - ))} -
-
-
- ); - } - return ( - - } - className={navigationMenuTriggerStyle()} - > - {entry.label} - - - ); - })} -
- ); -}); - export function Navbar() { return ( -