commit 55ae54d2c5ae1af8ede9d4f41a1bd891bd789bf8 Author: Ovidiu U Date: Fri Mar 13 09:23:15 2026 +0000 init diff --git a/.htaccess b/.htaccess new file mode 100644 index 0000000..46b00c5 --- /dev/null +++ b/.htaccess @@ -0,0 +1,46 @@ +# Enable rewrite engine +RewriteEngine On + +# Force HTTPS (handled by Pangolin/Cloudflare, but just in case) +# RewriteCond %{HTTPS} off +# RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] + +# Remove trailing slashes (except for directories) +RewriteCond %{REQUEST_FILENAME} !-d +RewriteRule ^(.*)/$ /$1 [L,R=301] + +# Security headers + + Header set X-Content-Type-Options "nosniff" + Header set X-Frame-Options "SAMEORIGIN" + Header set X-XSS-Protection "1; mode=block" + Header set Referrer-Policy "strict-origin-when-cross-origin" + + +# Prevent directory listing +Options -Indexes + +# Block access to hidden files + + Require all denied + + +# Cache static assets + + ExpiresActive On + ExpiresByType text/css "access plus 1 month" + ExpiresByType application/javascript "access plus 1 month" + ExpiresByType image/jpeg "access plus 1 year" + ExpiresByType image/png "access plus 1 year" + ExpiresByType image/svg+xml "access plus 1 year" + ExpiresByType image/webp "access plus 1 year" + ExpiresByType font/woff2 "access plus 1 year" + + +# Gzip compression + + AddOutputFilterByType DEFLATE text/html text/css application/javascript text/plain application/json image/svg+xml + + +# Custom error pages +ErrorDocument 404 /404.php diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..ab1f416 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,10 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Ignored default folder with query files +/queries/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/deployment.xml b/.idea/deployment.xml new file mode 100644 index 0000000..b1d08f6 --- /dev/null +++ b/.idea/deployment.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..8adcba3 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/php-docker-settings.xml b/.idea/php-docker-settings.xml new file mode 100644 index 0000000..2e7d87e --- /dev/null +++ b/.idea/php-docker-settings.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/php.xml b/.idea/php.xml new file mode 100644 index 0000000..2a84403 --- /dev/null +++ b/.idea/php.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/uovidiu.iml b/.idea/uovidiu.iml new file mode 100644 index 0000000..c956989 --- /dev/null +++ b/.idea/uovidiu.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/webServers.xml b/.idea/webServers.xml new file mode 100644 index 0000000..1c5787a --- /dev/null +++ b/.idea/webServers.xml @@ -0,0 +1,14 @@ + + + + + + \ No newline at end of file diff --git a/404.php b/404.php new file mode 100644 index 0000000..d242178 --- /dev/null +++ b/404.php @@ -0,0 +1,38 @@ + + + + + + 404 — Ovidiu Ungureanu + + + + + + + + + +
+
Error 404
+

Not
Found

+

This page doesn't exist. It probably never did.

+ +
+ + + + + diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..d4ef7d5 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,91 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Role + +Act as a World-Class Senior Creative Technologist specialising in automotive service industry web design. You build high-fidelity, trust-first landing pages that balance **working-class approachability** with **modern professional credibility**. Every element should communicate: "We know cars. We're honest. We've been here 25 years and we'll be here 25 more." Eradicate all generic AI patterns, template garage websites, and Wix-era layouts. + +--- + +## Always Do First + +- **Invoke the `frontend-design` skill** before writing any frontend code, every session, no exceptions. +- **Check `brand_assets/`** before designing. It may contain logos, colour guides, style guides, or images. If assets exist, use them — do not use placeholders where real assets are available. If a logo is present, use it. If a colour palette is defined, use those exact values — do not invent brand colours. + +--- + +## Project Overview + +Personal portfolio website for Ovidiu Ungureanu (PHP/MySQL developer). Pure PHP/HTML/CSS — no build tools, no package managers, no JavaScript frameworks. + +## Development + +No build step required. Serve with any PHP-capable web server (Apache recommended). + +**Local development:** +Running using Herd. no extra steps. + +Apache is required in production for `.htaccess` rules (`mod_rewrite`, `mod_headers`, `mod_expires`, `mod_deflate`). + +### Screenshots +- Puppeteer is installed locally in `node_modules/puppeteer/`. Chrome cache is at `~/.cache/puppeteer/`. +- **Always screenshot from localhost:** `node screenshot.mjs http://localhost:3000` +- Screenshots save automatically to `./temporary screenshots/screenshot-N.png` (auto-incremented, never overwritten). +- Optional label suffix: `node screenshot.mjs http://localhost:3000 label` → saves as `screenshot-N-label.png`. +- `screenshot.mjs` lives in the project root. Use it as-is. +- After screenshotting, read the PNG from `temporary screenshots/` with the Read tool — Claude can see and analyse the image directly. +- When comparing, be specific: "heading is 32px but reference shows ~24px", "card gap is 16px but should be 24px". +- Check: spacing/padding, font size/weight/line-height, colours (exact hex), alignment, border-radius, shadows, image sizing. + +## Architecture + +### Includes system + +Shared partials live in `includes/`: + +- `includes/header.php` — ``, ``, nav. Reads `$title`, `$description`, and optional `$extra_css` set by the page before `require`. +- `includes/footer.php` — `