/* ───────────────────────────────────────────────── Tab Bar Variants — TabBarV01..TabBarV20 Each one is a complete replacement for RoseTabBar. Signature: ({ active, onChange }) => JSX The 4 tabs are always: home · classes · online · profile ───────────────────────────────────────────────── */ const TABS = [ { id:"home", label:"йога", short:"йога", letter:"Й", num:"01", glyph:"✿", emoji:"🧘", icon:"lotus" }, { id:"classes", label:"занятия", short:"клас.", letter:"З", num:"02", glyph:"◐", emoji:"📅", icon:"calendar" }, { id:"online", label:"онлайн", short:"online",letter:"О", num:"03", glyph:"▶", emoji:"▶", icon:"play" }, { id:"profile", label:"профиль", short:"я", letter:"Я", num:"04", glyph:"☺", emoji:"😊", icon:"user" }, ]; /* ============ V01 — ORIGINAL (reference) ============ */ function TabBarV01({active,onChange}){ return ; } /* ============ V02 — FLOATING PILL (centered, not full-width) ============ */ function TabBarV02({active,onChange}){ return (
{TABS.map(t=>{ const a = t.id===active; return ( ); })}
); } /* ============ V03 — DOCK (centered, glassy) ============ */ function TabBarV03({active,onChange}){ return (
{TABS.map(t=>{ const a = t.id===active; return ( ); })}
); } /* ============ V04 — SEGMENTED PILL (text-only, centered) ============ */ function TabBarV04({active,onChange}){ return (
{TABS.map(t=>{ const a = t.id===active; return ( ); })}
); } /* ============ V05 — FAB CENTER (4 tabs around big center button) ============ */ function TabBarV05({active,onChange}){ return (
{[TABS[0],TABS[1]].map(t=>{ const a = t.id===active; return (
onChange(t.id)} style={{flex:1,display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",gap:4,cursor:"pointer",color:a?"#e91e8c":"#cba9bd"}}> {t.label}
); })}
{[TABS[2],TABS[3]].map(t=>{ const a = t.id===active; return (
onChange(t.id)} style={{flex:1,display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",gap:4,cursor:"pointer",color:a?"#e91e8c":"#cba9bd"}}> {t.label}
); })}
{/* Big center FAB - acts as "записаться" */}
); } /* ============ V06 — NUMBERS ONLY (brutalist, hot pink) ============ */ function TabBarV06({active,onChange}){ return (
{TABS.map((t,i)=>{ const a = t.id===active; return (
onChange(t.id)} style={{ flex:1,display:"flex",alignItems:"center",justifyContent:"center",gap:8,cursor:"pointer", background:a?"#2d2d2d":"transparent", color:a?"#fff":"rgba(255,255,255,0.85)", borderLeft:i?"1.5px solid rgba(255,255,255,0.3)":"none", }}> {t.num} {t.label.slice(0,4)}
); })}
); } /* ============ V07 — CAPSULE (rounded ends, centered bubble for active) ============ */ function TabBarV07({active,onChange}){ const idx = TABS.findIndex(t=>t.id===active); return (
{/* sliding bubble */}
{TABS.map((t,i)=>{ const a = t.id===active; return (
onChange(t.id)} style={{flex:1,position:"relative",zIndex:1,display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",cursor:"pointer",gap:2}}> {t.label}
); })}
); } /* ============ V08 — STICKER STACK (Y2K, rotated tabs) ============ */ function TabBarV08({active,onChange}){ const colors = ["#fde68a","#a7f3d0","#c4b5fd","#f9a8d4"]; return (
{TABS.map((t,i)=>{ const a = t.id===active; const rot = [-2,1.5,-1.5,2][i]; return ( ); })}
); } /* ============ V09 — DOTS ONLY (minimal zen) ============ */ function TabBarV09({active,onChange}){ return (
{TABS.map(t=>{ const a = t.id===active; return (
onChange(t.id)} style={{cursor:"pointer",display:"flex",flexDirection:"column",alignItems:"center",gap:6}}>
{a &&
{t.label}
}
); })}
); } /* ============ V10 — VERTICAL LABELS (text bottom-stack) ============ */ function TabBarV10({active,onChange}){ return (
{TABS.map((t,i)=>{ const a = t.id===active; return (
onChange(t.id)} style={{ flex:1,display:"flex",alignItems:"center",justifyContent:"center",gap:8,cursor:"pointer", borderLeft:i?"1px solid #fce4ec":"none", background:a?"linear-gradient(180deg, #fff5fa, #fde2ec)":"transparent", position:"relative", }}> {a &&
} {t.label}
); })}
); } /* ============ V11 — TOP BAR (move it to TOP instead of bottom) ============ */ function TabBarV11({active,onChange}){ return (
{TABS.map((t,i)=>{ const a = t.id===active; return (
onChange(t.id)} style={{ flex:1,display:"flex",alignItems:"center",justifyContent:"center",gap:6,cursor:"pointer", color:"#fff", background:a?"rgba(255,255,255,0.2)":"transparent", borderBottom:a?"3px solid #fff":"3px solid transparent", }}> {a && {t.label}}
); })}
); } /* ============ V12 — EMOJI BIG (oversized icons, no labels) ============ */ function TabBarV12({active,onChange}){ const colors = {home:"#f9a8d4",classes:"#a7f3d0",online:"#c4b5fd",profile:"#fde68a"}; return (
{TABS.map(t=>{ const a = t.id===active; return ( ); })}
); } /* ============ V13 — UNDERLINE (editorial, text-led) ============ */ function TabBarV13({active,onChange}){ return (
{TABS.map(t=>{ const a = t.id===active; return (
onChange(t.id)} style={{cursor:"pointer",position:"relative",padding:"6px 0"}}> {t.label} {a &&
}
); })}
); } /* ============ V14 — NEON Y2K (dark bg, glow icons) ============ */ function TabBarV14({active,onChange}){ return (
{TABS.map((t,i)=>{ const a = t.id===active; return (
onChange(t.id)} style={{ flex:1,display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",gap:4,cursor:"pointer", borderLeft:i?"1px dashed rgba(233,30,140,0.3)":"none", position:"relative", }}>
{t.label}
); })}
); } /* ============ V15 — CIRCLE FAB ROW (4 separate circles, floating) ============ */ function TabBarV15({active,onChange}){ return (
{TABS.map(t=>{ const a = t.id===active; return ( ); })}
); } /* ============ V16 — WIDE ACTIVE (active expands, others shrink to icons) ============ */ function TabBarV16({active,onChange}){ return (
{TABS.map(t=>{ const a = t.id===active; return ( ); })}
); } /* ============ V17 — INDICATOR DOT (icons row + colored dot underneath active) ============ */ function TabBarV17({active,onChange}){ const idx = TABS.findIndex(t=>t.id===active); return (
{TABS.map(t=>{ const a = t.id===active; return (
onChange(t.id)} style={{flex:1,display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",gap:4,cursor:"pointer"}}> {t.label}
); })}
); } /* ============ V18 — LETTERS ONLY (russian initials, monospace blocks) ============ */ function TabBarV18({active,onChange}){ return (
{TABS.map(t=>{ const a = t.id===active; return ( ); })}
); } /* ============ V19 — TICKETS (perforated stubs) ============ */ function TabBarV19({active,onChange}){ return (
{TABS.map((t,i)=>{ const a = t.id===active; return (
onChange(t.id)} style={{ flex:1,position:"relative",margin:"0 3px",cursor:"pointer", background:a?"#e91e8c":"#fff", color:a?"#fff":"#9d6b8a", borderRadius:8, display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",gap:2, boxShadow:a?"0 3px 0 rgba(233,30,140,0.3)":"0 2px 0 rgba(233,30,140,0.1)", border:a?"none":"1px dashed #f0c8dc", }}> {/* perforation circles on sides */}
{t.num} {t.label}
); })}
); } /* ============ V20 — DASHBOARD STATS (each tab shows a count) ============ */ function TabBarV20({active,onChange}){ const meta = {home:"5", classes:"3", online:"4", profile:"7"}; return (
{TABS.map((t,i)=>{ const a = t.id===active; return (
onChange(t.id)} style={{ flex:1,position:"relative",cursor:"pointer", display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",gap:2, borderLeft:i?"1px solid #fce4ec":"none", background:a?"#fde2ec":"transparent", }}> {a &&
}
{meta[t.id]}
{t.label}
); })}
); } const TAB_VARIANTS = [ { n:"01", Comp: TabBarV01, name:"исходный", tag:"reference", desc:"оригинал из app: full-width, активная — на горячем розовом, иконки + подпись." }, { n:"02", Comp: TabBarV02, name:"плавающая пилюля",tag:"floating pill",desc:"центрированная капсула, не на всю ширину. неактивные — только иконки, активная разворачивается с подписью." }, { n:"03", Comp: TabBarV03, name:"док", tag:"glass dock", desc:"квадратные кнопки 48×48 с матовым фоном (glass), активная всплывает на 4px и подсвечена розовым." }, { n:"04", Comp: TabBarV04, name:"сегмент", tag:"text only", desc:"чисто типографическая капсула на пастельном фоне — без иконок. активная — белая плашка с розовым текстом." }, { n:"05", Comp: TabBarV05, name:"FAB центр", tag:"action-led", desc:"4 таба разделены на 2+2 вокруг большой круглой кнопки + (call-to-action). иконка действия важнее навигации." }, { n:"06", Comp: TabBarV06, name:"номера", tag:"brutal", desc:"горячий розовый на полную ширину, гигантские номера 01–04 + микроподпись. брутализм, чёрная активная." }, { n:"07", Comp: TabBarV07, name:"капсула со слайдом",tag:"sliding", desc:"белая капсула с тенью; активная плашка плавно перемещается между табами cubic-bezier-spring." }, { n:"08", Comp: TabBarV08, name:"стикеры", tag:"y2k", desc:"4 стикерные кнопки с поворотом ±2°, чёрная обводка 2px, hard shadow 3px. активная увеличивается и поднимается." }, { n:"09", Comp: TabBarV09, name:"точки", tag:"minimal zen", desc:"только 4 точки по центру, активная — больше и розовая. подпись появляется поверх как тонкий caption." }, { n:"10", Comp: TabBarV10, name:"вертикальный акцент",tag:"top stripe",desc:"иконка + подпись в строку, активная — с градиентным фоном и розовой полоской 3px сверху." }, { n:"11", Comp: TabBarV11, name:"верхний бар", tag:"top nav", desc:"навигация переехала наверх, на розовом. активная — с подсветкой и белой подчеркивающей полосой." }, { n:"12", Comp: TabBarV12, name:"круги-аватары", tag:"oversized", desc:"4 больших круга с пастельной заливкой по типу занятия, активная — увеличена и поднята. без подписей." }, { n:"13", Comp: TabBarV13, name:"подчёркивание", tag:"editorial", desc:"редакторский стиль: только текст по центру, активная — italic, крупнее, с розовой чертой снизу." }, { n:"14", Comp: TabBarV14, name:"неон", tag:"y2k acid", desc:"тёмный фон с розовым glow, иконки в кружках с подсветкой. активная — neon-glow с textShadow." }, { n:"15", Comp: TabBarV15, name:"круглые FAB", tag:"circle row", desc:"4 отдельных плавающих круга по центру, активная вырастает с 52 до 64px и получает второе кольцо-обводку." }, { n:"16", Comp: TabBarV16, name:"эластик", tag:"elastic", desc:"flex-расширение: активная занимает в 2.4 раза больше места и показывает подпись, остальные — только иконки." }, { n:"17", Comp: TabBarV17, name:"индикатор-точка", tag:"dot under", desc:"стандартный layout, но активная отмечена не цветом, а скользящей точкой 8px снизу." }, { n:"18", Comp: TabBarV18, name:"буквы", tag:"initials", desc:"4 квадратных кнопки 42×42 с инициалами Й·З·О·Я, активная — розовая с подписью под ней (caption)." }, { n:"19", Comp: TabBarV19, name:"билеты", tag:"tickets", desc:"билетные стабы с перфорацией по бокам и пунктирной верхней границей. номер сверху, название снизу." }, { n:"20", Comp: TabBarV20, name:"счётчики", tag:"with badges", desc:"каждый таб показывает мини-бейдж с количеством (5 классов, 3 курса, 7 платежей) — utility-tab." }, ]; Object.assign(window, { TabBarV01, TabBarV02, TabBarV03, TabBarV04, TabBarV05, TabBarV06, TabBarV07, TabBarV08, TabBarV09, TabBarV10, TabBarV11, TabBarV12, TabBarV13, TabBarV14, TabBarV15, TabBarV16, TabBarV17, TabBarV18, TabBarV19, TabBarV20, TAB_VARIANTS, TABS, });