Адаптивная верстка

Мы разделяем все устройства на 6 групп:
КатегорияМин.размер экрана (px)
MOBILE_SMALL0
MOBILE_LARGE360
TABLET_SMALL480
TABLET_LARGE768
DESKTOP_SMALL992
DESKTOP_LARGE1200
Получить данные значения для динамической обработки можно следующим образом:
typescript
import { BREAKPOINTS } from '@open-condo/ui/hooks' console.log(BREAKPOINTS.TABLET_LARGE) // 768
Однако в большинстве случаев обрабатывать значения вручную вам не придется, потому что для создания адаптивных страниц и компонентов Condo UI предоставляет разработчикам 2 React-хука: useContainerSize и useBreakpoints.

useContainerSize

Данный хук наблюдает за вашим контейнером с помощью React-ref и возвращает размеры этого контейнера, позволяя вам адаптировать его содержимое в зависимости от этих размеров:
typescript
import React from 'react' import { useContainerSize } from '@open-condo/ui/hooks' const MIN_COL_WIDTH = 250 const CardGrid: React.FC = () => { const [{ width, height }, setRef] = useContainerSize() const cardsPerRow = Math.max(1, Math.floor(width / MIN_COL_WIDTH)) return ( <div className='my-container' ref={setRef}> {/* ... */} </div> ) }
Основное применение данного хука - динамическое определение колонок в сетке, а также определение наполнения и позиционирование дочерних суб-компонентов внутри родительского контейнера, однако он может быть использован для произвольных целей, в том числе и в комбинации со значениями представленными выше.

useBreakpoints

Хук useBreakpoints возвращает объект со всеми активными брейкпоинтами. Так например выглядит данные при ширине окна в 900px:
typescript
import { useBreakpoints } from '@open-condo/ui/hooks' const breakpoints = useBreakpoints() console.log(breakpoints.MOBILE_SMALL) // true, 900px >= 0px console.log(breakpoints.TABLET_LARGE) // true, 900px >= 768px console.log(breakpoints.DESKTOP_SMALL) // false, 900px < 992px
Таким образом, чтобы поменять расположение на всех планшетах, нужно сделать следующее условие:
typescript
import { useBreakpoints } from '@open-condo/ui/hooks' const breakpoints = useBreakpoints() if (breakpoints.TABLET_SMALL && !breakpoints.DESKTOP_SMALL) { // at least small tablet, but not small desktop yet }