/** * Header — единая шапка экрана: [left slot] [title centered] [right slot]. * * Правила выравнивания: * - left/right принимают натуральную ширину контента (обычно 1-2 * IconButton'а 36px, или pressable-avatar 32px). * - title (ReactNode, принимает как string, так и compound — аватар + * имя вместе) всегда центрирован через flex:1 + alignItems:center. * Абсолютно не позиционируется, т.к. при слишком широком title'е * лучше ужать его, чем наложить на кнопки. * * `title` может быть строкой (тогда рендерится как Text 17px semibold) * либо произвольным node'ом — используется в chat detail для * [avatar][name + typing-subtitle] compound-блока. * * `divider` (default true) — тонкая 1px линия снизу; в tab-страницах * обычно выключена (TabHeader всегда ставит divider=false). */ import React, { ReactNode } from 'react'; import { View, Text } from 'react-native'; export interface HeaderProps { title?: ReactNode; left?: ReactNode; right?: ReactNode; /** Показывать нижнюю тонкую линию-разделитель. По умолчанию true. */ divider?: boolean; } export function Header({ title, left, right, divider = true }: HeaderProps) { return ( {/* Left slot — натуральная ширина, минимум 44 чтобы title визуально центрировался для одно-icon-left + одно-icon-right. */} {left} {/* Title centered */} {typeof title === 'string' ? ( {title} ) : title ?? null} {/* Right slot — row, натуральная ширина, минимум 44. gap=4 чтобы несколько IconButton'ов не слипались в selection-mode. */} {right} ); }