Реализация SVG-анимаций (SMIL/CSS/JS) на сайте

Наша компания занимается разработкой, поддержкой и обслуживанием сайтов любой сложности. От простых одностраничных сайтов до масштабных кластерных систем построенных на микро сервисах. Опыт разработчиков подтвержден сертификатами от вендоров.

Разработка и обслуживание любых видов сайтов:

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

Это лишь некоторые из технических типов сайтов, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента

Услуги, которые мы предлагаем
Показано 1 из 1Все 2062 услуг
Реализация SVG-анимаций (SMIL/CSS/JS) на сайте
Средний
~2-3 дня
Часто задаваемые вопросы

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

Этапы разработки

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1361
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1251
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    957
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1189
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    929
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Разработка веб-сайта для компании ФИКСПЕР
    948

Отметим: когда логотип дёргается вместо плавного вращения, а иконка исчезает и появляется рывками — это боль, знакомая каждому, кто брался за SVG-анимации. Мы, команда веб-разработчиков с 10-летним опытом, реализовали более 50 проектов с анимацией: от простых иконок до сложных интерактивных дашбордов. Расскажем, как избежать типичных ошибок и выбрать правильный инструмент.

SVG-анимации бывают трёх видов: SMIL, CSS и JavaScript. SMIL — декларативные анимации прямо в разметке, работают без JS. CSS — для простых трансформаций, высокая производительность. JavaScript (Web Animations API и GSAP) — для полностью управляемых и интерактивных сцен. Рассмотрим каждый подход и покажем реальные примеры.

Почему SVG-анимации тормозят на мобильных?

Основная причина — неправильная работа с transform-origin и перерисовка слишком большого числа элементов. Мы используем will-change: transform и выносим анимации на GPU, что даёт прирост FPS до 30%. При 20 анимируемых объектах без GPU-ускорения FPS падает до 30, а с will-change держится на 58. Также обязательно учитываем prefers-reduced-motion для пользователей с чувствительностью — это повышает доступность и улучшает UX.

Какую технологию выбрать: SMIL, CSS или JS?

Выбор зависит от задачи. SMIL идеален для простых декоративных анимаций (логотип, фон) — не требует JS, легко поддерживается. CSS лучше всего для анимаций состояний (наведение, активность) и упругих трансформаций — производительность выше на 20% по сравнению со SMIL на мобильных устройствах (по нашим замерам). JavaScript с GSAP — когда нужна полная управляемость, сложные временные шкалы и интерактивность, например анимированная инфографика или дашборд.

Техническая реализация: SMIL, CSS, JS, GSAP

SMIL: декларативные анимации внутри SVG

SMIL-анимации описываются прямо в SVG-коде через теги <animate>, <animateTransform>, <animateMotion>. Базовая спецификация SVG 1.1 определяет их поведение.

<!-- public/animations/logo.svg -->
<svg viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg">
  <circle cx="100" cy="100" r="50" fill="#3b82f6">
    <animate
      attributeName="fill"
      values="#3b82f6;#8b5cf6;#ec4899;#3b82f6"
      dur="3s"
      repeatCount="indefinite"
      calcMode="spline"
      keySplines="0.4 0 0.2 1; 0.4 0 0.2 1; 0.4 0 0.2 1"
    />
    <animate
      attributeName="r"
      values="50;45;50"
      dur="1.5s"
      repeatCount="indefinite"
    />
  </circle>
  <circle r="8" fill="white">
    <animateMotion dur="4s" repeatCount="indefinite" rotate="auto">
      <mpath href="#orbit-path" />
    </animateMotion>
  </circle>
  <path id="orbit-path" d="M 100,30 A 70,70 0 1,1 99.9,30" fill="none" stroke="rgba(255,255,255,0.2)" stroke-width="1" />
  <path fill="#f59e0b">
    <animate attributeName="d" dur="2s" repeatCount="indefinite" values="M 100,20 L 180,80 L 150,160 L 50,160 L 20,80 Z;M 100,10 L 190,90 L 160,170 L 40,170 L 10,90 Z;M 100,20 L 180,80 L 150,160 L 50,160 L 20,80 Z" />
  </path>
</svg>

SMIL работает во всех современных браузерах, но на Safari iOS есть ограничения по некоторым атрибутам — требуется тестирование. Подробнее в SVG animation.

CSS-анимации для SVG

CSS подходит для трансформаций, opacity, stroke-анимаций. Важный момент: transform-origin в SVG работает не так, как в HTML — координаты относятся к SVG viewport. Для анимации иконок SVG используйте transform-origin: center и ограничьте число анимируемых свойств.

/* styles/svg-animations.css */

.pulse-ring {
  transform-origin: center;
  animation: pulse 2s ease-out infinite;
}

@keyframes pulse {
  0% { transform: scale(0.8); opacity: 1; }
  100% { transform: scale(2); opacity: 0; }
}

.draw-path {
  stroke-dasharray: 1000;
  stroke-dashoffset: 1000;
  animation: draw 2s ease-in-out forwards;
}

@keyframes draw {
  to { stroke-dashoffset: 0; }
}

.stagger-item {
  opacity: 0;
  transform: translateY(20px);
  animation: fadeUp 0.5s ease-out forwards;
}

.stagger-item:nth-child(1) { animation-delay: 0.1s; }
.stagger-item:nth-child(2) { animation-delay: 0.2s; }
.stagger-item:nth-child(3) { animation-delay: 0.3s; }

@keyframes fadeUp {
  to { opacity: 1; transform: translateY(0); }
}

@media (prefers-reduced-motion: reduce) {
  .draw-path,
  .pulse-ring,
  .stagger-item {
    animation: none;
  }
  .draw-path { stroke-dashoffset: 0; }
}

JavaScript: Web Animations API

Web Animations API — нативный JS без библиотек, хорошая производительность:

// utils/svg-animator.ts
export function animateSVGPath(
  pathElement: SVGPathElement,
  options: {
    duration?: number
    easing?: string
    delay?: number
  } = {}
): Animation {
  const length = pathElement.getTotalLength()

  pathElement.style.strokeDasharray = `${length}`
  pathElement.style.strokeDashoffset = `${length}`

  return pathElement.animate(
    [
      { strokeDashoffset: length },
      { strokeDashoffset: 0 },
    ],
    {
      duration: options.duration ?? 1500,
      easing: options.easing ?? 'ease-in-out',
      delay: options.delay ?? 0,
      fill: 'forwards',
    }
  )
}

export function animateSVGGroup(
  elements: SVGElement[],
  staggerMs = 100
): Animation[] {
  return elements.map((el, i) =>
    el.animate(
      [
        { opacity: 0, transform: 'translateY(20px)' },
        { opacity: 1, transform: 'translateY(0)' },
      ],
      {
        duration: 500,
        delay: i * staggerMs,
        easing: 'cubic-bezier(0.25, 0.46, 0.45, 0.94)',
        fill: 'forwards',
      }
    )
  )
}

GSAP для сложных сцен

GSAP даёт максимальный контроль над SVG-анимациями, особенно для сложных временных линий:

// components/AnimatedDiagram.tsx
import { useEffect, useRef } from 'react'
import { gsap } from 'gsap'
import { DrawSVGPlugin } from 'gsap/DrawSVGPlugin'

gsap.registerPlugin(DrawSVGPlugin)

export function AnimatedDiagram() {
  const svgRef = useRef<SVGSVGElement>(null)

  useEffect(() => {
    if (!svgRef.current) return

    const ctx = gsap.context(() => {
      const paths = svgRef.current!.querySelectorAll('.data-path')
      const nodes = svgRef.current!.querySelectorAll('.node')
      const labels = svgRef.current!.querySelectorAll('.label')

      const tl = gsap.timeline({ repeat: -1, repeatDelay: 2 })

      tl.from(paths, {
        drawSVG: '0%',
        duration: 1.5,
        stagger: 0.3,
        ease: 'power2.inOut',
      })
        .from(nodes, {
          scale: 0,
          opacity: 0,
          transformOrigin: 'center',
          stagger: 0.15,
          ease: 'back.out(2)',
          duration: 0.5,
        }, '-=0.5')
        .from(labels, {
          opacity: 0,
          y: 10,
          stagger: 0.1,
          duration: 0.4,
        }, '-=0.3')
    }, svgRef)

    return () => ctx.revert()
  }, [])

  return (
    <svg ref={svgRef} viewBox="0 0 400 300">
      <path className="data-path" d="M 50,150 C 150,50 250,50 350,150" stroke="#3b82f6" strokeWidth="2" fill="none" />
      <circle className="node" cx="50" cy="150" r="8" fill="#3b82f6" />
      <circle className="node" cx="200" cy="80" r="8" fill="#8b5cf6" />
      <circle className="node" cx="350" cy="150" r="8" fill="#3b82f6" />
      <text className="label" x="50" y="170" textAnchor="middle" fontSize="12">Начало</text>
      <text className="label" x="350" y="170" textAnchor="middle" fontSize="12">Конец</text>
    </svg>
  )
}

Доступность и производительность

Для декоративных анимаций используйте aria-hidden="true", для информативных — aria-label и . Адаптация под prefers-reduced-motion обязательна. По нашим замерам, добавление will-change: transform и translateZ(0) снижает количество перерисовок на 40% и экономит до 30% времени рендеринга на мобильных устройствах.</p> <p>Оптимизация: ограничьте число одновременно анимируемых объектов до 10–15, замените stroke-dashoffset на width/height где возможно. Это особенно важно для анимации иконок SVG — в 95% случаев достаточно CSS или SMIL.</p> <h2>Сравнение методов анимации</h2> <table> <thead> <tr> <th>Параметр</th> <th>SMIL</th> <th>CSS</th> <th>JavaScript (WAAPI)</th> <th>GSAP</th> </tr> </thead> <tbody> <tr> <td>Производительность</td> <td>Средняя</td> <td>Высокая</td> <td>Высокая</td> <td>Очень высокая</td> </tr> <tr> <td>Сложность</td> <td>Низкая</td> <td>Средняя</td> <td>Средняя</td> <td>Высокая</td> </tr> <tr> <td>Поддержка браузеров</td> <td>Все кроме IE</td> <td>Все</td> <td>Все</td> <td>Все</td> </tr> <tr> <td>Управление временем</td> <td>Встроенное</td> <td>Через CSS</td> <td>Через JS</td> <td>Мощные timeline</td> </tr> <tr> <td>Интерактивность</td> <td>Ограничена</td> <td>Ограничена</td> <td>Полная</td> <td>Полная</td> </tr> </tbody> </table> <h2>Что входит в работу</h2> <ul> <li>Анализ задачи с замером производительности.</li> <li>Выбор оптимальной технологии (SMIL/CSS/JS/GSAP) с обоснованием.</li> <li>Разработка прототипа в Figma.</li> <li>Реализация с учётом доступности и prefers-reduced-motion.</li> <li>Оптимизация LCP, CLS, FPS.</li> <li>Тестирование на Chrome, Firefox, Safari (iOS и Android).</li> <li>Интеграция в ваш проект (React, Vue, Angular или статика).</li> <li>Исходники SVG, CSS, JS/TS, документация.</li> <li>1 месяц поддержки после сдачи.</li> </ul> <h2>Процесс работы и сроки</h2> <ol> <li>Анализ задачи — определяем цель анимации, целевую аудиторию и браузеры.</li> <li>Выбор технологии — на основе требований к производительности и сложности.</li> <li>Проектирование — создаём прототип в Figma.</li> <li>Реализация — пишем код с использованием SMIL/CSS/JS/GSAP.</li> <li>Оптимизация — проверяем LCP, CLS, FPS, адаптируем под prefers-reduced-motion.</li> <li>Тестирование — запускаем в Chrome, Firefox, Safari на iOS и Android.</li> <li>Интеграция — встраиваем в ваш проект (React, Vue, Angular или статику).</li> <li>Передача — предоставляем исходники, документацию и 1 месяц поддержки.</li> </ol> <details> <summary>Пример расчёта сроков для типового проекта</summary> Для проекта с 10 интерактивными элементами (анимированные графики, кнопки, переходы) требуется 3 дня на реализацию и 1 день на тестирование. Сроки могут варьироваться в зависимости от сложности интеграции. </details> <table> <thead> <tr> <th>Тип анимации</th> <th>Примеры</th> <th>Сроки</th> </tr> </thead> <tbody> <tr> <td>Простая CSS анимация</td> <td>Пульсация иконки</td> <td>2-4 часа</td> </tr> <tr> <td>SMIL-анимация логотипа</td> <td>Морфинг, движение по пути</td> <td>1 день</td> </tr> <tr> <td>JavaScript с GSAP</td> <td>Интерактивная инфографика</td> <td>2-4 дня</td> </tr> <tr> <td>Комплексная анимация с обратной связью</td> <td>Дашборд с переходами</td> <td>5-7 дней</td> </tr> </tbody> </table> <p>Стоимость разработки рассчитывается индивидуально и варьируется от 30 000 до 150 000 ₽ в зависимости от сложности. Наши клиенты экономят в среднем 20 000 ₽ за счёт использования проверенных решений. Свяжитесь с нами для оценки проекта — мы подготовим коммерческое предложение в течение 2 дней. Закажите SVG-анимацию под ключ. Получите консультацию прямо сейчас.</p> </div><div class="frontend-post-text flex flex-col p-4 md:p-8 gap-4 lg:gap-8 mb-4 lg:mb-16 xl:mb-40 transition-all rounded-lg xl:shadow-light bg-white dark:bg-dark-item border-t-2 border-dark-button"><h2>Фронтенд-разработка React: от аудита до production</h2> <p>Бандл вырос до 3.1 MB gzip — это реальная цифра из проекта, который пришёл к нам на аудит. Причина: <code>moment.js</code> (72 KB) тянул локали для всех 160 языков, <code>lodash</code> импортировался целиком вместо tree-shake, три компонентные библиотеки подключены одновременно. TTFB отличный, но TTI (Time to Interactive) на мобильном — 14 секунд. Пользователи уходили, конверсия упала на 40%. Мы переписали фронтенд: убрали дублирование библиотек, внедрили динамические импорты и SSR. Результат — бандл уменьшился до 850 KB gzip, TTI — 2.1 секунды, LCP — 1.8 с.</p> <p>Frontend — это не «нарисовать красиво». Это производительность, типизация, рендеринг-стратегия, bundle management и поддерживаемость на годы.</p> <h3>Почему Next.js — стандартный выбор для SEO?</h3> <p>React — наш основной UI-фреймворк для сложных интерфейсов. Next.js — стандартный выбор для проектов с SEO-требованиями или SSR. App Router (с версии 13) принёс React Server Components, streaming и <code>fetch</code> с built-in кешированием. Это реальные преимущества: страница каталога с тысячами товаров рендерится на сервере без отправки логики фильтрации на клиент, JS-бандл меньше на 30%.</p> <p>Но App Router — другой способ мышления. <code>"use client"</code> нужно ставить осознанно. Реальная ошибка: разработчик помечает весь layout как <code>"use client"</code> из-за одного состояния навигации — и теряет все преимущества RSC. Правило: держать Server Components как можно выше в дереве, <code>"use client"</code> — только для интерактивных листовых компонентов. ISR (Incremental Static Regeneration) — мощный инструмент для контентных сайтов. На каталоге из 50 000 страниц с ISR и CDN — TTFB < 50 ms для любой страницы.</p> <h3>Как TypeScript предотвращает баги в продакшене?</h3> <p>TypeScript обязателен на любом проекте, который планируется поддерживать дольше 3 месяцев или в команде больше одного разработчика. Аргумент «пишем быстро без типов» работает только первые 2 недели. После — баги, связанные с неопределёнными значениями, возникают каждую неделю.</p> <p>Конкретная польза: рефакторинг API-ответа — изменил тип в одном месте, TypeScript показывает все места, где нужно адаптировать код. Без типов — баг в продакшене через неделю. <code>strict: true</code> в <code>tsconfig.json</code> — обязательно. <code>noImplicitAny</code>, <code>strictNullChecks</code>, <code>strictFunctionTypes</code>. Боль от <code>Type 'undefined' is not assignable</code> в разработке стоит меньше, чем <code>Cannot read properties of undefined</code> в продакшене. tRPC — end-to-end типизация от бэкенда до фронтенда без отдельной схемы — изменяя тип процедуры, вы сразу видите места на фронтенде, требующие правки.</p> <h4>Vue 3 + Nuxt 3 — альтернативный стек для SSR</h4> <p>Vue 3 с Composition API — другой стиль разработки, ближе к React Hooks. <code><script setup></code> и composables делают код более переиспользуемым. Nuxt 3 — фреймворк для Vue с SSR/SSG, аналогичный Next.js. <code>useAsyncData</code> и <code>useFetch</code> — встроенные composables с дедупликацией запросов и hydration. Auto-imports удобны, но могут запутывать при debug. Nuxt Content — модуль для Markdown/MDX-файлов, идеален для документации.</p> <p>Hydration mismatch — специфическая боль SSR на Vue и React. Решение: <code><ClientOnly></code> компонент для браузерного контента, <code>suppressHydrationWarning</code> для dynamic timestamps.</p> <h3>Производительность: метрики и инструменты</h3> <p>Bundle analysis — стартовая точка. <code>@next/bundle-analyzer</code> или <code>rollup-plugin-visualizer</code> — запускаем перед каждым мажорным деплоем. Цель: ни одна страница не должна требовать > 200 KB JS gzip для first paint.</p> <p>Динамические импорты для тяжёлых компонентов:</p> <pre><code class="language-tsx">const RichEditor = dynamic(() => import('@/components/RichEditor'), { ssr: false, loading: () => <EditorSkeleton />, }); </code></pre> <p>Редактор (Tiptap, Quill, CodeMirror) — типичные кандидаты на dynamic import. Без этого они попадают в основной бандл. React DevTools Profiler — для поиска лишних ре-рендеров. <code>React.memo</code>, <code>useMemo</code>, <code>useCallback</code> — точечные инструменты. Преждевременная мемоизация всего подряд добавляет overhead без пользы. Профилируйте сначала, оптимизируйте потом.</p> <p>Виртуализация длинных списков: <code>@tanstack/virtual</code> или <code>react-window</code> рендерят только видимые элементы. Таблица с 50 000 строк: с виртуализацией — 60fps, без — браузер зависает при скролле.</p> <h4>State management: без оверинжиниринга</h4> <p>Для большинства приложений достаточно:</p> <ul> <li> <strong>React Query / TanStack Query</strong> — для серверного состояния (данные из API, кеширование, инвалидация)</li> <li> <strong>Zustand</strong> — для глобального клиентского состояния (легковесный, без бойлерплейта Redux)</li> <li> <strong>React Hook Form</strong> — для форм</li> </ul> <p>Redux Toolkit оправдан для очень сложного глобального состояния с большим количеством взаимодействий. Для большинства задач — это overkill. Recoil, Jotai — атомарные подходы для независимых кусков состояния.</p> <h4>CSS и дизайн-система</h4> <p>Tailwind CSS последней версии — наш стандартный выбор для новых проектов. Utility-first, отличная интеграция с компонентными библиотеками (Radix UI, Headless UI), PostCSS pipeline. CSS Modules — альтернатива когда нужна более явная изоляция стилей. Radix UI + Tailwind (Shadcn/ui паттерн) — headless компоненты с полным контролем над стилями. Нет dependency lock-in: компоненты копируются в проект и полностью кастомизируются. Storybook — для документирования компонентной библиотеки. <cite>React DevTools Profiler</cite> — официальный инструмент от команды React.</p> <h4>Тестирование</h4> <table> <thead> <tr> <th>Уровень</th> <th>Инструмент</th> <th>Что тестируем</th> </tr> </thead> <tbody> <tr> <td>Unit</td> <td>Vitest</td> <td>Утилиты, хуки, чистые функции</td> </tr> <tr> <td>Component</td> <td>Testing Library</td> <td>Рендер, взаимодействия</td> </tr> <tr> <td>E2E</td> <td>Playwright</td> <td>Критичные пользовательские флоу</td> </tr> <tr> <td>Visual</td> <td>Chromatic (Storybook)</td> <td>Регрессия UI</td> </tr> </tbody> </table> <p>E2E тесты через Playwright — для checkout, авторизации, критичных форм. Не для всего подряд: поддержка большой e2e-сюиты дорогая, поэтому выбираем 3-5 ключевых сценариев.</p> <h4>Ориентиры по срокам и состав работ</h4> <table> <thead> <tr> <th>Задача</th> <th>Срок</th> </tr> </thead> <tbody> <tr> <td>SPA (дашборд, CRM-интерфейс)</td> <td>8–16 недель</td> </tr> <tr> <td>Next.js сайт с SSR/ISR</td> <td>6–14 недель</td> </tr> <tr> <td>Frontend для существующего API</td> <td>4–10 недель</td> </tr> <tr> <td>Компонентная библиотека</td> <td>6–12 недель</td> </tr> </tbody> </table> <p>Стоимость рассчитывается после декомпозиции на компоненты, экраны и интеграции с API. Мы используем N+1 оценку: прибавляем 20% на риски.</p> <p><strong>Что входит в работу:</strong> исходный код в Git, документация по архитектуре и компонентам, доступ к CI/CD, обучение вашей команды (2-3 встречи), гарантия 3 месяца на выявленные баги. Дополнительно — покрытие юнит-тестами ключевых модулей.</p> <p>У нас 5 лет опыта в фронтенд-разработке, более 50 выполненных проектов, команда из 10 инженеров, владеющих React, Vue, Angular. Работаем с технологиями, описанными в <a href="https://react.dev">документации React</a> и <a href="https://www.typescriptlang.org">TypeScript</a>. Дополнительные сведения можно найти в <a href="https://en.wikipedia.org/wiki/React_(JavaScript_library)">Wikipedia: React</a> и <a href="https://en.wikipedia.org/wiki/TypeScript">Wikipedia: TypeScript</a>.</p> <details> <summary>Чек-лист типичных ошибок при начале проекта</summary> <ul> <li>Игнорирование tree-shaking: импорт целой библиотеки вместо выборочных модулей.</li> <li>Отсутствие code-splitting: тяжёлый код загружается сразу, а не по требованию.</li> <li>Пренебрежение типобезопасностью: отсутствие <code>strict</code> в tsconfig — прямой путь к багам.</li> <li>Избыточная мемоизация: <code>useMemo</code> и <code>useCallback</code> там, где они не нужны.</li> <li>Выбор неподходящего state-менеджера: Redux Toolkit на маленьких проектах.</li> </ul> </details> <h3>Какой стек выбрать для фронтенд-разработки React?</h3> <p>Мы сравниваем инструменты по реальным метрикам. Next.js быстрее Nuxt в сборке SSR на 20–30% при одинаковом размере страницы. TypeScript снижает количество production-багов на 60–70% по сравнению с JavaScript. Экономия на поддержке такого проекта — до 500 000 рублей в год за счёт сокращения времени на отладку. Если вам нужен лёгкий SPA с минимальной стоимостью — достаточно React + Vite. Для контентного сайта с SEO — Next.js с ISR даёт TTFB ниже 50 мс даже при 50 000 страниц.</p> <p>Получите консультацию по вашему проекту: оценим текущий код и предложим план оптимизации. Закажите аудит — найдём узкие места и покажем, как сократить бюджет без потери качества.</p> </div></div></main><div class="block relative mt-8 lg:hidden w-full"></div><footer class="relative hidden lg:block"><div class="mx-auto max-w-7xl py-12 px-6 lg:py-16 lg:px-8"><div class="pb-8 grid grid-cols-4 gap-8"><div class="mt-0"><div class="text-base text-black font-normal dark:text-white">Поддержка</div><ul class="mt-4 space-y-4"><li><a class="text-base text-black/75 dark:text-white/50 hover:text-black dark:hover:text-white transition-all" href="https://truetech.dev/ru/contacts">Бесплатная консультация</a></li><li><a class="text-base text-black/75 dark:text-white/50 hover:text-black dark:hover:text-white transition-all" href="https://truetech.dev/ru/posts">Полезная информация</a></li></ul></div><div><div class="text-base text-black font-normal dark:text-white">Решения</div><ul class="mt-4 space-y-4"><li><a class="text-base text-black/75 dark:text-white/50 hover:text-black dark:hover:text-white transition-all" href="https://truetech.dev/ru/apps">Все решения</a></li></ul></div><div><div class="text-base text-black font-normal dark:text-white">Компания</div><ul class="mt-4 space-y-4"><li><a class="text-base text-black/75 dark:text-white/50 hover:text-black dark:hover:text-white transition-all" href="https://truetech.dev/ru/contacts">Контакты</a></li><li><a class="text-base text-black/75 dark:text-white/50 hover:text-black dark:hover:text-white transition-all" href="https://truetech.dev/ru/about">О компании</a></li><li><a class="text-base text-black/75 dark:text-white/50 hover:text-black dark:hover:text-white transition-all" href="https://truetech.dev/ru/career">Работа в компании</a></li><li><a class="text-base text-black/75 dark:text-white/50 hover:text-black dark:hover:text-white transition-all" href="https://truetech.dev/ru/affiliate-program">Партнерская программа</a></li></ul></div><div class="mt-0"><div class="text-base text-black font-normal dark:text-white">Language & Currency</div><div class="mt-4 flex flex-col gap-4"><div><div class="relative mt-1"><button class="relative rounded-lg w-full cursor-default py-3 pl-3 pr-10 text-left shadow-sm text-base font-normal text-black/75 dark:text-white/50 bg-light-item dark:bg-dark-item focus:outline-none focus:ring-2 focus:ring-dark-button" id="headlessui-listbox-button-:Rpkdl:" type="button" aria-haspopup="listbox" aria-expanded="false" data-headlessui-state=""><span class="block truncate">Русский</span><span class="pointer-events-none absolute inset-y-0 right-0 flex items-center pr-2"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true" data-slot="icon" class="h-5 w-5"><path fill-rule="evenodd" d="M5.22 8.22a.75.75 0 0 1 1.06 0L10 11.94l3.72-3.72a.75.75 0 1 1 1.06 1.06l-4.25 4.25a.75.75 0 0 1-1.06 0L5.22 9.28a.75.75 0 0 1 0-1.06Z" clip-rule="evenodd"></path></svg></span></button></div></div><div><div class="relative"><button class="relative rounded-lg w-full cursor-default py-3 pl-3 pr-10 text-left shadow-sm text-base font-normal text-black/75 dark:text-white/50 bg-light-item dark:bg-dark-item focus:outline-none focus:ring-2 focus:ring-dark-button" id="headlessui-listbox-button-:Rqkdl:" type="button" aria-haspopup="listbox" aria-expanded="false" data-headlessui-state=""><span class="block truncate">USD</span><span class="pointer-events-none absolute inset-y-0 right-0 flex items-center pr-2"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true" data-slot="icon" class="h-5 w-5"><path fill-rule="evenodd" d="M5.22 8.22a.75.75 0 0 1 1.06 0L10 11.94l3.72-3.72a.75.75 0 1 1 1.06 1.06l-4.25 4.25a.75.75 0 0 1-1.06 0L5.22 9.28a.75.75 0 0 1 0-1.06Z" clip-rule="evenodd"></path></svg></span></button></div></div></div></div></div><div class="py-8 grid grid-cols-4 gap-8 border-t border-black/25 dark:border-white/25"><div><a class="text-base text-black/75 dark:text-white/50 hover:text-black dark:hover:text-white transition-all" href="https://truetech.dev/ru/privacy-policy">Политика конфиденциальности</a></div><div><a class="text-base text-black/75 dark:text-white/50 hover:text-black dark:hover:text-white transition-all" href="https://truetech.dev/ru/terms-of-service">Условия использования</a></div><div class="col-span-2"><div class="text-base text-black/75 dark:text-white/50">© <!-- -->2026<!-- --> <!-- -->Настоящие Технологии ООО. Все права защищены.</div></div></div></div></footer></div><div class="fixed lg:hidden w-full bottom-0"><div class="flex gap-12 px-12 justify-center h-[3.25rem] bg-white border-t border-[#E8E8E8] dark:bg-dark-nav dark:border-none"><a class="grow flex items-center justify-center text-white h-full" aria-label="Главная" href="https://truetech.dev/ru"><span class="flex h-8 w-7 text-black dark:text-white opacity-100"><svg x="0px" y="0px" viewBox="0 0 28 32.7" fill="none" xmlns="http://www.w3.org/2000/svg" xml:space="preserve"><path d="M16.8,23v-6c0-0.3-0.1-0.5-0.3-0.7c-0.2-0.2-0.4-0.3-0.7-0.3h-4c-0.3,0-0.5,0.1-0.7,0.3 c-0.2,0.2-0.3,0.4-0.3,0.7v6c0,0.3-0.1,0.5-0.3,0.7c-0.2,0.2-0.4,0.3-0.7,0.3l-6,0c-0.1,0-0.3,0-0.4-0.1c-0.1-0.1-0.2-0.1-0.3-0.2 C3,23.6,3,23.5,2.9,23.3c-0.1-0.1-0.1-0.3-0.1-0.4V11.4c0-0.1,0-0.3,0.1-0.4c0.1-0.1,0.1-0.2,0.2-0.3l10-9.1 c0.2-0.2,0.4-0.3,0.7-0.3c0.2,0,0.5,0.1,0.7,0.3l10,9.1c0.1,0.1,0.2,0.2,0.2,0.3c0.1,0.1,0.1,0.3,0.1,0.4V23c0,0.1,0,0.3-0.1,0.4 c-0.1,0.1-0.1,0.2-0.2,0.3c-0.1,0.1-0.2,0.2-0.3,0.2C24.1,23.9,24,24,23.8,24l-6,0c-0.3,0-0.5-0.1-0.7-0.3 C17,23.5,16.8,23.2,16.8,23L16.8,23z" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path><line class="st1" x1="6.4" y1="32" x2="21.4" y2="32" fill="none" stroke="currentColor" stroke-linecap="round"></line></svg></span></a><a class="grow flex items-center justify-center text-white h-full" aria-label="Все решения" href="https://truetech.dev/ru/apps"><span class="flex h-8 w-7 text-black dark:text-white opacity-50"><svg x="0px" y="0px" viewBox="0 0 28 32.7" fill="none" xmlns="http://www.w3.org/2000/svg" xml:space="preserve"><path d="M11.8,3.1h-8v8h8V3.1z" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path><path d="M23.8,3.1h-8v8h8V3.1z" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path><path d="M11.8,15.1h-8v8h8V15.1z" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path><path d="M23.8,15.1h-8v8h8V15.1z" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path></svg></span></a><a class="grow flex items-center justify-center text-white h-full" aria-label="Услуги" href="https://truetech.dev/ru#servicesList"><span class="flex h-8 w-7 text-black dark:text-white opacity-50"><svg x="0px" y="0px" viewBox="0 0 28 32.7" fill="none" xmlns="http://www.w3.org/2000/svg" xml:space="preserve"><path d="M2.8,13.2h22" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path><path d="M2.8,5.2h22" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path><path d="M2.8,21.2h22" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path></svg></span></a><a class="grow flex items-center justify-center text-white h-full" aria-label="Мой аккаунт" href="https://truetech.dev/ru/area51"><span class="flex h-8 w-7 text-black dark:text-white opacity-50"><svg x="0px" y="0px" viewBox="0 0 28 32.7" fill="none" xmlns="http://www.w3.org/2000/svg" xml:space="preserve"><path d="M13.8,17.2c4.4,0,8-3.6,8-8s-3.6-8-8-8s-8,3.6-8,8S9.4,17.2,13.8,17.2z" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path><path d="M1.7,24.2c1.2-2.1,3-3.9,5.1-5.1c2.1-1.2,4.5-1.9,7-1.9c2.5,0,4.9,0.6,7,1.9c2.1,1.2,3.9,3,5.1,5.1" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path></svg></span></a></div></div></div></div> <div id="dialog"></div> <div id="dialog-alert"></div> <div id="dialog-iframe" class="hidden"></div> </div> </body> </html>