Compare commits
5
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3671f6a8e8 | ||
|
|
0b63a6698d | ||
|
|
c1c64b8345 | ||
|
|
71b1117e9d | ||
|
|
f9edebcc81 |
@@ -0,0 +1,47 @@
|
||||
on:
|
||||
push:
|
||||
branches: [main]
|
||||
pull_request:
|
||||
branches: [main]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
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
|
||||
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: hugo --minify
|
||||
|
||||
- name: Verify Hugo output exists
|
||||
run: |
|
||||
if [ ! -d "public" ]; then
|
||||
echo "public/ not found"
|
||||
exit 1
|
||||
fi
|
||||
@@ -0,0 +1,41 @@
|
||||
on:
|
||||
push:
|
||||
branches: [main]
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
|
||||
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 }}
|
||||
publish_branch: gh-pages
|
||||
keep_files: false
|
||||
force_orphan: true
|
||||
commit_message: Deploy Hugo site
|
||||
+23
@@ -0,0 +1,23 @@
|
||||
# Node dependencies
|
||||
node_modules/
|
||||
|
||||
# Build output
|
||||
/public
|
||||
/dist
|
||||
/build
|
||||
|
||||
# Hugo
|
||||
*.log
|
||||
*.patch
|
||||
.hugo_build.lock
|
||||
|
||||
# OS & editor artifacts
|
||||
.DS_Store
|
||||
.idea/
|
||||
*.swp
|
||||
*~
|
||||
*.md~
|
||||
|
||||
# Tailwind / PostCSS caches
|
||||
/.cache/
|
||||
assets/css/main.css
|
||||
@@ -0,0 +1 @@
|
||||
{\"repoUrl\": \"file:///home/emil/Desktop/Coding/AI/UI_test\"}
|
||||
@@ -0,0 +1,14 @@
|
||||
# Task
|
||||
|
||||
Describe your task here.
|
||||
|
||||
## Goals
|
||||
- Goal 1
|
||||
- Goal 2
|
||||
|
||||
## Checklist
|
||||
- [ ] Item 1
|
||||
- [ ] Item 2
|
||||
|
||||
## Notes
|
||||
(Update this as you work)
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"name": "proceed",
|
||||
"taskFile": ".ralph/proceed.md",
|
||||
"iteration": 2,
|
||||
"maxIterations": 50,
|
||||
"itemsPerIteration": 0,
|
||||
"reflectEvery": 0,
|
||||
"reflectInstructions": "REFLECTION CHECKPOINT\n\nPause and reflect on your progress:\n1. What has been accomplished so far?\n2. What's working well?\n3. What's not working or blocking progress?\n4. Should the approach be adjusted?\n5. What are the next priorities?\n\nUpdate the task file with your reflection, then continue working.",
|
||||
"active": false,
|
||||
"status": "completed",
|
||||
"startedAt": "2026-04-29T07:23:46.928Z",
|
||||
"lastReflectionAt": 0,
|
||||
"completedAt": "2026-04-29T07:38:48.762Z"
|
||||
}
|
||||
@@ -0,0 +1,271 @@
|
||||
./content/_index.md
|
||||
./package.json
|
||||
./node_modules/@nodelib/fs.walk/package.json
|
||||
./node_modules/@nodelib/fs.walk/README.md
|
||||
./node_modules/@nodelib/fs.scandir/package.json
|
||||
./node_modules/@nodelib/fs.scandir/README.md
|
||||
./node_modules/@nodelib/fs.stat/package.json
|
||||
./node_modules/@nodelib/fs.stat/README.md
|
||||
./node_modules/@jridgewell/trace-mapping/package.json
|
||||
./node_modules/@jridgewell/trace-mapping/README.md
|
||||
./node_modules/@jridgewell/sourcemap-codec/package.json
|
||||
./node_modules/@jridgewell/sourcemap-codec/README.md
|
||||
./node_modules/@jridgewell/resolve-uri/package.json
|
||||
./node_modules/@jridgewell/resolve-uri/README.md
|
||||
./node_modules/@jridgewell/gen-mapping/package.json
|
||||
./node_modules/@jridgewell/gen-mapping/README.md
|
||||
./node_modules/postcss/package.json
|
||||
./node_modules/postcss/README.md
|
||||
./node_modules/@alloc/quick-lru/package.json
|
||||
./node_modules/@alloc/quick-lru/readme.md
|
||||
./node_modules/browserslist/package.json
|
||||
./node_modules/browserslist/README.md
|
||||
./node_modules/caniuse-lite/package.json
|
||||
./node_modules/caniuse-lite/README.md
|
||||
./node_modules/tailwindcss/lib/value-parser/README.md
|
||||
./node_modules/tailwindcss/lib/postcss-plugins/nesting/README.md
|
||||
./node_modules/tailwindcss/src/value-parser/README.md
|
||||
./node_modules/tailwindcss/src/postcss-plugins/nesting/README.md
|
||||
./node_modules/tailwindcss/package.json
|
||||
./node_modules/tailwindcss/README.md
|
||||
./node_modules/fraction.js/package.json
|
||||
./node_modules/fraction.js/CHANGELOG.md
|
||||
./node_modules/fraction.js/README.md
|
||||
./node_modules/postcss-value-parser/package.json
|
||||
./node_modules/postcss-value-parser/README.md
|
||||
./node_modules/baseline-browser-mapping/package.json
|
||||
./node_modules/baseline-browser-mapping/README.md
|
||||
./node_modules/update-browserslist-db/package.json
|
||||
./node_modules/update-browserslist-db/README.md
|
||||
./node_modules/nanoid/async/package.json
|
||||
./node_modules/nanoid/non-secure/package.json
|
||||
./node_modules/nanoid/url-alphabet/package.json
|
||||
./node_modules/nanoid/package.json
|
||||
./node_modules/nanoid/README.md
|
||||
./node_modules/source-map-js/package.json
|
||||
./node_modules/source-map-js/README.md
|
||||
./node_modules/arg/package.json
|
||||
./node_modules/arg/LICENSE.md
|
||||
./node_modules/arg/README.md
|
||||
./node_modules/didyoumean/package.json
|
||||
./node_modules/didyoumean/README.md
|
||||
./node_modules/dlv/package.json
|
||||
./node_modules/dlv/README.md
|
||||
./node_modules/picocolors/package.json
|
||||
./node_modules/picocolors/README.md
|
||||
./node_modules/glob-parent/package.json
|
||||
./node_modules/glob-parent/README.md
|
||||
./node_modules/is-glob/package.json
|
||||
./node_modules/is-glob/README.md
|
||||
./node_modules/jiti/package.json
|
||||
./node_modules/jiti/README.md
|
||||
./node_modules/lilconfig/package.json
|
||||
./node_modules/lilconfig/readme.md
|
||||
./node_modules/micromatch/package.json
|
||||
./node_modules/micromatch/README.md
|
||||
./node_modules/postcss-import/package.json
|
||||
./node_modules/postcss-import/README.md
|
||||
./node_modules/object-hash/package.json
|
||||
./node_modules/normalize-path/package.json
|
||||
./node_modules/normalize-path/README.md
|
||||
./node_modules/postcss-js/package.json
|
||||
./node_modules/postcss-js/README.md
|
||||
./node_modules/postcss-load-config/package.json
|
||||
./node_modules/postcss-load-config/README.md
|
||||
./node_modules/postcss-nested/package.json
|
||||
./node_modules/postcss-nested/README.md
|
||||
./node_modules/postcss-selector-parser/package.json
|
||||
./node_modules/postcss-selector-parser/API.md
|
||||
./node_modules/postcss-selector-parser/CHANGELOG.md
|
||||
./node_modules/postcss-selector-parser/README.md
|
||||
./node_modules/sucrase/package.json
|
||||
./node_modules/sucrase/README.md
|
||||
./node_modules/resolve/test/resolver/symlinked/package/package.json
|
||||
./node_modules/resolve/test/resolver/browser_field/package.json
|
||||
./node_modules/resolve/test/resolver/nested_symlinks/mylib/package.json
|
||||
./node_modules/resolve/test/resolver/baz/package.json
|
||||
./node_modules/resolve/test/resolver/dot_main/package.json
|
||||
./node_modules/resolve/test/resolver/dot_slash_main/package.json
|
||||
./node_modules/resolve/test/resolver/false_main/package.json
|
||||
./node_modules/resolve/test/resolver/incorrect_main/package.json
|
||||
./node_modules/resolve/test/resolver/multirepo/packages/package-a/package.json
|
||||
./node_modules/resolve/test/resolver/multirepo/packages/package-b/package.json
|
||||
./node_modules/resolve/test/resolver/multirepo/package.json
|
||||
./node_modules/resolve/test/resolver/invalid_main/package.json
|
||||
./node_modules/resolve/test/module_dir/zmodules/bbb/package.json
|
||||
./node_modules/resolve/package.json
|
||||
./node_modules/resolve/.claude/notes.md
|
||||
./node_modules/resolve/.github/INCIDENT_RESPONSE_PROCESS.md
|
||||
./node_modules/resolve/.github/THREAT_MODEL.md
|
||||
./node_modules/resolve/SECURITY.md
|
||||
./node_modules/anymatch/package.json
|
||||
./node_modules/anymatch/README.md
|
||||
./node_modules/electron-to-chromium/package.json
|
||||
./node_modules/electron-to-chromium/README.md
|
||||
./node_modules/node-releases/package.json
|
||||
./node_modules/node-releases/README.md
|
||||
./node_modules/braces/package.json
|
||||
./node_modules/braces/README.md
|
||||
./node_modules/readdirp/package.json
|
||||
./node_modules/readdirp/README.md
|
||||
./node_modules/is-binary-path/package.json
|
||||
./node_modules/is-binary-path/readme.md
|
||||
./node_modules/merge2/package.json
|
||||
./node_modules/merge2/README.md
|
||||
./node_modules/fill-range/package.json
|
||||
./node_modules/fill-range/README.md
|
||||
./node_modules/picomatch/package.json
|
||||
./node_modules/picomatch/README.md
|
||||
./node_modules/fastq/package.json
|
||||
./node_modules/fastq/README.md
|
||||
./node_modules/fastq/SECURITY.md
|
||||
./node_modules/to-regex-range/package.json
|
||||
./node_modules/to-regex-range/README.md
|
||||
./node_modules/run-parallel/package.json
|
||||
./node_modules/run-parallel/README.md
|
||||
./node_modules/reusify/package.json
|
||||
./node_modules/reusify/README.md
|
||||
./node_modules/reusify/SECURITY.md
|
||||
./node_modules/binary-extensions/package.json
|
||||
./node_modules/binary-extensions/readme.md
|
||||
./node_modules/is-extglob/package.json
|
||||
./node_modules/is-extglob/README.md
|
||||
./node_modules/read-cache/package.json
|
||||
./node_modules/read-cache/README.md
|
||||
./node_modules/camelcase-css/package.json
|
||||
./node_modules/camelcase-css/README.md
|
||||
./node_modules/cssesc/package.json
|
||||
./node_modules/cssesc/README.md
|
||||
./node_modules/pify/package.json
|
||||
./node_modules/pify/readme.md
|
||||
./node_modules/util-deprecate/package.json
|
||||
./node_modules/util-deprecate/README.md
|
||||
./node_modules/util-deprecate/History.md
|
||||
./node_modules/es-errors/package.json
|
||||
./node_modules/es-errors/CHANGELOG.md
|
||||
./node_modules/es-errors/README.md
|
||||
./node_modules/is-core-module/package.json
|
||||
./node_modules/is-core-module/CHANGELOG.md
|
||||
./node_modules/is-core-module/README.md
|
||||
./node_modules/supports-preserve-symlinks-flag/package.json
|
||||
./node_modules/supports-preserve-symlinks-flag/CHANGELOG.md
|
||||
./node_modules/supports-preserve-symlinks-flag/README.md
|
||||
./node_modules/path-parse/package.json
|
||||
./node_modules/path-parse/README.md
|
||||
./node_modules/hasown/package.json
|
||||
./node_modules/hasown/CHANGELOG.md
|
||||
./node_modules/hasown/README.md
|
||||
./node_modules/function-bind/package.json
|
||||
./node_modules/function-bind/CHANGELOG.md
|
||||
./node_modules/function-bind/README.md
|
||||
./node_modules/function-bind/.github/SECURITY.md
|
||||
./node_modules/queue-microtask/package.json
|
||||
./node_modules/queue-microtask/README.md
|
||||
./node_modules/commander/package.json
|
||||
./node_modules/commander/CHANGELOG.md
|
||||
./node_modules/commander/Readme.md
|
||||
./node_modules/lines-and-columns/package.json
|
||||
./node_modules/lines-and-columns/README.md
|
||||
./node_modules/mz/package.json
|
||||
./node_modules/mz/README.md
|
||||
./node_modules/mz/HISTORY.md
|
||||
./node_modules/pirates/package.json
|
||||
./node_modules/pirates/README.md
|
||||
./node_modules/tinyglobby/node_modules/fdir/package.json
|
||||
./node_modules/tinyglobby/node_modules/fdir/README.md
|
||||
./node_modules/tinyglobby/node_modules/picomatch/package.json
|
||||
./node_modules/tinyglobby/node_modules/picomatch/README.md
|
||||
./node_modules/tinyglobby/package.json
|
||||
./node_modules/tinyglobby/README.md
|
||||
./node_modules/ts-interface-checker/package.json
|
||||
./node_modules/ts-interface-checker/README.md
|
||||
./node_modules/object-assign/package.json
|
||||
./node_modules/object-assign/readme.md
|
||||
./node_modules/any-promise/package.json
|
||||
./node_modules/any-promise/README.md
|
||||
./node_modules/thenify-all/package.json
|
||||
./node_modules/thenify-all/README.md
|
||||
./node_modules/thenify-all/History.md
|
||||
./node_modules/thenify/package.json
|
||||
./node_modules/thenify/History.md
|
||||
./node_modules/thenify/README.md
|
||||
./node_modules/is-number/package.json
|
||||
./node_modules/is-number/README.md
|
||||
./node_modules/escalade/package.json
|
||||
./node_modules/escalade/readme.md
|
||||
./node_modules/autoprefixer/lib/hacks/flex-spec.js
|
||||
./node_modules/autoprefixer/package.json
|
||||
./node_modules/autoprefixer/README.md
|
||||
./node_modules/chokidar/node_modules/glob-parent/package.json
|
||||
./node_modules/chokidar/node_modules/glob-parent/CHANGELOG.md
|
||||
./node_modules/chokidar/node_modules/glob-parent/README.md
|
||||
./node_modules/chokidar/package.json
|
||||
./node_modules/chokidar/README.md
|
||||
./node_modules/fast-glob/node_modules/glob-parent/package.json
|
||||
./node_modules/fast-glob/node_modules/glob-parent/CHANGELOG.md
|
||||
./node_modules/fast-glob/node_modules/glob-parent/README.md
|
||||
./node_modules/fast-glob/package.json
|
||||
./node_modules/fast-glob/README.md
|
||||
./node_modules/postcss-reporter/package.json
|
||||
./node_modules/postcss-reporter/README.md
|
||||
./node_modules/fs-extra/package.json
|
||||
./node_modules/fs-extra/README.md
|
||||
./node_modules/pretty-hrtime/package.json
|
||||
./node_modules/pretty-hrtime/README.md
|
||||
./node_modules/slash/package.json
|
||||
./node_modules/slash/readme.md
|
||||
./node_modules/yargs/helpers/package.json
|
||||
./node_modules/yargs/package.json
|
||||
./node_modules/yargs/README.md
|
||||
./node_modules/graceful-fs/package.json
|
||||
./node_modules/graceful-fs/README.md
|
||||
./node_modules/jsonfile/package.json
|
||||
./node_modules/jsonfile/README.md
|
||||
./node_modules/universalify/package.json
|
||||
./node_modules/universalify/README.md
|
||||
./node_modules/thenby/package.json
|
||||
./node_modules/thenby/README.md
|
||||
./node_modules/cliui/package.json
|
||||
./node_modules/cliui/CHANGELOG.md
|
||||
./node_modules/cliui/README.md
|
||||
./node_modules/get-caller-file/package.json
|
||||
./node_modules/get-caller-file/LICENSE.md
|
||||
./node_modules/get-caller-file/README.md
|
||||
./node_modules/require-directory/package.json
|
||||
./node_modules/require-directory/README.markdown
|
||||
./node_modules/string-width/package.json
|
||||
./node_modules/string-width/readme.md
|
||||
./node_modules/y18n/package.json
|
||||
./node_modules/y18n/CHANGELOG.md
|
||||
./node_modules/y18n/README.md
|
||||
./node_modules/yargs-parser/package.json
|
||||
./node_modules/yargs-parser/CHANGELOG.md
|
||||
./node_modules/yargs-parser/README.md
|
||||
./node_modules/strip-ansi/package.json
|
||||
./node_modules/strip-ansi/readme.md
|
||||
./node_modules/wrap-ansi/package.json
|
||||
./node_modules/wrap-ansi/readme.md
|
||||
./node_modules/emoji-regex/package.json
|
||||
./node_modules/emoji-regex/README.md
|
||||
./node_modules/is-fullwidth-code-point/package.json
|
||||
./node_modules/is-fullwidth-code-point/readme.md
|
||||
./node_modules/ansi-regex/package.json
|
||||
./node_modules/ansi-regex/readme.md
|
||||
./node_modules/ansi-styles/package.json
|
||||
./node_modules/ansi-styles/readme.md
|
||||
./node_modules/color-convert/package.json
|
||||
./node_modules/color-convert/CHANGELOG.md
|
||||
./node_modules/color-convert/README.md
|
||||
./node_modules/color-name/package.json
|
||||
./node_modules/color-name/README.md
|
||||
./node_modules/yaml/browser/package.json
|
||||
./node_modules/yaml/package.json
|
||||
./node_modules/yaml/README.md
|
||||
./node_modules/dependency-graph/specs/dep_graph_spec.js
|
||||
./node_modules/dependency-graph/package.json
|
||||
./node_modules/dependency-graph/CHANGELOG.md
|
||||
./node_modules/dependency-graph/README.md
|
||||
./node_modules/postcss-cli/node_modules/postcss-load-config/package.json
|
||||
./node_modules/postcss-cli/node_modules/postcss-load-config/README.md
|
||||
./node_modules/postcss-cli/package.json
|
||||
./node_modules/postcss-cli/README.md
|
||||
@@ -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 @@
|
||||
[['menu]\n [[menu.main]]\n name = "Resume"\n url = "/resume/', 'weight = 1\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'], {'name': 'resume-website', 'private': True, 'scripts': {'build:css': 'postcss assets/css/tailwind.css -o assets/css/main.css', 'build': 'npm run build:css && hugo --minify', 'lint:md': "markdownlint '**/*.md' --config .markdownlint.json || echo 'No markdownlint config'", 'lint:html': "htmlhint 'public/**/*.html' || echo 'No HTML output yet'"}, 'devDependencies': {'autoprefixer': '^10.5.0', 'postcss': '^8.5.12', 'postcss-cli': '^11.0.1', 'tailwindcss': '^3.4.4', 'markdownlint-cli': '^0.35.0', 'htmlhint': '^1.2.0'}}]
|
||||
@@ -1 +0,0 @@
|
||||
self.__BUILD_MANIFEST={__rewrites:{afterFiles:[],beforeFiles:[],fallback:[]},"/_error":["static/chunks/pages/_error-7ba65e1336b92748.js"],sortedPages:["/_app","/_error"]},self.__BUILD_MANIFEST_CB&&self.__BUILD_MANIFEST_CB();
|
||||
@@ -1 +0,0 @@
|
||||
self.__SSG_MANIFEST=new Set([]);self.__SSG_MANIFEST_CB&&self.__SSG_MANIFEST_CB()
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
||||
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[409],{7589:function(e,t,n){(window.__NEXT_P=window.__NEXT_P||[]).push(["/_not-found/page",function(){return n(3634)}])},3634:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return s}}),n(7043);let i=n(7437);n(2265);let o={fontFamily:'system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"',height:"100vh",textAlign:"center",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center"},l={display:"inline-block"},r={display:"inline-block",margin:"0 20px 0 0",padding:"0 23px 0 0",fontSize:24,fontWeight:500,verticalAlign:"top",lineHeight:"49px"},d={fontSize:14,fontWeight:400,lineHeight:"49px",margin:0};function s(){return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)("title",{children:"404: This page could not be found."}),(0,i.jsx)("div",{style:o,children:(0,i.jsxs)("div",{children:[(0,i.jsx)("style",{dangerouslySetInnerHTML:{__html:"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}),(0,i.jsx)("h1",{className:"next-error-h1",style:r,children:"404"}),(0,i.jsx)("div",{style:l,children:(0,i.jsx)("h2",{style:d,children:"This page could not be found."})})]})})]})}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)}},function(e){e.O(0,[971,117,744],function(){return e(e.s=7589)}),_N_E=e.O()}]);
|
||||
@@ -1 +0,0 @@
|
||||
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[185],{6642:function(n,e,u){Promise.resolve().then(u.t.bind(u,7960,23))},7960:function(){}},function(n){n.O(0,[587,971,117,744],function(){return n(n.s=6642)}),_N_E=n.O()}]);
|
||||
@@ -1 +0,0 @@
|
||||
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[931],{8219:function(e,t,n){Promise.resolve().then(n.bind(n,1030)),Promise.resolve().then(n.bind(n,24)),Promise.resolve().then(n.bind(n,1991))},1030:function(e,t,n){"use strict";n.d(t,{Nav:function(){return a}});var r=n(7437),s=n(2265);let i=[{label:"skills",href:"#skills"},{label:"projects",href:"#projects"},{label:"contact",href:"#contact"}];function a(){let[e,t]=(0,s.useState)(!1);return(0,s.useEffect)(()=>{let e=()=>t(window.scrollY>40);return window.addEventListener("scroll",e,{passive:!0}),()=>window.removeEventListener("scroll",e)},[]),(0,r.jsx)("header",{className:"sticky top-0 z-50 transition-all duration-300 ".concat(e?"bg-terminal-bg/90 backdrop-blur-sm border-b border-terminal-border":"bg-transparent"),children:(0,r.jsxs)("nav",{className:"max-w-3xl mx-auto px-5 sm:px-8 h-14 flex items-center justify-between",children:[(0,r.jsxs)("span",{className:"text-[11px] text-terminal-muted tracking-widest",children:[(0,r.jsx)("span",{className:"text-terminal-amber",children:"~/"}),"emil28092005"]}),(0,r.jsx)("div",{className:"flex items-center gap-6",children:i.map(e=>(0,r.jsx)("a",{href:e.href,className:"text-[11px] text-terminal-muted hover:text-terminal-text transition-colors tracking-wider",children:e.label},e.href))})]})})}},24:function(e,t,n){"use strict";n.r(t),n.d(t,{Reveal:function(){return l}});var r=n(7437),s=n(3433),i=n(2409),a=n(2265);function l(e){let{children:t,delay:n=0,className:l}=e,c=(0,a.useRef)(null),u=(0,s.Y)(c,{once:!0,margin:"-60px"});return(0,r.jsx)(i.E.div,{ref:c,initial:{opacity:0,y:16},animate:u?{opacity:1,y:0}:{},transition:{duration:.55,delay:n,ease:[.22,1,.36,1]},className:l,children:t})}},1991:function(e,t,n){"use strict";n.d(t,{TypingText:function(){return i}});var r=n(7437),s=n(2265);function i(e){let{phrases:t,speed:n=75,deleteSpeed:i=38,pauseDuration:a=2200}=e,[l,c]=(0,s.useState)(""),[u,o]=(0,s.useState)(0),[m,f]=(0,s.useState)(0),[d,x]=(0,s.useState)(!1),[h,p]=(0,s.useState)(!1);return(0,s.useEffect)(()=>{if(h)return;let e=t[u];if(!d){if(m<e.length){let e=setTimeout(()=>f(e=>e+1),n);return()=>clearTimeout(e)}if(t.length>1){let e=setTimeout(()=>{p(!1),x(!0)},a);return p(!0),()=>clearTimeout(e)}return}if(m>0){let e=setTimeout(()=>f(e=>e-1),i);return()=>clearTimeout(e)}x(!1),o(e=>(e+1)%t.length)},[m,d,h,u,t,n,i,a]),(0,s.useEffect)(()=>{c(t[u].slice(0,m))},[m,u,t]),(0,r.jsxs)("span",{children:[l,(0,r.jsx)("span",{className:"cursor-blink text-terminal-amber",children:"█"})]})}}},function(e){e.O(0,[965,971,117,744],function(){return e(e.s=8219)}),_N_E=e.O()}]);
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
||||
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[744],{5417:function(e,n,t){Promise.resolve().then(t.t.bind(t,2846,23)),Promise.resolve().then(t.t.bind(t,9107,23)),Promise.resolve().then(t.t.bind(t,1060,23)),Promise.resolve().then(t.t.bind(t,4707,23)),Promise.resolve().then(t.t.bind(t,80,23)),Promise.resolve().then(t.t.bind(t,6423,23))}},function(e){var n=function(n){return e(e.s=n)};e.O(0,[971,117],function(){return n(4278),n(5417)}),_N_E=e.O()}]);
|
||||
@@ -1 +0,0 @@
|
||||
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[888],{1597:function(n,_,u){(window.__NEXT_P=window.__NEXT_P||[]).push(["/_app",function(){return u(8141)}])}},function(n){var _=function(_){return n(n.s=_)};n.O(0,[774,179],function(){return _(1597),_(7253)}),_N_E=n.O()}]);
|
||||
@@ -1 +0,0 @@
|
||||
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[820],{1981:function(n,_,u){(window.__NEXT_P=window.__NEXT_P||[]).push(["/_error",function(){return u(8529)}])}},function(n){n.O(0,[888,774,179],function(){return n(n.s=1981)}),_N_E=n.O()}]);
|
||||
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
||||
!function(){"use strict";var e,t,r,n,o,u,i,c,f,a={},l={};function s(e){var t=l[e];if(void 0!==t)return t.exports;var r=l[e]={exports:{}},n=!0;try{a[e](r,r.exports,s),n=!1}finally{n&&delete l[e]}return r.exports}s.m=a,e=[],s.O=function(t,r,n,o){if(r){o=o||0;for(var u=e.length;u>0&&e[u-1][2]>o;u--)e[u]=e[u-1];e[u]=[r,n,o];return}for(var i=1/0,u=0;u<e.length;u++){for(var r=e[u][0],n=e[u][1],o=e[u][2],c=!0,f=0;f<r.length;f++)i>=o&&Object.keys(s.O).every(function(e){return s.O[e](r[f])})?r.splice(f--,1):(c=!1,o<i&&(i=o));if(c){e.splice(u--,1);var a=n();void 0!==a&&(t=a)}}return t},r=Object.getPrototypeOf?function(e){return Object.getPrototypeOf(e)}:function(e){return e.__proto__},s.t=function(e,n){if(1&n&&(e=this(e)),8&n||"object"==typeof e&&e&&(4&n&&e.__esModule||16&n&&"function"==typeof e.then))return e;var o=Object.create(null);s.r(o);var u={};t=t||[null,r({}),r([]),r(r)];for(var i=2&n&&e;"object"==typeof i&&!~t.indexOf(i);i=r(i))Object.getOwnPropertyNames(i).forEach(function(t){u[t]=function(){return e[t]}});return u.default=function(){return e},s.d(o,u),o},s.d=function(e,t){for(var r in t)s.o(t,r)&&!s.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},s.f={},s.e=function(e){return Promise.all(Object.keys(s.f).reduce(function(t,r){return s.f[r](e,t),t},[]))},s.u=function(e){},s.miniCssF=function(e){},s.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n={},o="_N_E:",s.l=function(e,t,r,u){if(n[e]){n[e].push(t);return}if(void 0!==r)for(var i,c,f=document.getElementsByTagName("script"),a=0;a<f.length;a++){var l=f[a];if(l.getAttribute("src")==e||l.getAttribute("data-webpack")==o+r){i=l;break}}i||(c=!0,(i=document.createElement("script")).charset="utf-8",i.timeout=120,s.nc&&i.setAttribute("nonce",s.nc),i.setAttribute("data-webpack",o+r),i.src=s.tu(e)),n[e]=[t];var d=function(t,r){i.onerror=i.onload=null,clearTimeout(p);var o=n[e];if(delete n[e],i.parentNode&&i.parentNode.removeChild(i),o&&o.forEach(function(e){return e(r)}),t)return t(r)},p=setTimeout(d.bind(null,void 0,{type:"timeout",target:i}),12e4);i.onerror=d.bind(null,i.onerror),i.onload=d.bind(null,i.onload),c&&document.head.appendChild(i)},s.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},s.tt=function(){return void 0===u&&(u={createScriptURL:function(e){return e}},"undefined"!=typeof trustedTypes&&trustedTypes.createPolicy&&(u=trustedTypes.createPolicy("nextjs#bundler",u))),u},s.tu=function(e){return s.tt().createScriptURL(e)},s.p="/Emil_Shanayev_Resume/_next/",i={272:0,587:0},s.f.j=function(e,t){var r=s.o(i,e)?i[e]:void 0;if(0!==r){if(r)t.push(r[2]);else if(/^(272|587)$/.test(e))i[e]=0;else{var n=new Promise(function(t,n){r=i[e]=[t,n]});t.push(r[2]=n);var o=s.p+s.u(e),u=Error();s.l(o,function(t){if(s.o(i,e)&&(0!==(r=i[e])&&(i[e]=void 0),r)){var n=t&&("load"===t.type?"missing":t.type),o=t&&t.target&&t.target.src;u.message="Loading chunk "+e+" failed.\n("+n+": "+o+")",u.name="ChunkLoadError",u.type=n,u.request=o,r[1](u)}},"chunk-"+e,e)}}},s.O.j=function(e){return 0===i[e]},c=function(e,t){var r,n,o=t[0],u=t[1],c=t[2],f=0;if(o.some(function(e){return 0!==i[e]})){for(r in u)s.o(u,r)&&(s.m[r]=u[r]);if(c)var a=c(s)}for(e&&e(t);f<o.length;f++)n=o[f],s.o(i,n)&&i[n]&&i[n][0](),i[n]=0;return s.O(a)},(f=self.webpackChunk_N_E=self.webpackChunk_N_E||[]).forEach(c.bind(null,0)),f.push=c.bind(null,f.push.bind(f))}();
|
||||
File diff suppressed because one or more lines are too long
@@ -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
@@ -0,0 +1,10 @@
|
||||
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"
|
||||
@@ -0,0 +1,58 @@
|
||||
---
|
||||
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 и облачных технологий, активно экспериментирую с новыми подходами к инфраструктуре и автоматизации.*
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
title: "DevOps Engineer"
|
||||
tags: ["DevOps", "Backend", "Go"]
|
||||
draft: true
|
||||
---
|
||||
@@ -0,0 +1 @@
|
||||
# Резюме _DevOps-инженер _ Backend-разработчик
|
||||
@@ -0,0 +1,6 @@
|
||||
GitHub indicates standard conventions: tailwind.css -> main.css (built). Hugo builds site to .???
|
||||
|
||||
I need to examine the assets/css folder:
|
||||
</parameter>
|
||||
</function>
|
||||
</tool_call>
|
||||
@@ -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.
|
||||
File diff suppressed because one or more lines are too long
@@ -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
+1613
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"name": "resume-website",
|
||||
"version": "1.0.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"build:css": "postcss assets/css/tailwind.css -o assets/css/main.css",
|
||||
"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",
|
||||
"tailwindcss": "^3.4.4"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
module.exports = {
|
||||
plugins: {
|
||||
tailwindcss: {},
|
||||
autoprefixer: {},
|
||||
},
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
/** @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
|
||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user