This repository is a personal resume card website (drednote.github.io) that presents:
- About section
- Work experience
- Projects
- Contacts and external links
Core idea: content is data-driven from files in public/* and rendered by React components in src/*.
- React 18 + TypeScript
- Webpack 5
- Sass
- Ant Design
- i18next + react-i18next
- moment.js (date formatting for experience timeline)
src/modules/navigation/*- top navigation (desktop/mobile), section anchors.src/modules/resume/*- PDF resume generation/download flow.src/modules/card-content/Home.tsx- hero/home block.src/modules/card-content/about/*- "About me" section and skills.src/modules/card-content/work-experience/*- work experience cards and timeline.src/modules/card-content/projects/*- project cards.src/modules/card-content/footer/*- footer and social links.
Root composition is in:
src/modules/card-content/CardContent.tsx(Home -> About -> Work Experience -> Projects -> Footer)
- Index:
public/experience/experience.json - Content per language:
public/experience/ru/*.jsonandpublic/experience/ru/*.mdpublic/experience/en/*.jsonandpublic/experience/en/*.md
Each experience entry includes role/company/dates/skills/link in JSON plus markdown description in MD.
- Index:
public/projects/projects.json - Content per language:
public/projects/ru/*.jsonandpublic/projects/ru/*.mdpublic/projects/en/*.jsonandpublic/projects/en/*.md
public/text/ru/about-me.mdpublic/text/en/about-me.mdpublic/text/ru/contact.mdpublic/text/en/contact.md
public/text/ru/resume.jsonpublic/text/en/resume.json
These files hold PDF-only resume metadata such as file name, name/header, phone, preferred contact method, contacts, target position, education, and languages.
Important: education is an array so multiple education entries can be added without code changes.
Do not hardcode mutable resume facts (phone, contacts, education, position text, etc.) in TS/TSX.
public/translation/ru/translation.jsonpublic/translation/en/translation.jsonsrc/utils/i18n.ts(language detection/init config)
- Experience and projects are loaded dynamically by current language (
i18n.language). - Experience timeline duration is computed from earliest
startDateentry. - Desktop and mobile layouts use adaptive wrappers from
src/components/adaptive/Adaptive.tsx. - PDF resume download is generated client-side with
pdfmakeinsrc/modules/resume/resumePdf.ts. - The top-nav PDF button lives in
src/modules/navigation/NavExtra.tsxand usessrc/components/icon-button/IconButton.tsx, matching the GitHub icon button style. pdfmakeis lazy-loaded on PDF button click; avoid static imports from always-rendered navigation components because they pull the large PDF vendor chunk into the main bundle.- PDF labels/headings should use
i18next(t(...)) and translation files, not inlinelang === ...strings. - PDF skills are derived from
skillsarrays in work-experience JSON files, not a separate static skills list. - Markdown in PDF descriptions currently supports paragraphs, headings, bullets,
**bold**, inline`code`, and markdown links.
npm run dev- run local dev server.npm run build- production build + copypublic/404.htmltodist/404.html.npm run lint- ESLint with--fix.npm test- placeholder script (No tests found).- Type-check workaround:
tsc --noEmitcurrently needs--baseUrl .becausetsconfig.jsondefines path aliases withoutbaseUrl; usetsc --noEmit --baseUrl .for focused checks.
- Do not revert existing user changes unless explicitly asked.
- Prefer
rg/rg --filesfor searching. - Use
apply_patchfor manual file edits.