Как устроен этот Quartz-сайт Smirnoff
Этот сайт — не чистый Obsidian-vault, который просто выложили в интернет. Он устроен как публичная витрина и рабочая карта проекта одновременно: здесь есть главная, контакты, проектные статьи, юридические документы, библиотека и набор кастомных интерфейсных компонентов.
Markdown остаётся основным форматом для статей, поэтому материалы удобно писать как заметки. Но ключевые страницы собраны не только из Markdown: часть данных лежит в JSON, а поведение вынесено в Preact-компоненты и inline-скрипты. За счёт этого сайт не превращается в набор разрозненных страниц: он ведёт читателя от общего смысла к конкретным проектам и точкам контакта.
Назначение сайта
У сайта несколько задач одновременно. Это не только место, куда складываются заметки, и не только страница «об услугах». Сайт должен объяснять, чем занимается автор, показывать ход работы над проектами и при этом оставаться удобным для чтения:
- показывать услуги и подход к разработке;
- хранить проектные материалы и технические заметки;
- давать понятную навигацию по разделам;
- принимать заявки через форму и callback-механику;
- публиковать юридические документы;
- показывать книжную полку, связанную с BOOK-LIBRARY;
- оставаться статическим сайтом, который можно деплоить на GitHub Pages.
Из-за этого Quartz здесь используется шире, чем обычный «digital garden». Он отвечает и за текстовую часть, и за интерфейсные сценарии: читатель видит понятный сайт, а автор сохраняет привычный способ писать и обновлять материалы.
Структура content
content — источник страниц сайта и самая понятная часть всей системы. Если смотреть на проект глазами автора, это рабочее пространство для статей, заметок и разделов. Если смотреть глазами читателя, именно из этой структуры рождаются страницы, карточки, теги и маршруты. Внутри лежат обычные Markdown-файлы и разделы:
- главная страница
index.md; - страница библиотеки
library.md; - проектные материалы в
Проекты; - серия про Obsidian и Quartz в
Проекты/Obsidian; - материалы про BOOK-LIBRARY в
Проекты/book-library; - юридические документы;
- изображения и вложения, которые используются в статьях.
Quartz читает это дерево, строит slug-и, ссылки, папки, теги, RSS и sitemap. Поэтому структура content одновременно влияет и на Obsidian-удобство, и на навигацию сайта. Это решает простую проблему: материалы можно вести как базу знаний, но публиковать их так, чтобы человек снаружи не заблудился в папках.
Роль quartz.config.ts
quartz.config.ts отвечает за то, каким будет сайт при сборке. Это слой общих правил: как называются страницы, какие ссылки считаются внутренними, какие плагины участвуют в сборке и каким будет визуальный язык сайта. В текущем проекте там заданы:
- название
Smirnoff; baseUrl: "slavx.ru";- SPA-навигация;
- popovers для внутренних ссылок;
- Plausible Analytics;
- шрифты Inter и IBM Plex Mono;
- light/dark палитры;
- Markdown-трансформеры;
- emitters для content pages, folder pages, tag pages, RSS, sitemap, static assets и custom OG.
Отдельно важны FolderPage и TagPage с usePreviewList: true. Благодаря этому папки и теги показываются карточками, а не сухими списками. Для читателя это маленькая, но заметная разница: раздел выглядит как подборка материалов, а не как технический индекс файлов.
Роль quartz.layout.ts
quartz.layout.ts отвечает за то, что стоит вокруг контента: левая колонка, правая колонка, общие компоненты и исключения для особых страниц. Если quartz.config.ts задаёт правила сборки, то layout определяет, как читатель будет двигаться по сайту и какие подсказки увидит рядом с текстом.
В общих компонентах подключены:
- геометрический фон;
- карусель услуг;
- FeedbackForm;
- HomeCallback;
- CookieConsent;
- Footer.
Для обычных статей layout добавляет breadcrumbs, title и meta. Слева находится Avatar, мобильный toolbar и CardMenu. Справа — поиск, dark mode, reader mode, граф, TOC и Backlinks.
Это важная особенность Quartz: Markdown-файл отвечает за текст, а layout задаёт контекст вокруг него. Поэтому статья не висит в пустоте: рядом есть навигация, поиск, граф связей, оглавление и обратные ссылки.
Главная как data-driven лендинг
Главная страница index не рендерится как обычная статья. В layout для неё есть ConditionalRender, который вставляет LandingContainer с блоками из quartz/static/data/home.json.
Состав блоков управляется массивом порядка:
- hero;
- focus;
- services;
- works;
- FAQ;
- contact.
Так главная остаётся управляемой данными. Можно менять тексты, карточки, CTA и порядок блоков без превращения content/index.md в огромный HTML-шаблон. Это важно для лендинга: ему нужна выразительная подача, но его всё равно должно быть легко поддерживать.
На главной также есть отдельный граф и scroll sequence. Это уже не типовая страница Quartz, а полноценный лендинг поверх Quartz-движка: она встречает нового посетителя, объясняет направление сайта и мягко ведёт к проектам или контакту.
Контакты как data-driven страница
Страница Кoнтакты устроена похожим образом. Она берёт данные из quartz/static/data/contacts.json и собирается из специальных компонентов:
- hero;
- каналы связи;
- workflow;
- форматы старта;
- FAQ;
- CTA.
Это удобно для страницы, где важна структура и интерактивные блоки. Markdown здесь был бы слишком плоским, а JSON + компоненты дают нормальную управляемость: можно отдельно настраивать смысловые блоки, не смешивая текст, данные и интерфейсную логику в одной простыне.
Проектные разделы
Проектные статьи остаются ближе к классическому Quartz. Они лежат в content/Проекты, получают title, description, tags, preview image и участвуют в графе связей. В отличие от главной, здесь важна не эффектная подача, а понятный рассказ: что делалось, как устроено решение и с чем оно связано.
Для таких материалов важны:
- аккуратный frontmatter;
- внутренние ссылки через wiki-links;
- короткие descriptions для карточек;
preview_image, чтобы папки и теги выглядели нормально;- понятная структура папок.
Так сайт работает как база знаний, но не теряет вид обычного публичного сайта. Автор может накапливать технический контекст, а читатель получает не внутренний архив, а аккуратно оформленные проектные страницы.
Юридические документы
Юридические документы лежат в content и публикуются как обычные страницы. Они важны не сами по себе, а в связке с формами и CTA. Если сайт собирает заявку, email, телефон или согласие, рядом должны быть корректные тексты про обработку данных.
Поэтому legal-страницы — часть архитектуры сайта, а не формальность в конце меню. Они поддерживают доверие к интерактивным сценариям: человек понимает, что происходит с данными, которые он оставляет через форму.
Кастомные компоненты
В проекте есть несколько компонентов, которые сильно меняют ощущение от Quartz:
Avatar— визуальная точка входа в левом сайдбаре;CardMenu— основная навигация вместо Explorer;Search,Darkmode,ReaderMode— базовые переключатели;Graph— граф связей без показа тегов;PagePreviewList— карточки на страницах папок и тегов;FeedbackForm— форма заявки через JSON-конфиг;HomeCallback— callback-механика для лендингов;LibraryPage— витрина книжной полки.
Часть компонентов рендерит HTML сразу, часть работает как ресурсный placeholder и оживает через inline-скрипт после загрузки страницы. Именно эти компоненты делают Quartz менее похожим на стандартную тему: у сайта появляется собственный ритм, навигация и точки действия.
Библиотека
content/library.md выглядит почти пустым, но это нормально. В этой странице Markdown нужен скорее как точка входа, а основную работу делает layout: для slug library он вставляет LibraryPage, который берёт настройки из bookshelf.json.
Библиотека показывает категории и книги из BOOK-LIBRARY: сначала пытается работать с live API, а при проблемах может использовать static catalog из quartz/static/generated. Обложки могут быть зеркалированы в generated-папку.
Quartz здесь — витрина. Источник истины по книгам остаётся в BOOK-LIBRARY. Такой разнос ролей полезен: сайт показывает библиотеку читателю, но не пытается заменить собой систему, где эти данные живут и обновляются.
Итог
Этот Quartz-сайт устроен как смесь Markdown-базы и компонентного сайта. Обычные статьи живут в content, внешний вид и поведение задаются через quartz.config.ts и quartz.layout.ts, а сложные страницы собираются из JSON и компонентов.
Главная мысль такая: Quartz здесь используется не ради эффекта «ещё один сайт из заметок», а как способ связать личную базу материалов, публичные проектные страницы и лендинговые сценарии в одну систему. Такой подход оставляет сайт статическим, но не ограничивает его форматом «страница заметки и список ссылок».