Skip to content

Стилизация

Приложение использует NativeWind v4 — Tailwind CSS для React Native.

Настройка

global.css

Подключает Tailwind директивы и определяет CSS-переменные цветов:

css
@tailwind base;
@tailwind components;
@tailwind utilities;

tailwind.config.js

Расширяет стандартные цвета через CSS-переменные:

javascript
module.exports = {
  content: ['./app/**/*.{ts,tsx}', './src/**/*.{ts,tsx}'],
  theme: {
    extend: {
      colors: {
        primary: 'rgb(var(--color-primary) / <alpha-value>)',
        background: 'rgb(var(--color-background) / <alpha-value>)',
        // ...
      },
    },
  },
};

Цветовая система

Единый источник правды: src/core/theme/colors.ts.

Основные цвета

ТокенЗначениеИспользование
Primary#0077F0CTA, акценты, основные действия
Primary Hover#0060C2Нажатие на primary
Success#6AB53AЗавершено, AI включен
Warning#D86D3FОжидание, AI выключен
Error#E53E3EОшибки, деструктивные действия

Цвета мессенджеров

МессенджерЦвет
Telegram#0088CC
Instagram#E4405F
WhatsApp#25D366

Шрифт

Inter (400, 500, 600, 700) — загружается через @expo-google-fonts/inter.

Темы (Light / Dark)

ThemeProvider из src/core/theme/provider.tsx управляет переключением тем. Настройка персистится в AsyncStorage через Zustand store.

Использование

tsx
// Light/dark варианты через NativeWind
<View className="bg-white dark:bg-gray-900">
  <Text className="text-gray-900 dark:text-white">
    Контент
  </Text>
</View>

CVA (Class Variance Authority)

Для компонентов с вариантами используется class-variance-authority:

typescript
import { cva } from 'class-variance-authority';

const buttonVariants = cva('rounded-lg items-center justify-center', {
  variants: {
    variant: {
      primary: 'bg-primary',
      secondary: 'bg-gray-200 dark:bg-gray-700',
      destructive: 'bg-error',
    },
    size: {
      sm: 'h-8 px-3',
      md: 'h-10 px-4',
      lg: 'h-12 px-6',
    },
  },
  defaultVariants: {
    variant: 'primary',
    size: 'md',
  },
});

Утилиты стилей

  • clsx — условное объединение классов
  • tailwind-merge — умное объединение Tailwind-классов (разрешение конфликтов)
typescript
import { clsx } from 'clsx';
import { twMerge } from 'tailwind-merge';

function cn(...inputs) {
  return twMerge(clsx(inputs));
}

Тени

ВариантElevationOpacity
Card2px6%
Elevated4px12%
Floating8px15%

Градиенты

Предопределённые градиенты используются через expo-linear-gradient:

НазваниеИспользование
blueОсновные кнопки
blueHorizontalГоризонтальный акцент
authDiagonalФон авторизации
greenУспешные действия
heroHero-секции

Glassmorphism

Таб-бар использует glassmorphism эффект через expo-blur:

tsx
<BlurView intensity={80} tint="light" className="absolute inset-0" />

Haptic-паттерны

ДействиеТип
Отправка сообщенияLight impact
Получение сообщенияLight impact
Добавление реакцииSuccess notification
Long pressMedium impact
Swipe to replySelection tick
Удаление сообщенияWarning notification