Skip to content
Draft

V2 #1

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
90 commits
Select commit Hold shift + click to select a range
c9dc7ca
Update all dependencies and switch to pnpm
agarun Mar 25, 2025
7423e2a
Update README.md
agarun Mar 26, 2025
01534f2
Update icons and titles
agarun Mar 26, 2025
8a4b123
Update robots.txt
agarun Mar 26, 2025
b52598e
Update styles
agarun Mar 27, 2025
efbb51d
Update styles
agarun Mar 27, 2025
c33877d
Update projects
agarun Mar 27, 2025
130a983
Update link styles
agarun Mar 27, 2025
8efc93d
Add icons
agarun Mar 27, 2025
9222f1d
Remove old files
agarun Mar 29, 2025
effa981
Add buttons
agarun Mar 29, 2025
ebc2673
Update contact page
agarun Mar 29, 2025
59ebc69
Add colors
agarun Mar 29, 2025
f161f7d
Update projects
agarun Mar 29, 2025
dcc3803
Update posts
agarun Mar 31, 2025
143e563
Create highlights section on about page
agarun Mar 31, 2025
1471038
Update icons
agarun Mar 31, 2025
6a26003
Add assets
agarun Mar 31, 2025
7034a3c
Update contact page
agarun Apr 1, 2025
8487ffb
Fix styles
agarun Apr 1, 2025
70db3c5
Upgrade Next.js
agarun Apr 1, 2025
6250965
Create vitest config
agarun Apr 3, 2025
7d10293
Fix tests
agarun Apr 3, 2025
2804629
Create posts page animation
agarun Apr 3, 2025
edec532
Update avatar
agarun Apr 5, 2025
1daa242
Update projects
agarun Apr 6, 2025
e229029
Update assets
agarun Apr 6, 2025
9e95125
Update Nav
agarun Apr 6, 2025
422f35f
Update styles
agarun Apr 6, 2025
b66f2b4
Add projects and images
agarun Apr 10, 2025
6ddd544
Update articles
agarun Apr 12, 2025
1d70acb
Add project images
agarun Apr 19, 2025
4f77c3e
Add Q3P icon
agarun Apr 19, 2025
5c6597e
Update projects page
agarun Apr 19, 2025
806b9e3
Reverse order
agarun Apr 19, 2025
bf32fb3
Create logo hover animation
agarun Apr 20, 2025
10a1d57
Update .gitignore
agarun Apr 20, 2025
cf274ed
Update projects
agarun Apr 20, 2025
6a79ece
Update styles
agarun Apr 20, 2025
6630536
Update styles
agarun Apr 21, 2025
b16a621
Update copy
agarun Apr 23, 2025
a9cb2a7
Add mobile styles
agarun Apr 23, 2025
8dcdf8b
Update copy
agarun Apr 23, 2025
1996914
Update styles
agarun Apr 24, 2025
7110fa5
Add icons
agarun Apr 24, 2025
d66d50c
Add icon grid to footer
agarun Apr 24, 2025
7d6ab5a
Add keylines
agarun Apr 24, 2025
8d53586
Update README.md
agarun Apr 25, 2025
f68ec34
Update styles
agarun Apr 25, 2025
eccd307
Update projects
agarun Apr 25, 2025
667e8f9
Create Canvas
agarun Apr 25, 2025
68fbc05
Create end-to-end testing setup
agarun Apr 25, 2025
6774c88
Convert Cypress tests to Playwright
agarun Apr 25, 2025
b854862
Fix build
agarun Apr 25, 2025
3e7f77d
Update copy
agarun Apr 26, 2025
d4dfaf0
Update homepage
agarun Apr 26, 2025
6702ffe
Fix relative paths
agarun Apr 26, 2025
100f6c5
Update 404 page
agarun Apr 26, 2025
8552332
Fix default theme
agarun Apr 26, 2025
0441f7b
Add artifical delay
agarun Apr 26, 2025
14ec231
Update styles
agarun Apr 28, 2025
e12138d
Update copy
agarun Apr 28, 2025
6e813b5
Add mobile styles
agarun Apr 28, 2025
c534df2
Fix mobile styles
agarun Apr 28, 2025
1291dec
Update styles
agarun May 2, 2025
53998a6
Add ASCII
agarun May 2, 2025
937b909
Update files
agarun Jul 18, 2025
bdd4f17
Update styles
agarun Jul 18, 2025
0aaf4e6
Add corepack
agarun Jul 18, 2025
1fcfee1
Add alt text to all project images
agarun Jul 18, 2025
596eab5
Refactor styles
agarun Jul 20, 2025
846da6e
Update dark mode colors
agarun Jul 20, 2025
7bbd49b
Update files
agarun Aug 29, 2025
0196fe0
Update styles
agarun Aug 29, 2025
c50af88
Update files
agarun Aug 29, 2025
df088f0
Update styles and CSS variables
agarun Aug 29, 2025
2505473
Update socials
agarun Aug 29, 2025
05f9f0a
Add tap interaction to frontpage canvas
agarun Aug 29, 2025
11efb0c
Update socials
agarun Aug 29, 2025
a6afb40
Add scroll container with fade and blur effects
agarun Aug 29, 2025
1af9b23
Update styles
agarun Aug 30, 2025
73e85f3
Add mobile styles
agarun Aug 30, 2025
5acfdc5
Update copy
agarun Aug 30, 2025
23697ce
Create initial loading animation
agarun Aug 30, 2025
857b261
Update colors
agarun Aug 30, 2025
7a33246
Remove log
agarun Aug 30, 2025
be42f38
Use CSS variables
agarun Aug 31, 2025
5384f3f
Fix tests
agarun Aug 31, 2025
ece7a32
Update files
agarun Sep 3, 2025
0a02003
Update files
agarun Jan 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .eslintrc.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"react-app",
"eslint:recommended",
"plugin:prettier/recommended",
"plugin:cypress/recommended",
"plugin:playwright/recommended",
"next/core-web-vitals"
]
}
7 changes: 7 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -35,3 +35,10 @@ yarn-error.log*

# Lighthouse
*.report.html

# Playwright
node_modules/
/test-results/
/playwright-report/
/blob-report/
/playwright/.cache/
97 changes: 64 additions & 33 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,74 +1,105 @@
# [agarun.com](agarun.com)

My personal website where I host my portfolio, contact information, and blog posts. It's always a work in progress, but feel free to look around.
My personal website where I host my portfolio, contact info, and writing. It's always a work in progress, but feel free to look around.

## Getting Started

The prerequisites are Yarn and Node >= 14.
First, setup [pnpm](https://pnpm.io/) and [Node](https://nodejs.org/en/download) >= 20.

First, install the dependencies:
Next, install the dependencies:

```bash
yarn install
pnpm install
```

Run the development server:

```bash
npm run dev
# or
yarn dev
pnpm dev
```

Open [http://localhost:3000](http://localhost:3000) with your browser to see the app.
Visit [http://localhost:3000](http://localhost:3000) to see the site.

## Preview 🚀
## Preview Build

To build the site:
To export the site for production and preview it locally:

```bash
yarn build
pnpm site
```

Then, to serve it locally:
## Tech Stack

### Codebase

This project uses [React](https://react.dev/) and [Next.js](https://nextjs.org/)

```bash
yarn start
.
├── components
│ ├── …
│ ├── Icon
│ ├── Link
│ ├── Nav
│ ├── Layout
│ ├── PostLayout
│ └── ProjectLayout
├── pages
│ ├── …
│ ├── posts
│ └── projects
├── lib
├── posts
├── projects
├── public
├── styles
└── tests
├── …
└── e2e
└── …
```

## Technologies 🧰
### Hosting

Hosted with [Netlify](https://www.netlify.com/). Built with React and [Next.js](https://nextjs.org/).
- [Netlify](https://www.netlify.com/)

### Tooling

- [ESLint](https://eslint.org/)
- The ESLint config (`.eslintrc.json`) extends the `create-react-app` config, Next.js config, and includes a few plugins
- [Prettier](https://prettier.io/)
- [Husky](https://github.com/typicode/husky)
- Pre-commit hooks that run tools like ESLint & Prettier on modified files via `lint-staged`
- [Lighthouse](https://github.com/GoogleChrome/lighthouse) to collect performance metrics about webpages
- I use this locally and [on Netlify](https://www.netlify.com/blog/2021/03/26/netlify-build-plugin-of-the-week-lighthouse/), in addition to [web.dev/measure](https://web.dev/measure/)
- [ESLint](https://eslint.org/): linting
- [Prettier](https://prettier.io/): formatting
- [Husky](https://github.com/typicode/husky): pre-commit hooks that run on modified files using `lint-staged`
- [Lighthouse](https://github.com/GoogleChrome/lighthouse) to collect performance metrics

> You can use Lighthouse locally and [on Netlify](https://www.netlify.com/blog/2021/03/26/netlify-build-plugin-of-the-week-lighthouse/), in addition to PageSpeed ([web.dev/measure](https://web.dev/measure/)).

### Styling

- Color modes and theming tokens are implemented with CSS variables (custom properties)
- [Josh Comeau's dark mode guide](https://www.joshwcomeau.com/react/dark-mode/), [Theme UI](https://theme-ui.com/), [useDarkMode](https://github.com/donavon/use-dark-mode) were really useful resources to avoid FOUC.
- [Emotion](https://github.com/emotion-js/emotion) for writing style modules with JavaScript
- [Framer Motion](https://www.framer.com/motion/) for creating animated components
- **Theming**: color mode support and theming tokens are implemented with CSS variables
- **CSS**: [Emotion](https://github.com/emotion-js/emotion) CSS prop in addition to regular stylesheets
- **Animations**: [Framer Motion](https://www.framer.com/motion/)
- **Shaders**: [Paper](https://github.com/paper-design/shaders)

> Josh Comeau's [dark mode guide](https://www.joshwcomeau.com/react/dark-mode/), [Theme UI](https://theme-ui.com/), [Tailwind](https://github.com/tailwindlabs/tailwindcss/blob/c45616ff915c4bddb551f92f4c651ca76c4448ea/packages/tailwindcss/src/compat/dark-mode.ts#L4), and [useDarkMode](https://github.com/donavon/use-dark-mode) were really useful resources to avoid flash of unstyled content (FOUC).

### Writing

- [https://github.com/unifiedjs/unified](Unified) libraries including remark & rehype to process HTML and markdown
- [MDX](https://mdxjs.com/) to use React components (like `next/image`, or custom ones) in Markdown files. I chose to use `next-mdx-remote` over `mdx-bundler` here.
- [Prism](https://github.com/PrismJS/prism) to theme code snippets (with `prism-theme-vars`!)
- [Custom theme](https://github.com/agarun/agarun.com/blob/main/styles/prism.css) based on [Night Owl by Sarah Drasner](https://marketplace.visualstudio.com/items?itemName=sdras.night-owl)
- [unified](https://github.com/unifiedjs/unified): libraries to process HTML and markdown content, including remark & rehype plugins
- [MDX](https://mdxjs.com/): use React components in Markdown files, using `next-mdx-remote` over `mdx-bundler`
- [Prism](https://github.com/PrismJS/prism): code syntax highlighting themes, using `prism-theme-vars`

> I use a [custom](https://github.com/agarun/agarun.com/blob/main/styles/prism.css) syntax highlighting theme based on the lovely [Night Owl by Sarah Drasner](https://marketplace.visualstudio.com/items?itemName=sdras.night-owl) theme.

### Testing

- [Jest](https://jestjs.io/) and [React Testing Library](https://testing-library.com/docs/react-testing-library/intro/) for unit and integration tests
- [Cypress](https://www.cypress.io/) for integration and end-to-end tests
- [Vitest](https://vitest.dev/) and [React Testing Library](https://testing-library.com/docs/react-testing-library/intro/) for unit and integration tests
- [Playwright](https://playwright.dev/) for end-to-end tests

### Colophon

- [Inter](https://rsms.me/inter/): sans-serif (website)
- [TASA Orbiter](https://uncut.wtf/sans-serif/tasa-orbiter/): sans-serif (resume)
- [Cousine](https://fonts.google.com/specimen/Cousine): monospace

### Misc.
## History

This is the third iteration of `agarun.com`. The first one was made with [Jekyll](https://jekyllrb.com/), and the second with [Gatsby](https://www.gatsbyjs.com/).
117 changes: 117 additions & 0 deletions components/AnimateArrowRight.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
import { motion } from 'motion/react';
import useColorMode from '../lib/hooks/useColorMode';

const hoverColor = 'var(--colors-black)';

export function AnimateArrowRight({ isHovering }) {
const { colorMode } = useColorMode();
const defaultColor = colorMode === 'dark' ? '#696d72' : '#d1d5db';

return (
<div
style={{
flexGrow: 1,
display: 'flex',
justifyContent: 'flex-end',
alignItems: 'center',
}}
>
<svg
width="300"
height="20"
viewBox="0 0 177 20"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<motion.path
d="M0 10 H177"
stroke={defaultColor}
strokeWidth="2"
strokeDasharray="16 20"
strokeLinecap="round"
strokeLinejoin="round"
initial={{ opacity: 0, clipPath: 'inset(0% 0% 0% 0%)' }}
animate={{ opacity: 1, clipPath: 'inset(0% 0% 0% 100%)' }}
transition={{
clipPath: {
duration: 1,
},
}}
style={{
transform: 'translateY(2px)',
}}
/>
<motion.path
stroke={defaultColor}
d="M5 12h24 M22 5l7 7-7 7"
strokeWidth="2"
strokeLinecap="round"
strokeLinejoin="round"
initial={{ opacity: 0, clipPath: 'inset(0% 0% 0% 0%)' }}
animate={{ opacity: 1, clipPath: 'inset(0% 0% 0% 100%)' }}
transition={{
clipPath: {
delay: 1,
},
}}
style={{
transform: 'translateX(177px)',
}}
/>

<motion.path
d="M0 10 H177"
stroke={hoverColor}
strokeWidth="2"
strokeDasharray="8 10"
strokeLinecap="round"
strokeLinejoin="round"
initial={{
pathLength: 0,
pathOffset: 0,
}}
animate={{
pathLength: 0.3,
pathOffset: 1,
}}
transition={{
duration: 1,
}}
style={{
transform: 'translateY(2px)',
}}
/>
<motion.path
d="M5 12h24 M22 5l7 7-7 7"
strokeWidth="2"
strokeLinecap="round"
strokeLinejoin="round"
fill="none"
initial={{ stroke: defaultColor, clipPath: 'inset(0% 100% 0% 0%)' }}
animate={{
stroke: isHovering ? hoverColor : defaultColor,
clipPath: 'inset(0% 0% 0% 0%)',
translateX: [177, 177 + 6, 177],
}}
transition={{
delay: isHovering ? 0.6 : 0,
type: 'spring',
stiffness: 100,
damping: 20,
translateX: {
delay: 1.33,
duration: 0.75,
repeat: Infinity,
repeatDelay: 0.75,
},
}}
style={{
transform: 'translateX(177px)',
}}
/>
</svg>
</div>
);
}

export default AnimateArrowRight;
Loading