[О ПРОЕКТЕ]

Возможности разработчика,
не каталог шаблонов.

Интерактивное портфолио frontend-инженера Максима Соловьёва с лабораторией UI-экспериментов THE.LAB — коллекцией интерактивных эффектов на чистом CSS и нативном JavaScript, собранной внутри Angular-приложения с серверным рендерингом. Исходный код — в открытом репозитории на GitHub .

01 / О ПРОЕКТЕ

Портфолио и лаборатория в одном продукте

Сайт совмещает две задачи: портфолио — статические страницы (главная, о проекте, обо мне, контакты) с акцентом на аккуратную вёрстку и интерактивные детали интерфейса; THE.LAB — витрина UI-экспериментов, где каждый эффект это отдельный демо-стенд с живым эффектом, «паспортом» технологий, оценкой сложности, просмотром исходного кода и интерактивной debug-панелью.

Ключевая идея лаборатории — показать, что богатые интерактивные эффекты (притяжение к курсору, parallax, кинетическая типографика, генеративные фоны и т.д.) достижимы без тяжёлых сторонних библиотек: только CSS-переменные, transform, requestAnimationFrame, Pointer Events, IntersectionObserver и ResizeObserver.

02 / ОСОБЕННОСТИ

THE.LAB и инженерная инфраструктура

THE.LAB — 50+ экспериментов в 8 активных категориях (плюс 2 запланированных): cursor — эффекты на движение мыши; scroll — parallax, timeline, pinned/sticky-сцены; hover — tilt/lift/flip карточки, glow border, image reveal; navigation — morph menu, floating dock, radial-навигация; components — accordion, modal, tabs, tooltip; layout — живые сетки, split-screen, resizable-панели; backgrounds — noise, gradient mesh, particles; typography — variable fonts, mouse distortion, animated headlines. Категории physics и experimental — в планах.

Паспорт эксперимента — бейджи о технологиях (CSS Only, JavaScript, requestAnimationFrame, CSS Variables, SVG, clip-path, mask, IntersectionObserver, ResizeObserver, Pointer Events, No Libraries) и уровень сложности от Easy до Hard.

Исходник каждого эксперимента доступен на странице демо с копированием в буфер обмена; исходники синхронизируются в ассеты скриптом sync:lab-sources. Debug-панель — слайдеры параметров эффекта и монитор в реальном времени: FPS, координаты курсора, значения CSS-переменных.

Server-Side Rendering и пререндер через @angular/ssr и Express, с client hydration для быстрой первой отрисовки и корректной индексации. SEO — динамические title/description/Open Graph на каждую страницу, автогенерация sitemap.xml, robots.txt. Компоненты экспериментов подгружаются лениво через loadComponent. Standalone-компоненты без NgModule; состояние в основном на Angular Signals (signal/input), RxJS используется точечно — например, обработка событий роутера. Старые URL (*.html, lab-magnetic-button и т.п.) редиректят на актуальные маршруты.

[Открыть лабораторию]

03 / СКОРО

Эффекты с библиотеками

Следующий раздел — контраст к Lab: те же идеи интерактивности, но с участием профильных инструментов — GSAP, Three.js и аналоги. Здесь важен не только визуальный результат, но и грамотная интеграция тяжёлых зависимостей в Angular-приложение.

Lab и этот раздел скорее дополняют друг друга: в одном случае эффект собран вручную, в другом — на профильных инструментах, если они действительно уместны.

04 / ТЕХНОЛОГИИ

Стек проекта

Angular 17.3 со standalone-компонентами и Signals; SSR и prerender через @angular/ssr и @angular/platform-server; Express 4 как сервер; TypeScript 5.4, SCSS; состояние в основном на Angular Signals, RxJS 7.8 — точечно (навигация); embla-carousel для карусели; Karma и Jasmine — минимальное покрытие; Node.js и zone.js в runtime.

05 / СТРУКТУРА

Организация репозитория

Код разделён на инфраструктуру (core), переиспользуемые компоненты (shared), layout, feature-модули (home, about, projects, contact, lab) и серверные скрипты для SSR, синхронизации исходников и генерации sitemap.

src/
├── app/
│   ├── core/                 # Инфраструктура: конфиги, сервисы, утилиты
│   │   ├── config/           # site-pages, navigation
│   │   ├── services/         # page-meta (SEO), mouse-tracker
│   │   └── utils/
│   ├── shared/               # Переиспользуемые компоненты и директивы
│   │   ├── components/       # layout, button, toggle, breadcrumbs, pointer и др.
│   │   └── directives/       # reveal-on-scroll
│   ├── layout/               # header, footer
│   ├── features/
│   │   ├── home/             # Главная (hero, ambient canvas)
│   │   ├── about/            # Обо мне
│   │   ├── projects/         # О проекте
│   │   ├── contact/          # Контакты
│   │   └── lab/              # THE.LAB
│   │       ├── data/         # experiments.ts, experiment-loaders.ts
│   │       ├── models/       # Experiment, LabCategory, PageMeta
│   │       ├── components/   # Карточки, галерея, debug-панель, code-view
│   │       ├── shell/        # Layout демо-стендов
│   │       └── experiments/  # Компоненты эффектов по категориям
│   ├── app.routes.ts
│   ├── app.config.ts
│   └── app.component.ts
├── assets/, fonts/, img/, files/
├── index.html
├── main.ts / main.server.ts
├── robots.txt / sitemap.xml
└── styles.scss
scripts/
├── sync-lab-sources.js
└── generate-sitemap.js
server.ts