diff --git a/package-lock.json b/package-lock.json index 4f4c9f4..bf05c0a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,7 @@ "name": "cse-ai-resource-website", "version": "0.1.0", "dependencies": { + "@radix-ui/react-collapsible": "^1.1.2", "@tanstack/react-query": "~5.53.3", "lucide-react": "~0.417.0", "next": "^15.1.6", @@ -886,6 +887,203 @@ "url": "https://opencollective.com/unts" } }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.1.tgz", + "integrity": "sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-collapsible": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.2.tgz", + "integrity": "sha512-PliMB63vxz7vggcyq0IxNYk8vGDrLXVWw4+W4B8YnwI1s18x7YZYqlG9PLX7XxAJUi0g2DxP4XKJMFHh/iVh9A==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-presence": "1.1.2", + "@radix-ui/react-primitive": "2.0.1", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.1.tgz", + "integrity": "sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.1.tgz", + "integrity": "sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.0.tgz", + "integrity": "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-presence": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.2.tgz", + "integrity": "sha512-18TFr80t5EVgL9x1SwF/YGtfG+l0BS0PRAlCWBDoBEiDQjeKgnNZRVJp/oVBl24sr3Gbfwc/Qpj4OcWTQMsAEg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.1.tgz", + "integrity": "sha512-sHCWTtxwNn3L3fH8qAfnF3WbUZycW93SM1j3NFDzXBiz8D6F5UTTy8G1+WFEaiCdvCVRJWj6N2R4Xq6HdiHmDg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.1.tgz", + "integrity": "sha512-RApLLOcINYJA+dMVbOju7MYv1Mb2EBp2nH4HdDzXTSyaR5optlm6Otrz1euW3HbdOR8UmmFK06TD+A9frYWv+g==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", + "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz", + "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", + "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/@swc/counter": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", @@ -954,14 +1152,14 @@ "version": "15.7.13", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz", "integrity": "sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/@types/react": { "version": "18.3.8", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.8.tgz", "integrity": "sha512-syBUrW3/XpnW4WJ41Pft+I+aPoDVbrBVQGEnbD7NijDGlVC+8gV/XKRY+7vMDlfPpbwYt0l1vd/Sj8bJGMbs9Q==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@types/prop-types": "*", @@ -972,7 +1170,7 @@ "version": "18.3.0", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@types/react": "*" @@ -2037,7 +2235,7 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/data-view-buffer": { diff --git a/package.json b/package.json index ec16ed3..9834ded 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "prepare": "husky install" }, "dependencies": { + "@radix-ui/react-collapsible": "^1.1.2", "@tanstack/react-query": "~5.53.3", "lucide-react": "~0.417.0", "next": "^15.1.6", diff --git a/public/bluetriangle.svg b/public/bluetriangle.svg new file mode 100644 index 0000000..7da6c05 --- /dev/null +++ b/public/bluetriangle.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/logo.svg b/public/logo.svg new file mode 100644 index 0000000..2d6feb1 --- /dev/null +++ b/public/logo.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/public/mock.webp b/public/mock.webp new file mode 100644 index 0000000..23e1391 Binary files /dev/null and b/public/mock.webp differ diff --git a/public/yellowtriangle.svg b/public/yellowtriangle.svg new file mode 100644 index 0000000..1bac51e --- /dev/null +++ b/public/yellowtriangle.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/app/page.tsx b/src/app/page.tsx index 5dc8cf3..3d5dbc7 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,4 +1,5 @@ import About from "@/components/home/about"; +import Dropdowns from "@/components/home/dropdowns"; import Education from "@/components/home/education"; import Landing from "@/components/home/landing"; import News from "@/components/home/news"; @@ -6,18 +7,13 @@ import Welcome from "@/components/home/welcome"; const Home = () => { return ( -
+
- + +
); }; diff --git a/src/app/projects/page.tsx b/src/app/projects/page.tsx index 0ed0f06..b2b960f 100644 --- a/src/app/projects/page.tsx +++ b/src/app/projects/page.tsx @@ -1,12 +1,14 @@ import Professionals from "@/components/projects/professionals"; import Research from "@/components/projects/research"; import Medical from "@/components/projects/medical"; +import Business from "@/components/projects/business"; const page = () => { return (
+
); diff --git a/src/app/resources/page.tsx b/src/app/resources/page.tsx index cd3fcf8..9f0835c 100644 --- a/src/app/resources/page.tsx +++ b/src/app/resources/page.tsx @@ -2,6 +2,7 @@ import External from "@/components/resources/external"; import React from "react"; import Videos from "@/components/resources/videos"; import Articles from "@/components/resources/articles"; +import Notes from "@/components/resources/notes"; const page = () => { return ( @@ -9,6 +10,7 @@ const page = () => { +
); }; diff --git a/src/components/home/dropdown.tsx b/src/components/home/dropdown.tsx new file mode 100644 index 0000000..975dff5 --- /dev/null +++ b/src/components/home/dropdown.tsx @@ -0,0 +1,121 @@ +"use client"; +import React, { useState } from "react"; +import Image from "next/image"; +import BlueTriangle from "@/public/bluetriangle.svg"; +import YellowTriangle from "@/public/yellowtriangle.svg"; + +import * as CollapsiblePrimitive from "@radix-ui/react-collapsible"; +const Collapsible = CollapsiblePrimitive.Root; +const CollapsibleTrigger = CollapsiblePrimitive.CollapsibleTrigger; +const CollapsibleContent = CollapsiblePrimitive.CollapsibleContent; + +type Prerequisite = { + name: string; + indent: number; +}; + +const Dropdown = ({ + header, + description, + books, + platforms, + prerequisites, +}: { + header: string; + description: string; + books: string[]; + platforms: string[]; + prerequisites: Prerequisite[]; +}) => { + const [courseOpen, setCourseOpen] = useState(false); + const [resourcesOpen, setResourcesOpen] = useState(false); + const [prerequisitesOpen, setPrerequisitesOpen] = useState(false); + + return ( +
+ + +
+ Yellow Triangle + {header} +
+
+ + +

+ {description} +

+ + + +
+ Blue Triangle + Resources +
+
+ + +
+

+ Course Materials: Provided by UCR instructors (lecture + slides,notes). +

+
+ Books: + {books.map((item, index) => ( +
  • {item}
  • + ))} +
    +
    + Practice Platforms: + {platforms.map((item, index) => ( +
  • {item}
  • + ))} +
    +
    +
    +
    + + + +
    + Blue Triangle + Prerequisites +
    +
    + + +
    + {prerequisites.map((item, index) => ( +
  • + {item.name} +
  • + ))} +
    +
    +
    +
    +
    +
    + ); +}; + +export default Dropdown; diff --git a/src/components/home/dropdowns.tsx b/src/components/home/dropdowns.tsx new file mode 100644 index 0000000..12cade2 --- /dev/null +++ b/src/components/home/dropdowns.tsx @@ -0,0 +1,29 @@ +import Dropdown from "./dropdown"; +import { courses } from "@/data/courses"; +import { Course } from "@/types/data"; + +const Dropdowns = () => { + return ( +
    + {Object.keys(courses).map((level) => ( +
    +

    + {level} +

    + {courses[level].map((item: Course, index: number) => ( + + ))} +
    + ))} +
    + ); +}; + +export default Dropdowns; diff --git a/src/components/home/education.tsx b/src/components/home/education.tsx index 021bb7d..ace8203 100644 --- a/src/components/home/education.tsx +++ b/src/components/home/education.tsx @@ -1,5 +1,3 @@ -import React from "react"; - const Education = () => { return (
    diff --git a/src/components/home/footer.tsx b/src/components/home/footer.tsx index 12b934b..8018e2e 100644 --- a/src/components/home/footer.tsx +++ b/src/components/home/footer.tsx @@ -1,7 +1,13 @@ import React from "react"; +import Image from "next/image"; +import Logo from "@/public/logo.svg"; const Footer = () => { - return
    footer
    ; + return ( +
    + logo +
    + ); }; export default Footer; diff --git a/src/components/home/new.tsx b/src/components/home/new.tsx new file mode 100644 index 0000000..e5b3791 --- /dev/null +++ b/src/components/home/new.tsx @@ -0,0 +1,37 @@ +import React from "react"; +import Image, { StaticImageData } from "next/image"; +import Link from "next/link"; + +const New = ({ + image, + alt, + link, + title, + text, +}: { + image: StaticImageData; + alt: string; + link: string; + title: string; + text: string; +}) => { + return ( +
    +
    + {alt} +
    +

    + + {title} + +

    +

    {text}

    +
    + ); +}; + +export default New; diff --git a/src/components/home/news.tsx b/src/components/home/news.tsx index 729b9a7..de1a9d4 100644 --- a/src/components/home/news.tsx +++ b/src/components/home/news.tsx @@ -1,41 +1,25 @@ -import React from "react"; -import Image from "next/image"; -import Link from "next/link"; +import { newsData } from "@/data/news"; +import New from "./new"; -interface NewsProps { - title: string; - pageLink: string; - imageLink: string; - imageAlt: string; - description: string; -} - -const News = ({ - title, - pageLink, - imageLink, - imageAlt, - description, -}: NewsProps) => { +const News = () => { return ( -
    -
    - {imageAlt} +
    +
    +

    Recent News

    + +
    +
    + {newsData.map((news, index) => ( + + ))}
    -
    -

    - - {title} - -

    -

    {description}

    -
    ); }; diff --git a/src/components/navigation.tsx b/src/components/navigation.tsx index a5a7972..73a317b 100644 --- a/src/components/navigation.tsx +++ b/src/components/navigation.tsx @@ -1,8 +1,9 @@ -import React from "react"; +"use client"; import Image from "next/image"; import Link from "next/link"; import Logo from "@/public/UCRLogo.svg"; -import { items } from "@/data/nav"; +import { ITEMS } from "@/data/nav"; +import { usePathname } from "next/navigation"; type Item = { name: string; @@ -10,6 +11,8 @@ type Item = { }; const Navigation = () => { + const pathname = usePathname(); + return (

    @@ -25,10 +28,22 @@ const Navigation = () => { CSE AI

    - {items.map((item: Item, index: number) => ( - - {" "} - {item.name}{" "} + {ITEMS.map((item: Item, index: number) => ( + + {item.name} + ))}
    diff --git a/src/components/projects/medical.tsx b/src/components/projects/medical.tsx index 76ae560..14e8181 100644 --- a/src/components/projects/medical.tsx +++ b/src/components/projects/medical.tsx @@ -2,7 +2,7 @@ import React from "react"; const Medical = () => { return ( -
    +

    Medical diff --git a/src/components/projects/professionals.tsx b/src/components/projects/professionals.tsx index b37966d..216ea54 100644 --- a/src/components/projects/professionals.tsx +++ b/src/components/projects/professionals.tsx @@ -2,14 +2,14 @@ import React from "react"; const Professionals = () => { return ( -
    +
    -

    +

    Engineers/Technical Professionals

    -
    +
    -

    +

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea diff --git a/src/components/projects/research.tsx b/src/components/projects/research.tsx index 4755818..4863bca 100644 --- a/src/components/projects/research.tsx +++ b/src/components/projects/research.tsx @@ -8,13 +8,13 @@ const Research = () => { ]; return ( -

    +
    -

    Projects & Research

    +

    Projects & Research

    -

    +

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea diff --git a/src/components/resources/articlelist.tsx b/src/components/resources/articlelist.tsx index ba853fe..e17e69f 100644 --- a/src/components/resources/articlelist.tsx +++ b/src/components/resources/articlelist.tsx @@ -12,7 +12,7 @@ interface ArticleListProps { articles: Article[]; } -const ArticleList: React.FC = ({ title, articles }) => ( +const ArticleList = ({ title, articles }: ArticleListProps) => (

    {title}

      diff --git a/src/components/resources/articles.tsx b/src/components/resources/articles.tsx index 2977bc9..a4776b7 100644 --- a/src/components/resources/articles.tsx +++ b/src/components/resources/articles.tsx @@ -6,9 +6,10 @@ const categoryTitles: { [key: string]: string } = { pytorch: "PyTorch Official Tutorials", kaggle: "Kaggle Projects", }; + const Articles = () => { return ( -
      +
      Articles
      diff --git a/src/components/resources/external.tsx b/src/components/resources/external.tsx index 55fed2f..3f0a8a2 100644 --- a/src/components/resources/external.tsx +++ b/src/components/resources/external.tsx @@ -2,12 +2,12 @@ import React from "react"; const External = () => { return ( -
      -
      -

      External Resources

      -

      +

      +
      +

      External Resources

      +
      -

      +

      Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea diff --git a/src/components/resources/notes.tsx b/src/components/resources/notes.tsx index 4883694..d0ac33a 100644 --- a/src/components/resources/notes.tsx +++ b/src/components/resources/notes.tsx @@ -1,19 +1,21 @@ import React from "react"; import Link from "next/link"; -import notesData, { Note } from "../../data/notesData"; +import { notesData } from "@/data/notesData"; -const notes = () => { +const Notes = () => { return ( -

      +
      -

      Lecture Notes

      -
      +

      + Lecture Notes +

      +
      - {notesData.map((note: Note) => ( + {notesData.map((note, index) => ( { ); }; -export default notes; +export default Notes; diff --git a/src/components/resources/videos.tsx b/src/components/resources/videos.tsx index 6e13380..84bcf96 100644 --- a/src/components/resources/videos.tsx +++ b/src/components/resources/videos.tsx @@ -9,7 +9,7 @@ type Video = { const Videos = () => { return ( -
      +
      Videos
      diff --git a/src/data/articles.ts b/src/data/articles.ts index 47af8ef..5919320 100644 --- a/src/data/articles.ts +++ b/src/data/articles.ts @@ -1,4 +1,6 @@ -export const articlesData = { +import { Data } from "@/types/data"; + +export const articlesData: Record = { pytorch: [ { id: 1, title: "CIFAR10 Classifier", link: "#" }, { id: 2, title: "MNIST", link: "#" }, diff --git a/src/data/courses.ts b/src/data/courses.ts new file mode 100644 index 0000000..35340ef --- /dev/null +++ b/src/data/courses.ts @@ -0,0 +1,139 @@ +import { Course } from "@/types/data"; + +export const courses: Record = { + Beginner: [ + { + header: "CS 105: Data Analysis Methods", + description: + "Introduces fundamental concepts and methods in data analysis and visualization essential to various data science tasks.", + books: [ + "Introduction to the Practice of Statistics by Moore, McCabe, and Craig.", + "Data Science from Scratch by Joel Grus.", + ], + platforms: [ + "LeetCode: Beginner data manipulation problems.", + "GeeksforGeeks: For data structure and algorithm fundamentals.", + ], + prerequisites: [ + { + name: "CS 009B: Data-Oriented Introduction to Computing II (Python)", + indent: 0, + }, + ], + }, + { + header: "CS 170: Introduction to Artificial Intelligence", + description: + "Covers fundamental AI topics, including search algorithms, machine learning, reasoning, and knowledge representation.", + books: [ + "Artificial Intelligence: A Modern Approach by Stuart Russell and Peter Norvig.", + "Deep Learning by Ian Goodfellow.", + ], + platforms: [ + "CS50 AI: A project-based Harvard course.", + "AI Dungeon (fun problem-solving with AI applications).", + ], + prerequisites: [ + { name: "CS 100: Software Construction", indent: 0 }, + { + name: "Prerequisites for CS 100: CS 010C: Introduction to Data Structures and Algorithms", + indent: 1, + }, + { + name: "Prerequisites for CS 010C: CS 010B: Introduction to Computer Science II", + indent: 2, + }, + { + name: "Prerequisites for CS 010B: CS 010A: Introduction to Computer Science I", + indent: 2, + }, + ], + }, + { + header: "CS 171: Introduction to Machine Learning and Data Mining", + description: + "Introduces machine learning algorithms and data mining techniques, focusing on supervised and unsupervised learning methods.", + books: [ + "Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow by Aurélien Géron.", + "Pattern Recognition and Machine Learning by Christopher Bishop.", + ], + platforms: [ + "Kaggle: For dataset-based ML problems.", + "Machine Learning Mastery: Tutorials and practice datasets.", + ], + prerequisites: [ + { name: "CS 170: Introduction to Artificial Intelligence", indent: 0 }, + ], + }, + { + header: "CS 172: Introduction to Information Retrieval", + description: + "Focuses on the principles and methods of information retrieval, including indexing, querying, and evaluating search engines.", + books: [ + "Introduction to Information Retrieval by Christopher Manning.", + "Mining of Massive Datasets by Leskovec, Rajaraman, and Ullman.", + ], + platforms: [ + "ElasticSearch Labs: Practice building search engines.", + "IR Datasets: For testing and evaluation.", + ], + prerequisites: [{ name: "CS 100: Software Construction", indent: 0 }], + }, + { + header: "CS 173: Introduction to Natural Language Processing (NLP)", + description: + "Explores computational techniques for processing and understanding human language, covering syntax, semantics, and applications in NLP.", + books: [ + "Speech and Language Processing by Daniel Jurafsky and James H. Martin.", + "Natural Language Processing with PyTorch by Delip Rao.", + ], + platforms: [ + "Hugging Face: For hands-on NLP tasks with transformers.", + "Kaggle: NLP challenges (e.g., sentiment analysis, summarization).", + ], + prerequisites: [{ name: "CS 100: Software Construction", indent: 0 }], + }, + ], + Intermediate: [ + { + header: "CS 105: Data Analysis Methods", + description: + "Introduces fundamental concepts and methods in data analysis and visualization essential to various data science tasks.", + books: [ + "Introduction to the Practice of Statistics by Moore, McCabe, and Craig.", + "Data Science from Scratch by Joel Grus.", + ], + platforms: [ + "LeetCode: Beginner data manipulation problems.", + "GeeksforGeeks: For data structure and algorithm fundamentals.", + ], + prerequisites: [ + { + name: "CS 009B: Data-Oriented Introduction to Computing II (Python)", + indent: 0, + }, + ], + }, + ], + Advanced: [ + { + header: "CS 105: Data Analysis Methods", + description: + "Introduces fundamental concepts and methods in data analysis and visualization essential to various data science tasks.", + books: [ + "Introduction to the Practice of Statistics by Moore, McCabe, and Craig.", + "Data Science from Scratch by Joel Grus.", + ], + platforms: [ + "LeetCode: Beginner data manipulation problems.", + "GeeksforGeeks: For data structure and algorithm fundamentals.", + ], + prerequisites: [ + { + name: "CS 009B: Data-Oriented Introduction to Computing II (Python)", + indent: 0, + }, + ], + }, + ], +}; diff --git a/src/data/nav.ts b/src/data/nav.ts index d26647b..aa9d229 100644 --- a/src/data/nav.ts +++ b/src/data/nav.ts @@ -1,4 +1,4 @@ -export const items = [ +export const ITEMS = [ { name: "EDUCATION", href: "/education", diff --git a/src/data/news.ts b/src/data/news.ts index e69de29..9972663 100644 --- a/src/data/news.ts +++ b/src/data/news.ts @@ -0,0 +1,26 @@ +import mock from "@/public/mock.webp"; +import { News } from "@/types/data"; + +export const newsData: News[] = [ + { + image: mock, + imageAlt: "error loading image", + refLink: "link", + title: "TITLE", + text: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.", + }, + { + image: mock, + imageAlt: "error loading image", + refLink: "link", + title: "TITLE", + text: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.", + }, + { + image: mock, + imageAlt: "error loading image", + refLink: "link", + title: "TITLE", + text: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.", + }, +]; diff --git a/src/data/notesData.ts b/src/data/notesData.ts index 3f511bc..9ad2543 100644 --- a/src/data/notesData.ts +++ b/src/data/notesData.ts @@ -1,10 +1,6 @@ -export type Note = { - id: number; - title: string; - url: string; -}; +import { Note } from "@/types/data"; -const notesData: Note[] = [ +export const notesData: Note[] = [ { id: 1, title: "Stanford CS229 Machine Learning Lecture Notes", @@ -16,5 +12,3 @@ const notesData: Note[] = [ url: "www.mocklink.com", }, ]; - -export default notesData; diff --git a/src/types/data.ts b/src/types/data.ts new file mode 100644 index 0000000..17b8844 --- /dev/null +++ b/src/types/data.ts @@ -0,0 +1,34 @@ +import { StaticImageData } from "next/image"; + +export type News = { + image: StaticImageData; + imageAlt: string; + refLink: string; + title: string; + text: string; +}; + +export type Note = { + id: number; + title: string; + url: string; +}; + +export type Data = { + id: number; + title: string; + link: string; +}; + +type Prerequisite = { + name: string; + indent: number; +}; + +export interface Course { + header: string; + description: string; + books: string[]; + platforms: string[]; + prerequisites: Prerequisite[]; +}