Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions ai-portfolio/.github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
name: CI

on:
push:
branches: [ main, master ]
pull_request:
branches: [ main, master ]

jobs:
build-and-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
cache: npm
- run: npm ci
working-directory: ai-portfolio
- run: npm run build
working-directory: ai-portfolio
- name: Axe accessibility check (static)
run: npx @axe-core/cli --stdout --exit 0 --dir dist
working-directory: ai-portfolio
- name: Lighthouse CI (static)
run: |
npx http-server dist -p 8080 &
npx lighthouse http://localhost:8080 --only-categories=performance,accessibility,best-practices,seo --chrome-flags="--headless=new --no-sandbox" --output=json --output-path=./lh.json
node -e "const r=require('fs').readFileSync('lh.json','utf8');const j=JSON.parse(r);const s=j.categories;const ok=(s.performance.score>=0.9 && s.accessibility.score>=0.95 && s['best-practices'].score>=0.9 && s.seo.score>=0.9); if(!ok){console.error('Lighthouse thresholds not met', s); process.exit(1)}"
working-directory: ai-portfolio
24 changes: 24 additions & 0 deletions ai-portfolio/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*

node_modules
dist
dist-ssr
*.local

# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
13 changes: 13 additions & 0 deletions ai-portfolio/.lighthouse-budget.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
[
{
"path": "/",
"resourceSizes": [
{ "resourceType": "total", "budget": 300 },
{ "resourceType": "script", "budget": 180 },
{ "resourceType": "stylesheet", "budget": 60 }
],
"timings": [
{ "metric": "first-contentful-paint", "budget": 1500 }
]
}
]
20 changes: 20 additions & 0 deletions ai-portfolio/about/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<!doctype html>
<html lang="en" class="dark">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="color-scheme" content="dark light" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<title>About — Efstathios Stivaros</title>
<meta name="description" content="Rails engineer building accessible, AI‑native products.">
<link rel="canonical" href="https://www.stivaros.com/about" />
<meta property="og:title" content="About — Efstathios Stivaros" />
<meta property="og:description" content="Rails engineer building accessible, AI‑native products." />
</head>
<body class="bg-bg-dark text-slate-200">
<a class="sr-only focus:not-sr-only focus-ring absolute top-2 left-2 z-50 bg-panel text-white px-3 py-2 rounded" href="#main">Skip to content</a>
<site-header></site-header>
<div id="app"></div>
<script type="module" src="/src/main.js"></script>
</body>
</html>
20 changes: 20 additions & 0 deletions ai-portfolio/contact/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<!doctype html>
<html lang="en" class="dark">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="color-scheme" content="dark light" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<title>Contact — Efstathios Stivaros</title>
<meta name="description" content="Contact Efstathios Stivaros — email and form">
<link rel="canonical" href="https://www.stivaros.com/contact" />
<meta property="og:title" content="Contact — Efstathios Stivaros" />
<meta property="og:description" content="Get in touch via email and form." />
</head>
<body class="bg-bg-dark text-slate-200">
<a class="sr-only focus:not-sr-only focus-ring absolute top-2 left-2 z-50 bg-panel text-white px-3 py-2 rounded" href="#main">Skip to content</a>
<site-header></site-header>
<div id="app"></div>
<script type="module" src="/src/main.js"></script>
</body>
</html>
23 changes: 23 additions & 0 deletions ai-portfolio/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<!doctype html>
<html lang="en" class="dark">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="color-scheme" content="dark light" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<title>Efstathios Stivaros — AI‑native developer portfolio</title>
<meta name="description" content="Minimalist, accessible, AI‑native developer portfolio. Rails, Web Components, Tailwind. Case studies with Problem/Approach/Outcome.">
<link rel="canonical" href="https://www.stivaros.com/" />
<meta property="og:title" content="Efstathios Stivaros — AI‑native developer portfolio" />
<meta property="og:description" content="Minimalist, accessible, AI‑native developer portfolio." />
<meta property="og:type" content="website" />
<meta name="twitter:card" content="summary" />
</head>
<body class="bg-bg-dark text-slate-200">
<a class="sr-only focus:not-sr-only focus-ring absolute top-2 left-2 z-50 bg-panel text-white px-3 py-2 rounded" href="#main">Skip to content</a>
<site-header></site-header>
<div id="app"></div>
<script type="module" src="/src/main.js"></script>
</body>

</html>
Loading