diff --git a/src/components/Header.tsx b/src/components/Header.tsx
index 5e685e3..e2e28b3 100644
--- a/src/components/Header.tsx
+++ b/src/components/Header.tsx
@@ -1,23 +1,23 @@
import React from "react";
import { CustomLink } from "./CustomLink";
-import { InternalRoutes } from "@/utils/constants";
+import { HomePageSections } from "@/utils/constants";
const NavLinks = [
{
name: "Journey",
- url: InternalRoutes.journey,
+ url: `/#${HomePageSections.journey}`,
},
{
name: "Missions",
- url: InternalRoutes.missions,
+ url: `/#${HomePageSections.missions}`,
},
{
name: "Arsenal",
- url: InternalRoutes.arsenal,
+ url: `/#${HomePageSections.arsenal}`,
},
{
- name: "Batlog",
- url: InternalRoutes.blog,
+ name: "Unmasked",
+ url: `/#${HomePageSections.about}`,
},
];
diff --git a/src/lib/tsparticles.ts b/src/lib/tsparticles.ts
index 4d791ab..0470f59 100644
--- a/src/lib/tsparticles.ts
+++ b/src/lib/tsparticles.ts
@@ -1,197 +1,198 @@
import { IOptions, RecursivePartial } from "@tsparticles/engine";
-export const batLogoOptions: RecursivePartial = {
- autoPlay: true,
- clear: true,
- delay: 0,
- detectRetina: true,
- duration: 0,
- fpsLimit: 120,
- fullScreen: false,
- interactivity: {
- detectsOn: "window",
- events: {
- onHover: {
- enable: true,
- mode: "bubble",
- parallax: {
- enable: false,
- force: 2,
- smooth: 10,
+export const getBatLogoOptions = (
+ disableMotion?: boolean,
+): RecursivePartial => {
+ return {
+ autoPlay: true,
+ clear: true,
+ delay: 0,
+ detectRetina: true,
+ duration: 0,
+ fpsLimit: 120,
+ fullScreen: false,
+ interactivity: {
+ detectsOn: "window",
+ events: {
+ onHover: {
+ enable: true,
+ mode: "bubble",
+ },
+ resize: {
+ delay: 0.5,
+ enable: true,
},
},
- resize: {
- delay: 0.5,
- enable: true,
- },
- },
- modes: {
- bubble: {
- distance: 40,
- duration: 2,
- mix: false,
- opacity: 2,
- size: 3,
- divs: {
- distance: 200,
- duration: 0.4,
+ modes: {
+ bubble: {
+ distance: 40,
+ duration: 2,
mix: false,
- selectors: {},
+ opacity: 2,
+ size: 3,
+ divs: {
+ distance: 200,
+ duration: 0.4,
+ mix: false,
+ selectors: {},
+ },
},
},
},
- },
- particles: {
- color: {
- value: "#ffffff",
- },
- move: {
- angle: {
- offset: 0,
- value: 90,
+ particles: {
+ color: {
+ value: "#ffffff",
},
- center: {
- x: 50,
- y: 50,
- mode: "percent",
- radius: 0,
+ move: {
+ angle: {
+ offset: 0,
+ value: 90,
+ },
+ center: {
+ x: 50,
+ y: 50,
+ mode: "percent",
+ radius: 0,
+ },
+ decay: 0,
+ direction: "none",
+ drift: 0,
+ enable: !disableMotion,
+ outModes: {
+ default: "bounce",
+ bottom: "bounce",
+ left: "bounce",
+ right: "bounce",
+ top: "bounce",
+ },
+ random: true,
+ size: false,
+ speed: 0.55,
},
- decay: 0,
- direction: "none",
- drift: 0,
- enable: true,
- outModes: {
- default: "bounce",
- bottom: "bounce",
- left: "bounce",
- right: "bounce",
- top: "bounce",
+ number: {
+ limit: {
+ mode: "delete",
+ value: 0,
+ },
+ value: 400,
},
- random: true,
- size: false,
- speed: 0.55,
- },
- number: {
- limit: {
- mode: "delete",
- value: 0,
+ opacity: {
+ value: {
+ min: 0.05,
+ max: 0.5,
+ },
+ animation: {
+ count: 0,
+ enable: true,
+ speed: 2,
+ decay: 0,
+ delay: 0,
+ sync: false,
+ mode: "auto",
+ startValue: "random",
+ destroy: "none",
+ },
},
- value: 400,
- },
- opacity: {
- value: {
- min: 0.05,
- max: 0.5,
+ reduceDuplicates: false,
+ shape: {
+ close: true,
+ fill: true,
+ options: {},
+ type: "circle",
},
- animation: {
- count: 0,
- enable: true,
- speed: 2,
- decay: 0,
- delay: 0,
- sync: false,
- mode: "auto",
- startValue: "random",
- destroy: "none",
- },
- },
- reduceDuplicates: false,
- shape: {
- close: true,
- fill: true,
- options: {},
- type: "circle",
- },
- size: {
- value: 1,
- },
- links: {
- blink: false,
- color: {
- value: "#ffffff",
+ size: {
+ value: 1,
},
- consent: false,
- distance: 30,
- enable: true,
- frequency: 1,
- opacity: 0.5,
- width: 1,
- warp: false,
- },
- },
- pauseOnBlur: true,
- pauseOnOutsideViewport: true,
- smooth: true,
- zLayers: 100,
- key: "polygonMask",
- name: "Polygon Mask",
- motion: {
- disable: false,
- reduce: {
- factor: 4,
- value: true,
- },
- },
- polygon: {
- draw: {
- enable: true,
- stroke: {
+ links: {
+ blink: false,
color: {
value: "#ffffff",
},
+ consent: false,
+ distance: 30,
+ enable: true,
+ frequency: 1,
+ opacity: 0.5,
width: 1,
- opacity: 0.2,
+ warp: false,
},
},
- enable: true,
- inline: {
- arrangement: "equidistant",
- },
- move: {
- radius: 5,
- type: "path",
- },
- scale: 1,
- type: "inline",
- url: "/images/misc/batlogo.svg",
- position: {
- x: 50,
- y: 50,
+ pauseOnBlur: true,
+ pauseOnOutsideViewport: true,
+ smooth: true,
+ zLayers: 100,
+ key: "polygonMask",
+ name: "Polygon Mask",
+ motion: {
+ disable: false,
+ reduce: {
+ factor: 4,
+ value: true,
+ },
},
- },
- responsive: [
- {
- maxWidth: 640,
- mode: "screen",
- options: {
- particles: {
- number: {
- value: 150,
+ polygon: {
+ draw: {
+ enable: true,
+ stroke: {
+ color: {
+ value: "#ffffff",
},
+ width: 1,
+ opacity: 0.2,
},
- polygon: {
- scale: 0.425,
- },
+ },
+ enable: true,
+ inline: {
+ arrangement: "equidistant",
+ },
+ move: {
+ radius: 5,
+ type: "path",
+ },
+ scale: 1,
+ type: "inline",
+ url: "/images/misc/batlogo.svg",
+ position: {
+ x: 50,
+ y: 50,
},
},
- {
- maxWidth: 1800,
- mode: "screen",
- options: {
- particles: {
- number: {
- value: 380,
+ responsive: [
+ {
+ maxWidth: 640,
+ mode: "screen",
+ options: {
+ particles: {
+ number: {
+ value: 150,
+ },
+ },
+ polygon: {
+ scale: 0.425,
},
},
- polygon: {
- scale: 0.8,
+ },
+ {
+ maxWidth: 1800,
+ mode: "screen",
+ options: {
+ particles: {
+ number: {
+ value: 380,
+ },
+ },
+ polygon: {
+ scale: 0.8,
+ },
},
},
- },
- ],
+ ],
+ };
};
-export const nightSkyOptions: RecursivePartial = {
+export const getNightSkyOptions = (
+ disableMotion?: boolean,
+): RecursivePartial => ({
autoPlay: true,
clear: true,
delay: 0,
@@ -272,7 +273,7 @@ export const nightSkyOptions: RecursivePartial = {
distance: {},
direction: "none",
drift: 0,
- enable: true,
+ enable: !disableMotion,
outModes: {
default: "out",
bottom: "out",
@@ -377,4 +378,4 @@ export const nightSkyOptions: RecursivePartial = {
value: true,
},
},
-};
+});
diff --git a/src/utils/constants.ts b/src/utils/constants.ts
index f2c5bf2..50116dc 100644
--- a/src/utils/constants.ts
+++ b/src/utils/constants.ts
@@ -16,12 +16,13 @@ export const ExternalLinks = {
phone: "tel:+918921404559",
meeting: "https://cal.com/arjunvc/15min",
resume: "",
+ vicara: "https://www.vicara.co/",
};
-export const InternalRoutes = {
- blog: "/blog",
- journey: "/#journey",
- arsenal: "/#arsenal",
- missions: "/#missions",
- home: "/#main",
-};
+export const HomePageSections = {
+ main: "main",
+ journey: "journey",
+ arsenal: "arsenal",
+ missions: "missions",
+ about: "about",
+} as const;
diff --git a/src/utils/experiences.tsx b/src/utils/experiences.tsx
new file mode 100644
index 0000000..25dd241
--- /dev/null
+++ b/src/utils/experiences.tsx
@@ -0,0 +1,67 @@
+import { CustomLink } from "@/components/CustomLink";
+import { ExternalLinks } from "./constants";
+export type Experience = {
+ title: string;
+ company: string;
+ date: string;
+ descriptions: string[];
+ image: string;
+ imageAlt: string;
+ imageLink: string;
+ companyLink: string;
+ subheading: React.ReactNode;
+};
+
+export const Experiences: Experience[] = [
+ {
+ title: "Frontend Developer",
+ company: "VICARA",
+ date: "Feb 2022 to Jun 2023",
+ descriptions: [
+ "I modernized the frontend by migrating from Material UI to a custom SCSS library, improving visual consistency and maintainability. I prioritized developer experience through TypeScript and efficient CI/CD pipelines. I developed key features like a drag-and-drop pipeline builder and an in-app code editor, and revamped the landing page in Next.js for enhanced performance and SEO. I also expanded my skillset by exploring WebGL and 3D rendering with Three.js, backend development with Rust, and automating tasks with Cypress.",
+ ],
+ image: "/images/orgs/patr.webp",
+ imageAlt: "Patr - Deploy your app in 60 seconds",
+ companyLink: ExternalLinks.vicara,
+ imageLink: ExternalLinks.patr,
+ subheading: (
+ <>
+ At Vicara, I led frontend development for
+
+ Patr
+
+ ,
modernizing its architecture.
+ >
+ ),
+ },
+ {
+ title: "Founding Engineer",
+ company: "FINDR",
+ date: "Jul 2023 to Present",
+ companyLink: ExternalLinks.findr,
+ imageLink: ExternalLinks.findr,
+ descriptions: [
+ "I spearheaded the development of the entire frontend, including a Tauri-based desktop application prototype. I established a robust self-hosting infrastructure with Docker, Github Actions and AWS, optimized performance with custom solutions for image compression and icon loading, and significantly improved SEO through programmatic page generation. I also contributed to the backend using Python FastAPI and developed a Chrome extension that boosted user retention. I consistently explored emerging technologies, including LLM models, LangChain.js, and WebGPU.",
+ ],
+ image: "/images/orgs/findr.webp",
+ imageAlt: "Findr - Your AI second brain",
+ subheading: (
+ <>
+ At
+
+ Findr
+
+ , I led full-stack development, building the entire frontend and
+ contributing to the Python FastAPI backend.
+ >
+ ),
+ },
+];
diff --git a/tailwind.config.ts b/tailwind.config.ts
index 8780d3f..fe9a7ac 100644
--- a/tailwind.config.ts
+++ b/tailwind.config.ts
@@ -16,18 +16,18 @@ export default {
},
fontFamily: {
"bebas-neue": "var(--font-bebas-neue), sans-serif",
- inter: "var(--font-inter), sans-serif",
+ "rethink-sans": "var(--font-rethink-sans), sans-serif",
},
colors: {
surface: "#0A0A0A",
primary: "#ffffff",
secondary: "#b3b3b3",
- tertiary: "#828282",
+ tertiary: "#969696",
stroke: "#555555",
transparent: "transparent",
},
fontSize: {
- xs: "0.875rem",
+ xs: "0.895rem",
sm: "0.925rem",
base: "1rem",
lg: "1.125rem",