- canvas стартует с opacity:0 и плавно проявляется (0.9s) при .is-ready
- initPageMeshShader ставит is-ready после первого кадра
- modulepreload page-mesh-shader.js для параллельной загрузки с main.js
- пересборка страниц (build:pages)
- theme: store accent separately for light/dark (theme-core/controls)
- en contacts: WhatsApp card instead of VK (wa.me link)
- Activity: add GitHub card (logo webp) in both locales
- mp-card__image border uses --line to match card (less contrast)
- drop contact-card--brand-ya (yandex chat) from contact-section ru/en
- update cookie-policy contacts enumeration to drop Yandex (ru/en)
- rebuild public/
- add .en.html overrides for 16 case pages + resume via apinex translator
- translate remaining partials (projects-related, mini-projects-*, fab-stack-home-contact,
fab-stack-resume, content-edit-fab-stack, cookie-notice)
- enhance translate.mjs to protect <script>/<style> from translation
- second pass: translate attribute values (aria-label/alt/title/placeholder/content/
data-hint-default) and visible text DeepL skipped in html mode
- make logo language-aware (NM / НМ) via i18n
- remove {{> lang-switch}} from header-home/case/minimal
- add {{> lang-switch}} to footer
- restyle .lang-switch as compact text group 'RU / EN' (active = accent),
drop pill borders/background for a minimal look
- build-pages.mjs: add pagePrefix (locale-root-relative, no en offset)
- use pagePrefix for nav links: logo, back-home, footer design-system/
cookie-policy/, FAB #contact, cookie-notice link, cookie-policy body
link, case-page #skills/#projects anchors (assetPrefix pointed to site
root and leaked en pages to ru)
- docs/translation.md: document assetPrefix vs pagePrefix
- case-media-slider: обрамление+hover как у карточек, стрелки только при наведении (fade-in),
группа пред/след-пилюля в правом нижнем углу, disabled-кнопки видны (не скрываются),
убран border-radius у img/figcaption (скругление у viewport), неактивные слайды не скрываются
visibility (нет 'дырки' при перелистывании), настраиваемая ширина --wide/--content/--natural
- image-load-placeholder: исключён .case-media-slider (нет блика/серого фона)
- icon-press: универсальный эффект 'продавливания' иконки при нажатии (.icon-press + :active/.is-pressed),
применён к слайдеру и всем кнопкам просмотрщика
data-mp-cells-sm=2 для карточек related — в диапазоне 4 колонок
(≈1080–1355px вьюпорта) карточки занимают по 2 колонки и парятся,
устраняя пустую колонку справа. В десктопном 6-колоночном диапазоне
сохраняется data-mp-cells=3.
Убран инклюд {{> footer-spacer}} (пустая <section class="section section--surface"
aria-hidden> как прокладка перед футером) на главной и во всех 16 кейсах.
Пересобраны страницы (build:pages).
- Secondary button wrapped in theme-panel-fab-wrap (above primary)
- Primary button outside wrap (below secondary)
- Added glass-neutral class to both buttons
- Matches the pattern from fab-stack-home-contact.html
- Added secondary FAB button 'Печать' with printer icon (window.print)
- Created printer.svg icon for the print button
- Added .fab-secondary__ico--print CSS class
- Fixed html2pdf color-mix() issue: buildCleanClone() creates a deep clone
with all computed styles inlined, all stylesheets removed, and
pseudo-elements converted to real DOM elements before passing to html2pdf
- Two separate handlers: pdfBtn for download, printBtn for print dialog