diff --git a/app/globals.css b/app/globals.css index 554cbb4..81f050f 100644 --- a/app/globals.css +++ b/app/globals.css @@ -1,38 +1,131 @@ @import 'tailwindcss'; :root { - --background: #171717; + --background: #0b0b0d; + --foreground: #eceae0; } @theme inline { + --color-bg: #0b0b0d; + --color-surface: #111115; + --color-surface2: #18181e; + --color-bdr: #26262e; + --color-accent: #f4a229; + --color-accent2: #ff6b35; + --color-ink: #eceae0; + --color-muted: #72706a; + --color-danger: #e84040; --color-background: var(--background); - --font-sans: var(--font-geist-sans); - --font-mono: var(--font-geist-mono); - --color-coffee-50: #f8f8f8; - --color-coffee-100: #f1eff0; - --color-coffee-200: #e6e2e4; - --color-coffee-300: #d8d2d5; - --color-coffee-400: #baafb5; - --color-coffee-500: #a0939a; - --color-coffee-600: #887a81; - --color-coffee-700: #70656b; - --color-coffee-800: #5f555a; - --color-coffee-900: #524a4e; - --color-coffee-950: #2a2528; - --transparent: #1717178d; -} - -@media (prefers-color-scheme: dark) { - :root { - --background: #0a0a0a; - --foreground: #ededed; + --font-sans: var(--font-syne-family); + --font-mono: var(--font-jetbrains-mono); + --font-syne: var(--font-syne-family); + --animate-fade-up-1: fade-up 0.6s ease forwards 0.2s; + --animate-fade-up-2: fade-up 0.7s ease forwards 0.4s; + --animate-fade-up-3: fade-up 0.7s ease forwards 0.6s; + --animate-fade-up-4: fade-up 0.7s ease forwards 0.8s; + --animate-fade-up-5: fade-up 0.7s ease forwards 1s; + --animate-fade-up-6: fade-up 0.7s ease forwards 1.2s; +} + +@keyframes fade-up { + from { + opacity: 0; + transform: translateY(20px); + } + to { + opacity: 1; + transform: translateY(0); } } +/* Grid noise background */ +body::before { + content: ''; + position: fixed; + inset: 0; + background-image: + linear-gradient(#26262e 1px, transparent 1px), + linear-gradient(90deg, #26262e 1px, transparent 1px); + background-size: 40px 40px; + opacity: 0.25; + pointer-events: none; + z-index: 0; +} + +/* Scroll-triggered fade-in */ +.fade-in { + opacity: 0; + transform: translateY(16px); + transition: + opacity 0.6s ease, + transform 0.6s ease; +} +.fade-in.visible { + opacity: 1; + transform: translateY(0); +} + +/* Photo frame — offset accent border */ +.photo-frame::after { + content: ''; + position: absolute; + inset: 0; + border: 1px solid #f4a229; + border-radius: 4px; + transform: translate(8px, 8px); + pointer-events: none; +} + +/* Project card — top accent line on hover */ +.project-card::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + height: 2px; + background: #26262e; + transition: background 0.2s; +} +.project-card:hover::before { + background: #f4a229; +} + +/* Hero scroll — vertical trailing line */ +.hero-scroll::after { + content: ''; + display: block; + width: 1px; + height: 60px; + background: linear-gradient(to bottom, #72706a, transparent); + margin: 0.5rem auto 0; +} + +.stats-note code { + color: #f4a229; + background: rgba(244, 162, 41, 0.08); + padding: 0.1rem 0.3rem; + border-radius: 2px; +} + +::-webkit-scrollbar { + width: 6px; +} +::-webkit-scrollbar-track { + background: #0b0b0d; +} +::-webkit-scrollbar-thumb { + background: #26262e; + border-radius: 3px; +} +::-webkit-scrollbar-thumb:hover { + background: #72706a; +} + body { background: var(--background); color: var(--foreground); - font-family: Arial, Helvetica, sans-serif; + overflow-x: hidden; } p { diff --git a/app/layout.tsx b/app/layout.tsx index 2682dc6..1296f3a 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -1,16 +1,18 @@ import type { Metadata } from 'next'; -import { Geist, Geist_Mono } from 'next/font/google'; +import { JetBrains_Mono, Syne } from 'next/font/google'; import './globals.css'; import { Analytics } from '@vercel/analytics/next'; -const geistSans = Geist({ - variable: '--font-geist-sans', +const syne = Syne({ + variable: '--font-syne-family', subsets: ['latin'], + weight: ['400', '500', '600', '700', '800'], }); -const geistMono = Geist_Mono({ - variable: '--font-geist-mono', +const jetbrainsMono = JetBrains_Mono({ + variable: '--font-jetbrains-mono', subsets: ['latin'], + weight: ['300', '400', '500'], }); export const metadata: Metadata = { @@ -27,7 +29,7 @@ export default function RootLayout({ return (
{children}- I’m an ISTQB Certified QA professional with a background in full - stack development. I work mainly with JavaScript and Next.js, - and I’ve built and deployed both web and mobile applications, - including projects with database integrations, API connections, - and payment systems. -
- -- I started learning web development through documentation, online - resources, and mentorship from a senior developer. After - building several projects and releasing a mobile app, I became - increasingly interested in quality, edge cases, and system - behavior. That curiosity led me to study software testing more - seriously and earn my ISTQB Foundation Level certification. -
- -- Having written production code myself, I understand how features - are structured, where complexity hides, and how small changes - can affect the whole system. I now want to work in QA, combining - structured testing knowledge with hands on development - experience. -
++ I'm an ISTQB Certified QA professional with a background in + full stack development. I work mainly with JavaScript and Next.js, + and I've built and deployed both web and mobile applications, + including projects with database integrations, API connections, and + payment systems. +
++ I started learning web development through documentation, online + resources, and mentorship from a senior developer. After building + several projects and releasing a mobile app, I became increasingly + interested in quality, edge cases, and system behavior. That + curiosity led me to study software testing more seriously and earn + my ISTQB Foundation Level certification. +
++ Having written production code myself, I understand how features are + structured, where complexity hides, and how small changes can affect + the whole system. I now want to work in QA, combining structured + testing knowledge with hands on development experience. +
++ Outside of tech, I design knitting patterns, which, much like + writing test cases, requires translating complex structures into + clear, logical, and reproducible instructions. +
-- Outside of tech, I design knitting patterns, which, much like - writing test cases, requires translating complex structures into - clear, logical, and reproducible instructions. -
-
+ Let's build
+
+ something
+
+ worth shipping.
+
+ Open to QA roles, full-time opportunities, and collaborations where + testing and development meet. +
++ Web developer & software tester. Junior QA Engineer (ISTQB + Certified) with a development background, focused on building and + validating reliable, well structured software systems. +
-- Junior QA Engineer (ISTQB Certified) with a development - background, focused on building and validating reliable, well - structured software systems. -
-- Built a TicTacToe web application using Next.js to apply - structured software testing practices in a controlled - environment. - - Defined functional requirements, created test cases and a test - plan, and applied both white box and black box static testing - techniques. The project focuses primarily on manual testing - methodology, with end to end test automation using Playwright - currently being implemented. - - Demonstrates the full manual testing lifecycle from requirement - analysis to execution, while progressively expanding into - automation practices. -
-
- Contributed testing work to an open source Rust based bookmark
- management project.
-
- Performed early happy path testing of core features such as
- bookmark creation and editing, and collaborated with developers
- to verify expected behaviour.
- The project has undergone a major refactoring. As a result, the
- existing tests require updates to match the new code structure.
- I am currently reviewing the refactored architecture and
- preparing updates to realign the automated tests. The repository
- currently linked is my fork of the project, which showcases the
- original testing implementation.
-
- This project provided experience working within an existing
- codebase, validating functionality during development changes,
- and understanding how refactoring impacts test suites.
-
- Developed and migrated a full stack website from WordPress to a - custom Next.js and MySQL solution based on stakeholder - requirements gathered through planning meetings. Collaborated - with a senior developer who primarily focused on backend - architecture and acted as a technical mentor, while also - contributing to backend implementation. - - Implemented secure online donation functionality using Stripe, - improved membership and newsletter sign up workflows, and - introduced an administrative dashboard for managing content and - user data. Performed workflow based testing of payment - processes, authentication, and form validation following - deployment. - - Live site may experience occasional downtime due to external - factors. Public repository not available due to client - confidentiality and data protection requirements. Source code - available upon request. -
- - Website - -- Developed a mobile application using React Native Expo featuring - AI powered image generation and image recognition workflows. - Integrated OpenAI DALL E 3 for prompt based image generation and - the Imagga API for automated image tagging. - - Successfully managed the full release process to the Google Play - Store, including configuration, deployment, and compliance - requirements. The application was later removed due to ongoing - platform verification and maintenance demands that were not - feasible for a learning focused project. - - The project provided hands on experience with mobile - architecture, third party API integration, and production level - deployment workflows. A live demo is available via Appetize. -
-+ {project.description} +
+