- og:title/description/image + canonical + twitter:card в index.html, нарисован assets/og.png (1200x630, тема сайта). CSP не трогали — картинка того же происхождения. - Переписан текст «обо мне» и формулировка про текущую работу в Уралэнергоаква (убраны двусмысленности "неофициально возглавлял" и "продолжаю искать"), Go убран из title/skills-тега как отдельная "изучаю" пометка — теперь просто в стеке, раз есть реальный Go-код в home_automatization. - resume.js/projects.js больше не перерисовывают контент через JS при языке по умолчанию (ru) — index.html/projects.html содержат готовый серверный HTML, JS перерисовывает только при переключении на EN. Раньше весь текст резюме подгружался пустым в #resume-root, curl без JS ничего не видел. - Добавлены кнопка «скачать резюме (PDF)» и ссылка на git.cactoz.su в первый экран резюме. - home_automatization на /projects честно помечен «в разработке» вместо описания как готового продукта. - Игра переименована из BattleCity (товарный знак Namco) в ./tanks, убрана из основного меню во все страницы — ссылка теперь только в подвале страницы whoami.
85 lines
3.4 KiB
JavaScript
85 lines
3.4 KiB
JavaScript
import { getLang, initLangToggle } from './i18n.js';
|
|
|
|
const DATA = {
|
|
ru: {
|
|
heading: 'ls projects/',
|
|
subheading: 'Пара вещей, которые я собрал сам, от идеи до продакшена.',
|
|
projects: [
|
|
{
|
|
name: 'home_automatization',
|
|
description:
|
|
'В разработке: архитектура и ТЗ готовы, микросервисы на Go и Laravel собираются. Первая зона — гроубокс (полив, свет, климат), дальше — весь дом.',
|
|
tags: ['в разработке', 'Go', 'Laravel', 'Docker', 'RabbitMQ', 'ClickHouse', 'gRPC', 'MQTT'],
|
|
url: 'https://git.cactoz.su/cacto/home_automatization',
|
|
linkLabel: 'открыть',
|
|
},
|
|
{
|
|
name: 'cactoz.su',
|
|
description:
|
|
'Личный сайт-визитка: резюме, проекты и мультиплеерная мини-игра про танки. Тема — Матрица.',
|
|
tags: ['HTML/CSS/JS', 'C++', 'uWebSockets', 'Quintus.js', 'nginx', 'Docker'],
|
|
url: 'https://git.cactoz.su/cacto/cactoz.su',
|
|
linkLabel: 'открыть',
|
|
},
|
|
],
|
|
},
|
|
en: {
|
|
heading: 'ls projects/',
|
|
subheading: 'A couple of things I built myself, start to finish.',
|
|
projects: [
|
|
{
|
|
name: 'home_automatization',
|
|
description:
|
|
'Work in progress: architecture and spec are done, Go and Laravel microservices are being built. First zone is a grow box (watering, lighting, climate), the whole house comes next.',
|
|
tags: ['in progress', 'Go', 'Laravel', 'Docker', 'RabbitMQ', 'ClickHouse', 'gRPC', 'MQTT'],
|
|
url: 'https://git.cactoz.su/cacto/home_automatization',
|
|
linkLabel: 'open',
|
|
},
|
|
{
|
|
name: 'cactoz.su',
|
|
description:
|
|
'A personal portfolio site: résumé, projects and a small multiplayer tank game. Matrix theme throughout.',
|
|
tags: ['HTML/CSS/JS', 'C++', 'uWebSockets', 'Quintus.js', 'nginx', 'Docker'],
|
|
url: 'https://git.cactoz.su/cacto/cactoz.su',
|
|
linkLabel: 'open',
|
|
},
|
|
],
|
|
},
|
|
};
|
|
|
|
function render() {
|
|
const t = DATA[getLang()];
|
|
document.title = `${t.heading} — cacto`;
|
|
|
|
const heading = document.getElementById('projects-heading');
|
|
const subheading = document.getElementById('projects-subheading');
|
|
if (heading) heading.textContent = t.heading;
|
|
if (subheading) subheading.textContent = t.subheading;
|
|
|
|
const list = document.getElementById('project-list');
|
|
if (!list) return;
|
|
list.innerHTML = t.projects
|
|
.map(
|
|
(p) => `
|
|
<li class="project-card">
|
|
<div class="project-card__header">
|
|
<div class="project-card__name"><span class="project-card__perms">drwxr-xr-x</span> ${p.name}</div>
|
|
<a href="${p.url}" target="_blank" rel="noopener">${p.linkLabel} →</a>
|
|
</div>
|
|
<p class="project-card__desc">${p.description}</p>
|
|
<ul class="tag-list">
|
|
${p.tags.map((tag) => `<li class="tag">${tag}</li>`).join('')}
|
|
</ul>
|
|
</li>`
|
|
)
|
|
.join('');
|
|
}
|
|
|
|
// index.html-паттерн: projects.html уже содержит серверный RU-рендер этой
|
|
// же разметки, перерисовываем через JS только при переключении на EN.
|
|
document.title = `${DATA[getLang()].heading} — cacto`;
|
|
if (getLang() !== 'ru') {
|
|
render();
|
|
}
|
|
initLangToggle(render);
|