diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 9ccee2f..eb91004 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -11,6 +11,7 @@ "@iconify/react": "^6.0.0", "@radix-ui/react-dropdown-menu": "^2.1.15", "@radix-ui/react-slot": "^1.2.3", + "@radix-ui/react-tooltip": "^1.2.7", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "dompurify": "^3.2.6", @@ -1203,6 +1204,40 @@ } } }, + "node_modules/@radix-ui/react-tooltip": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.7.tgz", + "integrity": "sha512-Ap+fNYwKTYJ9pzqW+Xe2HtMRbQ/EeWkj2qykZ6SuEV4iS/o1bZI5ssJbk4D2r8XuDuOBVz/tIx2JObtuqU+5Zw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.10", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.7", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.4", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-visually-hidden": "1.2.3" + }, + "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-use-callback-ref": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", @@ -1324,6 +1359,29 @@ } } }, + "node_modules/@radix-ui/react-visually-hidden": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.3.tgz", + "integrity": "sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "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/rect": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz", diff --git a/frontend/package.json b/frontend/package.json index 2ed3bce..d3bc000 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -12,6 +12,7 @@ "@iconify/react": "^6.0.0", "@radix-ui/react-dropdown-menu": "^2.1.15", "@radix-ui/react-slot": "^1.2.3", + "@radix-ui/react-tooltip": "^1.2.7", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "dompurify": "^3.2.6", diff --git a/frontend/public/brain.png b/frontend/public/brain.png index bfef7c0..7765c94 100644 Binary files a/frontend/public/brain.png and b/frontend/public/brain.png differ diff --git a/frontend/src/app/portfolio/page.tsx b/frontend/src/app/portfolio/page.tsx index 04479ce..d4b4e8a 100644 --- a/frontend/src/app/portfolio/page.tsx +++ b/frontend/src/app/portfolio/page.tsx @@ -2,6 +2,11 @@ import { MapPin, Code, Briefcase, Download } from "lucide-react"; import { headers } from "next/headers"; import { Icon } from "@iconify/react"; import Link from "next/link"; +import { + Tooltip, + TooltipContent, + TooltipTrigger, +} from "@/components/ui/tooltip"; export default async function Portfolio() { // const headersList = await headers(); @@ -92,6 +97,14 @@ export default async function Portfolio() { }, }; + const featuredProjects = [ + { + name: "Semaphore Chat", + link: "https://semaphore.chat", + summary: `The is a chat application that offers a streamlined, no-nonsense AI chat experience. It provides access to multiple large language models (LLMs) from various vendors. Key features include markdown rendering of AI outputs, syntax highlighting for code, and the ability to display Mermaid.js diagrams on a canvas. The app supports real-time synchronization and resumable streams using Zero (sync engine), enabling users to share links, and allows for collaborative use of LLMs with peers. Authentication is handled via Google OAuth, the database is Postgres, frontend is in NextJS, self-hosted on an Hetzner server`, + }, + ]; + const workExperience = [ { company: "Grapevine", @@ -145,6 +158,32 @@ export default async function Portfolio() { }, ]; + const socials = [ + { + icon: "pajamas:mail", + link: "mailto:shenoy.ameya@gmail.com", + hoverText: "Shoot me an email!", + }, + + { + icon: "pajamas:linkedin", + link: "https://linkedin.com/in/codingcoffee", + hoverText: "Let's connect on LinkedIn", + }, + + { + icon: "pajamas:github", + link: "https://github.com/codingcoffee", + hoverText: "Checkout my opensource repos at GitHub", + }, + + { + icon: "pajamas:twitter", + link: "https://x.com/codingcoffeeX", + hoverText: "Follow me on X!", + }, + ]; + return (
@@ -183,10 +222,30 @@ export default async function Portfolio() {
- Engineering lead with 8+ years of expertise in designing scalable - system architecture, leading high performing teams, and delivering - ai driven solutions while also maintaining the role of an individual - contributor. +
+ Engineering lead with 8+ years of expertise in designing scalable + system architecture, leading high performing teams, and delivering + ai driven solutions while also maintaining the role of an + individual contributor. +
+
+ {socials.map((social, _) => ( + + + + + + + +

{social.hoverText}

+
+
+ ))} +
@@ -211,6 +270,28 @@ export default async function Portfolio() {
))} + +
+
Featured Projects
+ {featuredProjects.map((project, index) => ( +
+
+ +

{project.name}

+ +
+

+ {project.summary} +

+
+ ))} +
+
Key Skills
@@ -225,7 +306,10 @@ export default async function Portfolio() { key={language} className="flex items-center px-3 py-1 rounded-full gap-2" > - {" "} + {" "} {language} ))} diff --git a/frontend/src/components/Navbar.tsx b/frontend/src/components/Navbar.tsx index c6c7743..0562bd5 100644 --- a/frontend/src/components/Navbar.tsx +++ b/frontend/src/components/Navbar.tsx @@ -45,7 +45,7 @@ export function NavigationMenu() { variant="ghost" className={`${pathname === "/portfolio" ? "text-red-500" : ""} text-xl`} > -
Portfolio
+
Work
diff --git a/frontend/src/components/ui/tooltip.tsx b/frontend/src/components/ui/tooltip.tsx new file mode 100644 index 0000000..4ee26b3 --- /dev/null +++ b/frontend/src/components/ui/tooltip.tsx @@ -0,0 +1,61 @@ +"use client" + +import * as React from "react" +import * as TooltipPrimitive from "@radix-ui/react-tooltip" + +import { cn } from "@/lib/utils" + +function TooltipProvider({ + delayDuration = 0, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function Tooltip({ + ...props +}: React.ComponentProps) { + return ( + + + + ) +} + +function TooltipTrigger({ + ...props +}: React.ComponentProps) { + return +} + +function TooltipContent({ + className, + sideOffset = 0, + children, + ...props +}: React.ComponentProps) { + return ( + + + {children} + + + + ) +} + +export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }