From eea8da76b367c64cc86a065a6684c59ad4242878 Mon Sep 17 00:00:00 2001 From: Oliver Bryan <65399431+hex248@users.noreply.github.com> Date: Thu, 5 Feb 2026 14:21:38 +0000 Subject: [PATCH 01/18] Update README.md --- README.md | 73 +++---------------------------------------------------- 1 file changed, 3 insertions(+), 70 deletions(-) diff --git a/README.md b/README.md index d2e77611..5cadf0eb 100644 --- a/README.md +++ b/README.md @@ -1,73 +1,6 @@ -# React + TypeScript + Vite + -This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. +# ob248 - Developer portfolio site -Currently, two official plugins are available: +[ob248.com](https://ob248.com) -- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) (or [oxc](https://oxc.rs) when used in [rolldown-vite](https://vite.dev/guide/rolldown)) for Fast Refresh -- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh - -## React Compiler - -The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation). - -## Expanding the ESLint configuration - -If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules: - -```js -export default defineConfig([ - globalIgnores(['dist']), - { - files: ['**/*.{ts,tsx}'], - extends: [ - // Other configs... - - // Remove tseslint.configs.recommended and replace with this - tseslint.configs.recommendedTypeChecked, - // Alternatively, use this for stricter rules - tseslint.configs.strictTypeChecked, - // Optionally, add this for stylistic rules - tseslint.configs.stylisticTypeChecked, - - // Other configs... - ], - languageOptions: { - parserOptions: { - project: ['./tsconfig.node.json', './tsconfig.app.json'], - tsconfigRootDir: import.meta.dirname, - }, - // other options... - }, - }, -]) -``` - -You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules: - -```js -// eslint.config.js -import reactX from 'eslint-plugin-react-x' -import reactDom from 'eslint-plugin-react-dom' - -export default defineConfig([ - globalIgnores(['dist']), - { - files: ['**/*.{ts,tsx}'], - extends: [ - // Other configs... - // Enable lint rules for React - reactX.configs['recommended-typescript'], - // Enable lint rules for React DOM - reactDom.configs.recommended, - ], - languageOptions: { - parserOptions: { - project: ['./tsconfig.node.json', './tsconfig.app.json'], - tsconfigRootDir: import.meta.dirname, - }, - // other options... - }, - }, -]) -``` From 8c7ff54d37d120957881321f395bfaeb5e49f304 Mon Sep 17 00:00:00 2001 From: Oliver Bryan Date: Thu, 5 Feb 2026 14:25:09 +0000 Subject: [PATCH 02/18] enabled ascii --- src/App.tsx | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 0533adf4..938f1f8f 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,13 +1,12 @@ -import { useEffect, useState } from "react"; -import { Link, Route, Routes, useParams } from "react-router-dom"; import { ProjectListItem } from "@/components/ProjectListItem"; import { type ProjectEntry, projectList, projects } from "@/projects"; +import { useEffect, useState } from "react"; +import { Link, Route, Routes, useParams } from "react-router-dom"; import { ThemeToggle } from "./components/theme-toggle"; const asciiFiles = [ "cat-sleep.txt", - "polar-bear.txt", - "sleep-cat-ascii-art.txt", + // "polar-bear.txt", ]; function App() { @@ -49,11 +48,11 @@ function Home() { return (
- {/* {asciiArt ? ( + {asciiArt ? (
 						{asciiArt}
 					
- ) : null} */} + ) : null}

Oliver Bryan

From 3fe28a1ca370486f5acd0922b406590611536de8 Mon Sep 17 00:00:00 2001 From: Oliver Bryan Date: Thu, 5 Feb 2026 15:13:13 +0000 Subject: [PATCH 03/18] simplified ascii --- public/ascii/cat-sleep.txt | 38 +++++++++++++-------------- public/ascii/polar-bear.txt | 52 ++++++++++++++++++------------------- 2 files changed, 45 insertions(+), 45 deletions(-) diff --git a/public/ascii/cat-sleep.txt b/public/ascii/cat-sleep.txt index a8256888..16cbaf24 100644 --- a/public/ascii/cat-sleep.txt +++ b/public/ascii/cat-sleep.txt @@ -1,19 +1,19 @@ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⠓⠚⠒⢲⣶⠄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣴⠟⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣾⠟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⣤⣴⣶⣶⣶⣶⣶⣶⣶⣤⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠙⠛⠓⠂⠀⠀⠀⠀⠀⠀⣠⣶⠿⠛⠉⠁⠀⠀⠀⠀⠀⠀⠀⠉⠙⠻⢿⣶⣤⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⠿⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⠻⣷⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⣉⣿⡷⠀⠀⠀⠀⠀⠀⠀⣀⣶⠟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣷⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣴⡾⠛⠉⠀⠀⠀⠀⠀⠀⠀⣴⡟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⣿⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠙⠓⠶⠀⠀⠀⠀⠀⢀⣾⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⣿⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣾⠃⠀⣀⣀⣤⣤⣀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠸⣿⣤⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠠⠴⣶⡆⠀⠀⠀⠀⠀⣀⣼⠿⠛⠋⠉⠁⠀⠀⠀⠉⠙⠷⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢻⣯⠙⠷⣤⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⡿⠀⠀⠀⠀⣠⡾⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⠀⠀⠈⠻⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠻⠿⠛⠀⢠⣾⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣸⡿⠀⠀⠀⠀⠘⣿⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣼⠇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣿⠇⠀⠀⠀⠀⠀⢸⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⡶⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣴⡿⠃⠀⠀⠀⠀⠀⠀⢸⣿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⡾⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣷⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣤⣾⠟⠉⠀⠀⠀⠀⠀⠀⠀⢀⣾⠏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣾⣋⣀⣀⣀⣠⣤⣤⠀⠀⠀⠀⠀⠀⠀⠀⢀⡀⠀⠀⠀⠀⠀⠀⣸⣿⠀⠀⠀⠀⠀⠀⠀⣀⣀⣤⣤⣶⠿⣿⡏⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⡿⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠉⠉⠉⠉⠉⠛⠲⢤⣄⣀⣀⣀⡀⠀⠀⠀⠙⢷⣄⡀⠀⠀⢠⣿⣧⣤⣤⣴⣶⠶⠟⠛⠋⠉⠁⠀⠀⠀⣿⡆⠀⠀⠀⠀⠀⠀⣀⣴⡾⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠉⠉⠙⠛⠛⠛⠛⠉⠻⣦⣤⡿⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⢦⣄⣀⣤⣴⠾⠛⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ \ No newline at end of file +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⠓⠚⠒⢲⣶⠄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣴⠟⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣾⠟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⣤⣴⣶⣶⣶⣶⣶⣶⣶⣤⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠙⠛⠓⠂⠀⠀⠀⠀⠀⠀⣠⣶⠿⠛⠉⠁⠀⠀⠀⠀⠀⠀⠀⠉⠙⠻⢿⣶⣤⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⠿⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⠻⣷⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠈⠉⣉⣿⡷⠀⠀⠀⠀⠀⠀⠀⣀⣶⠟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣷⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⣴⡾⠛⠉⠀⠀⠀⠀⠀⠀⠀⣴⡟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⣿⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠉⠙⠓⠶⠀⠀⠀⠀⠀⢀⣾⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⣿⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣾⠃⠀⣀⣀⣤⣤⣀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠸⣿⣤⡀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠠⠴⣶⡆⠀⠀⠀⠀⠀⣀⣼⠿⠛⠋⠉⠁⠀⠀⠀⠉⠙⠷⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢻⣯⠙⠷⣤⡀⠀⠀⠀⠀ +⠀⠀⠀⢸⡿⠀⠀⠀⠀⣠⡾⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⠀⠀⠈⠻⣦⡀⠀⠀ +⠀⠀⠀⠻⠿⠛⠀⢠⣾⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣸⡿⠀⠀⠀⠀⠘⣿⡄⠀ +⠀⠀⠀⠀⠀⠀⢀⣼⠇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣿⠇⠀⠀⠀⠀⠀⢸⣿⠀ +⠀⠀⠀⠀⣠⡶⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣴⡿⠃⠀⠀⠀⠀⠀⠀⢸⣿⠁ +⠀⠀⣠⡾⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣷⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣤⣾⠟⠉⠀⠀⠀⠀⠀⠀⠀⢀⣾⠏⠀ +⢀⣾⣋⣀⣀⣀⣠⣤⣤⠀⠀⠀⠀⠀⠀⠀⠀⢀⡀⠀⠀⠀⠀⠀⠀⣸⣿⠀⠀⠀⠀⠀⠀⠀⣀⣀⣤⣤⣶⠿⣿⡏⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⡿⠋⠀⠀ +⠀⠉⠉⠉⠉⠉⠉⠛⠲⢤⣄⣀⣀⣀⡀⠀⠀⠀⠙⢷⣄⡀⠀⠀⢠⣿⣧⣤⣤⣴⣶⠶⠟⠛⠋⠉⠁⠀⠀⠀⣿⡆⠀⠀⠀⠀⠀⠀⣀⣴⡾⠋⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠉⠉⠙⠛⠛⠛⠛⠉⠻⣦⣤⡿⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⢦⣄⣀⣤⣴⠾⠛⠁⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ \ No newline at end of file diff --git a/public/ascii/polar-bear.txt b/public/ascii/polar-bear.txt index 0d1b0349..f0f553b9 100644 --- a/public/ascii/polar-bear.txt +++ b/public/ascii/polar-bear.txt @@ -1,26 +1,26 @@ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⣤⣤⠤⢤⣤⣤⣤⣄⣀⣀⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣴⡾⠋⠁⠀⠀⠀⠀⠀⠀⠀⠈⠉⠉⠉⠛⠻⠷⢶⣶⣤⣄⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⡴⠞⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠙⠻⢶⣤⣀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⠞⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠛⠿⣶⣤⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⡾⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⠻⣶⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⠏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣷⣤⠖⠚⢲⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⡏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⡶⠛⠓⢦⡀⠀⠀⠀⠀⠀⠀⠀⠘⢿⣆⠀⢀⡿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣾⠏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⣷⠀⠀⠀⠻⠀⠀⠀⠀⠀⠀⠀⠀⠀⠻⣾⠛⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⡿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠹⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣸⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠀⠀⠀⠀⠀⢀⣀⡀⠀⠀⠀⠀⡄⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡴⠋⠉⢻⡄⠀⠀⠀⠀⣿⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡼⠀⠀⠀⠀⠹⣆⠀⠀⠀⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢳⡄⠀⠀⣠⣤⣽⡆⠀⢸⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⠛⠲⠾⠿⠛⢀⣴⠟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢿⣇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⡿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡾⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣾⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠹⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣸⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠹⣷⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⠏⠀⠉⠛⡶⢦⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⡿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠹⣷⡀⠀⠀⠀⠀⠀⠀⠀⢀⡏⠀⠀⠀⣸⠃⠸⣆⠀⠀⠀⠀⠀⠀⠀⠀⠀⣇⠀⠀⠀⠀⠀⠀⠀⠀⢀⣿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⣷⣄⠀⠀⠀⠀⠀⠀⣾⠁⠀⠀⠀⡏⠀⠀⢹⡄⠀⠀⠀⠀⠀⠀⠀⠀⣿⠀⠀⠀⠀⠀⠀⠀⠀⣾⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⢷⣄⠀⠀⠀⠀⠹⣄⠀⢀⣀⣹⡀⠀⠀⢿⡀⠀⠀⠀⠀⠀⠀⠀⡿⠀⠀⠀⠀⠀⠀⠀⣸⠏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⠳⣦⡀⢀⣤⡽⠏⠉⠉⠀⠀⠀⠀⠈⢳⡄⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⠀⠀⣰⠏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢻⡀⠀⠀⠀⠀⠀⢧⡀⠀⠀⠀⠀⠠⣿⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠑⠶⠤⢤⣤⣀⣤⠷⠤⣤⣤⣀⣀⣬⡷⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠉⠀⠀⠀⠀⠀⠁⠁⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ \ No newline at end of file +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⣤⣤⠤⢤⣤⣤⣤⣄⣀⣀⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣴⡾⠋⠁⠀⠀⠀⠀⠀⠀⠀⠈⠉⠉⠉⠛⠻⠷⢶⣶⣤⣄⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⣠⡴⠞⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠙⠻⢶⣤⣀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⣠⠞⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠛⠿⣶⣤⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⢠⡾⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⠻⣶⣦⡀⠀⠀⠀⠀⠀ +⠀⠀⠀⣰⠏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣷⣤⠖⠚⢲⡄ +⠀⢀⣴⡏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⡶⠛⠓⢦⡀⠀⠀⠀⠀⠀⠀⠀⠘⢿⣆⠀⢀⡿ +⠀⣾⠏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⣷⠀⠀⠀⠻⠀⠀⠀⠀⠀⠀⠀⠀⠀⠻⣾⠛⠀ +⢸⡿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠹⣧⠀ +⣸⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠀⠀⠀⠀⠀⢀⣀⡀⠀⠀⠀⠀⡄⣿⡇ +⢿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡴⠋⠉⢻⡄⠀⠀⠀⠀⣿⠃ +⢸⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡼⠀⠀⠀⠀⠹⣆⠀⠀⠀⣿⠀ +⢸⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢳⡄⠀⠀⣠⣤⣽⡆⠀⢸⡇⠀ +⠀⣿⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⠛⠲⠾⠿⠛⢀⣴⠟⠀⠀ +⠀⢿⣇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⡿⠁⠀⠀⠀ +⠀⠈⢿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡾⠋⠀⠀⠀⠀⠀ +⠀⠀⠘⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣾⠃⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠹⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣸⡇⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠹⣷⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⠏⠀⠉⠛⡶⢦⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⡿⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠹⣷⡀⠀⠀⠀⠀⠀⠀⠀⢀⡏⠀⠀⠀⣸⠃⠸⣆⠀⠀⠀⠀⠀⠀⠀⠀⠀⣇⠀⠀⠀⠀⠀⠀⠀⠀⢀⣿⠁⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠙⣷⣄⠀⠀⠀⠀⠀⠀⣾⠁⠀⠀⠀⡏⠀⠀⢹⡄⠀⠀⠀⠀⠀⠀⠀⠀⣿⠀⠀⠀⠀⠀⠀⠀⠀⣾⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠈⠙⢷⣄⠀⠀⠀⠀⠹⣄⠀⢀⣀⣹⡀⠀⠀⢿⡀⠀⠀⠀⠀⠀⠀⠀⡿⠀⠀⠀⠀⠀⠀⠀⣸⠏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⠳⣦⡀⢀⣤⡽⠏⠉⠉⠀⠀⠀⠀⠈⢳⡄⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⠀⠀⣰⠏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢻⡀⠀⠀⠀⠀⠀⢧⡀⠀⠀⠀⠀⠠⣿⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠑⠶⠤⢤⣤⣀⣤⠷⠤⣤⣤⣀⣀⣬⡷⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠉⠀⠀⠀⠀⠀⠁⠁⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ \ No newline at end of file From a0a391fdc8c37d41c2ce90001d51ff6c9d16b553 Mon Sep 17 00:00:00 2001 From: Oliver Bryan Date: Thu, 5 Feb 2026 15:13:28 +0000 Subject: [PATCH 04/18] basteleur-bold --- src/App.tsx | 2 +- src/index.css | 21 +++++++++++++++++++-- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 938f1f8f..2bc45fa8 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -53,7 +53,7 @@ function Home() { {asciiArt} ) : null} -

Oliver Bryan

+

Oliver Bryan

{sortedProjects.map((project) => ( diff --git a/src/index.css b/src/index.css index af751c4d..7e32fa6f 100644 --- a/src/index.css +++ b/src/index.css @@ -1,6 +1,8 @@ @import url("https://fonts.ob248.com/commitmono"); @import url("https://fonts.ob248.com/ft88"); +@import url("https://fonts.ob248.com/ft88-gothique"); @import url("https://fonts.ob248.com/picnic"); +@import url("https://fonts.ob248.com/basteleur"); @import "tailwindcss"; @@ -149,7 +151,22 @@ body { font-weight: 200; } -.picnic { - font-family: "PicNic", serif; +.ft88-gothique { + font-family: "FT88 Gothique", serif; + font-weight: 200; +} + +.basteleur { + font-family: "Basteleur", serif; font-weight: 400; } + +.basteleur-bold { + font-family: "Basteleur", serif; + font-weight: 700; +} + +.picnic { + font-family: "PicNic", serif; + font-weight: 700; +} From 5e4a47feeaa2873fe130bc0a134ad6732828ead9 Mon Sep 17 00:00:00 2001 From: Oliver Bryan Date: Thu, 5 Feb 2026 15:31:54 +0000 Subject: [PATCH 05/18] new ascii --- public/ascii/cat-loaf.txt | 14 ++++++++++++++ public/ascii/cat-peek.txt | 27 +++++++++++++++++++++++++++ public/ascii/cat-shock.txt | 19 +++++++++++++++++++ public/ascii/exclamation.txt | 16 ++++++++++++++++ public/ascii/fat-cat-head.txt | 19 +++++++++++++++++++ public/ascii/grumpy-dog.txt | 19 +++++++++++++++++++ public/ascii/penguin-surfboard.txt | 14 ++++++++++++++ src/App.tsx | 17 +++++++++++++---- 8 files changed, 141 insertions(+), 4 deletions(-) create mode 100644 public/ascii/cat-loaf.txt create mode 100644 public/ascii/cat-peek.txt create mode 100644 public/ascii/cat-shock.txt create mode 100644 public/ascii/exclamation.txt create mode 100644 public/ascii/fat-cat-head.txt create mode 100644 public/ascii/grumpy-dog.txt create mode 100644 public/ascii/penguin-surfboard.txt diff --git a/public/ascii/cat-loaf.txt b/public/ascii/cat-loaf.txt new file mode 100644 index 00000000..642cd64f --- /dev/null +++ b/public/ascii/cat-loaf.txt @@ -0,0 +1,14 @@ +⠀⠀⠀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⣼⣿⣷⡄⠀⠀⠀⠀⠀⠀⣼⣿⣷⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⢰⣿⣿⣿⣿⡀⠀⠀⢀⣀⣸⣿⣿⣿⣿⣄⣀⣀⣀⣀⣀⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣶⣤⣀⠀⠀⠀⠀⠀⠀ +⢰⣿⣿⣿⣿⡿⢿⣿⣿⣿⣿⣿⡿⠿⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣦⡀⠀⠀⠀ +⢸⣿⣿⣿⢡⣶⣦⠘⣿⣿⣿⡇⣴⣶⡆⢹⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣦⠀⠀ +⢸⣿⣿⣿⣄⣉⣡⣼⣿⣿⣿⣷⣬⣩⣤⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧⠀ +⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣇ +⠈⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ +⠀⠘⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ +⠀⠀⠙⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿ +⠀⠀⠀⠈⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠃ +⠀⠀⠀⠀⠀⠙⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠋⠀ +⠀⠀⠀⠀⠀⠀⠀⠉⠻⠿⠿⠿⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠿⠿⠿⠿⠿⠟⠛⠁⠀⠀ \ No newline at end of file diff --git a/public/ascii/cat-peek.txt b/public/ascii/cat-peek.txt new file mode 100644 index 00000000..51bd7f11 --- /dev/null +++ b/public/ascii/cat-peek.txt @@ -0,0 +1,27 @@ +⢀⣴⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠟⠀⢹⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⢸⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⢸⣿⣿⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⢿⣿⣇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⢸⣿⣿⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⣿⣿⣿⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⢿⣿⣿⣿⣆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠐⠶⠶⣾⣿⣿⣿⣿⣷⣄⣀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⣤⣶⣾⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣤⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣶⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣀⣤⣤ +⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣶⣤⣤⣤⣤⣤⣤⣤⣤⣴⣶⣶⣶⣾⣿⣿⠿⠛⠉⢩ +⠉⠀⠀⠈⠁⠀⠈⠻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠛⠁⠀⠀⢠⡏ +⠀⠀⠀⠀⠀⠀⠀⠀⠘⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠿⠛⠋⠁⠀⠀⠀⢀⣴⠏⠀ +⠀⠀⠀⠀⣠⣶⡄⠀⠀⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣵⣖⠒⠀⠀⠀⠀⢀⣴⠛⠁⠀⠀ +⠀⠀⢀⣾⣿⣿⡟⠀⠀⢸⣿⣿⣿⣿⣿⣿⣿⠿⠿⠿⠿⠿⢿⣿⣿⣿⣿⣿⣿⠭⣬⠀⠀⠀⢀⣴⠟⠁⠀⠀⠀⠀ +⠀⠀⣾⣿⣿⣟⣀⠀⠀⣾⣿⣿⣿⣿⠟⠁⠀⠀⠀⠀⠀⠀⠀⠙⢿⣿⣿⣿⣧⠀⠀⠀⠀⣠⠾⠃⠀⠀⠀⠀⠀⠀ +⠀⠀⣿⣿⣿⣿⠟⠀⠠⣿⣿⣿⠏⠀⢀⣴⣿⡷⠀⠀⠀⠀⠀⠀⠈⣿⣿⣿⣿⡇⠀⣠⡾⠋⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠈⠛⠛⠋⠀⣠⣼⣿⡿⠁⠀⢠⣿⣿⠟⡁⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⣿⣧⡾⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⢀⣀⣠⣤⣾⣿⣿⣿⣿⠀⢠⣿⣿⣿⣿⠟⠀⠀⠀⠀⠀⠀⠀⣾⣿⣿⣿⡟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀⠀⢿⣿⣿⠟⠀⠀⠀⠀⠀⠀⠀⢀⣿⣿⡿⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣦⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣾⣿⠟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣤⡀⠀⠀⠀⠀⠀⣠⣴⣾⣿⠟⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣶⣶⣿⣿⣿⣿⠟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⣿⣿⣿⣿⠁⠈⠙⠻⠿⠿⠿⢿⣿⣿⣿⣿⡿⠿⠿⠛⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⣿⡿⠟⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ \ No newline at end of file diff --git a/public/ascii/cat-shock.txt b/public/ascii/cat-shock.txt new file mode 100644 index 00000000..3045822f --- /dev/null +++ b/public/ascii/cat-shock.txt @@ -0,0 +1,19 @@ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣾⡇⠀⠀⠀ +⠀⠀⠀⠀⢠⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣤⣦⠀⠀⠀⠀⠀⢀⣄⢀⣰⣿⣿⣧⣀⣀⡀ +⠀⠀⠀⠀⠸⣿⣿⣦⡀⠀⠀⠀⠀⠀⠀⣴⣿⣿⣿⡆⠀⠀⠀⠀⢸⣿⣿⣿⣿⣿⣿⣿⡿⠁ +⠀⠀⠀⠀⠀⣿⣿⣿⣿⣦⣀⣀⣀⣤⣾⣿⣿⣿⣿⡇⠀⠀⠀⠀⢸⣿⣿⣿⣿⣿⣿⣟⠀⠀ +⠀⠀⠀⠀⠀⢹⣿⣿⠛⠻⣿⣿⣿⠟⠻⣿⣿⣿⣿⠇⠀⠀⣿⣷⣾⣿⣿⣿⣿⣿⣿⣿⠏⠀ +⠀⠀⠀⠀⠀⣸⣿⠃⣿⡆⢹⣿⡇⣾⣿⠈⣿⣿⣿⡇⠀⢠⣿⣿⣿⣿⣿⣿⣿⣿⠛⠁⠀⠀ +⠀⠀⠀⠀⠸⣿⣿⡄⠿⠟⣾⣿⣧⠹⠿⢰⣿⣿⣿⡇⠀⢸⣿⣿⣿⣿⣿⣿⣿⡿⠟⠀⠀⠀ +⠀⠀⠀⠀⠀⠙⢿⣿⣶⣿⣿⣿⣿⣷⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠋⠁⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⢹⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡋⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡄⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⢰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡄⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⢀⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡄⠀⠀⠀⠀ +⠀⠀⠀⠀⢀⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧⠀⠀⠀⠀ +⠀⠀⠀⢀⣿⣿⣿⣿⣿⡿⠋⠀⠀⠉⠛⠻⠿⢿⣿⣿⣿⣿⣿⠃⠀⠙⢿⣿⣿⣿⡇⠀⠀⠀ +⠀⠀⢀⣾⣿⣿⣿⡿⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⠏⠀⠀⠀⠈⢻⣿⣿⣿⣄⠀⠀ +⢀⣠⣾⣿⣿⣿⠟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢰⣿⣿⣿⣿⠁⠀⠀⠀⠀⠈⣿⣿⣿⣿⣧⠀ +⠻⣿⣿⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠰⣿⣿⣿⣿⣿⡄⠀⠀⠀⠀⠀⠻⣿⣿⣿⠇⠀ +⠀⠈⠛⠉⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⠻⠿⠛⠃⠀⠀⠀⠀⠀⠀⠈⠁⠀⠀⠀ \ No newline at end of file diff --git a/public/ascii/exclamation.txt b/public/ascii/exclamation.txt new file mode 100644 index 00000000..b084bc97 --- /dev/null +++ b/public/ascii/exclamation.txt @@ -0,0 +1,16 @@ +⠀⣤⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⣸⣿⣷⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡀⠀⠀⠀⠀⠀⠀ +⣿⣿⣿⡆⠀⠀⠀⠀⢀⣤⣤⣶⣶⣿⣿⣿⠀⠀⠀⠀⠀⠀ +⢹⣿⣿⣿⠀⠀⠀⠀⢸⣿⣿⣿⣿⣿⣿⣿⠀⠀⠀⠀⠀⠀ +⠀⢻⣿⣿⣇⠀⠀⠀⠘⣿⣿⣿⣿⣿⣿⣿⠀⠀⠀⠀⠀⠀ +⠀⠈⣿⣿⣿⡀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⠀⠀⠀⠀⠀⠀ +⠀⠀⠸⣿⣿⣇⠀⠀⠀⢻⣿⣿⣿⣿⣿⣿⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⢻⣿⣿⡄⠀⠀⢸⣿⣿⣿⣿⣿⡏⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠈⠿⠟⠁⠀⠀⠘⣿⣿⣿⣿⣿⡇⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⣀⣤⡄⠀⠀⣿⣿⣿⣿⣿⡇⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⢻⣿⣿⡀⠀⢻⣿⣿⣿⣿⡇⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠻⠛⠁⠀⢸⣿⣿⣿⣿⡇⠀⠀⠀⣴⣦⣀ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠛⠻⠿⠃⠀⠀⢰⣿⣿⡿ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣶⣦⣤⣀⠀⠀⠀⣿⣿⡿⠁ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢿⣿⣿⣿⠂⠀⢰⣦⡙⠁⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠛⠟⠀⠀⠀⠙⠃⠀⠀ \ No newline at end of file diff --git a/public/ascii/fat-cat-head.txt b/public/ascii/fat-cat-head.txt new file mode 100644 index 00000000..db47eee0 --- /dev/null +++ b/public/ascii/fat-cat-head.txt @@ -0,0 +1,19 @@ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⣾⠿⠿⢶⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣿⠏⠀⠀⠀⠀⢿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⡀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⡿⠃⠀⠀⠀⠀⠀⠸⣷⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣾⠿⠛⢿⣦⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⡿⠁⠀⠀⠀⠀⠀⠀⠀⠹⣷⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣴⡿⠛⠁⠀⠀⠰⣿⡀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⢀⣤⣴⣿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⠿⢶⣾⣿⠷⣾⣶⣶⣶⣶⣾⡟⠁⠀⠀⠀⠀⠀⣿⡆⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⢀⣴⡿⠛⠉⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣼⣿⠃⠀⣴⣿⠏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢻⣷⣦⡀⠀⠀ +⠀⠀⠀⢀⣴⣿⡟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢿⡿⠁⠀⢰⣿⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⢿⣿⣦⠀ +⠀⠀⢠⣾⡿⠉⠀⠀⠀⠀⠀⠀⠀⠀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢻⣿⡀ +⠀⢰⣿⡟⠀⠀⠀⠀⠀⠀⠀⠀⢠⣿⣿⣷⠀⠀⠀⠀⢀⣀⡀⠀⠀⠀⠀⠀⠀⣠⣤⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⣿⡧ +⢰⣿⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠸⠿⠿⠋⠀⠀⠀⠀⢿⣿⣿⠀⠀⠀⠀⠀⠀⣿⣿⡿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⣿⣷ +⣼⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⡧⠀⠀⠀⠀⠀⠀⠀⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿ +⢿⣿⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣾⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣿⣿ +⢸⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢰⣷⣿⡿⠋⠹⣿⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣼⣿⠇ +⠘⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠀⠀⠀⠀⠈⠻⠿⣿⣾⣿⠗⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣼⣿⠏⠀ +⠀⠹⣿⣷⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣼⡿⠇⠀⠀ +⠀⠀⠈⠿⣿⣦⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⣴⣿⠏⠁⠀⠀⠀ +⠀⠀⠀⠀⠈⠻⣿⣷⣦⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣶⣿⡿⠋⠁⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠈⠉⠻⠿⣿⣶⣦⣤⣀⣀⣀⣀⣀⠀⠀⠀⠀⠀⠀⠀⢀⣀⣀⣀⣀⣤⣴⣾⠿⠿⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠛⠛⠛⠻⠿⠿⠿⣿⠿⣷⣿⣿⡿⣿⡿⠿⠿⠿⠛⠛⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ \ No newline at end of file diff --git a/public/ascii/grumpy-dog.txt b/public/ascii/grumpy-dog.txt new file mode 100644 index 00000000..d54763b3 --- /dev/null +++ b/public/ascii/grumpy-dog.txt @@ -0,0 +1,19 @@ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⣿⡿⠻⣿⣦⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣤⣤⣄⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⡏⠀⠀⢹⣿⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢰⣿⡟⠛⢿⣷⡀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⣾⣿⠁⠀⠀⠀⣿⣗⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣿⡟⠀⠀⠘⣿⣧⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⢠⣿⡏⠀⠀⠀⠀⠹⣿⣶⣶⣶⣶⣶⣶⣶⣦⣤⣤⣠⣀⣀⣀⣾⡿⠃⠀⠀⠀⢹⣿⣧⡀⠀ +⠀⠀⠀⠀⠀⠀⠀⣠⣾⣿⣧⡀⠀⠀⠀⠀⠀⠀⠉⠉⠉⠉⠉⠉⠉⠛⠛⠛⠛⠛⠛⠛⠁⠀⠀⠀⠀⠀⠹⣿⣷⠀ +⠀⠀⠀⠀⠀⠀⣈⣿⣿⣿⣿⣿⣿⣶⣤⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣀⣤⣄⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⡆ +⠀⠀⠀⠀⠀⠀⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠄⠀⠀⠀⢠⣴⣶⣶⣾⣿⣿⣿⣿⣿⣷⠀⠀⠀⠀⠀⠀⠀⠸⣿⣇ +⠀⠀⠀⠀⠀⠀⣼⣿⠋⠙⠛⠻⢿⣿⣿⠿⠿⠀⠀⠀⠀⠈⠻⣿⣿⣿⣿⣿⣿⣿⣿⣷⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿ +⠀⠀⠀⠀⠀⣰⣿⡏⠀⠀⠀⠀⣀⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⢉⠉⠉⠉⠉⠀⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⡏ +⠀⠀⣠⣴⣾⣿⠟⠁⠀⠀⠀⠘⣿⣿⠇⠀⠀⠀⠀⠀⠀⠀⣰⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⣿⣿ +⢀⣴⣿⡟⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⠛⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣿⡿ +⣼⣿⠋⠀⠀⠀⠀⠀⣠⣴⣶⣶⣶⣶⣶⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⡇ +⣿⣿⡀⠀⠀⠀⠀⠸⣿⣿⣿⣿⣿⣿⣿⣿⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣾⣿⠁ +⠸⣿⣷⡀⠀⠀⠀⠀⠈⠛⠛⠿⠿⠿⠿⠛⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣼⣿⠏⠀ +⠀⠹⣿⣿⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⣿⡿⠋⠀⠀ +⠀⠀⠈⠛⢿⣿⣶⣶⣤⣤⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⣀⣠⣶⣾⣿⠿⠋⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠈⠉⠛⠛⠿⠿⣿⣿⣿⣷⣶⣶⣶⣷⣿⣿⣿⣷⣶⣶⣿⣿⣿⣿⣿⡿⠿⠿⠛⠉⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠉⠛⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ \ No newline at end of file diff --git a/public/ascii/penguin-surfboard.txt b/public/ascii/penguin-surfboard.txt new file mode 100644 index 00000000..d856c07f --- /dev/null +++ b/public/ascii/penguin-surfboard.txt @@ -0,0 +1,14 @@ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⣶⠾⠟⠷⠶⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣿⠋⠀⠀⠀⠀⠀⢸⣧⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣼⠟⠁⠀⠀⠀⠀⠀⠀⣸⡿⠿⠿⠓⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⣿⠁⠀⠀⠀⠀⠀⠀⠀⢠⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣸⡟⠁⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣴⠶⠶⠶⠶⠿⠿⠿⠶⠶⠶⠶⠶⣦⣤⣄⣀⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣤⣴⠶⠾⢻⡟⠀⠀⢠⡇⠀⠀⢸⣷⠀⠀⠀⢿⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢉⣽⠇ +⠀⠀⠀⠀⠀⠀⣀⣤⡶⠟⠋⠉⠀⠀⢠⡿⠁⠀⢠⡿⠁⠀⠀⢸⡟⠀⠀⠀⢸⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣶⠟⠁⠀ +⠀⠀⢀⣤⡶⠟⠋⠁⠀⠀⠀⠀⠀⠀⣿⠇⠀⠀⣿⠁⠀⠀⢠⣿⠃⠀⠀⠀⢸⡇⠀⠀⠀⠀⠀⠀⠀⠀⣀⣤⡶⠟⠋⠀⠀⠀⠀ +⢀⣾⠟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⠀⠀⠀⣿⡀⠀⣰⡿⠁⠀⠀⠀⠀⢸⡇⠀⠀⠀⢀⣠⣴⠿⠛⠋⠁⠀⠀⠀⠀⠀⠀⠀ +⠸⣧⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢿⡆⠀⠀⠸⣧⢀⣿⠁⠀⠀⠀⠀⠀⢸⣧⣤⣴⠾⠛⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠈⠙⠛⠛⠿⠷⢶⣤⣄⣠⣤⣤⣤⣼⣇⠀⠀⠀⠻⣾⠇⠀⠀⠀⠀⠀⠀⢠⣿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠉⠁⠀⠈⣿⡆⠀⠀⠀⠀⣠⣶⣿⣷⣤⣀⣀⣸⣿⣇⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣷⣄⣀⣴⠞⠋⠁⠀⠀⠙⠿⠿⠿⠿⠟⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠙⠛⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ \ No newline at end of file diff --git a/src/App.tsx b/src/App.tsx index 2bc45fa8..915dd7d1 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -7,6 +7,13 @@ import { ThemeToggle } from "./components/theme-toggle"; const asciiFiles = [ "cat-sleep.txt", // "polar-bear.txt", + "penguin-surfboard.txt", + "cat-shock.txt", + "exclamation.txt", + "fat-cat-head.txt", + "grumpy-dog.txt", + "cat-peek.txt", + "cat-loaf.txt", ]; function App() { @@ -46,14 +53,16 @@ function Home() { }, [asciiFile]); return ( -
-
+
+
{asciiArt ? ( -
+					
 						{asciiArt}
 					
) : null} -

Oliver Bryan

+

+ Oliver Bryan +

{sortedProjects.map((project) => ( From f313420f4cdcac020155256653b2431a070b8d05 Mon Sep 17 00:00:00 2001 From: Oliver Bryan Date: Thu, 5 Feb 2026 15:32:09 +0000 Subject: [PATCH 06/18] picnic font --- src/App.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/App.tsx b/src/App.tsx index 915dd7d1..0c11ea38 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -60,7 +60,7 @@ function Home() { {asciiArt} ) : null} -

+

Oliver Bryan

From cc740265ea939eaec487f76f9c98ca94ea1cb11f Mon Sep 17 00:00:00 2001 From: Oliver Bryan Date: Thu, 5 Feb 2026 16:27:13 +0000 Subject: [PATCH 07/18] ask ai --- bun.lock | 8 ++++ package.json | 2 + src/components/ask-ai.tsx | 88 +++++++++++++++++++++++++++++++++++++++ src/lib/constants.ts | 10 +++++ 4 files changed, 108 insertions(+) create mode 100644 src/components/ask-ai.tsx create mode 100644 src/lib/constants.ts diff --git a/bun.lock b/bun.lock index cd059d86..6babf1df 100644 --- a/bun.lock +++ b/bun.lock @@ -5,6 +5,7 @@ "": { "name": "ob248.com", "dependencies": { + "@iconify/react": "^6.0.2", "@nsmr/pixelart-react": "^2.0.0", "@tailwindcss/vite": "^4.1.18", "class-variance-authority": "^0.7.1", @@ -14,6 +15,7 @@ "react": "^19.2.0", "react-dom": "^19.2.0", "react-router-dom": "^6.30.1", + "simple-icons": "^16.7.0", "tailwind-merge": "^3.4.0", "tailwindcss": "^4.1.18", }, @@ -159,6 +161,10 @@ "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="], + "@iconify/react": ["@iconify/react@6.0.2", "", { "dependencies": { "@iconify/types": "^2.0.0" }, "peerDependencies": { "react": ">=16" } }, "sha512-SMmC2sactfpJD427WJEDN6PMyznTFMhByK9yLW0gOTtnjzzbsi/Ke/XqsumsavFPwNiXs8jSiYeZTmLCLwO+Fg=="], + + "@iconify/types": ["@iconify/types@2.0.0", "", {}, "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg=="], + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], "@jridgewell/remapping": ["@jridgewell/remapping@2.3.5", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="], @@ -657,6 +663,8 @@ "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + "simple-icons": ["simple-icons@16.7.0", "", {}, "sha512-2BteuQXu1+/jK5dF8YXe8nwoRG3afwl03bCmgPJLiotllUBU46B+WntXT731Z17oOntfV5eeTI7Q1k7MeOA6eg=="], + "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], diff --git a/package.json b/package.json index 3774107b..3cd621b4 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "preview": "vite preview" }, "dependencies": { + "@iconify/react": "^6.0.2", "@nsmr/pixelart-react": "^2.0.0", "@tailwindcss/vite": "^4.1.18", "class-variance-authority": "^0.7.1", @@ -19,6 +20,7 @@ "react": "^19.2.0", "react-dom": "^19.2.0", "react-router-dom": "^6.30.1", + "simple-icons": "^16.7.0", "tailwind-merge": "^3.4.0", "tailwindcss": "^4.1.18" }, diff --git a/src/components/ask-ai.tsx b/src/components/ask-ai.tsx new file mode 100644 index 00000000..cc505bba --- /dev/null +++ b/src/components/ask-ai.tsx @@ -0,0 +1,88 @@ +import { AI_SUMMARY_PROMPT } from "@/lib/constants"; +import { cn } from "@/lib/utils"; +import { Icon } from "@iconify/react"; +import { Copy } from "@nsmr/pixelart-react"; +import { useRef, useState } from "react"; + +const chatGptUrl = "https://chat.openai.com/?q="; +const claudeUrl = "https://claude.ai/new?q="; + +export function AskAI({ + name, + prompt = AI_SUMMARY_PROMPT, + inline = false, +}: { + name: string; + prompt?: string; + inline?: boolean; +}) { + const encodedPrompt = encodeURIComponent(prompt); + const [copied, setCopied] = useState(false); + const timeoutRef = useRef(null); + + const handleCopy = async () => { + if (!navigator.clipboard) return; + try { + await navigator.clipboard.writeText(prompt); + setCopied(true); + if (timeoutRef.current) { + window.clearTimeout(timeoutRef.current); + } + timeoutRef.current = window.setTimeout(() => { + setCopied(false); + }, 1500); + } catch { + setCopied(false); + } + }; + + return ( +
+

Ask AI about {name}:

+
+ + + + + + +
+ + + Copied to clipboard + +
+
+
+ ); +} diff --git a/src/lib/constants.ts b/src/lib/constants.ts new file mode 100644 index 00000000..1329d735 --- /dev/null +++ b/src/lib/constants.ts @@ -0,0 +1,10 @@ +export const AI_SUMMARY_PROMPT = + "I am a recruiter, tell me about Oliver Bryan, a software developer. What would he bring to the table? Review his portfolio at ob248.com and summarize his key strengths, technical skills, and notable projects. What makes him stand out as a candidate?"; + +export function getProjectPrompt( + projectName: string, + projectDescription: string, + projectSlug: string, +): string { + return `Tell me about "${projectName}", a project by Oliver Bryan. ${projectDescription} Review the project page at ob248.com/projects/${projectSlug} and explain the technical decisions, technologies used, and what this project demonstrates about Oliver's skills as a developer. Provide any url or repository that would be helpful.`; +} From 5d9c5eaa93c769048723eca9551658af2cdacd98 Mon Sep 17 00:00:00 2001 From: Oliver Bryan Date: Thu, 5 Feb 2026 16:27:28 +0000 Subject: [PATCH 08/18] implemented "ask ai" --- src/App.tsx | 40 +++++++++++++++++++------ src/components/ProjectPage.tsx | 52 ++++++++++++++++++++------------- src/components/theme-toggle.tsx | 9 +++--- src/components/ui/button.tsx | 1 + 4 files changed, 69 insertions(+), 33 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 0c11ea38..40ab7849 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,12 +1,14 @@ +import { AskAI } from "@/components/ask-ai"; import { ProjectListItem } from "@/components/ProjectListItem"; import { type ProjectEntry, projectList, projects } from "@/projects"; +import { Downasaur, Home as HomeIcon } from "@nsmr/pixelart-react"; import { useEffect, useState } from "react"; import { Link, Route, Routes, useParams } from "react-router-dom"; import { ThemeToggle } from "./components/theme-toggle"; const asciiFiles = [ "cat-sleep.txt", - // "polar-bear.txt", + "polar-bear.txt", "penguin-surfboard.txt", "cat-shock.txt", "exclamation.txt", @@ -53,10 +55,10 @@ function Home() { }, [asciiFile]); return ( -
-
+
+
{asciiArt ? ( -
+					
 						{asciiArt}
 					
) : null} @@ -73,7 +75,10 @@ function Home() { /> ))}
- +
+ + +
); } @@ -88,15 +93,32 @@ function ProjectRoute() { function NotFound() { return ( -
-

Not found

- - Go home +
+ ? + + 404 + Not Found + + +
); } +// function NotFound() { +// return ( +//
+// +// +// +// +//
+// ); +// } + function parseDate(dateStr: string): Date { const lower = dateStr.toLowerCase(); diff --git a/src/components/ProjectPage.tsx b/src/components/ProjectPage.tsx index 40721c70..a8931457 100644 --- a/src/components/ProjectPage.tsx +++ b/src/components/ProjectPage.tsx @@ -1,22 +1,26 @@ +import { getProjectPrompt } from "@/lib/constants"; +import type { ProjectMetadata } from "@/projects"; +import { Home } from "@nsmr/pixelart-react"; import type { ReactNode } from "react"; import { Link } from "react-router-dom"; -import type { ProjectMetadata } from "@/projects"; +import { AskAI } from "./ask-ai"; -type ProjectPageProps = { +export function ProjectPage({ + metadata, + children, +}: { metadata: ProjectMetadata; children: ReactNode; -}; - -export function ProjectPage({ metadata, children }: ProjectPageProps) { +}) { const tags = metadata.tags ? [...metadata.tags].sort() : []; return ( -
+
- Home +
@@ -33,19 +37,27 @@ export function ProjectPage({ metadata, children }: ProjectPageProps) {
)}
-
- {metadata.url ? ( - - Try {metadata.title} - - ) : null} -
+
+ {metadata.url ? ( + + ) : null}

{metadata.date} diff --git a/src/components/theme-toggle.tsx b/src/components/theme-toggle.tsx index 001d5aa7..875d1f70 100644 --- a/src/components/theme-toggle.tsx +++ b/src/components/theme-toggle.tsx @@ -1,6 +1,6 @@ -import { Moon, Sun } from "@nsmr/pixelart-react"; import { useTheme } from "@/components/theme-provider"; import { Button } from "@/components/ui/button"; +import { Moon, Sun } from "@nsmr/pixelart-react"; export function ThemeToggle() { const { resolvedTheme, setTheme } = useTheme(); @@ -8,11 +8,12 @@ export function ThemeToggle() { return ( ); } diff --git a/src/components/ui/button.tsx b/src/components/ui/button.tsx index a0e33359..48cad0d7 100644 --- a/src/components/ui/button.tsx +++ b/src/components/ui/button.tsx @@ -19,6 +19,7 @@ const buttonVariants = cva( ghost: "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50", link: "text-primary underline-offset-4 hover:underline", + dummy: "", }, size: { default: "h-9 px-4 py-2 has-[>svg]:px-3", From 693b05e33a2a03d9d6f09580f085f091e2f53dec Mon Sep 17 00:00:00 2001 From: Oliver Bryan Date: Thu, 5 Feb 2026 16:27:33 +0000 Subject: [PATCH 09/18] Delete favicon copy.svg --- public/favicon copy.svg | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 public/favicon copy.svg diff --git a/public/favicon copy.svg b/public/favicon copy.svg deleted file mode 100644 index f4e96bb3..00000000 --- a/public/favicon copy.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - \ No newline at end of file From 6e0ad233a958c3c3bd7bbfdb87ed60ded5b80cb8 Mon Sep 17 00:00:00 2001 From: Oliver Bryan Date: Thu, 5 Feb 2026 16:32:13 +0000 Subject: [PATCH 10/18] ascii white in darkmode --- src/App.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/App.tsx b/src/App.tsx index 40ab7849..7c5768a2 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -58,7 +58,7 @@ function Home() {

{asciiArt ? ( -
+					
 						{asciiArt}
 					
) : null} From b4a577762bd99118ad0a0d266713af1843505d1e Mon Sep 17 00:00:00 2001 From: Oliver Bryan Date: Thu, 5 Feb 2026 16:32:23 +0000 Subject: [PATCH 11/18] CV link --- public/cv.pdf | 2872 +++++++++++++++++++++++++++++++++++++++++++++++++ src/App.tsx | 7 +- 2 files changed, 2878 insertions(+), 1 deletion(-) create mode 100644 public/cv.pdf diff --git a/public/cv.pdf b/public/cv.pdf new file mode 100644 index 00000000..6a6deede --- /dev/null +++ b/public/cv.pdf @@ -0,0 +1,2872 @@ +%PDF-1.7 +% + +1 0 obj +<< + /Type /Pages + /Count 1 + /Kids [191 0 R] +>> +endobj + +2 0 obj +<< + /Type /Outlines + /First 3 0 R + /Last 5 0 R + /Count 3 +>> +endobj + +3 0 obj +<< + /Parent 2 0 R + /Next 4 0 R + /Title (Professional Experience) + /Dest 185 0 R +>> +endobj + +4 0 obj +<< + /Parent 2 0 R + /Next 5 0 R + /Prev 3 0 R + /Title (Education) + /Dest 186 0 R +>> +endobj + +5 0 obj +<< + /Parent 2 0 R + /Prev 4 0 R + /Title (Personal Projects) + /Dest 187 0 R +>> +endobj + +6 0 obj +<< + /Type /StructTreeRoot + /RoleMap << + /Datetime /Span + /Terms /Part + /Title /P + /Strong /Span + /Em /Span + >> + /K [8 0 R] + /ParentTree << + /Nums [0 151 0 R 1 133 0 R 2 81 0 R 3 7 0 R] + >> + /ParentTreeNextKey 4 +>> +endobj + +7 0 obj +[152 0 R 150 0 R 151 0 R 149 0 R 148 0 R 148 0 R 146 0 R 146 0 R 143 0 R 142 0 R 141 0 R 138 0 R 137 0 R 135 0 R 132 0 R 134 0 R 132 0 R 127 0 R 125 0 R 126 0 R 125 0 R 121 0 R 120 0 R 119 0 R 116 0 R 115 0 R 115 0 R 113 0 R 110 0 R 108 0 R 109 0 R 108 0 R 105 0 R 104 0 R 101 0 R 101 0 R 99 0 R 96 0 R 95 0 R 92 0 R 92 0 R 90 0 R 87 0 R 87 0 R 85 0 R 82 0 R 81 0 R 80 0 R 78 0 R 75 0 R 74 0 R 74 0 R 71 0 R 70 0 R 70 0 R 70 0 R 67 0 R 66 0 R 65 0 R 62 0 R 62 0 R 60 0 R 57 0 R 56 0 R 53 0 R 52 0 R 49 0 R 48 0 R 45 0 R 44 0 R 43 0 R 40 0 R 40 0 R 38 0 R 35 0 R 34 0 R 31 0 R 30 0 R 29 0 R 26 0 R 26 0 R 24 0 R 21 0 R 20 0 R 20 0 R 17 0 R 16 0 R 16 0 R 13 0 R 12 0 R 11 0 R] +endobj + +8 0 obj +<< + /Type /StructElem + /S /Document + /P 6 0 R + /K [152 0 R 150 0 R 149 0 R 144 0 R 139 0 R 122 0 R 117 0 R 116 0 R 111 0 R 106 0 R 102 0 R 97 0 R 93 0 R 88 0 R 83 0 R 82 0 R 76 0 R 72 0 R 68 0 R 63 0 R 58 0 R 54 0 R 50 0 R 46 0 R 41 0 R 36 0 R 32 0 R 27 0 R 22 0 R 18 0 R 14 0 R 9 0 R] +>> +endobj + +9 0 obj +<< + /Type /StructElem + /S /L + /P 8 0 R + /A [<< + /O /List + /ListNumbering /Circle + >>] + /K [10 0 R] +>> +endobj + +10 0 obj +<< + /Type /StructElem + /S /LI + /P 9 0 R + /K [13 0 R 11 0 R] +>> +endobj + +11 0 obj +<< + /Type /StructElem + /S /LBody + /P 10 0 R + /K [12 0 R 90] + /Pg 191 0 R +>> +endobj + +12 0 obj +<< + /Type /StructElem + /S /Strong + /P 11 0 R + /K [89] + /Pg 191 0 R +>> +endobj + +13 0 obj +<< + /Type /StructElem + /S /Lbl + /P 10 0 R + /K [88] + /Pg 191 0 R +>> +endobj + +14 0 obj +<< + /Type /StructElem + /S /L + /P 8 0 R + /A [<< + /O /List + /ListNumbering /Circle + >>] + /K [15 0 R] +>> +endobj + +15 0 obj +<< + /Type /StructElem + /S /LI + /P 14 0 R + /K [17 0 R 16 0 R] +>> +endobj + +16 0 obj +<< + /Type /StructElem + /S /LBody + /P 15 0 R + /K [86 87] + /Pg 191 0 R +>> +endobj + +17 0 obj +<< + /Type /StructElem + /S /Lbl + /P 15 0 R + /K [85] + /Pg 191 0 R +>> +endobj + +18 0 obj +<< + /Type /StructElem + /S /L + /P 8 0 R + /A [<< + /O /List + /ListNumbering /Circle + >>] + /K [19 0 R] +>> +endobj + +19 0 obj +<< + /Type /StructElem + /S /LI + /P 18 0 R + /K [21 0 R 20 0 R] +>> +endobj + +20 0 obj +<< + /Type /StructElem + /S /LBody + /P 19 0 R + /K [83 84] + /Pg 191 0 R +>> +endobj + +21 0 obj +<< + /Type /StructElem + /S /Lbl + /P 19 0 R + /K [82] + /Pg 191 0 R +>> +endobj + +22 0 obj +<< + /Type /StructElem + /S /Div + /P 8 0 R + /K [25 0 R 23 0 R] +>> +endobj + +23 0 obj +<< + /Type /StructElem + /S /Div + /P 22 0 R + /K [24 0 R] +>> +endobj + +24 0 obj +<< + /Type /StructElem + /S /Span + /P 23 0 R + /A [<< + /O /Layout + /Placement /Block + >>] + /K [81] + /Pg 191 0 R +>> +endobj + +25 0 obj +<< + /Type /StructElem + /S /Div + /P 22 0 R + /K [26 0 R] +>> +endobj + +26 0 obj +<< + /Type /StructElem + /S /Span + /P 25 0 R + /A [<< + /O /Layout + /Placement /Block + >>] + /K [79 80] + /Pg 191 0 R +>> +endobj + +27 0 obj +<< + /Type /StructElem + /S /L + /P 8 0 R + /A [<< + /O /List + /ListNumbering /Circle + >>] + /K [28 0 R] +>> +endobj + +28 0 obj +<< + /Type /StructElem + /S /LI + /P 27 0 R + /K [31 0 R 29 0 R] +>> +endobj + +29 0 obj +<< + /Type /StructElem + /S /LBody + /P 28 0 R + /K [30 0 R 78] + /Pg 191 0 R +>> +endobj + +30 0 obj +<< + /Type /StructElem + /S /Strong + /P 29 0 R + /K [77] + /Pg 191 0 R +>> +endobj + +31 0 obj +<< + /Type /StructElem + /S /Lbl + /P 28 0 R + /K [76] + /Pg 191 0 R +>> +endobj + +32 0 obj +<< + /Type /StructElem + /S /L + /P 8 0 R + /A [<< + /O /List + /ListNumbering /Circle + >>] + /K [33 0 R] +>> +endobj + +33 0 obj +<< + /Type /StructElem + /S /LI + /P 32 0 R + /K [35 0 R 34 0 R] +>> +endobj + +34 0 obj +<< + /Type /StructElem + /S /LBody + /P 33 0 R + /K [75] + /Pg 191 0 R +>> +endobj + +35 0 obj +<< + /Type /StructElem + /S /Lbl + /P 33 0 R + /K [74] + /Pg 191 0 R +>> +endobj + +36 0 obj +<< + /Type /StructElem + /S /Div + /P 8 0 R + /K [39 0 R 37 0 R] +>> +endobj + +37 0 obj +<< + /Type /StructElem + /S /Div + /P 36 0 R + /K [38 0 R] +>> +endobj + +38 0 obj +<< + /Type /StructElem + /S /Span + /P 37 0 R + /A [<< + /O /Layout + /Placement /Block + >>] + /K [73] + /Pg 191 0 R +>> +endobj + +39 0 obj +<< + /Type /StructElem + /S /Div + /P 36 0 R + /K [40 0 R] +>> +endobj + +40 0 obj +<< + /Type /StructElem + /S /Span + /P 39 0 R + /A [<< + /O /Layout + /Placement /Block + >>] + /K [71 72] + /Pg 191 0 R +>> +endobj + +41 0 obj +<< + /Type /StructElem + /S /L + /P 8 0 R + /A [<< + /O /List + /ListNumbering /Circle + >>] + /K [42 0 R] +>> +endobj + +42 0 obj +<< + /Type /StructElem + /S /LI + /P 41 0 R + /K [45 0 R 43 0 R] +>> +endobj + +43 0 obj +<< + /Type /StructElem + /S /LBody + /P 42 0 R + /K [44 0 R 70] + /Pg 191 0 R +>> +endobj + +44 0 obj +<< + /Type /StructElem + /S /Strong + /P 43 0 R + /K [69] + /Pg 191 0 R +>> +endobj + +45 0 obj +<< + /Type /StructElem + /S /Lbl + /P 42 0 R + /K [68] + /Pg 191 0 R +>> +endobj + +46 0 obj +<< + /Type /StructElem + /S /L + /P 8 0 R + /A [<< + /O /List + /ListNumbering /Circle + >>] + /K [47 0 R] +>> +endobj + +47 0 obj +<< + /Type /StructElem + /S /LI + /P 46 0 R + /K [49 0 R 48 0 R] +>> +endobj + +48 0 obj +<< + /Type /StructElem + /S /LBody + /P 47 0 R + /K [67] + /Pg 191 0 R +>> +endobj + +49 0 obj +<< + /Type /StructElem + /S /Lbl + /P 47 0 R + /K [66] + /Pg 191 0 R +>> +endobj + +50 0 obj +<< + /Type /StructElem + /S /L + /P 8 0 R + /A [<< + /O /List + /ListNumbering /Circle + >>] + /K [51 0 R] +>> +endobj + +51 0 obj +<< + /Type /StructElem + /S /LI + /P 50 0 R + /K [53 0 R 52 0 R] +>> +endobj + +52 0 obj +<< + /Type /StructElem + /S /LBody + /P 51 0 R + /K [65] + /Pg 191 0 R +>> +endobj + +53 0 obj +<< + /Type /StructElem + /S /Lbl + /P 51 0 R + /K [64] + /Pg 191 0 R +>> +endobj + +54 0 obj +<< + /Type /StructElem + /S /L + /P 8 0 R + /A [<< + /O /List + /ListNumbering /Circle + >>] + /K [55 0 R] +>> +endobj + +55 0 obj +<< + /Type /StructElem + /S /LI + /P 54 0 R + /K [57 0 R 56 0 R] +>> +endobj + +56 0 obj +<< + /Type /StructElem + /S /LBody + /P 55 0 R + /K [63] + /Pg 191 0 R +>> +endobj + +57 0 obj +<< + /Type /StructElem + /S /Lbl + /P 55 0 R + /K [62] + /Pg 191 0 R +>> +endobj + +58 0 obj +<< + /Type /StructElem + /S /Div + /P 8 0 R + /K [61 0 R 59 0 R] +>> +endobj + +59 0 obj +<< + /Type /StructElem + /S /Div + /P 58 0 R + /K [60 0 R] +>> +endobj + +60 0 obj +<< + /Type /StructElem + /S /Span + /P 59 0 R + /A [<< + /O /Layout + /Placement /Block + >>] + /K [61] + /Pg 191 0 R +>> +endobj + +61 0 obj +<< + /Type /StructElem + /S /Div + /P 58 0 R + /K [62 0 R] +>> +endobj + +62 0 obj +<< + /Type /StructElem + /S /Span + /P 61 0 R + /A [<< + /O /Layout + /Placement /Block + >>] + /K [59 60] + /Pg 191 0 R +>> +endobj + +63 0 obj +<< + /Type /StructElem + /S /L + /P 8 0 R + /A [<< + /O /List + /ListNumbering /Circle + >>] + /K [64 0 R] +>> +endobj + +64 0 obj +<< + /Type /StructElem + /S /LI + /P 63 0 R + /K [67 0 R 65 0 R] +>> +endobj + +65 0 obj +<< + /Type /StructElem + /S /LBody + /P 64 0 R + /K [66 0 R 58] + /Pg 191 0 R +>> +endobj + +66 0 obj +<< + /Type /StructElem + /S /Strong + /P 65 0 R + /K [57] + /Pg 191 0 R +>> +endobj + +67 0 obj +<< + /Type /StructElem + /S /Lbl + /P 64 0 R + /K [56] + /Pg 191 0 R +>> +endobj + +68 0 obj +<< + /Type /StructElem + /S /L + /P 8 0 R + /A [<< + /O /List + /ListNumbering /Circle + >>] + /K [69 0 R] +>> +endobj + +69 0 obj +<< + /Type /StructElem + /S /LI + /P 68 0 R + /K [71 0 R 70 0 R] +>> +endobj + +70 0 obj +<< + /Type /StructElem + /S /LBody + /P 69 0 R + /K [53 54 55] + /Pg 191 0 R +>> +endobj + +71 0 obj +<< + /Type /StructElem + /S /Lbl + /P 69 0 R + /K [52] + /Pg 191 0 R +>> +endobj + +72 0 obj +<< + /Type /StructElem + /S /L + /P 8 0 R + /A [<< + /O /List + /ListNumbering /Circle + >>] + /K [73 0 R] +>> +endobj + +73 0 obj +<< + /Type /StructElem + /S /LI + /P 72 0 R + /K [75 0 R 74 0 R] +>> +endobj + +74 0 obj +<< + /Type /StructElem + /S /LBody + /P 73 0 R + /K [50 51] + /Pg 191 0 R +>> +endobj + +75 0 obj +<< + /Type /StructElem + /S /Lbl + /P 73 0 R + /K [49] + /Pg 191 0 R +>> +endobj + +76 0 obj +<< + /Type /StructElem + /S /Div + /P 8 0 R + /K [79 0 R 77 0 R] +>> +endobj + +77 0 obj +<< + /Type /StructElem + /S /Div + /P 76 0 R + /K [78 0 R] +>> +endobj + +78 0 obj +<< + /Type /StructElem + /S /Span + /P 77 0 R + /A [<< + /O /Layout + /Placement /Block + >>] + /K [48] + /Pg 191 0 R +>> +endobj + +79 0 obj +<< + /Type /StructElem + /S /Div + /P 76 0 R + /K [81 0 R 80 0 R] +>> +endobj + +80 0 obj +<< + /Type /StructElem + /S /Span + /P 79 0 R + /A [<< + /O /Layout + /Placement /Block + >>] + /K [47] + /Pg 191 0 R +>> +endobj + +81 0 obj +<< + /Type /StructElem + /S /Link + /P 79 0 R + /A [<< + /O /Layout + /Placement /Block + >>] + /K [46 << + /Type /OBJR + /Pg 191 0 R + /Obj 190 0 R + >>] + /Pg 191 0 R +>> +endobj + +82 0 obj +<< + /Type /StructElem + /S /H1 + /P 8 0 R + /T (Personal Projects) + /K [45] + /Pg 191 0 R +>> +endobj + +83 0 obj +<< + /Type /StructElem + /S /Div + /P 8 0 R + /K [86 0 R 84 0 R] +>> +endobj + +84 0 obj +<< + /Type /StructElem + /S /Div + /P 83 0 R + /K [85 0 R] +>> +endobj + +85 0 obj +<< + /Type /StructElem + /S /Span + /P 84 0 R + /A [<< + /O /Layout + /Placement /Block + >>] + /K [44] + /Pg 191 0 R +>> +endobj + +86 0 obj +<< + /Type /StructElem + /S /Div + /P 83 0 R + /K [87 0 R] +>> +endobj + +87 0 obj +<< + /Type /StructElem + /S /Span + /P 86 0 R + /A [<< + /O /Layout + /Placement /Block + >>] + /K [42 43] + /Pg 191 0 R +>> +endobj + +88 0 obj +<< + /Type /StructElem + /S /Div + /P 8 0 R + /K [91 0 R 89 0 R] +>> +endobj + +89 0 obj +<< + /Type /StructElem + /S /Div + /P 88 0 R + /K [90 0 R] +>> +endobj + +90 0 obj +<< + /Type /StructElem + /S /Span + /P 89 0 R + /A [<< + /O /Layout + /Placement /Block + >>] + /K [41] + /Pg 191 0 R +>> +endobj + +91 0 obj +<< + /Type /StructElem + /S /Div + /P 88 0 R + /K [92 0 R] +>> +endobj + +92 0 obj +<< + /Type /StructElem + /S /Span + /P 91 0 R + /A [<< + /O /Layout + /Placement /Block + >>] + /K [39 40] + /Pg 191 0 R +>> +endobj + +93 0 obj +<< + /Type /StructElem + /S /L + /P 8 0 R + /A [<< + /O /List + /ListNumbering /Circle + >>] + /K [94 0 R] +>> +endobj + +94 0 obj +<< + /Type /StructElem + /S /LI + /P 93 0 R + /K [96 0 R 95 0 R] +>> +endobj + +95 0 obj +<< + /Type /StructElem + /S /LBody + /P 94 0 R + /K [38] + /Pg 191 0 R +>> +endobj + +96 0 obj +<< + /Type /StructElem + /S /Lbl + /P 94 0 R + /K [37] + /Pg 191 0 R +>> +endobj + +97 0 obj +<< + /Type /StructElem + /S /Div + /P 8 0 R + /K [100 0 R 98 0 R] +>> +endobj + +98 0 obj +<< + /Type /StructElem + /S /Div + /P 97 0 R + /K [99 0 R] +>> +endobj + +99 0 obj +<< + /Type /StructElem + /S /Span + /P 98 0 R + /A [<< + /O /Layout + /Placement /Block + >>] + /K [36] + /Pg 191 0 R +>> +endobj + +100 0 obj +<< + /Type /StructElem + /S /Div + /P 97 0 R + /K [101 0 R] +>> +endobj + +101 0 obj +<< + /Type /StructElem + /S /Span + /P 100 0 R + /A [<< + /O /Layout + /Placement /Block + >>] + /K [34 35] + /Pg 191 0 R +>> +endobj + +102 0 obj +<< + /Type /StructElem + /S /L + /P 8 0 R + /A [<< + /O /List + /ListNumbering /Circle + >>] + /K [103 0 R] +>> +endobj + +103 0 obj +<< + /Type /StructElem + /S /LI + /P 102 0 R + /K [105 0 R 104 0 R] +>> +endobj + +104 0 obj +<< + /Type /StructElem + /S /LBody + /P 103 0 R + /K [33] + /Pg 191 0 R +>> +endobj + +105 0 obj +<< + /Type /StructElem + /S /Lbl + /P 103 0 R + /K [32] + /Pg 191 0 R +>> +endobj + +106 0 obj +<< + /Type /StructElem + /S /L + /P 8 0 R + /A [<< + /O /List + /ListNumbering /Circle + >>] + /K [107 0 R] +>> +endobj + +107 0 obj +<< + /Type /StructElem + /S /LI + /P 106 0 R + /K [110 0 R 108 0 R] +>> +endobj + +108 0 obj +<< + /Type /StructElem + /S /LBody + /P 107 0 R + /K [29 109 0 R 31] + /Pg 191 0 R +>> +endobj + +109 0 obj +<< + /Type /StructElem + /S /Strong + /P 108 0 R + /K [30] + /Pg 191 0 R +>> +endobj + +110 0 obj +<< + /Type /StructElem + /S /Lbl + /P 107 0 R + /K [28] + /Pg 191 0 R +>> +endobj + +111 0 obj +<< + /Type /StructElem + /S /Div + /P 8 0 R + /K [114 0 R 112 0 R] +>> +endobj + +112 0 obj +<< + /Type /StructElem + /S /Div + /P 111 0 R + /K [113 0 R] +>> +endobj + +113 0 obj +<< + /Type /StructElem + /S /Span + /P 112 0 R + /A [<< + /O /Layout + /Placement /Block + >>] + /K [27] + /Pg 191 0 R +>> +endobj + +114 0 obj +<< + /Type /StructElem + /S /Div + /P 111 0 R + /K [115 0 R] +>> +endobj + +115 0 obj +<< + /Type /StructElem + /S /Span + /P 114 0 R + /A [<< + /O /Layout + /Placement /Block + >>] + /K [25 26] + /Pg 191 0 R +>> +endobj + +116 0 obj +<< + /Type /StructElem + /S /H1 + /P 8 0 R + /T (Education) + /K [24] + /Pg 191 0 R +>> +endobj + +117 0 obj +<< + /Type /StructElem + /S /L + /P 8 0 R + /A [<< + /O /List + /ListNumbering /Circle + >>] + /K [118 0 R] +>> +endobj + +118 0 obj +<< + /Type /StructElem + /S /LI + /P 117 0 R + /K [121 0 R 119 0 R] +>> +endobj + +119 0 obj +<< + /Type /StructElem + /S /LBody + /P 118 0 R + /K [120 0 R 23] + /Pg 191 0 R +>> +endobj + +120 0 obj +<< + /Type /StructElem + /S /Strong + /P 119 0 R + /K [22] + /Pg 191 0 R +>> +endobj + +121 0 obj +<< + /Type /StructElem + /S /Lbl + /P 118 0 R + /K [21] + /Pg 191 0 R +>> +endobj + +122 0 obj +<< + /Type /StructElem + /S /L + /P 8 0 R + /A [<< + /O /List + /ListNumbering /Circle + >>] + /K [128 0 R 123 0 R] +>> +endobj + +123 0 obj +<< + /Type /StructElem + /S /L + /P 122 0 R + /A [<< + /O /List + /ListNumbering /Circle + >>] + /K [124 0 R] +>> +endobj + +124 0 obj +<< + /Type /StructElem + /S /LI + /P 123 0 R + /K [127 0 R 125 0 R] +>> +endobj + +125 0 obj +<< + /Type /StructElem + /S /LBody + /P 124 0 R + /K [18 126 0 R 20] + /Pg 191 0 R +>> +endobj + +126 0 obj +<< + /Type /StructElem + /S /Strong + /P 125 0 R + /K [19] + /Pg 191 0 R +>> +endobj + +127 0 obj +<< + /Type /StructElem + /S /Lbl + /P 124 0 R + /K [17] + /Pg 191 0 R +>> +endobj + +128 0 obj +<< + /Type /StructElem + /S /LI + /P 122 0 R + /K [138 0 R 129 0 R] +>> +endobj + +129 0 obj +<< + /Type /StructElem + /S /LBody + /P 128 0 R + /K [136 0 R 130 0 R] +>> +endobj + +130 0 obj +<< + /Type /StructElem + /S /L + /P 129 0 R + /A [<< + /O /List + /ListNumbering /Circle + >>] + /K [131 0 R] +>> +endobj + +131 0 obj +<< + /Type /StructElem + /S /LI + /P 130 0 R + /K [135 0 R 132 0 R] +>> +endobj + +132 0 obj +<< + /Type /StructElem + /S /LBody + /P 131 0 R + /K [14 133 0 R 16] + /Pg 191 0 R +>> +endobj + +133 0 obj +<< + /Type /StructElem + /S /Link + /P 132 0 R + /K [134 0 R << + /Type /OBJR + /Pg 191 0 R + /Obj 189 0 R + >>] +>> +endobj + +134 0 obj +<< + /Type /StructElem + /S /Strong + /P 133 0 R + /K [15] + /Pg 191 0 R +>> +endobj + +135 0 obj +<< + /Type /StructElem + /S /Lbl + /P 131 0 R + /K [13] + /Pg 191 0 R +>> +endobj + +136 0 obj +<< + /Type /StructElem + /S /P + /P 129 0 R + /K [137 0 R] +>> +endobj + +137 0 obj +<< + /Type /StructElem + /S /Strong + /P 136 0 R + /K [12] + /Pg 191 0 R +>> +endobj + +138 0 obj +<< + /Type /StructElem + /S /Lbl + /P 128 0 R + /K [11] + /Pg 191 0 R +>> +endobj + +139 0 obj +<< + /Type /StructElem + /S /L + /P 8 0 R + /A [<< + /O /List + /ListNumbering /Circle + >>] + /K [140 0 R] +>> +endobj + +140 0 obj +<< + /Type /StructElem + /S /LI + /P 139 0 R + /K [143 0 R 141 0 R] +>> +endobj + +141 0 obj +<< + /Type /StructElem + /S /LBody + /P 140 0 R + /K [142 0 R 10] + /Pg 191 0 R +>> +endobj + +142 0 obj +<< + /Type /StructElem + /S /Strong + /P 141 0 R + /K [9] + /Pg 191 0 R +>> +endobj + +143 0 obj +<< + /Type /StructElem + /S /Lbl + /P 140 0 R + /K [8] + /Pg 191 0 R +>> +endobj + +144 0 obj +<< + /Type /StructElem + /S /Div + /P 8 0 R + /K [147 0 R 145 0 R] +>> +endobj + +145 0 obj +<< + /Type /StructElem + /S /Div + /P 144 0 R + /K [146 0 R] +>> +endobj + +146 0 obj +<< + /Type /StructElem + /S /Span + /P 145 0 R + /A [<< + /O /Layout + /Placement /Block + >>] + /K [6 7] + /Pg 191 0 R +>> +endobj + +147 0 obj +<< + /Type /StructElem + /S /Div + /P 144 0 R + /K [148 0 R] +>> +endobj + +148 0 obj +<< + /Type /StructElem + /S /Span + /P 147 0 R + /A [<< + /O /Layout + /Placement /Block + >>] + /K [4 5] + /Pg 191 0 R +>> +endobj + +149 0 obj +<< + /Type /StructElem + /S /H1 + /P 8 0 R + /T (Professional Experience) + /K [3] + /Pg 191 0 R +>> +endobj + +150 0 obj +<< + /Type /StructElem + /S /P + /P 8 0 R + /K [1 151 0 R] + /Pg 191 0 R +>> +endobj + +151 0 obj +<< + /Type /StructElem + /S /Link + /P 150 0 R + /K [2 << + /Type /OBJR + /Pg 191 0 R + /Obj 188 0 R + >>] + /Pg 191 0 R +>> +endobj + +152 0 obj +<< + /Type /StructElem + /S /P + /P 8 0 R + /K [0] + /Pg 191 0 R +>> +endobj + +153 0 obj +<< + /Type /Font + /Subtype /Type0 + /BaseFont /GOMQCD+Ubuntu-Bold + /Encoding /Identity-H + /DescendantFonts [154 0 R] + /ToUnicode 157 0 R +>> +endobj + +154 0 obj +<< + /Type /Font + /Subtype /CIDFontType2 + /BaseFont /GOMQCD+Ubuntu-Bold + /CIDSystemInfo << + /Registry (Adobe) + /Ordering (Identity) + /Supplement 0 + >> + /FontDescriptor 156 0 R + /DW 0 + /CIDToGIDMap /Identity + /W [0 0 500 1 1 790 2 2 316 3 3 289 4 4 550 5 5 584 6 6 422 7 7 240 8 8 672 9 9 547 10 10 553 11 11 589 12 12 529 13 13 589 14 14 607 15 15 582 16 16 422 17 17 444 18 18 784 19 19 737 20 20 604 21 21 485 22 22 500 23 23 246 24 24 644 25 25 289 26 26 604 27 27 897 28 28 614 29 29 589 30 30 594 31 31 606 32 32 568 33 33 705 34 34 568 35 35 661 36 37 568 38 38 648 39 39 862 40 40 568 41 41 707 42 42 721 43 43 563 44 44 554 45 45 702 46 47 356 48 48 568 49 49 246 50 51 568 52 52 579 53 53 948 54 54 316 55 55 610] +>> +endobj + +155 0 obj +<< + /Length 12 + /Filter /FlateDecode +>> +stream +x #ez +endstream +endobj + +156 0 obj +<< + /Type /FontDescriptor + /FontName /GOMQCD+Ubuntu-Bold + /Flags 131076 + /FontBBox [-72 -188 928 783] + /ItalicAngle 0 + /Ascent 776 + /Descent -185 + /CapHeight 693 + /StemV 168.6 + /CIDSet 155 0 R + /FontFile2 158 0 R +>> +endobj + +157 0 obj +<< + /Length 1376 + /Type /CMap + /WMode 0 +>> +stream +%!PS-Adobe-3.0 Resource-CMap +%%DocumentNeededResources: procset CIDInit +%%IncludeResource: procset CIDInit +%%BeginResource: CMap Custom +%%Title: (Custom Adobe Identity 0) +%%Version: 1 +%%EndComments +/CIDInit /ProcSet findresource begin +12 dict begin +begincmap +/CIDSystemInfo 3 dict dup begin + /Registry (Adobe) def + /Ordering (Identity) def + /Supplement 0 def +end def +/CMapName /Custom def +/CMapVersion 1 def +/CMapType 0 def +/WMode 0 def +1 begincodespacerange +<0000> +endcodespacerange +55 beginbfchar +<0001> <004F> +<0002> <006C> +<0003> <0069> +<0004> <0076> +<0005> <0065> +<0006> <0072> +<0007> <0020> +<0008> <0042> +<0009> <0079> +<000A> <0061> +<000B> <006E> +<000C> <004A> +<000D> <0075> +<000E> <006F> +<000F> <0053> +<0010> <0066> +<0011> <0074> +<0012> <0077> +<0013> <0044> +<0014> <0070> +<0015> <0073> +<0016> <0063> +<0017> <003A> +<0018> <0050> +<0019> <006A> +<001A> <0064> +<001B> <004D> +<001C> <0054> +<001D> <0068> +<001E> <0067> +<001F> <0045> +<0020> <0032> +<0021> <0026> +<0022> <0033> +<0023> <0059> +<0024> <0030> +<0025> <0036> +<0026> <0043> +<0027> <006D> +<0028> <0031> +<0029> <0055> +<002A> <0041> +<002B> <004C> +<002C> <0078> +<002D> <0047> +<002E> <0028> +<002F> <0029> +<0030> <0039> +<0031> <002C> +<0032> <0038> +<0033> <0037> +<0034> <006B> +<0035> <0057> +<0036> <0049> +<0037> <005A> +endbfchar +endcmap +CMapName currentdict /CMap defineresource pop +end +end +%%EndResource +%%EOF +endstream +endobj + +158 0 obj +<< + /Length 9829 + /Filter /FlateDecode +>> +stream +x{ytuo` ,$A EB$Ql(E")ɱڴŪ8l9DqCIJYDR/U4~9I覊4=7e)Kz7y  +'C ׶/e}T@ `v?xdKێpo {fgؙ~ жg)34D[8|l| xis1 4)POmc@N<9@FfyKGx 3or*O8 x>|W;Yx N{Jj{ZU dIu#niWO ` ˿dX|ȖCoㆁ}ޞ5W:ZSMƺX4EbX>8cSeCLO{mZ-Ǧ滛*jxoJ.O꙯鉢 FOS z ij}m\-/! x(lT>ϞZ)\Q $4eIJ*A*)Ajl.X%:陸P^T'.&& QL 6k{r~pZ چmcnWd=w;mRn+޹_߹+iN0|U2 zCnoQ+NiiM'w>ϟ>7gG[?sZm;?Janғl|AД:r^W k c{{ťŒXlN;Zt֖&ybTxHkKfjwBc/H;N_Gmg7V՛jhpfOhjqq(.I;vnt7&(X)QYn\kNV]Rj=kR-K6^+'tod  y yg헎! 9* +,v`%23o&YMʶ+&-kmif\?soDZgSTm 5>aw0"#ȢL>$̄L +7ガrB@ yxL+80 ( &Ȥqfli&bl,A_Ei%SĩWpT*{ڛA Hd=[3@y\Ej ;򹭾91Ɏ ``8!w^O1ncu0ꉧVbkwãFRwVΥJ L$]Z,]4'J%.i.bbCʹy`&&i|&bkY/huk>ocg)-Fy5 #&԰~aGFj*xxAh^v&`F% Ylv1AۯSI&&VҤ.' k 6&3+? kd)yƅwʊ)ט7s b0SV)ͪWWQ80 +0 `Uw 0Gf:)!"?yˏ~F98&Z9nb[IlikL*K5{%jC?Kp-X] %2r(kl=L@o nLjc;:|Nɬ[wYE{LW_18au>)17ۥ!QdGx0# ;^֭kْWHIN{64%Nŋgf8{l|ﱥa.k' Łfݪ 4G]6]GoLklG3*3l(:.:܂U ޒ$Dx ἠ0lQDubιI+hRM)*D@  r 2ZTN1KԢBO f0X +Fsy)[K(H,?(gJҼLi~B,Rw#51wR3ք. ɔ8m{NANqy6=J%7M?a??2m{CHdx|Gcm#8U%AZ򵦢~$Ap<`rBUlWMS*V3k@ydGİ_ i='w?o{j?u[i*.#)+>tf;NO grL̨T (gܻ~UL ,/C/Oڡw^i]Ж: %9ȉ\r'Lq gɹbU^KH +aԕ˟8|.P5mv;ȗ=vO+I@/.cIs ˗gmCyǜl``G+Ƽ[~ULARLM'QC93u^2qG:Ւq 3y'}/tܔO?cCAӐJY[+au,TMe֏&fԶwۿC(aQtxW(&Hs#=־- Al[:D52n;?fqB'G.@L-A4".._8kc">N#gzaNDJ,D ~g\ΥRs~L45a\L.99͸\lJ~E[ gEnLDl0g Vd!BZZO^ͳoi+B#onW*kSfrXf` +83~Jש{]J6wȅ'oF(FCo5#?dcY7 +p9G]v"2&Db*j +l-ev !ʏdgE=1߁̬a Teu+4\>*G35P6O61H8,aXdmN QY;{;sTegR*2Xr(ٕ8ńwc6ӶɉQYwoUVuO3y.cԛU"_M`;9c=y1Ύ&{7ٗw׵WU IbeuhxjW`m1usQ#}}l kOqIUt@g@~<*V6 v XvbX*Z≝9 8@B'F +WO%t9.^Ax{N% +kNcgy@=xFSsc ]ү}ൃixq`~W%.-Mj e +;v[LeWXOtVSFRד<ֳ#ȓg-XMMm551w/:Ԏ>2wl׭;Or'<Ȑ|]Nܕ zwq9۾u&_xv{1ZE)pT& +kyZQt#^@fX3r40|e5{?ym"\Riƶp[jO_Ji$HxZt;5ʛ+jEnL #eXOP 5_!5!!845],& GO g& `8k3*ڗ^*]E*R%cڳ&ݝ=gj4JV=WE |\*tn&ޯx قG&a*)v]W"TJM7z'89G(U[w.\|_?_]hX[𥥡5s>s%"a|Zoa +r +5lrUΉ\o$WK"=]q+W+W[Fzc9jx +)FaM Q~-RػV;-Ɨ^0*xU+/#ėR؜Ln.TW\#v`@ѝAEZs: IY=p;.Q ~\gEL3CAbJ$v +~6Z@>eD"<%lfAx>g4M~7D$Ā߄5zJa7#7}ߐ-QkD+2I!1D`uHXrETO*nDiR3wT*}j!@Iu+fV7Ն+(̙@*ylVN]~؁=\6$ +嬭͗q ͊)դx ׫ݏwW\fnZH*pT"StRT?cxԖKUlۉEjÃ='#/Ӿ(6qyS.%apg0I7㩭OULq[pC [-RTeīC#-zJ tٱcdO&ϾwF,Z}dc1V*PI3Mhѣ +]3 %b'iUawE2B&0\fPl62R%Bgє-mcWj9*mBzRrglO}'Ⲷ>kw~^~ $، flHwʯ1ebu[;sv(hBi7,Hyp If,9'o~+{;VBdŻ*G2"(lmo ,LEfh_EdrB ka0:ďG25 y@z 9--=)!4ϺY;P9͢(-FcRШ4=kޥytsS9UZS,C#v?f$Fr IXgYC>K_뷯)ŴZCNao⿪eM_8{ăcmw9|&2 ^\Q0`BAVE7&E 艴׈6#0Mfd6_G8Xh9icrZf`-&,TGޔɕe3+W&JƩMdR))aTme9&fۿJ5󭳝ΌXߔ9lj{csJވy\/oⱁ+< f eW|uJI&\7]5b.t^;qNwN2ĂN:ć"52!"ߌ4d##Ag$闝p!7 +d@q+[?zQ"` h_Y0 +|#0)*E^ +r^jQc0N'ÀEx=WݯD){;[A7^zzջ u`wN9qJDQ8|Ba-/i[?j^@vao%߽*{՟^ǧߝ8}zUN3rK`\9k0)ahR;6xp[G*ٽyh7Q#&[C0 lg)t05.S!+-=F%9ulbGofhl{|Dև>'J'M=Ӡv ˗vpd˛O2]GxnJ{S.d*Lm?vۧ&_ |ݘ]޺?| @\#˽Pc#VF÷ ø PXH?$e(ȋ0H40z}P$X}LB!Ja-# P8Ixj{`CH2C'Eg3$ WA##gH: L: J 3EEu(da4|28E H^(2;a@x?^ğ Sf~b2aL`0Ckn oYvXcs[.˶O_5?/Hqls[t ^R0`TM > g iR-j.xZ6 ިU&p!Y8jZ<[-*[Z^8<{a7P!ihfPa?v4<*l&P20 @Pp +{zxfϽ?yL4ұw_yF44Ad@kMiʅ?ixH {aX_<:G= +`ݻWYJ;ݧ8 )xTiW} v$7#~ l00 Da`0 (l8 V(Bp4:p\ B A@ +CX5)Uk@vO}P _ o(+C z H|&DbA߹ꗇ7nᑄg/, +endstream +endobj + +159 0 obj +<< + /Type /Font + /Subtype /Type0 + /BaseFont /KSCKQS+Ubuntu + /Encoding /Identity-H + /DescendantFonts [160 0 R] + /ToUnicode 163 0 R +>> +endobj + +160 0 obj +<< + /Type /Font + /Subtype /CIDFontType2 + /BaseFont /KSCKQS+Ubuntu + /CIDSystemInfo << + /Registry (Adobe) + /Ordering (Identity) + /Supplement 0 + >> + /FontDescriptor 162 0 R + /DW 0 + /CIDToGIDMap /Identity + /W [0 0 500 1 1 590 2 2 589 3 5 564 6 6 950 7 7 589 8 8 386 9 9 402 10 10 574 11 11 246 12 12 861 13 13 559 14 14 231 15 15 279 16 16 608 17 17 386 18 18 273 19 19 252.99998 20 20 246 21 21 465 22 22 537 23 24 564 25 25 299 26 26 446 27 27 360 28 28 620 29 29 522 30 30 589 31 31 574 32 32 578 33 33 500 34 34 501.99997 35 35 522 36 36 777 37 37 713 38 38 246 39 39 571 40 40 497 41 41 728 42 42 252.99998 43 43 629 44 44 324 45 45 510.99997 46 46 565 47 47 532 48 48 324 49 49 778 50 50 519 51 51 672 52 52 778 53 53 705 54 54 564 55 55 871 56 56 688 57 57 929 58 58 571 59 59 643 60 61 564 62 62 663 63 63 471 64 64 643 65 65 1033 66 67 417 68 68 629 69 69 269 70 70 656] +>> +endobj + +161 0 obj +<< + /Length 13 + /Filter /FlateDecode +>> +stream +x +6 +endstream +endobj + +162 0 obj +<< + /Type /FontDescriptor + /FontName /KSCKQS+Ubuntu + /Flags 131076 + /FontBBox [-68 -188 966 783] + /ItalicAngle 0 + /Ascent 776 + /Descent -185 + /CapHeight 693 + /StemV 95.4 + /CIDSet 161 0 R + /FontFile2 164 0 R +>> +endobj + +163 0 obj +<< + /Length 1598 + /Type /CMap + /WMode 0 +>> +stream +%!PS-Adobe-3.0 Resource-CMap +%%DocumentNeededResources: procset CIDInit +%%IncludeResource: procset CIDInit +%%BeginResource: CMap Custom +%%Title: (Custom Adobe Identity 0) +%%Version: 1 +%%EndComments +/CIDInit /ProcSet findresource begin +12 dict begin +begincmap +/CIDSystemInfo 3 dict dup begin + /Registry (Adobe) def + /Ordering (Identity) def + /Supplement 0 def +end def +/CMapName /Custom def +/CMapVersion 1 def +/CMapType 0 def +/WMode 0 def +1 begincodespacerange +<0000> +endcodespacerange +70 beginbfchar +<0001> <006F> +<0002> <0062> +<0003> <0032> +<0004> <0034> +<0005> <0038> +<0006> <0040> +<0007> <0070> +<0008> <0072> +<0009> <0074> +<000A> <006E> +<000B> <002E> +<000C> <006D> +<000D> <0065> +<000E> <0020> +<000F> <007C> +<0010> <0050> +<0011> <0066> +<0012> <006C> +<0013> <0069> +<0014> <003A> +<0015> <0063> +<0016> <0046> +<0017> <0030> +<0018> <0035> +<0019> <002D> +<001A> <0073> +<001B> <2022> +<001C> <0043> +<001D> <0061> +<001E> <0064> +<001F> <0075> +<0020> <0067> +<0021> <004A> +<0022> <0076> +<0023> <006B> +<0024> <0077> +<0025> <0044> +<0026> <002C> +<0027> <0068> +<0028> <0079> +<0029> <004E> +<002A> <006A> +<002B> <0052> +<002C> <0028> +<002D> <0078> +<002E> <0054> +<002F> <0053> +<0030> <0029> +<0031> <0051> +<0032> <004C> +<0033> <0047> +<0034> <004F> +<0035> <0048> +<0036> <0033> +<0037> <004D> +<0038> <0055> +<0039> <0057> +<003A> <0045> +<003B> <0042> +<003C> <0031> +<003D> <0036> +<003E> <0041> +<003F> <007A> +<0040> <00660069> +<0041> <006600660069> +<0042> <201C> +<0043> <201D> +<0044> <004B> +<0045> <0049> +<0046> <0056> +endbfchar +endcmap +CMapName currentdict /CMap defineresource pop +end +end +%%EndResource +%%EOF +endstream +endobj + +164 0 obj +<< + /Length 14723 + /Filter /FlateDecode +>> +stream +xͼ{xו/gUuwSV[R K'P$p0'dl'c<=Iq2n 0IsώsddLbA}UIyn۪k׮[v8 + n9x@.-Իm]2}~mHEt +;NLMиc k[tǮhH{L<nYxfġ܏4fnlx@S=S~gV>ߺ{04@o@=[FBFnYF9<`.7/b rpm7 7E>Ñ݄ 6XYXI@.C7 dއ50=p/Ca1HCa% 1xDl +.ãJVX 5V-,AtYSWXqPGG֬^5sF]3ꦤq쎏bU-gɸܓ=Xxwu9cuŻڪWWA< )o#F,9CskLgb2;4<ƌ62teYYN3OwLZ, wU2eBlWւp,O\PasuU,{tx4.+,+H#x•1$Ux;٣ꪬ)iȚ=9$7oفcͪrOV(̵Lm'31%;qGެ7ޙ|xTF\=jR-]TO7K9ã!v^@=8,96:-Ofmh8UDzdb,>u 12%z>{3ΜMp( 3cH)!fMxgkMYK)*0,tV\+]1%L/1xkW_86fwR0&s",!k={q@r;xCͅIq- +/Κo.lS1 gaHowYuhkmw d]g͋ +,Z3U ./3O>q|/_} /<cYͪqXxD\crG7;XωOm :7,'tVWy&NfϨdvы n8s Kq7Ħ%߬༐yNtàByh؅ܵװ)|O0CЮdҮ(t;>KqJa63'&1B2Ɔ/{׵F$J[ʓHn}[{n+GVݲ7SrfPSM1=Oe< ' +A4)Mg{FmO +եrב`rΊF}5 VDТ/`+x_}h, +V^AcąܵsbVr׍^r@4؍몕rv1s 2ni1VJIޟw%-\UsT +;cV<>,\]ú)&Œuژ:([d>ߋk[#buyKH:.yd%P\ 5t[]Tk5JÜS#T*],r +i+ypp"qIj&|Y,2'\>w:V>7k=#̵[Rs\ouߧҩ/]W u71M1#ťxC6S\vlժ?${d?^C}gΐgk+ 4n[MAz"sAKpV#.VI$h*n'r75 ]rG]O)CNO)/1xІx"n{sk=upA< m*A +j-z&b짊݇9l"=ОKi^+\E T!%os_Vk[mPS$K_߳u!0/f3XY^uܖwO0x[̲&2mATk _UE'wR&! +E!0yꆌDg])V m/I&2h]?O&΅l_Kk6X]=PFG=e*qm 5֔rnQk'):w%+nDN[mY,si yKɥRU+LSCHĵrfP>xBjNщ~Con4uk\-yJPM\D'gApȃVT4ʁfED5=%6 &K +H`IXscc8/hd6<-h.ghlysWfAb3pXĦ͜sxJ_JHh^Y$"I=qxJƸo^/h +V {Rc93.`SDx*͗9E^6YK0^t` !7Z"Mmd1'jug(wߖ.QJʃ`Imgr'FcbHr\Loo_zr o߃;]0ƈ0h3mЉX@F2I̐_;{ZW}z2^.usu tUa(y-Onu%bX t3V(?D-D,R :DL`oQTvpF_n +# iZA8иjYa{PyWEKfPUW΂Q!zyCsAcAeu9]0k5[9,]򌣧&cҎؑ?['EU+U|_ '\0ҾeSO=t`}9yZJr7y xbm@)j%!S"`%݆6\F8awJEvfء63 +e3gfle4lQ( ¦vjl3RXWIKM-)u:'~^ۑ[8v|@1Wyn@E J!}F:9N= qriYeMޯ@LI0QFYʱw?A=]_C[3Aገ쯫Bxe"i"[SlK$E19(~S=o۵_;Ar$dО f7OgvT,v{ 9o JsG4*)L4 o{%2(B9L4}2Q0>$ 8xDȌۧ)āþ~"+ˀp p/J~//;2l$an1b#ձĻKjjm+{qRw=Jo +&)z=@ @?2?Tj^YXmv֟7r +zDhx1( ׍wxKؠ,44xy>EY޼},~VPxOQWf>;q\|}ȝRvP=j+-EKx1 4k(\d/89yo;NvޖLo{uvvNYMYWz#jW0d7/gŬ4A@5j~^SUQp=ax3L6ta-Ƭ|yG0Y3Bԏhv|rkEʑۚgZɆSX}*SOQrׄdn~pB Ʊg󈓵\|s:Y t#};3N+uM>5lt_! /(5ND]11VfЖ wFHÕBrnoxA!VSӡc EƜE<3^!Q2AclH--;\#΀l8tnsʁ |)B)@P(x¢aQ_[YbFdOz~{z%_N<4nxX-rhbmVj15j53̸ë<~[`oguLrg\$Wf-!yqA1 *:ֺ1#}2=.6wNڣɪ@98^:*c0[wgv7VwTzB1gTyEd0}db>k"&3$ǐ0eeg`3i,omfL9o2`֜Ox’2}"&'phT@;TDHC`e!sϙ? +A;h]VIR)Ru`ۋ +b6ТA(_ +ËP Ȥk="-`dBH_͑5cS2gأئ"|`0nȻ:YL($fFDj;4q-ip 65ց~Vom߻vtaRY^adL6n0;cM6< Yri)ᑑVPb`4EOYaYH&&֬o}oKrL7q7R^1VA~W6Ep ./Pt4 X$ 3zЁw8*3c~Nj~䇰oHC A{J O5ie{Gڑst94Z$? G|pO>fSRtʥN22fck}l1T2 .J7 @aϻ0ID+82 lEGFo3J +-,wWWʍ`i+`>!+h#|oG?.<~9]3pǺߑm4;yGa]݇74'P~r/`&5اxf{a;l2YK'DՙG +u[ch1jYMZNK=MhU#ߌgbd&F\F|R̃6&W/ĕDOJR[ҖlC12O($B8eI ВLڎs\N4sjt"z`CW@\=FyP@=8/hE]<[ ]g|ࡐ4AEZXTx_ir}Oi l*Ɣ@mԑi(nU csWVv.tA[IErd'G1}F|A3"H+єQVct*)9&ȣE,"EWDž‹cx2IO[)N8>5(vu;sVפ ̲Ĉb:Bo="tuCgsYn>5~OS>P9Ê)(x<#$je=&,yK*ɘ2o2ٜu$ֶ$X)7]B êxp~9g>?3'砨oX;PnMy\DB +_@)LaNrIϳ̉E:;C^'"h' ȳN2$5N +N ;Db`_/bnS׃{+z?)C;;LҔ3^Cȏ+* m,֔[.шkKpDr_/}cyu_.b)N#ΑO;l_Lߨ_3)NIk7̿O64cCu@4u=YqAsaРK ] PMj9|K Yl2jin8bT'=bƍX"s- Rj{Ց ;6D(VA)(zuRN9;mIVB_Ki>t1܇ ;]`6XXYHGlO7o҉zg#tU?԰yBXMA|[&WJjɡ/tKEU@w>=AσEs7z̼,g-vS̒YF1e7K)k-2nW@[DsS+:@$QC{Cχ )?Ș6I{iqKn!v::@+ƪ]AfpEl жev@s](0T1آ +d#]c]o%h3s'O}g7!뾾|1@)9C9CM]V4`omĖ{u9u9cVQ2~F r B `C3rZM̫Ёm"C43: d85nA'!? ZZiZD(';K A -p# +`-|I 'n^Z +HBt` ea-}nbC0PDZ]N?PJ?C&+ V3ᄵi V%A.cb~kfyerr_p{6_;N9G]K\{/k܏?<޵ޫRm7|Yh-?TԢ\@O#""Gy7r-dYq1@(` +` ,[~E  +3,op +u+:BtG3ppPQYs! +uu;ԓ18z쁽pN;ȐZ: &`7ݰ2 :o0[adxv$l [Al@^y2A {l0`&`{a4K[SZf,wYN8:N_>NK{S} _'>A2BOG 4Dp&CM#')n:0=LCbO흢”SRe +wHtʁ9v5. 2'Bள)||@<Kz +endstream +endobj + +165 0 obj +<< + /Type /Font + /Subtype /Type0 + /BaseFont /TOLZWC+Ubuntu-Light + /Encoding /Identity-H + /DescendantFonts [166 0 R] + /ToUnicode 169 0 R +>> +endobj + +166 0 obj +<< + /Type /Font + /Subtype /CIDFontType2 + /BaseFont /TOLZWC+Ubuntu-Light + /CIDSystemInfo << + /Registry (Adobe) + /Ordering (Identity) + /Supplement 0 + >> + /FontDescriptor 168 0 R + /DW 0 + /CIDToGIDMap /Identity + /W [0 0 500 1 1 592 2 2 374 3 3 582 4 4 376 5 5 548 6 6 428 7 7 237 8 8 569 9 9 509 10 10 255 11 11 228 12 12 555 13 13 499 14 14 583 15 15 460 16 16 583 17 17 569 18 18 387 19 19 237] +>> +endobj + +167 0 obj +<< + /Length 11 + /Filter /FlateDecode +>> +stream +x +endstream +endobj + +168 0 obj +<< + /Type /FontDescriptor + /FontName /TOLZWC+Ubuntu-Light + /Flags 131076 + /FontBBox [-63 -187 556 776] + /ItalicAngle 0 + /Ascent 776 + /Descent -185 + /CapHeight 693 + /StemV 71 + /CIDSet 167 0 R + /FontFile2 170 0 R +>> +endobj + +169 0 obj +<< + /Length 872 + /Type /CMap + /WMode 0 +>> +stream +%!PS-Adobe-3.0 Resource-CMap +%%DocumentNeededResources: procset CIDInit +%%IncludeResource: procset CIDInit +%%BeginResource: CMap Custom +%%Title: (Custom Adobe Identity 0) +%%Version: 1 +%%EndComments +/CIDInit /ProcSet findresource begin +12 dict begin +begincmap +/CIDSystemInfo 3 dict dup begin + /Registry (Adobe) def + /Ordering (Identity) def + /Supplement 0 def +end def +/CMapName /Custom def +/CMapVersion 1 def +/CMapType 0 def +/WMode 0 def +1 begincodespacerange +<0000> +endcodespacerange +19 beginbfchar +<0001> <0050> +<0002> <0072> +<0003> <006F> +<0004> <0066> +<0005> <0065> +<0006> <0073> +<0007> <0069> +<0008> <006E> +<0009> <0061> +<000A> <006C> +<000B> <0020> +<000C> <0045> +<000D> <0078> +<000E> <0070> +<000F> <0063> +<0010> <0064> +<0011> <0075> +<0012> <0074> +<0013> <006A> +endbfchar +endcmap +CMapName currentdict /CMap defineresource pop +end +end +%%EndResource +%%EOF +endstream +endobj + +170 0 obj +<< + /Length 5337 + /Filter /FlateDecode +>> +stream +xYkpu]<xP HAԃI--ʡLHmȶdyX&i5ɤLI&ӕ%;T&rjq&ԝiM^u0Ƕv*st$=us{ι`\8=O,?G>x/5||8Pb*-qb%=xR;j ;`G3Ѯ({@G/?bP*?͵h٣G/) }}(QUn$pkP]0"`0x zzoل=؃A b7v ,maT@n4kjgqǽkb| nۺeΎmr:Dj8CGAWyҬMLtR[+FsyC-؝s ֕ Ιjx\mfL&[C-hJ^SٞbISYX1iݤ-fÓfU-DUͫcġ|w9Ggg;]ڨFvTlM-,oֺun,'']_lX"sbmHH%)<9J}5+FU;ԒjT#D{#]>m/)֮dcuࣻJX4پٜx]k꒨mZ"Z!ԥ KFNS6wLʚ*cK}KsCvWeI*m,=F `;۾k02DY{Xۃ;,r\[y&}z[HgO׷{H[ {t}VkilVoil+?^.;Vよ JuAROPtB=*BIwqn[N>w }F2ލsҏW v˄q i~߷ǕJ z1}cv5ͷ-]+:h y1ڀ隬ωZ?'f/m@.W߼zbvBdt;ۨUe QA%9LfK-z#MУR +r\,Lʤ'y"B5%|16E|D/W_ >S!h(r-!bdRI2]$E7f\.k0lk2\Ns+!x46{e/#&^n϶ S?|Ѳm΄B>q)Q@oí+=݃<3Va~/]Bkjnݧ:wSd֨z Co!BkrQ( HZGხJaE.#%t? =@ IV0I` G0%/Bo.W/Z͸ષf}-Wp@wEН:wI`ٜ6)4f%Ύ$NaNڬ:1f{^"s922+9*dZW̨^@6xS}n Jva!ѕ'`lx(796m1_?"d CCˤ_d4&kJTþFYn~)E"X #}ᩜc!U{ĵPZO¤9 ւg +&j,#nE +6-(@h)vyy.^ Ʒ-Tרs-J?adOiY /x=Ѣ'&$P_Ws "ndKC 6@ȉ5+Ѡ&rM俚(J'J'F6\ˍI''s3ç.&6Y3fHw_ׄJIoD~餲[ +H]u-ߛdWO{16d;dgszV;J7ϸoP1\ϥXyvmۙc% + ㏮q'B{عՋuuv?ͫb`h7r|3Zݲcs8CcXu ΐj<^z3 !ud3rcC{cO(c՘i[6/

^ lK&؛%h[mɧj38^xnp *+kLs쮎s AW/&EzJTN({t>t\eVJTE:n(;bO&d璬;$1xj3bRSmg&f~/jg'Edžrzjy6 ܾfmz3ln#=38go8007Tll%#1<͟!Kg76 uQ^?XgWNvvY}},:(bneJtkJF谬.E<_ D,h8vx()6a t?.ޕMq3HW[@.W_5F^;3" skvu# d'7ת/V fC .WFN"%$u.$QUE3i]aש`CfZr-{Úv3i +[J{Եeٵ[FF}{J~߭tohޤ_zqcTWz^^6+Q4zU_x^q;HN`7CnYMbc| i)aoc7{Y>, JE?9pݲuim;p}_2+pCB7fjwXQ7s@fsuVyr6 +i iMO6څ>|v#~QQw̒?ߠ|2A7*w6)O+ʙ|E=ɞ|TRrO'NJG%˧ة{=c<*=Eغ#mbW#HEyhW((2(2(|EWe"_Qy6j/ky)#ȵ>2Qxik;kNڝv4kwT!8iOl2Å0evns!`)*s={+gg?b$݈O/ggJMp<:~w|)Z|dT=Y{S*9Hlb +GRѽ/S +endstream +endobj + +171 0 obj +<< + /Type /Font + /Subtype /Type0 + /BaseFont /CFPIRH+Ubuntu-Italic + /Encoding /Identity-H + /DescendantFonts [172 0 R] + /ToUnicode 175 0 R +>> +endobj + +172 0 obj +<< + /Type /Font + /Subtype /CIDFontType2 + /BaseFont /CFPIRH+Ubuntu-Italic + /CIDSystemInfo << + /Registry (Adobe) + /Ordering (Identity) + /Supplement 0 + >> + /FontDescriptor 174 0 R + /DW 0 + /CIDToGIDMap /Identity + /W [0 0 500 1 1 691 2 2 555 3 3 263 4 4 231 5 5 517 6 6 518 7 7 372 8 8 481 9 9 249 10 10 451 11 11 412 12 12 609 13 13 828 14 14 555 15 15 389 16 16 246 17 17 666 18 18 614 19 19 551 20 20 478 21 21 368 22 22 916 23 23 507.00003 24 24 547 25 25 550 26 26 552 27 27 618 28 28 544 29 29 517 30 30 557 31 31 636 32 32 640 33 33 847 34 35 317 36 36 681 37 37 550 38 38 276 39 39 546 40 40 623 41 41 787] +>> +endobj + +173 0 obj +<< + /Length 14 + /Filter /FlateDecode +>> +stream +x +endstream +endobj + +174 0 obj +<< + /Type /FontDescriptor + /FontName /CFPIRH+Ubuntu-Italic + /Flags 131140 + /FontBBox [-56 -189 1046 783] + /ItalicAngle -13 + /Ascent 776 + /Descent -185 + /CapHeight 693 + /StemV 95.4 + /CIDSet 173 0 R + /FontFile2 176 0 R +>> +endobj + +175 0 obj +<< + /Length 1180 + /Type /CMap + /WMode 0 +>> +stream +%!PS-Adobe-3.0 Resource-CMap +%%DocumentNeededResources: procset CIDInit +%%IncludeResource: procset CIDInit +%%BeginResource: CMap Custom +%%Title: (Custom Adobe Identity 0) +%%Version: 1 +%%EndComments +/CIDInit /ProcSet findresource begin +12 dict begin +begincmap +/CIDSystemInfo 3 dict dup begin + /Registry (Adobe) def + /Ordering (Identity) def + /Supplement 0 def +end def +/CMapName /Custom def +/CMapVersion 1 def +/CMapType 0 def +/WMode 0 def +1 begincodespacerange +<0000> +endcodespacerange +41 beginbfchar +<0001> <0044> +<0002> <0054> +<0003> <0049> +<0004> <0020> +<0005> <0053> +<0006> <0065> +<0007> <0072> +<0008> <0076> +<0009> <0069> +<000A> <0063> +<000B> <0073> +<000C> <0052> +<000D> <006D> +<000E> <006F> +<000F> <0074> +<0010> <002C> +<0011> <0055> +<0012> <004B> +<0013> <006E> +<0014> <0079> +<0015> <0066> +<0016> <0057> +<0017> <004C> +<0018> <0064> +<0019> <0075> +<001A> <0068> +<001B> <0042> +<001C> <0061> +<001D> <006B> +<001E> <0045> +<001F> <0041> +<0020> <0026> +<0021> <004D> +<0022> <0028> +<0023> <0029> +<0024> <0048> +<0025> <0067> +<0026> <006C> +<0027> <0070> +<0028> <0056> +<0029> <0077> +endbfchar +endcmap +CMapName currentdict /CMap defineresource pop +end +end +%%EndResource +%%EOF +endstream +endobj + +176 0 obj +<< + /Length 10878 + /Filter /FlateDecode +>> +stream +x{{xuw0= @ @ ALCD˜mR,Yے(bV44vZuj"c*Nb5ToZ?]ﮣ(m.eݸN";C=dw+$}̝;8p~@v~/ڮ=v@L3@G%޽cc3T7 q7s>›y<1s%K?`y0@gw}w:} uoA,̭K{rl.\Z‘_XZy"t=@}[/A'@(}35`5lpLK 0 E F6Xi]0 -0 YxF;a#X)N̗t :IM45PL&7o86a12<48wmO^Zy|G{۪LScC]MZK'zN]Yy G 4ijfhͨŚk:Z~LQf###HH"ؠij^M]$7Mhj^mR-.pjxc){"Vwml 8p:X;Eкէ(n|lKG&z#$냵^EڢK WO5=EM]&dc ĉE_X?JcCߎbWLk <'~ E2-{fkR5`_񊘊dfEڢ/ǹ|~Qm ⑱r[m@Ϥ'tϜ]9S1grǥ6ܭlS7Y$>Lo۾˙'޲6O^Ϙw*fdD1+ZOy؄kp˦ vyYQ^[UL_/K; {icg WxUA+L<Ebl:2[TwxQ,Imb$&/F4$>2ze0-)4Mj-IhIj=E[R,ZM\ўNuD`eX9kǒ,rɵxKDlFwJsN|(\s/_S9wj8zoG59An{ea>'\΁S\R-ZB&b_yꄶCvE}t ewx60҇zG|8$C/Y z(tCR #KYG6.Jr-]tUkMmKBP-QS+uİPpx"s㏶yөmo>No\'ʭ6~7>A"&}. F^"Na֒Vb,TIFu~0l6.K!k.0 F8ޖ86PJ`op4pOs +_-\~g|o]~g|Ks_;S&Zĭj( ښ +9JQLM=J>Fxc$Iz1!4sj{"V+Uuκ愽Q6WU!q=jx#2 kKuԵojt>w(̖ާMT/%'--۸,k>aMg;]FK?GG4ɣr%^\hetyq;rLKWeHiCixD]Yج2J wa{Cjt hksC-Jju7$MI⌮JK* OuFv6w/*[tL(ݠxx*8`}os:  Jz:^r\ ^x=~ϐ{eyy¹sϟg !D_ŽHi]*[zSw}J1A_<2>*@WH.]u -bDFy!|)΂HD')[֬8JйX:E0Nk`7(ZAbP@&>>p\a//L< +rM\m.+wя#D;[nRԱݕ;=}fL[E 7|}8Q;nPA6-,7Ms'9 s| A2d+SXSK٩&j5ZroM; BA5EWdU8,L+@,$uAE {|֊ +z=U{46]>_Fs@v=-mkƶ-&C҄m0aLޣ\jBumDc1;6gJ}<[u7md{x]B/rX7ZͥZ;eNz['" WUV.Ģr,ECG&ND1z6z{"JQt.vYsϧSFXl8@:R'+RU;mJEC4,R K`)+"ky%35uajov4 +ڻHh(.&AT.>ݰ&)ڬ ^QSvʔv  +e[n-ZshiZ>+r{"`&=$-]*]L πtIh(уU%M/g=wQq:ʩYʜ0*]Aa)N7Iye 3HwcwpC;gW_>nh֔,a(11od *ݡS@m~t{ 0+Tgi`?q*"1Nt❸N\G'é ^]v;Xz˧}<{Zde$;fFvgٖK{2  aU0%4PY!dK_ +/wK_čD|҂ ~֗W2PVbVɍxZ4)uqw֮ wz3O 66^Iɪlj0"х7o f!U/ȸGn=Pty1Ph焐[CP`+8 ON#O\C92\:50ߚTcw$ J|P:\)\ꥭT,qO \)# +RX:M'=@euͥZ F8 +х\Uv*~b8y(;LV'd>YM$-:X5(Nxq#sߞO}P"I_ʪ&MaIm5})ʨg]~]J'+NՑX=V7[ۣ5xș5GMDm/Kki+'@$i͏ɼ4 u:(3opK널hYx|AʢW:7Drk{};~ [i-sͅ`TYs63a_⮱m6굍DJ׷i1)ěTF͍wkڶ*=%%2_hg!.->4e~8ʋEQQˇ ;:p A 9n0M5O],G`.}^dHpTEH_Vj$8ݲ(Df_DDUdƩ"tw W`>G|`>(qǕN*[Ko-D^ =Q<|+iMC@!cH;WDFS mVM>Gg>;>痿ح8v/-ʭȭ+#? C$`-yu( .o +ťG><=]5>} 3T&f`4M"3ZӥErLJaF `pA Ɋ +@b:psSGO6lj!{@q1(p9%-ZC:?')ڲnԷ#KSlj5Bj J9$Gtl_#$t8м n3A(؟St m,2t V상l- 4M~R5jwٮ]]dcTሣᆤhghT% ޘF9w3΅`Wy!1!`)rV&6s[\Ͻ騳ʟWR.aJrDCnj/g%t#sWlzN]2 _aaI + _3z0F4|oRqC +ۅWA$_MlB{ͧj<1 3cJŬ]NˀSCVF%5pK<:=OV'q0+imcj=z"DC*;\us,3_Q?"-JNzV] ~+{(gjW* LԮmPOy`jgC"?ӿ~|rd}nOt|Ԛؓx^!PliΎ8Zjsu|aİA*Aӱ,E9:]1 G8(@Q~dO֋ԕucp̓7vt FޤIūx*<$O$$Y_J!8Muf9980A;>g .=WXJv̏~k*}΄+?>SLHgKJR08 +y^] <ӒgB_uDʖT9.,`c3RF;SV}x!(2= Y!3M.Jg%*yc GFvU&hY7t<0U^?b ++H },6β|!+=YnpO )5*S\ G`D06r'.!zhNa( @d BEwIL$A7A*C<$ D7$+NQwOUk~^9{fXKEj |wTt VEs)m׬;rRXcs_WIN<|钞Aar vn/@zXxB`"CfK`\k3Ă{<&-E H|dO7}e@C݁ @kFi+ bC cE9F1el `]Vs%.%OJAt@?[vxJ5*? =HOY~L^p˷qst.:2S4y0׷։`dJ$XX} + TFc1!P3>2ѨbAIFY}`l`'mk:ᣑxA%t$: |B;TiaE@\~g q"\:D+Yv!dt-Ȃ(aZW!$e]_) ֚`e?u [5iOҮi!i;Xq6pKmqGn%Ƶ4]u/-6HX3HjzURNf|3VV"aGUMS$Q/):w.@|I44wX2\ZXʥ^#,˶'㈥*b!N `6 +TPP0 +HOey7B sYVd}0}Fum|ց"I~!+GCr46 t4ڐֺCݶ8EJgg|eXcjxjJw&}~K'f-T o:>TǷn ܿރ7=ᆻ8l<{xQ'+ ;p0P.%Z6#1X\gbŕܻ+f +;S¢ȯOVU.xup';kҫWSɿCڄFtV?vU%j +ƒ_}b\[~Hd{jisy3CӶF;L^B)M|bd/x2B A;ie3?ҕl .0V!S[5}y./ɸo81 t fL?w9݂G)u[ R^~ ] 7ggܸggIw Y!]X@zz*AIh(QLĆX<0T3׹3V9r"4"(4o` VB):\H \V\. #9oV;IZ[ʁ=AIp4/@95+n=2G]-*ZQ@ʍԜ/js֌``CP:TeDe/gs~}azHmFa`K-3-AJ+W?j,roؖ>{GKj5=ק7WiaWMՙ=rMk\r1+QDksk}l`.33Z(K;yMl@JJ#$X DKd:Z~ !2pWt9pJ^N%YɰMR{wc˗tV>`eg&bbbb +։9哒ۣy4w'H#'{9ow3,͹s1턨^I8J)9}V΂?aǝ7t`j˱ΰ#=TjWAgBiۺ6~dR.'é-[6~ˮ]m7{Á +ǬXDd8b{k%ZSL"e"M4$ea|GnmfFs.<+d2.Z9|a pKj ^ AJƲq1cf;(bۙtГFq|/BGGSֳ`8S'SH,r(R`*<H(ʾd4?.uI`Aj ^Y.(.zKUa /+U ^0ͫ{@ /U_= F4B`Ő<ŗe&ҘvMkjڵi3(kB]k79}Tno)b +ؚo3gWKTӖ{wץwܸkmo|7{; !]';OJ~>:Zt?_\~Cwus+EZiLMb1GCZa 8 c%_:c\'4̒cp;|}>Cwr2W%e8E7Q 6SQFh#{Aznd G֔^߂1Za"9 {b!n%[-֬lpe1lpnv.9'f ) *}W>)_xb9eS)Bπ(Sǫκ+Kf d)f^Y@3<D0VѬIudZ5u'ͺ^Nvn8*@TX 3p;3T0 M:;`?YP.fa *ݰTm*j< Mn `Oqv]m .s.a삻`̰d : Qwhnע\f>x~8$Rfng#o^^y\VC2I fv&{v0 J1SP $@?`6B4| ٳ Cza=A5! NpA`l<pp>7݄J(d F iB\[;C瞎c'xH +"Ibqbㄇ!6 "ωJĢœ'L6y~^|g^ϼvӧO o>U{bBם'n=Ah넏~Hb_{>V{JǨ-(]*m}|ؗy:}c_$ɇb?44/|Sb'u>w<;>dzǹ):0Kǩ,b{kǸc>s${ӱO^!\L=L)ww7Oyu<7O}r{?lӴ1)Jc7{BOu_]ǦOx_"yp=?~}{?q߾q؛Kwo:k;Nom[''8eƓc'GOo8~<8 n=}[v͛ ,Ë?n. +[d܄G}즢u7m8EC|zU&OVM6Mu4QSLa:ޏ+?lwܕOA!ޏM̫M?OD(bjP +endstream +endobj + +177 0 obj +<< + /Type /Font + /Subtype /Type0 + /BaseFont /ZXCGTT+LibertinusSerif-Regular-Identity-H + /Encoding /Identity-H + /DescendantFonts [178 0 R] + /ToUnicode 181 0 R +>> +endobj + +178 0 obj +<< + /Type /Font + /Subtype /CIDFontType0 + /BaseFont /ZXCGTT+LibertinusSerif-Regular + /CIDSystemInfo << + /Registry (Adobe) + /Ordering (Identity) + /Supplement 0 + >> + /FontDescriptor 180 0 R + /DW 0 + /W [0 0 500 1 1 375] +>> +endobj + +179 0 obj +<< + /Length 9 + /Filter /FlateDecode +>> +stream +x; +endstream +endobj + +180 0 obj +<< + /Type /FontDescriptor + /FontName /ZXCGTT+LibertinusSerif-Regular + /Flags 131078 + /FontBBox [0 0 500 698] + /ItalicAngle 0 + /Ascent 894 + /Descent -246 + /CapHeight 658 + /StemV 95.4 + /CIDSet 179 0 R + /FontFile3 182 0 R +>> +endobj + +181 0 obj +<< + /Length 619 + /Type /CMap + /WMode 0 +>> +stream +%!PS-Adobe-3.0 Resource-CMap +%%DocumentNeededResources: procset CIDInit +%%IncludeResource: procset CIDInit +%%BeginResource: CMap Custom +%%Title: (Custom Adobe Identity 0) +%%Version: 1 +%%EndComments +/CIDInit /ProcSet findresource begin +12 dict begin +begincmap +/CIDSystemInfo 3 dict dup begin + /Registry (Adobe) def + /Ordering (Identity) def + /Supplement 0 def +end def +/CMapName /Custom def +/CMapVersion 1 def +/CMapType 0 def +/WMode 0 def +1 begincodespacerange +<0000> +endcodespacerange +1 beginbfchar +<0001> <2023> +endbfchar +endcmap +CMapName currentdict /CMap defineresource pop +end +end +%%EndResource +%%EOF +endstream +endobj + +182 0 obj +<< + /Length 344 + /Filter /FlateDecode + /Subtype /CIDFontType0C +>> +stream +xcd`aa`ddLJ-*+-N-L JM/I,ɹ!#CAAB<=EFBOVY \ (>񨀨W< ̌l|ގ)I)y%%E% +BHFY +EY% +%Ez L 8Θ;u3VNe4]yn\oMOQ4@!!&FFߔ?^cCe/s7ˏ~:nn}wߓX+ +bW}c3wOd{||95~Rl; +endstream +endobj + +183 0 obj +[/ICCBased 184 0 R] +endobj + +184 0 obj +<< + /Length 258 + /N 1 + /Range [0 1] + /Filter /FlateDecode +>> +stream +xuJPFOUvDD@`]\ +FMkIRB|&إnऋ(HrTų9` ըa&ʺ:l +3Ŭ*ުnh)&C|>b纝黓AvCƫ+ y') +̵8+/> + /F 4 + /StructParent 0 + /Contents (https://ob248.com) +>> +endobj + +189 0 obj +<< + /Type /Annot + /Subtype /Link + /Rect [116.44868 668.9756 165.04868 682.02954] + /Border [0 0 0] + /A << + /Type /Action + /S /URI + /URI (https://prayerbud.co.uk) + >> + /F 4 + /StructParent 1 + /Contents (https://prayerbud.co.uk) +>> +endobj + +190 0 obj +<< + /Type /Annot + /Subtype /Link + /Rect [30 396.27792 66.29448 409.33188] + /Border [0 0 0] + /A << + /Type /Action + /S /URI + /URI (https://glimpse.ob248.com) + >> + /F 4 + /StructParent 2 + /Contents (https://glimpse.ob248.com) +>> +endobj + +191 0 obj +<< + /Type /Page + /Resources << + /ProcSet [/PDF /Text /ImageC /ImageB] + /ColorSpace << + /c0 183 0 R + >> + /Font << + /f0 153 0 R + /f1 159 0 R + /f2 165 0 R + /f3 171 0 R + /f4 177 0 R + >> + >> + /MediaBox [0 0 595.2756 841.8898] + /StructParents 3 + /Tabs /S + /Parent 1 0 R + /Contents 192 0 R + /Annots [188 0 R 189 0 R 190 0 R] +>> +endobj + +192 0 obj +<< + /Length 4284 + /Filter /FlateDecode +>> +stream +x]Y~_AjnGQ3Hoq$$z=dcw,xQkvzUE={cݫ߼fb9{;L25sg~؝ӏ;~t{yzw~)\]\#̗v|[!rUUL:5&~-W~ ؙ7b?\{s,)3? +%7q VU,r^^%=Dt]jZizZ2Vv\^؟XƋʼn8[ǥcŤxu .p:h lZF %И6]a9 E/>ݰrh7A<{;-ΰwvV[uLwK` +zxu + +HTH ;i`gQ% r5k8m9[Ս +=>[-em Qs)]- +گiʃ\B x?ck|:H%WXYpMMC&B̌qM+qZiB ]IŤ=R-Fj +ȧ:3E.Zy4w̞~wu!28*7%7p79][G=u`GdjlRg&|:A3R,4-wSOhaE\"tϾirS50P(W 3``ʁRŸgWg`}fcnnYa0{o$ƞV]Iu!醎6Q%[[=Q x@91-.\/u(ڸ Ѻ5.JxZ5IR:n~n6 *4!gIg5?h-"Ɨ&8O>A8$-9VH9B#4x=#Nhdh1yw(:!gh +Lfky @h!W"vY%t1,fwt}e5` '7cX63ńscf__;=^:?XHq[%c EF-s'5ŬDOZ2ȧ#"_; +0R;{a*5W! j!2 >JW=CvjXG e|<83Y$v*'Ȑs' OQIIZ ̯H +Cۆªz(*|RQI1n?W$G4#Do? {L yFSp3tV#Cw,ܸIdw"İjh-*}l*,*E])B\ +1ٍ ˁlQXJf' ;Q&,Ni"EEZ0;).ߤ70?Ubࠨpt`wH{/p"``Q +)zkd)G)_X~Zɪ9hg"Ȗ_Iha]L#G{1d{h[Bn:'%>;3Uܗm$hY@KZU/&> ]gŬcO=jrBhndfYֲЪ(VI5umMn0qbmj+vRϡ4/DZQqe9`L -7n'5]\*8Qx`rq 4 !r7'g %fT-h?A2{!Q+%!8 += +hm5MI*d4\v'b7*TK θnfe(|p)ofOi-X H8LpZD a!Q@ݏ,t@u9Dk1Oi:w.TQHST2R/>a3Z='e|o@ +3H;-Be" jPm)_ fFhqqV +-cFa 񅁝x쫚)@e0 hOaPï`Uy`ԵTEGUNEm{\^otp M^5lDY'|ݱt,lehiۣk~H2aW֥+,p <5WQN7@2C>hNB"3U.Vy<#]GO>tWhP@KVi[<8 wϩNAQ-} Gڣ~Fוw޹CWڿc)BbĽ4CDt R{ wYGY=c>n3rfz{#ȮbuP|G#-ZOw՞VH4qݤ,8J"P$Ȫ9θRc,}t 1m˔!T)xZ<&}R؛i+1vivhϭ}ҔL{S"LVT-yj+)&F)45/J 0TfZ|kO=LST)53ODmve遲=T;aHJ>bȧ;)xR.ګh$"Tw[Mղ8;Qb YelZO|4^ +6j,$`q^uf)Q*JV1Ly*vhaWRJW׈[NC&uvTmvm2T c| +Yk/Xzoڌk+ +%ŧ|ݰgo߼}+ċoizF)@帟W^fKg +BIӚ D@E;b ) ~X,OT783)5: L.I}'~r*9](Z^'>M3|0w)UNK! A۴9 +RRsob3Bur+*UCD=r kmr \EJg|ɮ="JBY㤘ĕ\!GP:Q*i91B)DjI>ZrvW 6Q𻼓 +4ˣj߬E]_Ϻ#~2WP[J9DtB=d*Jy"d>pٛ?xENv<)Jl5E=pg +`h^bm$NHkvrІ! +tǣ+pn4n0'2D +`ʏI+!:гZ ̕]ƺvL*5ԵE8Ւilm\ +/nzSkBqU݁-@JٹTYDBDPBZH fB(3|p! "^.G䨮'ڃo[sYէIhzƿ Zdi>V\%w֛!cNm!s`^԰mOi@Q{rDJ{@ʹ*x-.<J Qm:cvoY;Jk +=BrɦSљ!Mmz}Ճ(! H'f{$!H 0E\@y[<!qS+jCv!]4?^n> ЕyU]=&p- vvGB%^I{1 >X0oUI M[|}k503ĝY4P. +8.S<&X =n=k#8 _t,>'hiDaj1 Hr휓}_\W/zM: (&Dx #5myAUrTbvkY#]"Q(cpӿ0>v$f0ʔKe#pFbbƕ)4dzɭV(jo9lg]-l*jpߠ!M=׬VMkײVUϿ@ArX_H{.#6?v3j ۚ-yҝ/@1hPp4A&U8CBaـr{Y\̸ؠFLUxVI|񂮑(H9U"3zZo)lAَeH6g-mwMOW+ovDw؂BR+O0!sQS5kM%p息w0/hP!^^PJdΰR?cEG b7 += o{d +endstream +endobj + +193 0 obj +<< + /Title (Oliver Bryan CV) + /Author (Oliver Bryan) + /Creator (Typst 0.14.2) + /ModDate (D:20260117214445Z) + /CreationDate (D:20260117214445Z) +>> +endobj + +194 0 obj +<< + /Length 1165 + /Type /Metadata + /Subtype /XML +>> +stream +Oliver Bryan CVOliver BryanTypst 0.14.2en-GB2026-01-17T21:44:45+00:002026-01-17T21:44:45+00:001application/pdfHOT054N5u8uxrZkElkFqQQ==7HUp3EyjbKaNAp3uawir4Q==proof1.7 +endstream +endobj + +195 0 obj +<< + /Type /Catalog + /Pages 1 0 R + /Metadata 194 0 R + /Lang (en-GB) + /StructTreeRoot 6 0 R + /MarkInfo << + /Marked true + /Suspects false + >> + /ViewerPreferences << + /Direction /L2R + >> + /Outlines 2 0 R +>> +endobj + +xref +0 196 +0000000000 65535 f +0000000016 00000 n +0000000082 00000 n +0000000162 00000 n +0000000265 00000 n +0000000368 00000 n +0000000465 00000 n +0000000720 00000 n +0000001411 00000 n +0000001720 00000 n +0000001850 00000 n +0000001934 00000 n +0000002032 00000 n +0000002124 00000 n +0000002213 00000 n +0000002344 00000 n +0000002429 00000 n +0000002523 00000 n +0000002612 00000 n +0000002743 00000 n +0000002828 00000 n +0000002922 00000 n +0000003011 00000 n +0000003096 00000 n +0000003175 00000 n +0000003317 00000 n +0000003396 00000 n +0000003541 00000 n +0000003672 00000 n +0000003757 00000 n +0000003855 00000 n +0000003947 00000 n +0000004036 00000 n +0000004167 00000 n +0000004252 00000 n +0000004343 00000 n +0000004432 00000 n +0000004517 00000 n +0000004596 00000 n +0000004738 00000 n +0000004817 00000 n +0000004962 00000 n +0000005093 00000 n +0000005178 00000 n +0000005276 00000 n +0000005368 00000 n +0000005457 00000 n +0000005588 00000 n +0000005673 00000 n +0000005764 00000 n +0000005853 00000 n +0000005984 00000 n +0000006069 00000 n +0000006160 00000 n +0000006249 00000 n +0000006380 00000 n +0000006465 00000 n +0000006556 00000 n +0000006645 00000 n +0000006730 00000 n +0000006809 00000 n +0000006951 00000 n +0000007030 00000 n +0000007175 00000 n +0000007306 00000 n +0000007391 00000 n +0000007489 00000 n +0000007581 00000 n +0000007670 00000 n +0000007801 00000 n +0000007886 00000 n +0000007983 00000 n +0000008072 00000 n +0000008203 00000 n +0000008288 00000 n +0000008382 00000 n +0000008471 00000 n +0000008556 00000 n +0000008635 00000 n +0000008777 00000 n +0000008863 00000 n +0000009005 00000 n +0000009204 00000 n +0000009316 00000 n +0000009401 00000 n +0000009480 00000 n +0000009622 00000 n +0000009701 00000 n +0000009846 00000 n +0000009931 00000 n +0000010010 00000 n +0000010152 00000 n +0000010231 00000 n +0000010376 00000 n +0000010507 00000 n +0000010592 00000 n +0000010683 00000 n +0000010772 00000 n +0000010858 00000 n +0000010937 00000 n +0000011079 00000 n +0000011160 00000 n +0000011307 00000 n +0000011440 00000 n +0000011529 00000 n +0000011622 00000 n +0000011713 00000 n +0000011846 00000 n +0000011935 00000 n +0000012039 00000 n +0000012133 00000 n +0000012224 00000 n +0000012312 00000 n +0000012394 00000 n +0000012538 00000 n +0000012620 00000 n +0000012767 00000 n +0000012872 00000 n +0000013005 00000 n +0000013094 00000 n +0000013195 00000 n +0000013289 00000 n +0000013380 00000 n +0000013521 00000 n +0000013656 00000 n +0000013745 00000 n +0000013849 00000 n +0000013943 00000 n +0000014034 00000 n +0000014123 00000 n +0000014215 00000 n +0000014350 00000 n +0000014439 00000 n +0000014543 00000 n +0000014683 00000 n +0000014777 00000 n +0000014868 00000 n +0000014948 00000 n +0000015042 00000 n +0000015133 00000 n +0000015266 00000 n +0000015355 00000 n +0000015456 00000 n +0000015549 00000 n +0000015639 00000 n +0000015727 00000 n +0000015809 00000 n +0000015954 00000 n +0000016036 00000 n +0000016181 00000 n +0000016299 00000 n +0000016393 00000 n +0000016541 00000 n +0000016627 00000 n +0000016789 00000 n +0000017550 00000 n +0000017640 00000 n +0000017885 00000 n +0000019343 00000 n +0000029252 00000 n +0000029409 00000 n +0000030324 00000 n +0000030415 00000 n +0000030654 00000 n +0000032334 00000 n +0000047138 00000 n +0000047301 00000 n +0000047733 00000 n +0000047822 00000 n +0000048065 00000 n +0000049018 00000 n +0000054435 00000 n +0000054599 00000 n +0000055248 00000 n +0000055340 00000 n +0000055589 00000 n +0000056851 00000 n +0000067810 00000 n +0000067995 00000 n +0000068249 00000 n +0000068335 00000 n +0000068586 00000 n +0000069286 00000 n +0000069735 00000 n +0000069773 00000 n +0000070132 00000 n +0000070179 00000 n +0000070227 00000 n +0000070274 00000 n +0000070525 00000 n +0000070789 00000 n +0000071050 00000 n +0000071443 00000 n +0000075807 00000 n +0000075976 00000 n +0000077232 00000 n +trailer +<< + /Size 196 + /Root 195 0 R + /Info 193 0 R + /ID [(7HUp3EyjbKaNAp3uawir4Q==) (HOT054N5u8uxrZkElkFqQQ==)] +>> +startxref +77472 +%%EOF \ No newline at end of file diff --git a/src/App.tsx b/src/App.tsx index 7c5768a2..ec6b8bd0 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -76,7 +76,12 @@ function Home() { ))}

- +
From 8e6c734bb4230e2019ae3c2086977ce456cdfbd9 Mon Sep 17 00:00:00 2001 From: Oliver Bryan Date: Thu, 5 Feb 2026 16:32:44 +0000 Subject: [PATCH 12/18] biome check --- src/App.tsx | 6 +++--- src/components/ProjectPage.tsx | 4 ++-- src/components/ask-ai.tsx | 4 ++-- src/components/theme-toggle.tsx | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index ec6b8bd0..7b00f207 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,9 +1,9 @@ -import { AskAI } from "@/components/ask-ai"; -import { ProjectListItem } from "@/components/ProjectListItem"; -import { type ProjectEntry, projectList, projects } from "@/projects"; import { Downasaur, Home as HomeIcon } from "@nsmr/pixelart-react"; import { useEffect, useState } from "react"; import { Link, Route, Routes, useParams } from "react-router-dom"; +import { AskAI } from "@/components/ask-ai"; +import { ProjectListItem } from "@/components/ProjectListItem"; +import { type ProjectEntry, projectList, projects } from "@/projects"; import { ThemeToggle } from "./components/theme-toggle"; const asciiFiles = [ diff --git a/src/components/ProjectPage.tsx b/src/components/ProjectPage.tsx index a8931457..397e15dc 100644 --- a/src/components/ProjectPage.tsx +++ b/src/components/ProjectPage.tsx @@ -1,8 +1,8 @@ -import { getProjectPrompt } from "@/lib/constants"; -import type { ProjectMetadata } from "@/projects"; import { Home } from "@nsmr/pixelart-react"; import type { ReactNode } from "react"; import { Link } from "react-router-dom"; +import { getProjectPrompt } from "@/lib/constants"; +import type { ProjectMetadata } from "@/projects"; import { AskAI } from "./ask-ai"; export function ProjectPage({ diff --git a/src/components/ask-ai.tsx b/src/components/ask-ai.tsx index cc505bba..abb15296 100644 --- a/src/components/ask-ai.tsx +++ b/src/components/ask-ai.tsx @@ -1,8 +1,8 @@ -import { AI_SUMMARY_PROMPT } from "@/lib/constants"; -import { cn } from "@/lib/utils"; import { Icon } from "@iconify/react"; import { Copy } from "@nsmr/pixelart-react"; import { useRef, useState } from "react"; +import { AI_SUMMARY_PROMPT } from "@/lib/constants"; +import { cn } from "@/lib/utils"; const chatGptUrl = "https://chat.openai.com/?q="; const claudeUrl = "https://claude.ai/new?q="; diff --git a/src/components/theme-toggle.tsx b/src/components/theme-toggle.tsx index 875d1f70..73e3f210 100644 --- a/src/components/theme-toggle.tsx +++ b/src/components/theme-toggle.tsx @@ -1,6 +1,6 @@ +import { Moon, Sun } from "@nsmr/pixelart-react"; import { useTheme } from "@/components/theme-provider"; import { Button } from "@/components/ui/button"; -import { Moon, Sun } from "@nsmr/pixelart-react"; export function ThemeToggle() { const { resolvedTheme, setTheme } = useTheme(); From 9d76acb7055eb0527f4ab1047f7173dcb44aadc0 Mon Sep 17 00:00:00 2001 From: Oliver Bryan Date: Thu, 5 Feb 2026 16:35:19 +0000 Subject: [PATCH 13/18] darker dark mode --- src/index.css | 4 ++-- src/lib/constants.ts | 2 +- src/projects/sprint/index.tsx | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/index.css b/src/index.css index 7e32fa6f..4db126cf 100644 --- a/src/index.css +++ b/src/index.css @@ -87,7 +87,7 @@ } .dark { - --background: #1b1813; + --background: #141311; --foreground: #f6efe3; --card: #242019; --card-foreground: #f6efe3; @@ -97,7 +97,7 @@ --primary-foreground: #2a241b; --secondary: #2f2a21; --secondary-foreground: #f1e9dc; - --muted: #2b261e; + --muted: #1a1713; --muted-foreground: #b8ad9d; --accent: #df7126; --accent-foreground: #2a241b; diff --git a/src/lib/constants.ts b/src/lib/constants.ts index 1329d735..a0da4d65 100644 --- a/src/lib/constants.ts +++ b/src/lib/constants.ts @@ -1,5 +1,5 @@ export const AI_SUMMARY_PROMPT = - "I am a recruiter, tell me about Oliver Bryan, a software developer. What would he bring to the table? Review his portfolio at ob248.com and summarize his key strengths, technical skills, and notable projects. What makes him stand out as a candidate?"; + "I am a recruiter, tell me about Oliver Bryan, a software developer. What would he bring to the table? Review his portfolio at ob248.com and summarise his key strengths, technical skills, and notable projects. What makes him stand out as a candidate?"; export function getProjectPrompt( projectName: string, diff --git a/src/projects/sprint/index.tsx b/src/projects/sprint/index.tsx index 46fc9c3f..c039aa7c 100644 --- a/src/projects/sprint/index.tsx +++ b/src/projects/sprint/index.tsx @@ -46,7 +46,7 @@ export function SprintProject() {
  • Issue assignment to team members
  • Time tracking with start, pause, and resume timers
  • Sprint management with date ranges
  • -
  • Customizable issue statuses per organisation
  • +
  • Customisable issue statuses per organisation
  • Resizable split-pane interface
  • Role-based access: owner, admin, member
  • Avatar uploads with S3 storage
  • From efa37e45a7f89295b5bd333156b3ec2f4db44ee0 Mon Sep 17 00:00:00 2001 From: Oliver Bryan Date: Thu, 5 Feb 2026 16:53:23 +0000 Subject: [PATCH 14/18] fixed weird space at the end of ascii --- public/ascii/cat-loaf.txt | 2 +- public/ascii/cat-peek.txt | 2 +- public/ascii/cat-shock.txt | 2 +- public/ascii/exclamation.txt | 2 +- public/ascii/fat-cat-head.txt | 2 +- public/ascii/grumpy-dog.txt | 2 +- public/ascii/penguin-surfboard.txt | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/public/ascii/cat-loaf.txt b/public/ascii/cat-loaf.txt index 642cd64f..38958a26 100644 --- a/public/ascii/cat-loaf.txt +++ b/public/ascii/cat-loaf.txt @@ -11,4 +11,4 @@ ⠀⠀⠙⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿ ⠀⠀⠀⠈⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠃ ⠀⠀⠀⠀⠀⠙⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠋⠀ -⠀⠀⠀⠀⠀⠀⠀⠉⠻⠿⠿⠿⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠿⠿⠿⠿⠿⠟⠛⠁⠀⠀ \ No newline at end of file +⠀⠀⠀⠀⠀⠀⠀⠉⠻⠿⠿⠿⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠿⠿⠿⠿⠿⠟⠛⠁⠀⠀⠀ \ No newline at end of file diff --git a/public/ascii/cat-peek.txt b/public/ascii/cat-peek.txt index 51bd7f11..374571f6 100644 --- a/public/ascii/cat-peek.txt +++ b/public/ascii/cat-peek.txt @@ -24,4 +24,4 @@ ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣶⣶⣿⣿⣿⣿⠟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⣿⣿⣿⣿⠁⠈⠙⠻⠿⠿⠿⢿⣿⣿⣿⣿⡿⠿⠿⠛⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⣿⡿⠟⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ \ No newline at end of file +⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ \ No newline at end of file diff --git a/public/ascii/cat-shock.txt b/public/ascii/cat-shock.txt index 3045822f..338b553b 100644 --- a/public/ascii/cat-shock.txt +++ b/public/ascii/cat-shock.txt @@ -16,4 +16,4 @@ ⠀⠀⢀⣾⣿⣿⣿⡿⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⠏⠀⠀⠀⠈⢻⣿⣿⣿⣄⠀⠀ ⢀⣠⣾⣿⣿⣿⠟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢰⣿⣿⣿⣿⠁⠀⠀⠀⠀⠈⣿⣿⣿⣿⣧⠀ ⠻⣿⣿⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠰⣿⣿⣿⣿⣿⡄⠀⠀⠀⠀⠀⠻⣿⣿⣿⠇⠀ -⠀⠈⠛⠉⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⠻⠿⠛⠃⠀⠀⠀⠀⠀⠀⠈⠁⠀⠀⠀ \ No newline at end of file +⠀⠈⠛⠉⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⠻⠿⠛⠃⠀⠀⠀⠀⠀⠀⠈⠁⠀⠀⠀⠀ \ No newline at end of file diff --git a/public/ascii/exclamation.txt b/public/ascii/exclamation.txt index b084bc97..c8040c9e 100644 --- a/public/ascii/exclamation.txt +++ b/public/ascii/exclamation.txt @@ -13,4 +13,4 @@ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠛⠻⠿⠃⠀⠀⢰⣿⣿⡿ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣶⣦⣤⣀⠀⠀⠀⣿⣿⡿⠁ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢿⣿⣿⣿⠂⠀⢰⣦⡙⠁⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠛⠟⠀⠀⠀⠙⠃⠀⠀ \ No newline at end of file +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠛⠟⠀⠀⠀⠙⠃⠀⠀⠀ \ No newline at end of file diff --git a/public/ascii/fat-cat-head.txt b/public/ascii/fat-cat-head.txt index db47eee0..8e124a34 100644 --- a/public/ascii/fat-cat-head.txt +++ b/public/ascii/fat-cat-head.txt @@ -16,4 +16,4 @@ ⠀⠀⠈⠿⣿⣦⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⣴⣿⠏⠁⠀⠀⠀ ⠀⠀⠀⠀⠈⠻⣿⣷⣦⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣶⣿⡿⠋⠁⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠈⠉⠻⠿⣿⣶⣦⣤⣀⣀⣀⣀⣀⠀⠀⠀⠀⠀⠀⠀⢀⣀⣀⣀⣀⣤⣴⣾⠿⠿⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠛⠛⠛⠻⠿⠿⠿⣿⠿⣷⣿⣿⡿⣿⡿⠿⠿⠿⠛⠛⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ \ No newline at end of file +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠛⠛⠛⠻⠿⠿⠿⣿⠿⣷⣿⣿⡿⣿⡿⠿⠿⠿⠛⠛⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ \ No newline at end of file diff --git a/public/ascii/grumpy-dog.txt b/public/ascii/grumpy-dog.txt index d54763b3..81d172bf 100644 --- a/public/ascii/grumpy-dog.txt +++ b/public/ascii/grumpy-dog.txt @@ -16,4 +16,4 @@ ⠀⠹⣿⣿⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⣿⡿⠋⠀⠀ ⠀⠀⠈⠛⢿⣿⣶⣶⣤⣤⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⣀⣠⣶⣾⣿⠿⠋⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠈⠉⠛⠛⠿⠿⣿⣿⣿⣷⣶⣶⣶⣷⣿⣿⣿⣷⣶⣶⣿⣿⣿⣿⣿⡿⠿⠿⠛⠉⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠉⠛⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ \ No newline at end of file +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠉⠛⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ \ No newline at end of file diff --git a/public/ascii/penguin-surfboard.txt b/public/ascii/penguin-surfboard.txt index d856c07f..78b7983b 100644 --- a/public/ascii/penguin-surfboard.txt +++ b/public/ascii/penguin-surfboard.txt @@ -11,4 +11,4 @@ ⠀⠈⠙⠛⠛⠿⠷⢶⣤⣄⣠⣤⣤⣤⣼⣇⠀⠀⠀⠻⣾⠇⠀⠀⠀⠀⠀⠀⢠⣿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠉⠁⠀⠈⣿⡆⠀⠀⠀⠀⣠⣶⣿⣷⣤⣀⣀⣸⣿⣇⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣷⣄⣀⣴⠞⠋⠁⠀⠀⠙⠿⠿⠿⠿⠟⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠙⠛⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ \ No newline at end of file +⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠙⠛⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ \ No newline at end of file From 8382b122a2c61e535bb1fe61c6bdf8ff8cc55958 Mon Sep 17 00:00:00 2001 From: Oliver Bryan Date: Thu, 5 Feb 2026 16:53:36 +0000 Subject: [PATCH 15/18] github,email,cv header --- bun.lock | 3 --- index.html | 2 +- package.json | 1 - src/App.tsx | 30 +++++++++++++++++++++++++++--- 4 files changed, 28 insertions(+), 8 deletions(-) diff --git a/bun.lock b/bun.lock index 6babf1df..fb8d4baf 100644 --- a/bun.lock +++ b/bun.lock @@ -10,7 +10,6 @@ "@tailwindcss/vite": "^4.1.18", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", - "lucide-react": "^0.563.0", "radix-ui": "^1.4.3", "react": "^19.2.0", "react-dom": "^19.2.0", @@ -597,8 +596,6 @@ "lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], - "lucide-react": ["lucide-react@0.563.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-8dXPB2GI4dI8jV4MgUDGBeLdGk8ekfqVZ0BdLcrRzocGgG75ltNEmWS+gE7uokKF/0oSUuczNDT+g9hFJ23FkA=="], - "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], diff --git a/index.html b/index.html index 8535acda..e0b0bb7b 100644 --- a/index.html +++ b/index.html @@ -4,7 +4,7 @@ - ob248.com + Oliver Bryan