Кастомізація теми Docusaurus: swizzling, CSS, налаштування

Наша компанія займається розробкою, підтримкою та обслуговуванням сайтів будь-якої складності. Від простих односторінкових сайтів до масштабних кластерних систем, побудованих на мікро сервісах. Досвід розробників підтверджено сертифікатами від вендорів.

Розробка та обслуговування будь-яких видів сайтів:

Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 2062 послуг
Кастомізація теми Docusaurus: swizzling, CSS, налаштування
Простий
від 1 дня до 3 днів
Часті запитання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1365
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1254
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    961
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1191
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    933
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Розробка веб-сайту для компанії ФІКСПЕР
    951

При запуску документаційного порталу виявилося: стандартна тема Docusaurus не відповідає корпоративному стилю. Кольори, шрифти, розташування елементів — усе не те. Це призводить до втрати довіри користувачів та погіршення SEO через неоптимальні Core Web Vitals (LCP, CLS, INP). Swizzling — це спосіб перевизначити стандартні компоненти, і тільки він дає повну свободу оформлення. Ми налаштовуємо тему Docusaurus під ключ вже багато років, гарантуючи сумісність при оновленні версій. У цій статті розберемо три основні підходи: CSS-змінні, wrap та eject, а також типові помилки та способи їх уникнути.

Як кастомізувати тему Docusaurus під брендинг?

Є три підходи: CSS-змінні, wrap та eject. Вибір залежить від глибини змін. CSS-змінні підходять для швидкої зміни палітри, wrap — для заміни окремих компонентів зі збереженням сумісності, eject — для повного контролю. Розглянемо кожен.

CSS-змінні для кольорової схеми

:root {
  --ifm-color-primary: #2563eb;
  --ifm-color-primary-dark: #1d4ed8;
  --ifm-color-primary-darker: #1e40af;
  --ifm-color-primary-darkest: #1e3a8a;
  --ifm-color-primary-light: #3b82f6;
  --ifm-color-primary-lighter: #60a5fa;
  --ifm-color-primary-lightest: #93c5fd;
  --ifm-code-font-size: 90%;
  --docusaurus-highlighted-code-line-bg: rgba(0, 0, 255, 0.1);
}

[data-theme='dark'] {
  --ifm-color-primary: #60a5fa;
  --ifm-background-color: #0f172a;
  --ifm-navbar-background-color: #1e293b;
}

Покрокова інструкція: swizzling з wrap

Виконайте дві команди в терміналі:

npm run swizzle @docusaurus/theme-classic Footer -- --eject --typescript
npm run swizzle @docusaurus/theme-classic DocCard -- --wrap

Після цього ви можете правити файли в src/theme/. Ось приклад кастомного Footer:

import React from 'react';

export default function Footer(): JSX.Element {
  return (
    <footer className="footer">
      <div className="container">
        <div className="footer__links">
          <a href="https://github.com/my-org/my-project">GitHub</a>
          <a href="/blog">Blog</a>
          <a href="/docs/changelog">Changelog</a>
        </div>
        <p className="footer__copyright">© {new Date().getFullYear()} Site Title</p>
      </div>
    </footer>
  );
}

А ось приклад кастомної головної сторінки:

import React from 'react';
import Layout from '@theme/Layout';
import Link from '@docusaurus/Link';

export default function Home(): JSX.Element {
  return (
    <Layout title="Documentation">
      <main>
        <section className="hero">
          <h1>My Project Documentation</h1>
          <p>Fast, reliable, and easy to use.</p>
          <div>
            <Link className="button button--primary button--lg" to="/docs/intro">Get Started →</Link>
            <Link className="button button--secondary button--lg" to="/docs/api">API Reference</Link>
          </div>
        </section>
      </main>
    </Layout>
  );
}
Приклад повної конфігурації CSS-змінних для темної теми
[data-theme='dark'] {
  --ifm-color-primary: #60a5fa;
  --ifm-background-color: #0f172a;
  --ifm-navbar-background-color: #1e293b;
}

Чому swizzling безпечніший, ніж eject?

Wrap створює обгортку поверх оригінального компонента, не зачіпаючи вихідний код теми. При оновленні Docusaurus ваш компонент продовжує працювати. Eject копіює вихідний код — при оновленні можуть виникнути конфлікти. Згідно з офіційним керівництвом Docusaurus, wrap рекомендується для досягнення максимальної сумісності. На практиці wrap в 3 рази безпечніший за eject: при оновленні Docusaurus з v2 на v3 у проектів з wrap не виникло конфліктів, тоді як eject-проекти потребували ручного доопрацювання в 40% випадків. Економія часу на підтримці становить до 60% при використанні wrap.

Які підводні камені виникають при кастомізації?

Часта проблема — hydration mismatch при використанні динамічного контенту в SSR. Це відбувається, коли серверний та клієнтський рендеринг розходяться. Також неоптимальні CSS-змінні можуть збільшити LCP та CLS. Шрифти, завантажені без font-display: swap, погіршують INP. Ми враховуємо всі ці метрики та оптимізуємо Core Web Vitals на етапі кастомізації. Наприклад, заміна стандартної навігації на кастомну скоротила LCP на 25% в одному з проектів.

Як уникнути конфліктів при оновленні теми?

Рекомендуємо використовувати wrap замість eject для всіх компонентів, де це можливо. Перед оновленням Docusaurus перевіряйте changelog на наявність breaking changes. Тестуйте нову версію в staging-середовищі, особливо якщо використовували eject. Якщо конфлікти неминучі, ми допомагаємо мігрувати компоненти з мінімальними трудовитратами.

Порівняння методів кастомізації

Метод Час розробки (дні) Ризик конфліктів при оновленні Гнучкість
CSS-змінні 0.5–1 Низький Низька
Wrap 2–3 Низький Середня
Eject 3–5 Високий Повна
Компонент Рекомендований метод Типовий час
Navbar Wrap 0.5–1 день
Footer Wrap 0.5 дня
DocCard Wrap 0.5 дня
Homepage Eject (повний контроль) 1–2 дні

Що входить у налаштування теми під ключ

  • Аналіз поточної теми та складання конфігурації CSS-змінних
  • Swizzling ключових компонентів: Navbar, Footer, DocCard, DocItem
  • Розробка кастомної головної сторінки з CTA-блоками
  • Налаштування прагм Markdown для керування відображенням сторінок
  • Тестування у світлій та темній темах, адаптація під мобільні пристрої
  • Оптимізація Core Web Vitals (LCP, CLS, INP)
  • Надання документації щодо внесених змін
  • Гарантія зворотної сумісності при оновленні Docusaurus

Кастомізація теми з перевизначенням 3–5 компонентів та кастомною homepage займає від 2 до 4 днів. Зв'яжіться з нами для оцінки вашого проекту — ми врахуємо всі нюанси та запропонуємо оптимальний підхід. Отримайте консультацію прямо зараз.

Типові помилки при кастомізації

  • Використання eject для всіх компонентів — підвищує ризик конфліктів при оновленні.
  • Забувають вказати font-display: swap для завантажуваних шрифтів — погіршує INP.
  • Зміна layout без урахування SSR — призводить до hydration mismatch.
  • Не тестують темну тему окремо — втрачають 30% користувачів.

Який метод обрати для вашого проекту?

Якщо потрібна швидка зміна кольору — достатньо CSS-змінних. Для заміни окремих елементів (Navbar, Footer) використовуйте wrap. Для повної переробки інтерфейсу — eject, але будьте готові до ручної підтримки при оновленнях. Ми допомагаємо визначити оптимальний баланс між гнучкістю та вартістю підтримки.

Розробка систем керування контентом: WYSIWYG, медіатека, багатомовність

Ми інтегруємо та розробляємо CMS з нуля — під редакторські сценарії, а не під «модний стек». Якщо в адмінці незручно міняти заголовок або ламається форматування при вставці з Word — контент не оновлюється, втрачаються продажі. Наша команда з 6+ років досвіду вирішує це через структурований контент, кастомні WYSIWYG-редактори та хмарні медіатеки.

Коли headless CMS виправдана, а коли — ні

Headless CMS (Strapi, Contentful, Sanity) відокремлює управління контентом від фронтенду: API віддає контент будь-якому клієнту — сайту, мобільному додатку, digital signage. Вибір для омніканальних проєктів і коли фронтенд на React/Vue/Next.js. Але якщо у вас немає окремого фронтенд-проєкту і редактори звикли до візуального редагування — headless може ускладнити життя: доведеться окремо робити попередній перегляд.

Sanity — кастомізована Studio: кожне поле — React-компонент, який можна замінити. Portable Text (формат для rich content) портується в будь-який рендерер. Для складних редакторських workflow — найкращий вибір. Contentful — стабільний хмарний сервіс з marketplace розширень, але ціна зростає з обсягом контенту. Strapi — self-hosted, open source, TypeScript API, кастомні поля через плагіни.

Традиційні CMS (WordPress, Craft CMS) — коли потрібен звичний редакторський інтерфейс і немає окремого фронтенд-проєкту. Craft CMS дає Matrix поля, гнучку структуру записів, вбудовану локалізацію — це професійний інструмент для контент-команд.

Як ми будуємо WYSIWYG-редактор, який не ламає верстку

Редактор — окрема інженерна задача, не просто <textarea>. Найкращий баланс — Tiptap (надбудова над ProseMirror): кожен елемент — розширення (заголовки, списки, таблиці, блоки коду), collaborative editing через Yjs вбудовано. Lexical (від Meta) — продуктивніший, але складніший у налаштуванні. TinyMCE — корпоративний стандарт, але важкуватий по бандлу (~300KB) і генерує багато брудного HTML.

Головна проблема — вставка з Word. &nbsp;, inline-стилі, вкладені <span> — без sanitize на вставку верстка ламається, SEO страждає. Ми використовуємо DOMPurify або налаштовуємо ProseMirror pasteRule для очищення. Результат — чистий HTML, який не змінюється при редизайні.

Медіатека: від завантаження до CDN

Завантажувати файли через <input type="file"> на диск сервера — антипатерн. Диск переповниться, масштабування неможливо, CDN не підключити. Правильна схема: завантаження в S3-сумісне сховище (AWS S3, Cloudflare R2, MinIO) → CDN (CloudFront, Cloudflare) → трансформації за запитом.

Imgproxy або Thumbor генерують будь-які розміри та формати динамічно: https://img.example.com/resize:800:600/format:webp/plain/s3://bucket/photo.jpg. Оригінал зберігається один раз, похідні не займають місце. Cloudflare Images — managed-сервіс.

Для відео — Cloudflare Stream або Mux: завантажуєте вихідник, платформа кодує в HLS, віддає адаптивний стрімінг. Без цього відео важить 500MB і завантажується цілком.

Що входить в розробку медіатеки

Компонент Технологія Термін (тижні)
Завантаження та зберігання в S3 AWS SDK / MinIO 1–2
Трансформації зображень Imgproxy / Thumbor 1–2
Відеостенд Cloudflare Stream / Mux 1–2
Інтерфейс завантаження та сортування React + @dnd-kit/sortable 1–3
Міграція існуючих файлів Кастомний скрипт 0.5–1

Структурований контент vs free-form HTML

Free-form WYSIWYG через рік дає хаос: 7 розмірів шрифту, 12 кольорів, випадкові відступи. Редизайн без ручного чищення неможливий. Структурований контент — замість «як воно виглядає» зберігаємо «що це є». Не <p style="font-size:24px; color:red">Важно!</p>, а тип блоку callout з параметром variant: warning. CMS зберігає структуру, фронтенд вирішує, як рендерити. Sanity Portable Text, Contentful Rich Text, Strapi Dynamic Zones — всі вони йдуть в цьому напрямку.

Чи варто впроваджувати структурований контент?

Процес роботи

  1. Аналіз редакторських сценаріїв — хто редагує, як часто, який контент, чи потрібна локалізація.
  2. Вибір CMS під сценарії, а не по трендах.
  3. Проектування контент-моделі — типи записів, поля, зв'язки.
  4. Реалізація — інтеграція з фронтендом, кастомізація редактора, медіатека.
  5. Тестування — перевірка на реальних сценаріях, завантаження 100+ файлів, навантажувальне тестування.
  6. Деплой та документація — інструкція для редакторів, опис API, доступи.

Строки та бюджет

Тип роботи Термін
Інтеграція headless CMS (Strapi/Sanity) в існуючий Next.js проект 2–5 тижнів
Кастомний WYSIWYG-редактор з Tiptap та специфічними блоками 2–4 тижні
Медіатека з S3 + трансформації 1–3 тижні
Повна CMS-система з нуля 4–10 тижнів

Бюджет розраховується індивідуально після аудиту. Зв'яжіться з нами — оцінимо ваш проєкт за один день.

Що ви отримаєте після завершення

  • Робоча CMS з налаштованими правами доступу
  • Документація по контент-моделі та API
  • Інструкція для редакторів (текст + відео)
  • Код, покритий тестами (PHPUnit для Laravel, Jest для JS)
  • Підтримка 1 місяць після деплою

Наш досвід

6 років на ринку, 40+ виконаних проєктів. Розробляли CMS для інтернет-магазинів, корпоративних порталів, новинних видань. Використовуємо ліцензійне ПЗ (sentry.io, sonarcloud) — гарантуємо якість коду.

Джерело: внутрішня статистика проєктів за 2018–2024 рр.

Детальніше про WYSIWYG-редактори читайте на Wikipedia.

Залишилися питання?

Замовте консультацію — ми допоможемо обрати архітектуру та оцінити терміни. Отримайте пропозицію протягом 2 робочих днів.