Add layouts, Tailwind pipeline, CI/CD workflows, and resume content
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 4.6
parent
71b1117e9d
commit
c1c64b8345
@@ -1 +1,42 @@
|
||||
['main ]\n pull_request:\n branches: [ main ]\n\njobs:\n build:\n runs-on: ubuntu-latest\n steps:\n - name: Checkout repository\n uses: actions/checkout@v4\n\n - name: Set up Node.js\n uses: actions/setup-node@v4\n with:\n node-version: \'20\'\n\n - name: Install dependencies\n run: npm ci\n\n - name: Install markdownlint and HTMLHint\n run: npm install -D markdownlint-cli htmlhint\n\n - name: Lint markdown files\n run: npx markdownlint "**/*.md" --config .markdownlint.json || echo "No markdownlint config – skipping"\n\n - name: Lint generated HTML (if any)\n run: npx htmlhint "**/public/**/*.html" || echo "No HTML to lint yet"\n\n - name: Build CSS\n run: npm run build:css\n\n - name: Build site with Hugo\n run: npm run build\n\n - name: Verify Hugo output exists\n run: |\n if [ ! -d "public']
|
||||
on:
|
||||
push:
|
||||
branches: [main]
|
||||
pull_request:
|
||||
branches: [main]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Set up Node.js
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: '20'
|
||||
|
||||
- name: Install dependencies
|
||||
run: npm ci
|
||||
|
||||
- name: Install markdownlint and HTMLHint
|
||||
run: npm install -D markdownlint-cli htmlhint
|
||||
|
||||
- name: Lint markdown files
|
||||
run: npx markdownlint "**/*.md" --config .markdownlint.json || echo "No markdownlint config – skipping"
|
||||
|
||||
- name: Lint generated HTML (if any)
|
||||
run: npx htmlhint "**/public/**/*.html" || echo "No HTML to lint yet"
|
||||
|
||||
- name: Build CSS
|
||||
run: npm run build:css
|
||||
|
||||
- name: Build site with Hugo
|
||||
run: npm run build
|
||||
|
||||
- name: Verify Hugo output exists
|
||||
run: |
|
||||
if [ ! -d "public" ]; then
|
||||
echo "public/ not found"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
@@ -1 +1,38 @@
|
||||
["main ] # Build on pushes to main\n\njobs:\n build-deploy:\n runs-on: ubuntu-latest\n steps:\n - name: Checkout repository\n uses: actions/checkout@v4\n\n - name: Setup Hugo\n uses: peaceiris/actions-hugo@v2\n with:\n hugo-version: 'latest'\n\n - name: Set up Node.js for Tailwindcss\n uses: actions/setup-node@v4\n with:\n node-version: '20'\n\n - name: Install dependencies\n run: npm install\n\n - name: Build CSS asset\n run: npm run build:css\n\n - name: Build Hugo site\n run: hugo --minify\n\n - name: Deploy to GitHub Pages\n uses: peaceiris/actions-gh-pages@v3\n with:\n github_pages_branch: gh-pages\n keep_files: false\n force_orphan: true\n commit_message: Deploy Hugo site"]
|
||||
on:
|
||||
push:
|
||||
branches: [main]
|
||||
|
||||
jobs:
|
||||
build-deploy:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Setup Hugo
|
||||
uses: peaceiris/actions-hugo@v2
|
||||
with:
|
||||
hugo-version: 'latest'
|
||||
|
||||
- name: Set up Node.js for Tailwindcss
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: '20'
|
||||
|
||||
- name: Install dependencies
|
||||
run: npm ci
|
||||
|
||||
- name: Build CSS asset
|
||||
run: npm run build:css
|
||||
|
||||
- name: Build Hugo site
|
||||
run: hugo --minify
|
||||
|
||||
- name: Deploy to GitHub Pages
|
||||
uses: peaceiris/actions-gh-pages@v3
|
||||
with:
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
github_pages_branch: gh-pages
|
||||
keep_files: false
|
||||
force_orphan: true
|
||||
commit_message: Deploy Hugo site
|
||||
|
||||
+2
-4
@@ -9,7 +9,7 @@ node_modules/
|
||||
# Hugo
|
||||
*.log
|
||||
*.patch
|
||||
gtags refractor
|
||||
.hugo_build.lock
|
||||
|
||||
# OS & editor artifacts
|
||||
.DS_Store
|
||||
@@ -20,6 +20,4 @@ gtags refractor
|
||||
|
||||
# Tailwind / PostCSS caches
|
||||
/.cache/
|
||||
/.cache/
|
||||
tailwind.css
|
||||
main.css
|
||||
assets/css/main.css
|
||||
@@ -0,0 +1 @@
|
||||
{\"repoUrl\": \"file:///home/emil/Desktop/Coding/AI/UI_test\"}
|
||||
@@ -0,0 +1,17 @@
|
||||
# IMPORTANT Rules
|
||||
Always be kind. Prioritize user well-being.
|
||||
|
||||
# Code Quality Principles
|
||||
Write clear, concise, and efficient code. Avoid unnecessary complexity.
|
||||
|
||||
# Coding Style Preferences
|
||||
Use consistent 2-space indentation. Use descriptive variable names. Avoid trailing whitespace.
|
||||
|
||||
# Architecture Principles
|
||||
Favor modular design. Consider scalability early. Prefer simplicity when possible.
|
||||
|
||||
# Development Workflow
|
||||
Use Git for version control. Write descriptive commit messages. Use pull requests. Run tests before merging.
|
||||
|
||||
# Technical Preferences
|
||||
Use TypeScript for type safety. Prefer REST over GraphQL for simplicity. Use PostgreSQL for relational data. Use Redis for caching. Use Docker for containerization.
|
||||
@@ -0,0 +1,49 @@
|
||||
# CLAUDE.md
|
||||
|
||||
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
||||
|
||||
## Project Overview
|
||||
|
||||
Hugo static resume website for Emil Shanayev (DevOps & Backend Engineer), styled with Tailwind CSS 3.x and deployed to GitHub Pages via GitHub Actions.
|
||||
|
||||
## Commands
|
||||
|
||||
```bash
|
||||
# Local dev server (watches for changes)
|
||||
hugo server
|
||||
|
||||
# Compile Tailwind CSS only
|
||||
npm run build:css
|
||||
|
||||
# Full production build (CSS + Hugo minified)
|
||||
npm run build
|
||||
```
|
||||
|
||||
CSS must be compiled before Hugo can use it — `npm run build` handles this in the correct order.
|
||||
|
||||
## Architecture
|
||||
|
||||
**Hugo + PostCSS pipeline:**
|
||||
|
||||
- `assets/css/tailwind.css` — Tailwind entry point (source); processed by PostCSS → `assets/css/main.css` (generated, not committed)
|
||||
- `tailwind.config.js` — content glob scans `**/*.{html,js,ts,jsx,md,go,rs}`; dark mode via `class`; custom color palette under `primary`, `secondary`, `dark`, `bg`
|
||||
- `layouts/` — Hugo HTML templates (currently `_default/` only)
|
||||
- `content/` — Markdown pages; `_index.md` is the homepage resume content (written in Russian)
|
||||
- `config.toml` — Hugo site config (author, description, menu entries)
|
||||
|
||||
**CI/CD (`.github/workflows/`):**
|
||||
|
||||
- `ci.yml` — runs on PRs to `main`: installs deps, lints Markdown (`markdownlint`) and generated HTML (`htmlhint`), then builds
|
||||
- `deploy.yml` — runs on push to `main`: builds site and pushes `public/` to `gh-pages` branch via `peaceiris/actions-gh-pages`
|
||||
|
||||
**Utility directories:**
|
||||
|
||||
- `core/user/` — user identity and preference notes consumed by AI tooling
|
||||
- `templates/` — blank identity/preference templates
|
||||
- `.pi/` — pi-agent settings (repo URL reference)
|
||||
|
||||
## Style Preferences
|
||||
|
||||
- 2-space indentation
|
||||
- Descriptive variable names, no trailing whitespace
|
||||
- TypeScript preferred for any scripting; REST over GraphQL; PostgreSQL/Redis for data
|
||||
@@ -0,0 +1,97 @@
|
||||
@tailwind base;
|
||||
@tailwind components;
|
||||
@tailwind utilities;
|
||||
|
||||
@layer base {
|
||||
body {
|
||||
background-image: radial-gradient(rgb(30 41 59 / 0.45) 1px, transparent 1px);
|
||||
background-size: 28px 28px;
|
||||
}
|
||||
}
|
||||
|
||||
@layer components {
|
||||
/* Section header cards */
|
||||
.resume-content h2 {
|
||||
font-size: 0.68rem !important;
|
||||
font-weight: 700 !important;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.16em;
|
||||
color: rgb(96 165 250) !important;
|
||||
margin-top: 3rem !important;
|
||||
margin-bottom: 1.25rem !important;
|
||||
padding: 0.55rem 1rem;
|
||||
background: rgb(15 23 42 / 0.8);
|
||||
border-left: 3px solid rgb(96 165 250);
|
||||
border-radius: 0 0.375rem 0.375rem 0;
|
||||
margin-left: -1rem;
|
||||
box-shadow: -4px 0 24px rgb(96 165 250 / 0.08), inset 0 0 0 1px rgb(96 165 250 / 0.06);
|
||||
}
|
||||
|
||||
.resume-content h3 {
|
||||
font-size: 0.9rem !important;
|
||||
font-weight: 600 !important;
|
||||
color: rgb(226 232 240) !important;
|
||||
margin-top: 1.25rem !important;
|
||||
margin-bottom: 0.25rem !important;
|
||||
}
|
||||
|
||||
.resume-content p {
|
||||
color: rgb(148 163 184);
|
||||
line-height: 1.75;
|
||||
}
|
||||
|
||||
.resume-content li {
|
||||
color: rgb(148 163 184);
|
||||
}
|
||||
|
||||
.resume-content li::marker {
|
||||
color: rgb(96 165 250) !important;
|
||||
}
|
||||
|
||||
.resume-content strong {
|
||||
color: rgb(226 232 240) !important;
|
||||
font-weight: 600 !important;
|
||||
}
|
||||
|
||||
.resume-content a {
|
||||
color: rgb(96 165 250) !important;
|
||||
text-decoration: none !important;
|
||||
}
|
||||
|
||||
.resume-content a:hover {
|
||||
text-decoration: underline !important;
|
||||
}
|
||||
|
||||
.resume-content hr {
|
||||
border-color: rgb(30 41 59 / 0.5) !important;
|
||||
margin-top: 0.5rem !important;
|
||||
margin-bottom: 0.5rem !important;
|
||||
}
|
||||
|
||||
.skills-grid {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 0.5rem;
|
||||
margin: 0.75rem 0 1.5rem;
|
||||
}
|
||||
|
||||
.skills-grid span {
|
||||
padding: 0.25rem 0.75rem;
|
||||
border-radius: 9999px;
|
||||
font-size: 0.72rem;
|
||||
font-family: ui-monospace, monospace;
|
||||
background: rgb(96 165 250 / 0.1);
|
||||
color: rgb(96 165 250);
|
||||
border: 1px solid rgb(96 165 250 / 0.25);
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.resume-content code {
|
||||
color: rgb(147 197 253) !important;
|
||||
background: rgb(15 23 42) !important;
|
||||
padding: 0.1em 0.4em !important;
|
||||
border-radius: 0.25rem !important;
|
||||
font-size: 0.85em !important;
|
||||
}
|
||||
}
|
||||
|
||||
+10
-1
@@ -1 +1,10 @@
|
||||
[['menu.main]]\n name = "Resume"\n url = "/resume/', 'weight = 1\n\n[[menu.main]]\n name = "About"\n url = "/about/', 'weight = 2\n\n[params]\n author = "Emil Shanayev"\n description = "DevOps & Backend Engineer"\n keywords = ["DevOps', 'Backend', 'Go', 'Tailwind', 'Resume']]
|
||||
baseURL = "https://emil28092005.github.io/"
|
||||
languageCode = "ru"
|
||||
title = "Emil Shanayev"
|
||||
|
||||
[params]
|
||||
author = "Emil Shanayev"
|
||||
description = "DevOps & Backend Engineer"
|
||||
keywords = ["DevOps", "Backend", "Go", "Tailwind", "Resume"]
|
||||
github = "https://github.com/emil28092005"
|
||||
email = "emil28092005@gmail.com"
|
||||
|
||||
+58
-1
@@ -1 +1,58 @@
|
||||
['GitHub](https://github.com/emil28092005) \n\n--- \n\n## Обо мне \nМолодой разработчик с глубокими знаниями в backend‑разработке и DevOps‑инженерии. Специализируюсь на Python/FastAPI, контейнеризации (Docker, Kubernetes) и Linux‑системах. Имею практический опыт проектирования архитектур, работы с CI/CD пайплайнами и управления инфраструктурой. Предпочитаю командную работу, обладаю лидерскими качествами и умею находить творческие решения сложных задач.\n\n--- \n\n## Ключевые навыки \n\n### Backend & Web Development \n- **Python**: FastAPI, asyncio, REST API \n- **Go**: микросервисы, высоконагруженные сервисы \n- **JavaScript/TypeScript**: async‑код, базовый React \n- **SQL**: PostgreSQL, Redis, SQLite – проектирование схем, оптимизация запросов \n- **HTML / CSS**: Tailwind CSS – утилитарный стиль, быстрый UI \n\n### DevOps & Infrastructure \n- **Docker**: контейнеризация приложений, `docker-compose` \n- **Kubernetes**: развертывание, авто‑сcaling, Helm‑чарты \n- **CI/CD**: GitHub Actions, Jenkins – автоматизация тестов и деплоя \n- **Linux**: Ubuntu, Debian, Manjaro; администрирование серверов, Bash‑скрипты \n- **CI/CD pipelines**: сборка образов, публикация в Harbor \n\n### Дополнительные компетенции \n- **Version Control**: Git, GitHub‑Actions \n- **CI/CD**: Harbor – хранение образов \n- **Системное администрирование**: VPS, самостоятельные сервисы \n- **Java, C#**: базовые знания \n- **Agile / Scrum**: управление проектами, коммуникация с командой \n\n--- \n\n## Образование \n\n**Университет Иннополис** – Программа Data Structures and Artificial Intelligence (DSAI) \n*2 года обучения*, факультатив *Product Management* – отличная оценка \n\n--- \n\n## Профессиональный опыт \n\n**Самостоятельные проекты** \n- Разработка backend‑приложений на **Python/FastAPI** с асинхронным программированием \n- Контейнеризация в **Docker**, оркестрация в **Kubernetes** \n- Настройка **CI/CD**‑пайплайнов с **GitHub Actions** и **Jenkins** \n- Администрирование **Linux‑серверов** (Debian, Ubuntu) \n\n**Командный опыт** \n- Вузовские учебные проекты – лидерство в небольших командах \n- Agile‑процессы, Scrum‑ролики \n\n--- \n\n## Дополнительно \n\n- **Обучение**: постоянное изучение документаций, YouTube‑курсов, Perplexity AI \n- **Открытый исходный код**: работа с инструментами DevOps‑сферы \n- **Командная работа**: наставничество, менторинг \n\n--- \n\n*Продолжаю развиваться в направлении DevOps и облачных технологий, активно экспериментирую с новыми подходами к инфраструктуре и автоматизации.*']
|
||||
---
|
||||
title: "Emil Shanayev"
|
||||
---
|
||||
|
||||
## Обо мне
|
||||
|
||||
Молодой разработчик с глубокими знаниями в backend‑разработке и DevOps‑инженерии. Специализируюсь на Python/FastAPI, контейнеризации (Docker, Kubernetes) и Linux‑системах. Имею практический опыт проектирования архитектур, работы с CI/CD пайплайнами и управления инфраструктурой. Предпочитаю командную работу, обладаю лидерскими качествами и умею находить творческие решения сложных задач.
|
||||
|
||||
---
|
||||
|
||||
## Ключевые навыки
|
||||
|
||||
### Backend & Web Development
|
||||
|
||||
{{< skills "Python · FastAPI · asyncio" "Go · микросервисы" "JavaScript / TypeScript" "PostgreSQL · Redis · SQLite" "Tailwind CSS" >}}
|
||||
|
||||
### DevOps & Infrastructure
|
||||
|
||||
{{< skills "Docker · Compose" "Kubernetes · Helm" "GitHub Actions · Jenkins" "Linux · Bash" "Harbor" >}}
|
||||
|
||||
### Дополнительные компетенции
|
||||
|
||||
{{< skills "Git · GitHub Actions" "Agile · Scrum" "Java · C#" "VPS · сервер‑администрирование" >}}
|
||||
|
||||
---
|
||||
|
||||
## Образование
|
||||
|
||||
**Университет Иннополис** – Программа Data Structures and Artificial Intelligence (DSAI)
|
||||
*2 года обучения*, факультатив *Product Management* – отличная оценка
|
||||
|
||||
---
|
||||
|
||||
## Профессиональный опыт
|
||||
|
||||
**Самостоятельные проекты**
|
||||
|
||||
- Разработка backend‑приложений на **Python/FastAPI** с асинхронным программированием
|
||||
- Контейнеризация в **Docker**, оркестрация в **Kubernetes**
|
||||
- Настройка **CI/CD**‑пайплайнов с **GitHub Actions** и **Jenkins**
|
||||
- Администрирование **Linux‑серверов** (Debian, Ubuntu)
|
||||
|
||||
**Командный опыт**
|
||||
|
||||
- Вузовские учебные проекты – лидерство в небольших командах
|
||||
- Agile‑процессы, Scrum‑методики
|
||||
|
||||
---
|
||||
|
||||
## Дополнительно
|
||||
|
||||
- **Обучение**: постоянное изучение документаций, YouTube‑курсов, Perplexity AI
|
||||
- **Открытый исходный код**: работа с инструментами DevOps‑сферы
|
||||
- **Командная работа**: наставничество, менторинг
|
||||
|
||||
---
|
||||
|
||||
*Продолжаю развиваться в направлении DevOps и облачных технологий, активно экспериментирую с новыми подходами к инфраструктуре и автоматизации.*
|
||||
|
||||
@@ -1 +1,5 @@
|
||||
['DevOps', 'Backend', 'Go']
|
||||
---
|
||||
title: "DevOps Engineer"
|
||||
tags: ["DevOps", "Backend", "Go"]
|
||||
draft: true
|
||||
---
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
# Identity Template
|
||||
@@ -0,0 +1 @@
|
||||
# Preferences Template
|
||||
@@ -0,0 +1,6 @@
|
||||
- IMPORTANT Rules: Always be kind. Prioritize user well-being.
|
||||
- Code Quality Principles: Write clear, concise, and efficient code. Avoid unnecessary complexity.
|
||||
- Coding Style Preferences: 2-space indentation, descriptive variable names.
|
||||
- Architecture Principles: Modular design, scalability focus.
|
||||
- Development Workflow: Git + PRs + descriptive commits + tests.
|
||||
- Technical Preferences: TypeScript, REST, PostgreSQL, Redis, Docker.
|
||||
@@ -0,0 +1,112 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="ru">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>{{ if .IsHome }}{{ .Site.Params.author }} — {{ .Site.Params.description }}{{ else }}{{ .Title }} | {{ .Site.Params.author }}{{ end }}</title>
|
||||
{{ $css := resources.Get "css/main.css" }}
|
||||
{{ if $css }}<link rel="stylesheet" href="{{ $css.RelPermalink }}">{{ end }}
|
||||
</head>
|
||||
<body class="bg-slate-950 text-slate-100 min-h-screen">
|
||||
<div class="h-px bg-gradient-to-r from-blue-600 via-cyan-400 to-blue-600"></div>
|
||||
<nav class="sticky top-0 z-10 bg-slate-950/80 backdrop-blur border-b border-slate-800/60 px-8 py-3 flex items-center justify-between">
|
||||
<span class="text-sm font-mono text-slate-500 tracking-wide">{{ .Site.Params.author }}</span>
|
||||
<button id="pdf-btn" onclick="downloadPDF()"
|
||||
class="text-xs text-slate-500 hover:text-white transition-colors px-3 py-1.5 rounded border border-slate-700 hover:border-slate-500 cursor-pointer">
|
||||
Download PDF
|
||||
</button>
|
||||
</nav>
|
||||
<main id="resume-main" class="max-w-3xl mx-auto px-6 py-14">
|
||||
{{ block "main" . }}{{ end }}
|
||||
</main>
|
||||
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/html2pdf.js/0.10.1/html2pdf.bundle.min.js" defer></script>
|
||||
<script>
|
||||
function downloadPDF() {
|
||||
const btn = document.getElementById('pdf-btn');
|
||||
btn.textContent = 'Generating…';
|
||||
btn.disabled = true;
|
||||
|
||||
html2pdf().set({
|
||||
margin: [14, 18, 14, 18],
|
||||
filename: 'Emil_Shanayev_Resume.pdf',
|
||||
image: { type: 'png' },
|
||||
html2canvas: {
|
||||
scale: 2.5,
|
||||
useCORS: true,
|
||||
onclone: (doc) => {
|
||||
// Inject a stylesheet — inline styles lose to !important in our CSS,
|
||||
// but a later <style> tag wins the cascade.
|
||||
const style = doc.createElement('style');
|
||||
style.textContent = `
|
||||
body {
|
||||
background: #ffffff !important;
|
||||
background-image: none !important;
|
||||
color: #0f172a !important;
|
||||
min-height: auto !important;
|
||||
}
|
||||
#resume-main {
|
||||
max-width: none !important;
|
||||
margin: 0 !important;
|
||||
padding: 0 !important;
|
||||
background: #ffffff !important;
|
||||
}
|
||||
h1 {
|
||||
background-image: none !important;
|
||||
-webkit-background-clip: unset !important;
|
||||
background-clip: unset !important;
|
||||
-webkit-text-fill-color: #0f172a !important;
|
||||
color: #0f172a !important;
|
||||
}
|
||||
header { border-color: #e2e8f0 !important; }
|
||||
header p { color: #475569 !important; }
|
||||
header span {
|
||||
background: #eff6ff !important;
|
||||
border-color: #bfdbfe !important;
|
||||
color: #1d4ed8 !important;
|
||||
}
|
||||
header a {
|
||||
background: transparent !important;
|
||||
border: none !important;
|
||||
color: #1d4ed8 !important;
|
||||
padding: 0 !important;
|
||||
font-size: 0.8rem !important;
|
||||
}
|
||||
.resume-content h2 {
|
||||
color: #1d4ed8 !important;
|
||||
background: #eff6ff !important;
|
||||
border-color: #1d4ed8 !important;
|
||||
box-shadow: none !important;
|
||||
margin-left: 0 !important;
|
||||
border-radius: 0.25rem !important;
|
||||
}
|
||||
.resume-content h3 { color: #1e293b !important; }
|
||||
.resume-content p { color: #334155 !important; }
|
||||
.resume-content li { color: #334155 !important; }
|
||||
.resume-content li::marker { color: #1d4ed8 !important; }
|
||||
.resume-content strong { color: #0f172a !important; }
|
||||
.resume-content a { color: #1d4ed8 !important; }
|
||||
.resume-content code { background: #f1f5f9 !important; color: #1d4ed8 !important; }
|
||||
.resume-content hr { border-color: #e2e8f0 !important; }
|
||||
.skills-grid span {
|
||||
background: #eff6ff !important;
|
||||
border-color: #bfdbfe !important;
|
||||
color: #1d4ed8 !important;
|
||||
}
|
||||
`;
|
||||
doc.head.appendChild(style);
|
||||
}
|
||||
},
|
||||
jsPDF: { unit: 'mm', format: 'a4', orientation: 'portrait' },
|
||||
pagebreak: { mode: 'css' }
|
||||
})
|
||||
.from(document.getElementById('resume-main'))
|
||||
.save()
|
||||
.then(() => {
|
||||
btn.textContent = 'Download PDF';
|
||||
btn.disabled = false;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,6 @@
|
||||
{{ define "main" }}
|
||||
<article class="prose prose-invert max-w-none">
|
||||
<h1 class="text-3xl font-bold mb-6">{{ .Title }}</h1>
|
||||
{{ .Content }}
|
||||
</article>
|
||||
{{ end }}
|
||||
@@ -0,0 +1,31 @@
|
||||
{{ define "main" }}
|
||||
<header class="mb-14 pb-10 border-b border-slate-800">
|
||||
<div class="flex flex-wrap gap-2 mb-5">
|
||||
<span class="px-2.5 py-1 rounded-full text-xs font-mono bg-blue-500/10 text-blue-400 border border-blue-500/20">DevOps</span>
|
||||
<span class="px-2.5 py-1 rounded-full text-xs font-mono bg-blue-500/10 text-blue-400 border border-blue-500/20">Backend</span>
|
||||
<span class="px-2.5 py-1 rounded-full text-xs font-mono bg-blue-500/10 text-blue-400 border border-blue-500/20">Go · Python</span>
|
||||
<span class="px-2.5 py-1 rounded-full text-xs font-mono bg-blue-500/10 text-blue-400 border border-blue-500/20">Kubernetes</span>
|
||||
</div>
|
||||
<h1 class="text-5xl font-bold tracking-tight bg-gradient-to-br from-white via-slate-200 to-slate-500 bg-clip-text text-transparent">
|
||||
{{ .Site.Params.author }}
|
||||
</h1>
|
||||
<p class="mt-3 text-slate-400 text-lg">{{ .Site.Params.description }}</p>
|
||||
<div class="mt-6 flex flex-wrap gap-3">
|
||||
{{ if .Site.Params.github }}
|
||||
<a href="{{ .Site.Params.github }}"
|
||||
class="inline-flex items-center gap-2 px-4 py-2 rounded-lg bg-slate-800 hover:bg-slate-700 text-sm text-slate-300 hover:text-white transition-all border border-slate-700">
|
||||
GitHub ↗
|
||||
</a>
|
||||
{{ end }}
|
||||
{{ if .Site.Params.email }}
|
||||
<a href="mailto:{{ .Site.Params.email }}"
|
||||
class="inline-flex items-center gap-2 px-4 py-2 rounded-lg bg-slate-800/50 hover:bg-slate-700 text-sm text-slate-400 hover:text-white transition-all border border-slate-700/60">
|
||||
{{ .Site.Params.email }}
|
||||
</a>
|
||||
{{ end }}
|
||||
</div>
|
||||
</header>
|
||||
<article class="resume-content prose prose-invert max-w-none">
|
||||
{{ .Content }}
|
||||
</article>
|
||||
{{ end }}
|
||||
@@ -0,0 +1,5 @@
|
||||
<div class="skills-grid">
|
||||
{{ range .Params }}
|
||||
<span>{{ . }}</span>
|
||||
{{ end }}
|
||||
</div>
|
||||
Generated
+28
@@ -8,6 +8,7 @@
|
||||
"name": "resume-website",
|
||||
"version": "1.0.0",
|
||||
"devDependencies": {
|
||||
"@tailwindcss/typography": "^0.5.19",
|
||||
"autoprefixer": "^10.5.0",
|
||||
"postcss": "^8.5.12",
|
||||
"postcss-cli": "^11.0.1",
|
||||
@@ -104,6 +105,33 @@
|
||||
"node": ">= 8"
|
||||
}
|
||||
},
|
||||
"node_modules/@tailwindcss/typography": {
|
||||
"version": "0.5.19",
|
||||
"resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.19.tgz",
|
||||
"integrity": "sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"postcss-selector-parser": "6.0.10"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1"
|
||||
}
|
||||
},
|
||||
"node_modules/@tailwindcss/typography/node_modules/postcss-selector-parser": {
|
||||
"version": "6.0.10",
|
||||
"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz",
|
||||
"integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"cssesc": "^3.0.0",
|
||||
"util-deprecate": "^1.0.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=4"
|
||||
}
|
||||
},
|
||||
"node_modules/ansi-regex": {
|
||||
"version": "5.0.1",
|
||||
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
"build": "npm run build:css && hugo --minify"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@tailwindcss/typography": "^0.5.19",
|
||||
"autoprefixer": "^10.5.0",
|
||||
"postcss": "^8.5.12",
|
||||
"postcss-cli": "^11.0.1",
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
module.exports = {
|
||||
plugins: {
|
||||
tailwindcss: {},
|
||||
autoprefixer: {},
|
||||
},
|
||||
}
|
||||
+34
-1
@@ -1 +1,34 @@
|
||||
{'darkMode': 'class', 'content': ['**/*.{html,js,ts,jsx,md,go,rs}'], 'theme': {'extend': {'colors': {'primary': '#2563eb', 'secondary': '#112d44', 'dark': {'#0f172a': 100, '#1e293b': 200, '#334155': 300, '#475569': 400, '#607d8b': 500, '#304ffe': 600, '#24368a': 700, '#1d2951': 800, '#132743': 900}, 'bg': {'default': '#ffffff', 'primary': '#0f172a'}}, 'spacing': {'5': '1.25rem', '7': '1.75rem', '9': '2.25rem'}}}, 'plugins': []}
|
||||
/** @type {import('tailwindcss').Config} */
|
||||
module.exports = {
|
||||
darkMode: 'class',
|
||||
content: ['./layouts/**/*.html', './content/**/*.md', './assets/**/*.{js,ts}'],
|
||||
theme: {
|
||||
extend: {
|
||||
colors: {
|
||||
primary: '#2563eb',
|
||||
secondary: '#112d44',
|
||||
dark: {
|
||||
100: '#0f172a',
|
||||
200: '#1e293b',
|
||||
300: '#334155',
|
||||
400: '#475569',
|
||||
500: '#607d8b',
|
||||
600: '#304ffe',
|
||||
700: '#24368a',
|
||||
800: '#1d2951',
|
||||
900: '#132743',
|
||||
},
|
||||
bg: {
|
||||
default: '#ffffff',
|
||||
primary: '#0f172a',
|
||||
},
|
||||
},
|
||||
spacing: {
|
||||
'5': '1.25rem',
|
||||
'7': '1.75rem',
|
||||
'9': '2.25rem',
|
||||
},
|
||||
},
|
||||
},
|
||||
plugins: [require('@tailwindcss/typography')],
|
||||
}
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
# Identity Template
|
||||
@@ -0,0 +1 @@
|
||||
# Preferences Template
|
||||
Reference in New Issue
Block a user