ReleaseNotes
ReleaseNotes — адаптивный preset для показа новостей платформы. На desktop это модальное окно, на mobile — bottom sheet; поверхность выбирается автоматически по раскладке. Публичная визуальная ось contentState принимает data, noData, error.
Примеры использования
Данные
import { Button } from '@cloud-ru/ds-button';
import { ReleaseNotes } from '@cloud-ru/ds-uikit-product-modal-predefined';
import { useState } from 'react';
import { releaseNotesItems } from './releaseNotesItems';
export function ReleaseNotesData() {
const [open, setOpen] = useState(false);
return (
<>
<Button label='Open release notes' view='filled' appearance='primary' onClick={() => setOpen(true)} />
<ReleaseNotes open={open} onClose={() => setOpen(false)} items={releaseNotesItems} />
</>
);
}Нет данных
import { Button } from '@cloud-ru/ds-button';
import { ReleaseNotes } from '@cloud-ru/ds-uikit-product-modal-predefined';
import { useState } from 'react';
import { releaseNotesItems } from './releaseNotesItems';
export function ReleaseNotesNoData() {
const [open, setOpen] = useState(false);
return (
<>
<Button label='Open no-data release notes' view='filled' appearance='primary' onClick={() => setOpen(true)} />
<ReleaseNotes open={open} onClose={() => setOpen(false)} contentState='noData' items={releaseNotesItems} />
</>
);
}Ошибка загрузки
import { Button } from '@cloud-ru/ds-button';
import { ReleaseNotes } from '@cloud-ru/ds-uikit-product-modal-predefined';
import { useState } from 'react';
import { releaseNotesItems } from './releaseNotesItems';
export function ReleaseNotesError() {
const [open, setOpen] = useState(false);
return (
<>
<Button label='Open error release notes' view='filled' appearance='primary' onClick={() => setOpen(true)} />
<ReleaseNotes
open={open}
onClose={() => setOpen(false)}
contentState='error'
items={releaseNotesItems}
onDataErrorRetryClick={() => undefined}
/>
</>
);
}Видео в новости
import { Button } from '@cloud-ru/ds-button';
import { ReleaseNotes } from '@cloud-ru/ds-uikit-product-modal-predefined';
import { useState } from 'react';
import { releaseNotesItems } from './releaseNotesItems';
export function ReleaseNotesVideo() {
const [open, setOpen] = useState(false);
return (
<>
<Button label='Open video release notes' view='filled' appearance='primary' onClick={() => setOpen(true)} />
<ReleaseNotes
open={open}
onClose={() => setOpen(false)}
items={[
{
...releaseNotesItems[0],
video: 'https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.mp4',
},
]}
/>
</>
);
}Props
Types
ReleaseNotesProps| Prop | Type | Default | Required | Description |
|---|---|---|---|---|
closeOnPopstate | boolean | — | no | Закрытие при навигации по истории |
contentState | "data" | "error" | "noData" | — | no | Визуальное состояние контента по Figma |
data-test-id | string | — | no | |
items | NoteItemProps[] | — | yes | Массив новостей |
loading | boolean | — | no | Состояние загрузки контента |
onClose | () => void | — | yes | Колбэк закрытия |
onDataErrorRetryClick | (() => void) | — | no | Действие перезагрузки на экране ошибки |
onReadLaterClick | (() => void) | — | no | Действие "Ознакомиться позже" |
onSlideChange | ((slide: number) => void) | — | no | Действие при смене слайда |
open | boolean | — | yes | Управление состоянием показан/не показан |
readLaterButtonProps | Partial<ButtonProps> | — | no | Только mobile: дополнительные пропсы action-кнопки "Ознакомиться позже" (на desktop игнорируется). |
Unions
Types
ReleaseNotesProps
NoteItemProps
Unions
ReleaseNotesContentState
Related props
ButtonProps
Адаптивность
ReleaseNotes — адаптивный компонент с переключением поверхности (surface-swap). Раскладку он берёт из AdaptiveProvider (контекст @cloud-ru/ds-adaptive); публичный API единый для обеих платформ:
- desktop (по умолчанию) — модальное окно (
ModalCustomиз@cloud-ru/ds-modal) с каруселью новостей и постраничной навигацией. - mobile — контент рендерится в
BottomSheetиз@cloud-ru/ds-bottom-sheet(панель снизу со свайпом для закрытия).
Верстайте под desktop и поставьте один <AdaptiveProvider> в корне приложения — mobile-поверхность включается автоматически (desktop-first). Пропа layoutType у компонента нет: источник раскладки — только контекст.
Как форсировать платформу
Форс — только контекстом, не пропом:
- Поддерево — вложенный провайдер:
import { AdaptiveProvider } from '@cloud-ru/ds-adaptive' <AdaptiveProvider layoutType='mobile'> <ReleaseNotes open={open} onClose={close} items={items} /> </AdaptiveProvider> - Отдельный компонент —
withLayoutType(module-scope, сахар над провайдером):import { withLayoutType } from '@cloud-ru/ds-adaptive' import { ReleaseNotes } from '@cloud-ru/ds-uikit-product-modal-predefined' const MobileReleaseNotes = withLayoutType(ReleaseNotes, 'mobile')
Платформенные пропы
Таблица синхронизирована с type-level JSDoc у ReleaseNotesProps.
| Пропы | desktop | mobile |
|---|---|---|
readLaterButtonProps | игнорируется | используется |
open, onClose, container, closeOnPopstate, contentState, items, loading, onReadLaterClick, onDataErrorRetryClick, onSlideChange | используется | используется |
Подробнее о модели адаптивности — Adaptive.