Portfolio Website
- Aim
- Design Phase
- Routes
- Styling
- Data
Aim
The aim of this project was to build a personal website that could display my projects and resume.
Design Phase
Remix was used to build the portfolio website and Netlify was used for hosting. The Remix template from Netlify automatically created everything needed to deploy to Netlify — including a pre-configured netlify.toml file with typical build settings. For more information visit the documentation on Netlify.
Routes
The route structure for this website follows the "conventional route folders" pattern as specified in the Remix documentation:
app/
├── routes/
│ ├── _index/
│ │ ├── LinkTile.tsx
│ │ └── Modal.tsx
│ │ └── route.tsx
│ ├── about/
│ │ └── route.tsx
│ ├── contact/
│ │ └── route.tsx
│ ├── projects.$projectId/
│ │ └── route.tsx
└── root.tsx
Root
The root route contains the Header and Footer componants. Between these two is Remix's Outlet component.
Index
The index route contains a brief introduction about myself, links to three of my projects, and a link for my resume.
About
The about route contains more detailed information about myself and my career.
Contact
The contact route contains information on how to get in touch with me. It has a build in email request form.
Styling
Styling is done with plain css. All css files are organised within a single folder called "styles".
app/
├── routes/
├── styles/
Within this folder there is a filed called "shared.css" which is imported in the root.tsx. The shared css file contains global styles for all parts of the website. If a route contains one or more components a folder named after the route will contain all css files for that route. Otherwise the route css file will not be located in a folder. This is demonstrated in the diagram below.
app/
├── styles/
│ ├── _index/
│ │ ├── index.css
│ │ ├── LinkTile.css
│ ├── about/
│ │ └── route.tsx
│ ├── contact/
│ │ └── route.tsx
│ ├── projects.$projectId/
│ │ └── route.tsx
└── root.tsx
Data
The data for the project component comes from github. Each project has a markdown file wich is imported using "loader" and "useLoaderData" Remix API's.