Compare commits
10
Commits
3671f6a8e8
...
b001ddf6b5
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b001ddf6b5 | ||
|
|
8e723e306d | ||
|
|
b90b64ee86 | ||
|
|
75cb20939d | ||
|
|
b3648753eb | ||
|
|
101d9cb494 | ||
|
|
7bde4bad07 | ||
|
|
0a2d1941d5 | ||
|
|
727996503e | ||
|
|
a6ed78c2ca |
@@ -1,47 +0,0 @@
|
||||
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
|
||||
@@ -1,41 +1,53 @@
|
||||
name: Deploy to GitHub Pages
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [main]
|
||||
workflow_dispatch:
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
contents: read
|
||||
pages: write
|
||||
id-token: write
|
||||
|
||||
concurrency:
|
||||
group: pages
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
build-deploy:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Setup Hugo
|
||||
uses: peaceiris/actions-hugo@v2
|
||||
with:
|
||||
hugo-version: 'latest'
|
||||
|
||||
- name: Set up Node.js for Tailwindcss
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: '20'
|
||||
node-version: 22
|
||||
cache: npm
|
||||
|
||||
- name: Install dependencies
|
||||
run: npm ci
|
||||
|
||||
- name: Build CSS asset
|
||||
run: npm run build:css
|
||||
- name: Build static site
|
||||
run: npm run build
|
||||
|
||||
- name: Build Hugo site
|
||||
run: hugo --minify
|
||||
- name: Configure Pages
|
||||
uses: actions/configure-pages@v5
|
||||
|
||||
- name: Deploy to GitHub Pages
|
||||
uses: peaceiris/actions-gh-pages@v3
|
||||
- name: Upload artifact
|
||||
uses: actions/upload-pages-artifact@v3
|
||||
with:
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
publish_branch: gh-pages
|
||||
keep_files: false
|
||||
force_orphan: true
|
||||
commit_message: Deploy Hugo site
|
||||
path: ./out
|
||||
|
||||
deploy:
|
||||
environment:
|
||||
name: github-pages
|
||||
url: ${{ steps.deployment.outputs.page_url }}
|
||||
runs-on: ubuntu-latest
|
||||
needs: build
|
||||
steps:
|
||||
- name: Deploy to GitHub Pages
|
||||
id: deployment
|
||||
uses: actions/deploy-pages@v4
|
||||
|
||||
+34
-16
@@ -1,23 +1,41 @@
|
||||
# Node dependencies
|
||||
# Dependencies
|
||||
node_modules/
|
||||
|
||||
# Build output
|
||||
/public
|
||||
/dist
|
||||
/build
|
||||
# Next.js
|
||||
.next/
|
||||
out/
|
||||
|
||||
# Hugo
|
||||
*.log
|
||||
*.patch
|
||||
.hugo_build.lock
|
||||
# Production
|
||||
build/
|
||||
dist/
|
||||
|
||||
# OS & editor artifacts
|
||||
.DS_Store
|
||||
# Environment variables
|
||||
.env
|
||||
.env.local
|
||||
.env.development.local
|
||||
.env.test.local
|
||||
.env.production.local
|
||||
|
||||
# TypeScript
|
||||
*.tsbuildinfo
|
||||
next-env.d.ts
|
||||
|
||||
# Logs
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
pnpm-debug.log*
|
||||
|
||||
# Editors
|
||||
.vscode/
|
||||
.idea/
|
||||
*.swp
|
||||
*~
|
||||
*.md~
|
||||
*.swo
|
||||
|
||||
# Tailwind / PostCSS caches
|
||||
/.cache/
|
||||
assets/css/main.css
|
||||
# Operating systems
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
|
||||
# Local tooling
|
||||
.vercel/
|
||||
.turbo/
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
{\"repoUrl\": \"file:///home/emil/Desktop/Coding/AI/UI_test\"}
|
||||
@@ -1,14 +0,0 @@
|
||||
# Task
|
||||
|
||||
Describe your task here.
|
||||
|
||||
## Goals
|
||||
- Goal 1
|
||||
- Goal 2
|
||||
|
||||
## Checklist
|
||||
- [ ] Item 1
|
||||
- [ ] Item 2
|
||||
|
||||
## Notes
|
||||
(Update this as you work)
|
||||
@@ -1,14 +0,0 @@
|
||||
{
|
||||
"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"
|
||||
}
|
||||
@@ -1,271 +0,0 @@
|
||||
./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
|
||||
@@ -1,17 +0,0 @@
|
||||
# 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.
|
||||
@@ -1,49 +0,0 @@
|
||||
# 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
|
||||
@@ -1 +0,0 @@
|
||||
[['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'}}]
|
||||
@@ -0,0 +1,28 @@
|
||||
# Emil Shanayev — Portfolio
|
||||
|
||||
Updated static portfolio based on the original `Emil_Shanayev_Resume` repository.
|
||||
|
||||
## Local development
|
||||
|
||||
```bash
|
||||
npm install
|
||||
npm run dev
|
||||
```
|
||||
|
||||
Open `http://localhost:3000`.
|
||||
|
||||
## Production build
|
||||
|
||||
```bash
|
||||
npm run build
|
||||
```
|
||||
|
||||
The static export is written to `out/`.
|
||||
|
||||
## GitHub Pages
|
||||
|
||||
The project is preconfigured for:
|
||||
|
||||
`https://emil28092005.github.io/Emil_Shanayev_Resume/`
|
||||
|
||||
Push the project to the `main` branch, then select **Settings → Pages → Source → GitHub Actions**. The included workflow builds and deploys the static export automatically.
|
||||
+104
@@ -0,0 +1,104 @@
|
||||
@import url('https://fonts.googleapis.com/css2?family=DM+Mono:wght@300;400;500&family=Manrope:wght@400;500;600;700&display=swap');
|
||||
|
||||
:root { --ink:#f3f6f0; --paper:#0b0e0d; --surface:#121715; --surface-raised:#171d1a; --acid:#c7ff46; --muted:#96a099; --line:rgba(222,237,220,.14); --dark:#070908; --glow:rgba(199,255,70,.14); }
|
||||
* { box-sizing:border-box; }
|
||||
html { scroll-behavior:smooth; background:var(--paper); }
|
||||
body { margin:0; overflow-x:hidden; background:var(--paper); color:var(--ink); font-family:'Manrope',sans-serif; }
|
||||
main { overflow:hidden; position:relative; background-image:linear-gradient(rgba(255,255,255,.025) 1px, transparent 1px),linear-gradient(90deg, rgba(255,255,255,.025) 1px, transparent 1px); background-size:48px 48px; }
|
||||
a { color:inherit; text-decoration:none; }
|
||||
a:focus-visible { outline:2px solid var(--acid); outline-offset:5px; }
|
||||
::selection { background:var(--acid); color:#0b0e0d; }
|
||||
.link-arrow { width:14px; height:14px; flex:none; fill:none; stroke:currentColor; stroke-width:1.35; stroke-linecap:round; stroke-linejoin:round; }
|
||||
.shell { width:min(1180px, calc(100% - 48px)); margin-inline:auto; }
|
||||
.ambient { position:absolute; width:680px; height:680px; border-radius:50%; pointer-events:none; filter:blur(4px); opacity:.55; }
|
||||
.ambient-one { top:-350px; right:-220px; background:radial-gradient(circle, var(--glow), transparent 67%); }
|
||||
.ambient-two { top:1200px; left:-430px; background:radial-gradient(circle, rgba(67,146,130,.13), transparent 66%); }
|
||||
.nav { height:86px; display:flex; align-items:center; justify-content:space-between; border-bottom:1px solid var(--line); position:relative; z-index:1; }
|
||||
.mark { font:600 17px 'DM Mono',monospace; letter-spacing:-.04em; color:var(--acid); }
|
||||
.mark span { color:var(--muted); font-weight:300; }
|
||||
.nav nav { display:flex; gap:34px; font:400 12px 'DM Mono',monospace; text-transform:uppercase; letter-spacing:.08em; }
|
||||
.nav nav a { position:relative; transition:color .2s; }.nav nav a::after { content:''; position:absolute; left:0; right:0; bottom:-8px; height:1px; background:var(--acid); transform:scaleX(0); transform-origin:left; transition:transform .2s; }.nav nav a:hover { color:var(--acid); }.nav nav a:hover::after { transform:scaleX(1); }
|
||||
.hero { min-height:760px; padding:64px 0 70px; position:relative; border-bottom:1px solid var(--line); }
|
||||
.hero-kicker { max-width:290px; font:400 11px/1.5 'DM Mono',monospace; text-transform:uppercase; letter-spacing:.06em; color:var(--muted); display:flex; gap:10px; }
|
||||
.pulse { width:8px; height:8px; margin-top:4px; background:var(--acid); border-radius:50%; box-shadow:0 0 0 5px var(--glow),0 0 18px var(--acid); flex:none; }
|
||||
.hero-orbit { position:absolute; width:230px; height:230px; border:1px solid rgba(199,255,70,.24); right:-60px; top:90px; border-radius:50%; opacity:.55; animation:spin 20s linear infinite; z-index:0; pointer-events:none; }
|
||||
.hero-orbit::before,.hero-orbit::after { content:''; position:absolute; border-radius:50%; background:var(--acid); box-shadow:0 0 18px var(--acid); }.hero-orbit::before { width:7px; height:7px; top:34px; left:34px; }.hero-orbit::after { width:4px; height:4px; bottom:29px; right:56px; }
|
||||
.hero-orbit span { position:absolute; inset:32px; border:1px dashed rgba(231,250,224,.18); border-radius:50%; display:grid; place-items:center; font:500 13px 'DM Mono',monospace; color:var(--acid); animation:spin-reverse 20s linear infinite; }.hero-orbit i { position:absolute; width:100%; height:1px; top:50%; background:linear-gradient(90deg, transparent,rgba(199,255,70,.6),transparent); }
|
||||
.eyebrow { font:400 11px 'DM Mono',monospace; text-transform:uppercase; letter-spacing:.15em; color:var(--muted); }
|
||||
.hero h1 { font-size:clamp(70px,11.5vw,164px); line-height:.82; letter-spacing:-.085em; margin:56px 0 26px -8px; font-weight:600; position:relative; z-index:1; text-shadow:0 0 55px rgba(199,255,70,.07); }
|
||||
.hero h2 { max-width:760px; font-size:clamp(28px,4.2vw,58px); line-height:1.03; letter-spacing:-.05em; margin:0 0 32px; font-weight:500; text-wrap:balance; }
|
||||
.hero-copy { width:min(650px, calc(100% - 220px)); margin-left:26%; color:#bac4bb; font-size:16px; line-height:1.75; }
|
||||
.hero-actions { margin:42px 0 0 26%; display:flex; gap:10px; }
|
||||
.button { padding:14px 18px; border:1px solid rgba(243,246,240,.36); background:rgba(15,20,18,.55); font:500 11px 'DM Mono',monospace; text-transform:uppercase; display:flex; gap:26px; justify-content:space-between; transition:transform .2s,background .2s,border .2s; }
|
||||
.button.primary { background:var(--acid); border-color:var(--acid); color:#11150f; box-shadow:0 12px 30px rgba(199,255,70,.16); }.button:hover { transform:translateY(-3px); background:var(--acid); border-color:var(--acid); color:#11150f; }
|
||||
.hero-facts { display:flex; gap:38px; margin:58px 0 0 26%; font:400 10px 'DM Mono',monospace; color:var(--muted); text-transform:uppercase; letter-spacing:.05em; }.hero-facts b { color:var(--acid); font-size:17px; font-weight:400; margin-right:6px; }
|
||||
.hero-index { position:absolute; right:0; bottom:70px; font:300 11px 'DM Mono',monospace; color:var(--muted); pointer-events:none; }
|
||||
@media (max-width:1100px) {
|
||||
.hero-orbit { display:none; }
|
||||
.hero-index { display:none; }
|
||||
}
|
||||
.section-heading { display:flex; justify-content:space-between; align-items:flex-end; padding:23px 0; border-bottom:1px solid rgba(243,246,240,.65); }
|
||||
.section-heading p { margin:0; font:500 12px 'DM Mono',monospace; text-transform:uppercase; letter-spacing:.11em; }
|
||||
.section-heading span { font:300 11px 'DM Mono',monospace; color:var(--muted); }
|
||||
.capabilities,.work,.tools,.about { padding-top:100px; }
|
||||
.cap-grid { display:grid; grid-template-columns:repeat(3,1fr); }
|
||||
.cap-card { padding:42px 30px 36px 0; min-height:320px; border-right:1px solid var(--line); transition:background .25s,padding .25s; }
|
||||
.cap-card + .cap-card { padding-left:30px; }
|
||||
.cap-card:last-child { border-right:0; }
|
||||
.cap-number { font:300 11px 'DM Mono',monospace; color:var(--muted); }
|
||||
.cap-card:hover { background:linear-gradient(135deg,rgba(199,255,70,.09),transparent 68%); }.cap-card h3 { font-size:24px; margin:54px 0 16px; letter-spacing:-.035em; }.cap-card p { color:#b0bab2; font-size:14px; line-height:1.7; min-height:74px; }.cap-card:hover .cap-number { color:var(--acid); }
|
||||
.tag-list { display:flex; flex-wrap:wrap; gap:7px; margin-top:24px; }
|
||||
.tag-list span { font:400 10px 'DM Mono',monospace; border:1px solid var(--line); background:rgba(255,255,255,.025); padding:6px 8px; color:#b8c2bb; }
|
||||
.project { display:grid; grid-template-columns:160px minmax(0,1fr) 150px; gap:34px; padding:52px 0; border-bottom:1px solid var(--line); transition:background .25s; }.project:hover { background:linear-gradient(90deg,rgba(199,255,70,.075),transparent 72%); }.project:hover .project-meta span { color:var(--acid); }
|
||||
.project-meta span { font:300 11px 'DM Mono',monospace; color:var(--muted); }
|
||||
.project-meta p { font:400 10px/1.5 'DM Mono',monospace; text-transform:uppercase; color:var(--muted); margin-top:14px; max-width:150px; }
|
||||
.project-body h3 { margin:0 0 18px; font-size:clamp(30px,4vw,52px); letter-spacing:-.055em; font-weight:500; }
|
||||
.project-body > p { max-width:720px; color:#b0bab2; line-height:1.75; margin:0; }
|
||||
.project-body ul { display:grid; grid-template-columns:1fr 1fr; padding:0; margin:26px 0 0; list-style:none; gap:9px 20px; }
|
||||
.project-body li { font:400 11px 'DM Mono',monospace; }
|
||||
.project-body li::before { content:'—'; color:var(--muted); margin-right:9px; }
|
||||
.project-links { display:flex; align-items:flex-end; justify-content:flex-end; flex-direction:column; gap:10px; }
|
||||
.project-links a { width:100%; display:flex; justify-content:space-between; align-items:center; padding:11px 0; border-bottom:1px solid rgba(243,246,240,.55); font:400 10px 'DM Mono',monospace; text-transform:uppercase; }.project-links a:hover { color:var(--acid); border-color:var(--acid); }.project-links a:hover .link-arrow,.tool-grid a:hover .link-arrow,.contact-grid a:hover .link-arrow { transform:translate(2px,-2px); }.link-arrow { transition:transform .2s; }
|
||||
.tool-grid { display:grid; grid-template-columns:1fr 1fr; }
|
||||
.tool-grid a { min-height:130px; border-bottom:1px solid var(--line); padding:26px 0; display:flex; justify-content:space-between; gap:30px; transition:color .2s,transform .2s; }
|
||||
.tool-grid a:nth-child(odd) { padding-right:30px; border-right:1px solid var(--line); }
|
||||
.tool-grid a:nth-child(even) { padding-left:30px; }
|
||||
.tool-grid a:last-child:nth-child(odd) { border-right:0; padding-right:0; }
|
||||
.tool-grid strong { font-size:18px; }
|
||||
.tool-grid p { color:var(--muted); font-size:12px; margin:9px 0 0; }
|
||||
.tool-grid a:hover { color:var(--acid); transform:translateX(8px); }.tool-grid a:hover strong { box-shadow:inset 0 -8px rgba(199,255,70,.28); }
|
||||
.education { display:grid; grid-template-columns:160px 1fr; gap:34px; padding:30px 0; border-bottom:1px solid var(--line); }.education-list { padding:18px 0 70px; }.education-list .education:last-child { border-bottom:0; }
|
||||
.education > span { font:300 11px 'DM Mono',monospace; color:var(--muted); }
|
||||
.education h3 { margin:0 0 8px; font-size:22px; }
|
||||
.education p { margin:0; color:#b0bab2; line-height:1.6; }
|
||||
.education-note { font-size:13px; }
|
||||
.footer { background:radial-gradient(circle at 85% 15%,rgba(199,255,70,.13),transparent 26%),var(--dark); color:#f3f6f0; width:100%; max-width:none; padding:90px max(24px,calc((100% - 1180px)/2)) 32px; margin-top:30px; border-top:1px solid var(--line); }
|
||||
.footer .eyebrow { color:#a4a69c; }
|
||||
.footer h2 { font-size:clamp(45px,7vw,96px); line-height:.98; letter-spacing:-.065em; font-weight:500; margin:48px 0 80px; }
|
||||
.footer h2 em { color:var(--acid); font-style:normal; }
|
||||
.contact-grid { border-top:1px solid #484b42; }
|
||||
.contact-grid a { display:grid; grid-template-columns:120px 1fr 24px; padding:22px 0; border-bottom:1px solid #484b42; align-items:center; transition:padding .2s,color .2s; }.contact-grid a:hover { padding-inline:10px; }
|
||||
.contact-grid span { font:400 10px 'DM Mono',monospace; text-transform:uppercase; color:#92958a; }
|
||||
.contact-grid strong { font-weight:400; }
|
||||
.contact-grid a:hover strong { color:var(--acid); }
|
||||
.footer-bottom { display:flex; justify-content:space-between; padding-top:60px; color:#787b71; font:300 9px 'DM Mono',monospace; text-transform:uppercase; }
|
||||
@keyframes spin { to { transform:rotate(360deg); } } @keyframes spin-reverse { to { transform:rotate(-360deg); } }
|
||||
@media (prefers-reduced-motion:reduce) { *,*::before,*::after { scroll-behavior:auto!important; animation-duration:.01ms!important; animation-iteration-count:1!important; transition-duration:.01ms!important; } }
|
||||
@media (max-width:980px) and (min-width:761px) {
|
||||
.hero h1 { font-size:clamp(72px, 11vw, 120px); }
|
||||
.hero-orbit { right:2%; width:250px; height:250px; }
|
||||
.project { grid-template-columns:120px minmax(0,1fr); gap:26px; }
|
||||
.project-links { grid-column:2; flex-direction:row; justify-content:flex-start; }
|
||||
.project-links a { width:150px; }
|
||||
}
|
||||
@media (max-width:760px) {
|
||||
.shell { width:min(100% - 28px,1180px); }
|
||||
.nav { height:70px; }.nav nav { gap:15px; font-size:10px; }.nav nav a::after { bottom:-6px; }
|
||||
.hero { min-height:auto; padding:55px 0 60px; }.hero-kicker { margin-bottom:34px; }.hero h1 { margin-top:0; font-size:19vw; }.hero h2 { font-size:36px; }
|
||||
.hero-copy,.hero-actions { width:100%; margin-left:0; }.hero-copy { margin-top:30px; }.hero-actions { flex-direction:column; }.hero-facts { margin-left:0; gap:16px; flex-direction:column; }.hero-index { display:none; }
|
||||
.section-heading span { display:none; }.capabilities,.work,.tools,.about { padding-top:70px; }
|
||||
.cap-grid { grid-template-columns:1fr; }.cap-card,.cap-card + .cap-card { border-right:0; border-bottom:1px solid var(--line); padding:34px 0; min-height:0; }.cap-card h3 { margin-top:28px; }.cap-card p { min-height:0; }
|
||||
.project { grid-template-columns:1fr; gap:20px; padding:38px 0; }.project:hover { padding-left:0; }.project-meta { display:flex; justify-content:space-between; }.project-meta p { margin:0; max-width:none; }.project-body ul { grid-template-columns:1fr; }.project-links { align-items:flex-start; }.project-links a { width:150px; }
|
||||
.tool-grid { grid-template-columns:1fr; }.tool-grid a:nth-child(n) { border-right:0; padding:24px 0; }
|
||||
.education { grid-template-columns:1fr; gap:20px; padding-bottom:70px; }.contact-grid a { grid-template-columns:80px 1fr 20px; }.contact-grid strong { font-size:12px; overflow-wrap:anywhere; }.footer-bottom { gap:20px; }.footer-bottom span:last-child { text-align:right; }
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
import type { Metadata } from 'next'
|
||||
import './globals.css'
|
||||
|
||||
export const metadata: Metadata = {
|
||||
title: 'Emil Shanayev — AI Systems & Scientific Software',
|
||||
description: 'Portfolio of Emil Shanayev: AI-native systems, scientific software, graphics and infrastructure.',
|
||||
authors: [{ name: 'Emil Shanayev' }],
|
||||
}
|
||||
|
||||
export default function RootLayout({ children }: Readonly<{ children: React.ReactNode }>) {
|
||||
return (
|
||||
<html lang="en">
|
||||
<body>{children}</body>
|
||||
</html>
|
||||
)
|
||||
}
|
||||
+129
@@ -0,0 +1,129 @@
|
||||
import { resume } from '@/data/resume'
|
||||
|
||||
const ArrowIcon = () => (
|
||||
<svg className="link-arrow" viewBox="0 0 16 16" aria-hidden="true">
|
||||
<path d="M3 13 13 3M6 3h7v7" />
|
||||
</svg>
|
||||
)
|
||||
|
||||
export default function Home() {
|
||||
return (
|
||||
<main>
|
||||
<div className="ambient ambient-one" aria-hidden="true" />
|
||||
<div className="ambient ambient-two" aria-hidden="true" />
|
||||
<header className="nav shell">
|
||||
<a className="mark" href="#top" aria-label="Home">ES<span>/26</span></a>
|
||||
<nav aria-label="Main navigation">
|
||||
<a href="#work">Work</a>
|
||||
<a href="#profile">Profile</a>
|
||||
<a href="#contact">Contact</a>
|
||||
</nav>
|
||||
</header>
|
||||
|
||||
<section className="hero shell" id="top">
|
||||
<div className="hero-kicker"><span className="pulse" /> {resume.availability}</div>
|
||||
<div className="hero-orbit" aria-hidden="true"><span>AI</span><i /></div>
|
||||
<p className="eyebrow">{resume.eyebrow}</p>
|
||||
<h1>{resume.name}</h1>
|
||||
<h2>{resume.role}</h2>
|
||||
<p className="hero-copy">{resume.bio}</p>
|
||||
<div className="hero-actions">
|
||||
<a className="button primary" href="#work">Selected work</a>
|
||||
<a className="button" href={resume.contacts[0].href} target="_blank" rel="noreferrer">GitHub <ArrowIcon /></a>
|
||||
</div>
|
||||
<div className="hero-facts">
|
||||
<span><b>05</b> featured systems</span>
|
||||
<span><b>∞</b> curiosity for hard problems</span>
|
||||
</div>
|
||||
<div className="hero-index" aria-hidden="true">01—05</div>
|
||||
</section>
|
||||
|
||||
<section className="capabilities shell" id="profile">
|
||||
<div className="section-heading">
|
||||
<p>Profile / capabilities</p>
|
||||
<span>Three intersecting domains</span>
|
||||
</div>
|
||||
<div className="cap-grid">
|
||||
{resume.capabilities.map((item) => (
|
||||
<article className="cap-card" key={item.index}>
|
||||
<span className="cap-number">{item.index}</span>
|
||||
<h3>{item.title}</h3>
|
||||
<p>{item.text}</p>
|
||||
<div className="tag-list">{item.stack.map((tag) => <span key={tag}>{tag}</span>)}</div>
|
||||
</article>
|
||||
))}
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section className="work shell" id="work">
|
||||
<div className="section-heading">
|
||||
<p>Selected work</p>
|
||||
<span>Built systems, not placeholder concepts</span>
|
||||
</div>
|
||||
<div className="project-list">
|
||||
{resume.projects.map((project) => (
|
||||
<article className="project" key={project.number}>
|
||||
<div className="project-meta">
|
||||
<span>{project.number}</span>
|
||||
<p>{project.kind}</p>
|
||||
</div>
|
||||
<div className="project-body">
|
||||
<h3>{project.name}</h3>
|
||||
<p>{project.description}</p>
|
||||
<ul>{project.highlights.map((highlight) => <li key={highlight}>{highlight}</li>)}</ul>
|
||||
<div className="tag-list">{project.tech.map((tag) => <span key={tag}>{tag}</span>)}</div>
|
||||
</div>
|
||||
<div className="project-links">
|
||||
<a href={project.href} target="_blank" rel="noreferrer">Repository <ArrowIcon /></a>
|
||||
{'secondaryHref' in project && project.secondaryHref && (
|
||||
<a href={project.secondaryHref} target="_blank" rel="noreferrer">{'secondaryLabel' in project ? project.secondaryLabel : 'Related project'} <ArrowIcon /></a>
|
||||
)}
|
||||
</div>
|
||||
</article>
|
||||
))}
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section className="tools shell">
|
||||
<div className="section-heading">
|
||||
<p>Tools & experiments</p>
|
||||
<span>Smaller utilities from active exploration</span>
|
||||
</div>
|
||||
<div className="tool-grid">
|
||||
{resume.tools.map((tool) => (
|
||||
<a href={tool.href} target="_blank" rel="noreferrer" key={tool.name}>
|
||||
<div><strong>{tool.name}</strong><p>{tool.note}</p></div><ArrowIcon />
|
||||
</a>
|
||||
))}
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section className="about shell">
|
||||
<div className="section-heading">
|
||||
<p>Education</p><span>Learning by building</span>
|
||||
</div>
|
||||
<div className="education-list">
|
||||
{resume.education.map((education) => (
|
||||
<div className="education" key={education.institution}>
|
||||
<span>{education.period}</span>
|
||||
<div><h3>{education.institution}</h3><p>{education.program}</p></div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<footer className="footer shell" id="contact">
|
||||
<p className="eyebrow">Have a difficult technical problem?</p>
|
||||
<h2>Let’s build something<br /><em>that actually works.</em></h2>
|
||||
<div className="contact-grid">
|
||||
{resume.contacts.map((contact) => (
|
||||
<a href={contact.href} target={contact.href.startsWith('http') ? '_blank' : undefined} rel="noreferrer" key={contact.label}>
|
||||
<span>{contact.label}</span><strong>{contact.value}</strong><ArrowIcon />
|
||||
</a>
|
||||
))}
|
||||
</div>
|
||||
<div className="footer-bottom"><span>© 2026 Emil Shanayev</span><span>Designed as a static Next.js portfolio</span></div>
|
||||
</footer>
|
||||
</main>
|
||||
)
|
||||
}
|
||||
@@ -1,97 +0,0 @@
|
||||
@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,10 +0,0 @@
|
||||
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"
|
||||
@@ -1,58 +0,0 @@
|
||||
---
|
||||
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,5 +0,0 @@
|
||||
---
|
||||
title: "DevOps Engineer"
|
||||
tags: ["DevOps", "Backend", "Go"]
|
||||
draft: true
|
||||
---
|
||||
@@ -1 +0,0 @@
|
||||
# Резюме _DevOps-инженер _ Backend-разработчик
|
||||
@@ -1,6 +0,0 @@
|
||||
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>
|
||||
@@ -1 +0,0 @@
|
||||
# Identity Template
|
||||
@@ -1 +0,0 @@
|
||||
# Preferences Template
|
||||
@@ -1,6 +0,0 @@
|
||||
- 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.
|
||||
+102
@@ -0,0 +1,102 @@
|
||||
export const resume = {
|
||||
name: 'Emil Shanayev',
|
||||
eyebrow: 'AI systems · scientific computing · game technology',
|
||||
role: 'AI Systems & Scientific Software Developer',
|
||||
bio: 'I build AI-native products and developer infrastructure across scientific computing, agent protocols and game technology — from distributed molecular workloads and LLM-controlled worlds to a Vulkan engine and production Telegram services.',
|
||||
location: 'Russia',
|
||||
availability: 'Open to internships, research collaborations and engineering projects',
|
||||
contacts: [
|
||||
{ label: 'GitHub', value: 'emil28092005', href: 'https://github.com/emil28092005' },
|
||||
{ label: 'Email', value: 'emil28092005@gmail.com', href: 'mailto:emil28092005@gmail.com' },
|
||||
{ label: 'Email', value: 'emil28092005@yandex.ru', href: 'mailto:emil28092005@yandex.ru' },
|
||||
{ label: 'Telegram', value: '@emilshanaty', href: 'https://t.me/emilshanaty' },
|
||||
],
|
||||
capabilities: [
|
||||
{
|
||||
index: '01',
|
||||
title: 'Scientific software',
|
||||
text: 'Molecular data processing, cheminformatics workloads, deterministic pipelines and reproducible command-line tools.',
|
||||
stack: ['Python', 'RDKit', 'ChEMBL', 'Go', 'PostgreSQL'],
|
||||
},
|
||||
{
|
||||
index: '02',
|
||||
title: 'AI-native systems',
|
||||
text: 'Agent protocols, recursive research teams, MCP integrations and human-in-the-loop feedback systems.',
|
||||
stack: ['MCP', 'ACP / JSON-RPC', 'LLM APIs', 'TypeScript', 'Python'],
|
||||
},
|
||||
{
|
||||
index: '03',
|
||||
title: 'Systems & infrastructure',
|
||||
text: 'Performance-oriented engines, native audio tools, backend services and the infrastructure needed to ship them.',
|
||||
stack: ['C# / .NET', 'Vulkan', 'Rust', 'Docker', 'WebSocket', 'Linux'],
|
||||
},
|
||||
],
|
||||
projects: [
|
||||
{
|
||||
number: '01',
|
||||
name: 'Cortex Engine',
|
||||
kind: 'AI-native 3D game engine',
|
||||
description: 'A C#/.NET 9 game engine with a pure P/Invoke Vulkan 1.3 renderer, PBR shading, cubemap-array shadows, native Box3D physics and Flecs ECS. Its editor and runtime expose scene operations to AI agents through MCP.',
|
||||
highlights: ['Pure Vulkan 1.3 backend', 'PBR + multi-light shadows', 'Playable FPS demo', '7 MCP scene tools'],
|
||||
tech: ['C#', '.NET 9', 'Vulkan', 'SDL3', 'Box3D', 'Flecs', 'MCP'],
|
||||
href: 'https://github.com/emil28092005/Cortex_Engine',
|
||||
},
|
||||
{
|
||||
number: '02',
|
||||
name: 'SciMesh',
|
||||
kind: 'Distributed scientific computing platform',
|
||||
description: 'A local-first platform that turns molecular computations into independent tasks, dispatches them to Go workers and deterministically combines checksum-protected artifacts. The Python SDK provides exact ChEMBL workloads without dense N×N matrices.',
|
||||
highlights: ['Python workload SDK', 'Go coordinator + workers', 'PostgreSQL / SQLite modes', 'Cross-platform signed releases'],
|
||||
tech: ['Python', 'Go', 'RDKit', 'PostgreSQL', 'Docker', 'SHA-256'],
|
||||
href: 'https://github.com/emil28092005/SciMesh',
|
||||
},
|
||||
{
|
||||
number: '03',
|
||||
name: 'AICC Protocol',
|
||||
kind: 'LLM-controlled character protocol',
|
||||
description: 'An engine-agnostic protocol and Python SDK for connecting language-model agents to virtual environments. The reference capsule testbed proves the full loop: perception, movement and interaction over WebSocket with a protocol-conformant bridge.',
|
||||
highlights: ['Async-first Python SDK', 'WebSocket + in-process transports', '9/9 conformance scenarios', 'Vision and navigation demo'],
|
||||
tech: ['Python', 'JSON Schema', 'WebSocket', 'Pydantic', 'LLM agents'],
|
||||
href: 'https://github.com/emil28092005/AICC-Protocol',
|
||||
secondaryHref: 'https://github.com/emil28092005/aicc-py',
|
||||
secondaryLabel: 'aicc-py',
|
||||
},
|
||||
{
|
||||
number: '04',
|
||||
name: 'Hypothesis Machine',
|
||||
kind: 'Recursive research-agent extension',
|
||||
description: 'A TypeScript extension for the Pi Coding Agent that turns one interactive session into a persistent, recursive research team. It combines parallel agents, recoverable trees, full-text research memory and isolated Docker experiments with independent review.',
|
||||
highlights: ['Recursive / parallel agents', 'Persistent tree recovery', 'SQLite FTS research memory', 'Sandboxed experiment runner'],
|
||||
tech: ['TypeScript', 'Node.js 22', 'SQLite', 'Docker', 'Pi Agent'],
|
||||
href: 'https://github.com/emil28092005/hypothesis-machine',
|
||||
},
|
||||
{
|
||||
number: '05',
|
||||
name: 'Bibi Bot',
|
||||
kind: 'Self-hosted Telegram AI assistant',
|
||||
description: 'A production-oriented Telegram assistant for private groups: one-way HLS game streaming in a Mini App, DeepSeek-backed chat, repository-grounded answers, scoped SQLite memory and PostgreSQL-backed team context.',
|
||||
highlights: ['Telegram Mini App + HLS', 'Repository research with partial clones', 'Scoped memory and privacy controls', 'Docker Compose deployment'],
|
||||
tech: ['Python', 'FastAPI', 'Telegram', 'DeepSeek', 'PostgreSQL', 'Docker'],
|
||||
href: 'https://github.com/emil28092005/bibi_bot',
|
||||
},
|
||||
],
|
||||
tools: [
|
||||
{ name: 'Soundgen', note: 'Rust 8-bit synthesis, MCP generation and human-feedback training loop', href: 'https://github.com/emil28092005/Soundgen' },
|
||||
{ name: 'KimiFleet', note: 'Visible multi-agent orchestrator over ACP with live dashboard and handoffs', href: 'https://github.com/emil28092005/KimiFleet' },
|
||||
{ name: 'Imagen', note: 'MCP pixel-art generator with transparent backgrounds and rated references', href: 'https://github.com/emil28092005/Imagen' },
|
||||
{ name: 'Fractalier', note: 'Procedural fractal evolution game with selection, crossover and mutation', href: 'https://github.com/emil28092005/Fractalier' },
|
||||
{ name: 'MoME', note: 'Sparse-gated personal memory plugin with an online-learning router', href: 'https://github.com/emil28092005/hermes-plugin-mome' },
|
||||
],
|
||||
education: [
|
||||
{
|
||||
period: '2023—2025',
|
||||
institution: 'Innopolis University',
|
||||
program: 'Data Structures and Artificial Intelligence (DSAI)',
|
||||
},
|
||||
{
|
||||
period: '2026—present',
|
||||
institution: 'HSE University',
|
||||
program: '1st-year student · Bachelor’s programme',
|
||||
},
|
||||
],
|
||||
} as const
|
||||
@@ -1,112 +0,0 @@
|
||||
<!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>
|
||||
@@ -1,6 +0,0 @@
|
||||
{{ define "main" }}
|
||||
<article class="prose prose-invert max-w-none">
|
||||
<h1 class="text-3xl font-bold mb-6">{{ .Title }}</h1>
|
||||
{{ .Content }}
|
||||
</article>
|
||||
{{ end }}
|
||||
@@ -1,31 +0,0 @@
|
||||
{{ 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 }}
|
||||
@@ -1,5 +0,0 @@
|
||||
<div class="skills-grid">
|
||||
{{ range .Params }}
|
||||
<span>{{ . }}</span>
|
||||
{{ end }}
|
||||
</div>
|
||||
Vendored
+6
@@ -0,0 +1,6 @@
|
||||
/// <reference types="next" />
|
||||
/// <reference types="next/image-types/global" />
|
||||
/// <reference path="./.next/types/routes.d.ts" />
|
||||
|
||||
// NOTE: This file should not be edited
|
||||
// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
|
||||
@@ -0,0 +1,9 @@
|
||||
/** @type {import('next').NextConfig} */
|
||||
const nextConfig = {
|
||||
output: 'export',
|
||||
basePath: '/Emil_Shanayev_Resume',
|
||||
assetPrefix: '/Emil_Shanayev_Resume',
|
||||
images: { unoptimized: true },
|
||||
}
|
||||
|
||||
export default nextConfig
|
||||
Generated
+801
-1451
File diff suppressed because it is too large
Load Diff
+14
-9
@@ -1,16 +1,21 @@
|
||||
{
|
||||
"name": "resume-website",
|
||||
"version": "1.0.0",
|
||||
"name": "emil-shanayev-resume",
|
||||
"version": "2.0.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"build:css": "postcss assets/css/tailwind.css -o assets/css/main.css",
|
||||
"build": "npm run build:css && hugo --minify"
|
||||
"dev": "next dev",
|
||||
"build": "next build",
|
||||
"start": "next start"
|
||||
},
|
||||
"dependencies": {
|
||||
"next": "15.5.21",
|
||||
"react": "19.2.4",
|
||||
"react-dom": "19.2.4"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@tailwindcss/typography": "^0.5.19",
|
||||
"autoprefixer": "^10.5.0",
|
||||
"postcss": "^8.5.12",
|
||||
"postcss-cli": "^11.0.1",
|
||||
"tailwindcss": "^3.4.4"
|
||||
"@types/node": "22.10.2",
|
||||
"@types/react": "19.2.14",
|
||||
"@types/react-dom": "19.2.3",
|
||||
"typescript": "5.7.2"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
module.exports = {
|
||||
plugins: {
|
||||
tailwindcss: {},
|
||||
autoprefixer: {},
|
||||
},
|
||||
}
|
||||
@@ -1,34 +0,0 @@
|
||||
/** @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')],
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
# Identity Template
|
||||
@@ -1 +0,0 @@
|
||||
# Preferences Template
|
||||
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"target": "ES2017",
|
||||
"lib": ["dom", "dom.iterable", "esnext"],
|
||||
"allowJs": false,
|
||||
"skipLibCheck": true,
|
||||
"strict": true,
|
||||
"noEmit": true,
|
||||
"esModuleInterop": true,
|
||||
"module": "esnext",
|
||||
"moduleResolution": "bundler",
|
||||
"resolveJsonModule": true,
|
||||
"isolatedModules": true,
|
||||
"jsx": "preserve",
|
||||
"incremental": true,
|
||||
"plugins": [{ "name": "next" }],
|
||||
"paths": { "@/*": ["./*"] }
|
||||
},
|
||||
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
|
||||
"exclude": ["node_modules"]
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user