diff --git a/medcenterpersonal/src/App.tsx b/medcenterpersonal/src/App.tsx index 81fac7b..267937f 100644 --- a/medcenterpersonal/src/App.tsx +++ b/medcenterpersonal/src/App.tsx @@ -9,6 +9,7 @@ import { ResidencySection } from './components/ResidencySection' import { ScenariosSection } from './components/ScenariosSection' import { SiteFooter } from './components/SiteFooter' import { SiteHeader } from './components/SiteHeader' +import { ThumbBar } from './components/ThumbBar' import { WhyExoSection } from './components/WhyExoSection' export default function App() { @@ -30,6 +31,8 @@ export default function App() { + + ) } diff --git a/medcenterpersonal/src/components/Button.tsx b/medcenterpersonal/src/components/Button.tsx index 509d9d0..e669da1 100644 --- a/medcenterpersonal/src/components/Button.tsx +++ b/medcenterpersonal/src/components/Button.tsx @@ -4,10 +4,20 @@ import { cx } from '../lib/cx' export type ButtonVariant = 'primary' | 'secondary' | 'call' const base = - 'inline-flex cursor-pointer items-center justify-center gap-[10px] rounded-full border border-transparent font-[790] leading-none whitespace-nowrap ' + + 'inline-flex cursor-pointer items-center justify-center gap-[10px] rounded-full border border-transparent font-[790] leading-none ' + 'transition-[transform,box-shadow,background-color,border-color] duration-200 hover:-translate-y-[2px] active:translate-y-0 ' + '[&>svg]:size-[18px] [&>svg]:shrink-0' +/** + * `whitespace-nowrap` belongs on buttons sized by their label, not on every + * button. A full-width button whose label cannot wrap reports a min-content + * width of its whole label — 358px for «Получить предварительный аудит» — and + * that width propagates out through any `auto` grid track around it. That is + * what pushed the whole `#proposal` section 47px off a 375px screen and let + * `overflow-hidden` slice the copy and the form fields off the right edge. + */ +export const nowrap = 'whitespace-nowrap' + /** * Sizing gets its own slot rather than living in `base`. Tailwind resolves * conflicting utilities by their order in the stylesheet, not by the order they @@ -18,7 +28,7 @@ const base = const defaultSize = 'min-h-[52px] px-[22px]' /** `.btn--header` — smaller, and tighter still on the narrowest phones. */ -export const headerSize = 'min-h-[44px] px-[17px] text-[13px] phone:px-[14px] phone:text-[12px]' +export const headerSize = 'min-h-[44px] px-[17px] text-[13px] whitespace-nowrap phone:px-[14px] phone:text-[12px]' const variants: Record = { primary: diff --git a/medcenterpersonal/src/components/EquipmentSection.tsx b/medcenterpersonal/src/components/EquipmentSection.tsx index a91bc13..42f6dc6 100644 --- a/medcenterpersonal/src/components/EquipmentSection.tsx +++ b/medcenterpersonal/src/components/EquipmentSection.tsx @@ -2,7 +2,8 @@ import { devices, equipmentNote } from '../data/content' import { useReveal } from '../hooks/useReveal' import { cx } from '../lib/cx' import { CheckIcon } from './Icons' -import { Container, ScrollHint, Section, SectionHead } from './Layout' +import { Container, Section, SectionHead } from './Layout' +import { Rail } from './Rail' /** * Product shots differ in framing, so the last stylesheet pass in the original @@ -37,10 +38,12 @@ export function EquipmentSection() { lead="Конфигурация подбирается под профиль центра, поток пациентов и задачи врачей. Используем технологическое ядро ЭКЗО без универсального набора и лишнего дублирования." /> -
{devices.map((device) => (
))} -
- - - На мобильном — листайте карточки в сторону - +