@cloud-ru/ds-drawer 1.0.7-preview-2eb4a9ee.0 → 1.0.7-preview-62d98150.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -6
- package/dist/cjs/components/Drawer/styles.module.css +16 -0
- package/dist/cjs/components/Drawer/types.d.ts +3 -7
- package/dist/cjs/components/DrawerCustom/DrawerCustom.d.ts +3 -3
- package/dist/cjs/components/DrawerCustom/DrawerCustom.js +1 -1
- package/dist/cjs/components/DrawerCustom/constants.js +6 -2
- package/dist/cjs/components/DrawerCustom/hooks/useDrawerResize.js +5 -1
- package/dist/cjs/components/DrawerCustom/styles.module.css +123 -117
- package/dist/cjs/constants.d.ts +1 -1
- package/dist/cjs/constants.js +1 -1
- package/dist/cjs/helperComponents/DesktopDrawer/DesktopDrawer.d.ts +1 -1
- package/dist/cjs/helperComponents/DesktopDrawer/DesktopDrawer.js +12 -8
- package/dist/cjs/helperComponents/DialogSlots.d.ts +4 -25
- package/dist/cjs/helperComponents/DialogSlots.js +3 -32
- package/dist/cjs/helperComponents/DrawerBody/DrawerBody.d.ts +1 -1
- package/dist/cjs/helperComponents/DrawerBody/DrawerBody.js +2 -3
- package/dist/cjs/helperComponents/MobileDrawer/MobileDrawer.d.ts +1 -1
- package/dist/cjs/helperComponents/MobileDrawer/MobileDrawer.js +4 -4
- package/dist/cjs/style.css +139 -132
- package/dist/esm/components/Drawer/styles.module.css +16 -0
- package/dist/esm/components/Drawer/types.d.ts +3 -7
- package/dist/esm/components/DrawerCustom/DrawerCustom.d.ts +3 -3
- package/dist/esm/components/DrawerCustom/DrawerCustom.js +1 -1
- package/dist/esm/components/DrawerCustom/constants.js +3 -2
- package/dist/esm/components/DrawerCustom/hooks/useDrawerResize.js +2 -1
- package/dist/esm/components/DrawerCustom/styles.module.css +123 -117
- package/dist/esm/constants.d.ts +1 -1
- package/dist/esm/constants.js +1 -1
- package/dist/esm/helperComponents/DesktopDrawer/DesktopDrawer.d.ts +1 -1
- package/dist/esm/helperComponents/DesktopDrawer/DesktopDrawer.js +12 -8
- package/dist/esm/helperComponents/DialogSlots.d.ts +4 -25
- package/dist/esm/helperComponents/DialogSlots.js +4 -29
- package/dist/esm/helperComponents/DrawerBody/DrawerBody.d.ts +1 -1
- package/dist/esm/helperComponents/DrawerBody/DrawerBody.js +3 -4
- package/dist/esm/helperComponents/MobileDrawer/MobileDrawer.d.ts +1 -1
- package/dist/esm/helperComponents/MobileDrawer/MobileDrawer.js +4 -4
- package/dist/esm/style.css +139 -132
- package/dist/tsconfig.cjs.tsbuildinfo +1 -1
- package/dist/tsconfig.esm.tsbuildinfo +1 -1
- package/package.json +4 -4
- package/src/components/Drawer/styles.module.scss +19 -0
- package/src/components/Drawer/types.ts +3 -7
- package/src/components/DrawerCustom/DrawerCustom.tsx +1 -1
- package/src/components/DrawerCustom/constants.ts +4 -2
- package/src/components/DrawerCustom/hooks/useDrawerResize.tsx +2 -1
- package/src/components/DrawerCustom/styles.module.scss +60 -42
- package/src/constants.ts +1 -1
- package/src/helperComponents/DesktopDrawer/DesktopDrawer.tsx +27 -18
- package/src/helperComponents/DialogSlots.tsx +3 -74
- package/src/helperComponents/DrawerBody/DrawerBody.tsx +2 -5
- package/src/helperComponents/MobileDrawer/MobileDrawer.tsx +2 -5
- package/dist/cjs/helperComponents/styles.module.css +0 -15
- package/dist/esm/helperComponents/styles.module.css +0 -15
- package/src/helperComponents/styles.module.scss +0 -22
package/README.md
CHANGED
|
@@ -248,7 +248,6 @@ export function NestedDrawer() {
|
|
|
248
248
|
| `closeOnPopstate` | `boolean` | — | Закрывать дровер при перемещении по истории браузера |
|
|
249
249
|
| `container` | `string \| HTMLElement` | — | Контейнер в котором будет рендерится Drawer. По-умолчанию - body |
|
|
250
250
|
| `content` | `ReactNode` | — | Содержимое body (альтернатива `children`). |
|
|
251
|
-
| `contentRef` | `Ref<HTMLElement>` | — | Ссылка на скроллируемый контейнер контента (например, для дозагрузки по скроллу). |
|
|
252
251
|
| `data-test-id` | `string` | — | |
|
|
253
252
|
| `disableMotions` | `boolean` | `false` | Отключить анимации |
|
|
254
253
|
| `footer` | `(ReactElement<any, string \| JSXElementConstructor<any>> & (string \| number \| boolean \| ReactElement<any, string \| JSXElementConstructor<any>> \| Iterable<...> \| ReactPortal \| null))` | — | Футер <br/> Произвольный футер. Приоритетнее `approveButton` / `cancelButton` / `additionalButton`. |
|
|
@@ -266,14 +265,12 @@ export function NestedDrawer() {
|
|
|
266
265
|
| `showBlackout` | `boolean` | `true` | Отображение темной подложки |
|
|
267
266
|
| `showButtonClosed` | `boolean` | `true` | Отображение кнопки закрытия в шапке дровера |
|
|
268
267
|
| `slotAfterTitle` | `ReactNode` | — | Slot справа от title (например, `QuestionTooltip` из `@cloud-ru/ds-tooltip`). |
|
|
269
|
-
| `slotSecondTitle` | `ReactNode` | — | Slot под подзаголовком — типично `SearchBar`, `SegmentControl` или `Filter`. <br/> Рендерится на обеих поверхностях: `secondWrapper` в мастере `bottomSheet`, <br/> `subHeadlineWrapper` в мастере `window` (modal / drawer). |
|
|
270
268
|
| `snapIndex` | `number` | — | Controlled-индекс активного snap'а. Если задан, sheet всегда находится на этом snap'е; <br/> swipe-up/down вызывают `onSnapIndexChange`, но не меняют позицию сами — consumer должен <br/> передать новое значение. |
|
|
271
269
|
| `snapPoints` | `SnapPoint` | — | Массив фиксированных позиций sheet'а от меньшей к большей. По дефолту `undefined` — <br/> sheet `height: auto` с одним snap'ом по высоте контента. <br/> Пример: `[0.5, 1]` — sheet открывается на половину экрана, drag вверх раскрывает <br/> до full-viewport; drag вниз ниже `0.5` ведёт к закрытию. <br/> Контракт массива (движок не сортирует и не дедуплицирует — порядок и различимость на <br/> стороне потребителя): <br/> - строго по возрастанию: индекс `0` — самая компактная позиция, последний — top / expanded; <br/> - значения должны резолвиться в различные высоты (`['50%', 0.5]` на типичном вьюпорте дадут <br/> одну высоту → дубль-индекс будет недостижим свайпом); <br/> - `'fit-content'` имеет смысл только как ЕДИНСТВЕННЫЙ snap (без `snapPoints`); внутри массива <br/> фиксированных позиций его «контентная» высота не определена. |
|
|
272
270
|
| `subtitle` | `ReactNode` | — | Текстовая строка-подзаголовок под title. |
|
|
273
271
|
| `swipeEnabled` | `boolean` | `true` | Включает swipe-down для закрытия / swipe-up для раскрытия на следующий snap-point. <br/> При `swipeEnabled=false` snap-point по-прежнему можно переключить через controlled `snapIndex` prop'ом. |
|
|
274
272
|
| `title` | `ReactNode` | — | Заголовок. Типографика зависит от поверхности: `title-l` на sheet, `headline-s` на window (modal/drawer). |
|
|
275
273
|
| `width` | `Width` | `'s'` | Ширина (только при position: "left" \| "right") |
|
|
276
|
-
| `withDividers` | `boolean` | `false` | Только mobile: разделители между шапкой/контентом/футером sheet'а. |
|
|
277
274
|
|
|
278
275
|
##### Related types
|
|
279
276
|
|
|
@@ -289,7 +286,6 @@ export function NestedDrawer() {
|
|
|
289
286
|
| `closeOnPopstate` | `boolean \| undefined` | — | Закрывать дровер при перемещении по истории браузера |
|
|
290
287
|
| `container` | `string \| HTMLElement \| undefined` | — | Контейнер в котором будет рендерится Drawer. По-умолчанию - body |
|
|
291
288
|
| `content` | `string \| number \| boolean \| ReactElement<any, string \| JSXElementConstructor<any>> \| Iterable<ReactNode> \| ReactPortal \| null \| undefined` | — | Содержимое body (альтернатива `children`). |
|
|
292
|
-
| `contentRef` | `Ref<HTMLElement> \| undefined` | — | Ссылка на скроллируемый контейнер контента (например, для дозагрузки по скроллу). |
|
|
293
289
|
| `data-test-id` | `string \| undefined` | — | |
|
|
294
290
|
| `disableMotions` | `boolean \| undefined` | — | Отключить анимации |
|
|
295
291
|
| `footer` | `(ReactElement<any, string \| JSXElementConstructor<any>> & (string \| number \| boolean \| ReactElement<any, string \| JSXElementConstructor<any>> \| Iterable<ReactNode> \| ReactPortal \| null)) \| undefined` | — | Футер <br/> Произвольный футер. Приоритетнее `approveButton` / `cancelButton` / `additionalButton`. |
|
|
@@ -307,14 +303,12 @@ export function NestedDrawer() {
|
|
|
307
303
|
| `showBlackout` | `boolean \| undefined` | — | Отображение темной подложки |
|
|
308
304
|
| `showButtonClosed` | `boolean \| undefined` | — | Отображение кнопки закрытия в шапке дровера |
|
|
309
305
|
| `slotAfterTitle` | `string \| number \| boolean \| ReactElement<any, string \| JSXElementConstructor<any>> \| Iterable<ReactNode> \| ReactPortal \| null \| undefined` | — | Slot справа от title (например, `QuestionTooltip` из `@cloud-ru/ds-tooltip`). |
|
|
310
|
-
| `slotSecondTitle` | `string \| number \| boolean \| ReactElement<any, string \| JSXElementConstructor<any>> \| Iterable<ReactNode> \| ReactPortal \| null \| undefined` | — | Slot под подзаголовком — типично `SearchBar`, `SegmentControl` или `Filter`. <br/> Рендерится на обеих поверхностях: `secondWrapper` в мастере `bottomSheet`, <br/> `subHeadlineWrapper` в мастере `window` (modal / drawer). |
|
|
311
306
|
| `snapIndex` | `number \| undefined` | — | Controlled-индекс активного snap'а. Если задан, sheet всегда находится на этом snap'е; <br/> swipe-up/down вызывают `onSnapIndexChange`, но не меняют позицию сами — consumer должен <br/> передать новое значение. |
|
|
312
307
|
| `snapPoints` | `SnapPoint` | — | Массив фиксированных позиций sheet'а от меньшей к большей. По дефолту `undefined` — <br/> sheet `height: auto` с одним snap'ом по высоте контента. <br/> Пример: `[0.5, 1]` — sheet открывается на половину экрана, drag вверх раскрывает <br/> до full-viewport; drag вниз ниже `0.5` ведёт к закрытию. <br/> Контракт массива (движок не сортирует и не дедуплицирует — порядок и различимость на <br/> стороне потребителя): <br/> - строго по возрастанию: индекс `0` — самая компактная позиция, последний — top / expanded; <br/> - значения должны резолвиться в различные высоты (`['50%', 0.5]` на типичном вьюпорте дадут <br/> одну высоту → дубль-индекс будет недостижим свайпом); <br/> - `'fit-content'` имеет смысл только как ЕДИНСТВЕННЫЙ snap (без `snapPoints`); внутри массива <br/> фиксированных позиций его «контентная» высота не определена. |
|
|
313
308
|
| `subtitle` | `string \| number \| boolean \| ReactElement<any, string \| JSXElementConstructor<any>> \| Iterable<ReactNode> \| ReactPortal \| null \| undefined` | — | Текстовая строка-подзаголовок под title. |
|
|
314
309
|
| `swipeEnabled` | `boolean \| undefined` | — | Включает swipe-down для закрытия / swipe-up для раскрытия на следующий snap-point. <br/> При `swipeEnabled=false` snap-point по-прежнему можно переключить через controlled `snapIndex` prop'ом. |
|
|
315
310
|
| `title` | `string \| number \| boolean \| ReactElement<any, string \| JSXElementConstructor<any>> \| Iterable<ReactNode> \| ReactPortal \| null \| undefined` | — | Заголовок. Типографика зависит от поверхности: `title-l` на sheet, `headline-s` на window (modal/drawer). |
|
|
316
311
|
| `width` | `Width` | — | Ширина (только при position: "left" \| "right") |
|
|
317
|
-
| `withDividers` | `boolean \| undefined` | — | Только mobile: разделители между шапкой/контентом/футером sheet'а. |
|
|
318
312
|
|
|
319
313
|
- `Position` = `"bottom"` \| `"left"` \| `"right"` \| `"top"`
|
|
320
314
|
|
|
@@ -1,3 +1,19 @@
|
|
|
1
1
|
.drawer{
|
|
2
2
|
box-sizing:border-box;
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
.safeAreaTop{
|
|
6
|
+
display:flex;
|
|
7
|
+
flex-direction:column;
|
|
8
|
+
align-items:flex-start;
|
|
9
|
+
align-self:stretch;
|
|
10
|
+
padding-top:var(--sn-drawer-anatomy-container-safeArea-paddingTop, var(--sn-density-spacing-interval-l, var(--sn-primitive-dimension-24, 24px)));
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
.safeAreaBottom{
|
|
14
|
+
display:flex;
|
|
15
|
+
flex-direction:column;
|
|
16
|
+
align-items:flex-start;
|
|
17
|
+
align-self:stretch;
|
|
18
|
+
padding-bottom:var(--sn-drawer-anatomy-container-safeArea-paddingBottom, var(--sn-density-spacing-interval-s, var(--sn-primitive-dimension-8, 8px)));
|
|
3
19
|
}
|
|
@@ -1,20 +1,16 @@
|
|
|
1
1
|
import { BottomSheetActionButton, BottomSheetProps, FooterActionsOrientation } from '@cloud-ru/ds-bottom-sheet';
|
|
2
2
|
import { WithSupportProps } from '@cloud-ru/ds-utils';
|
|
3
|
-
import { ReactElement, ReactNode
|
|
3
|
+
import { ReactElement, ReactNode } from 'react';
|
|
4
4
|
import { DialogBodyProps, DialogHeaderProps } from '../../helperComponents';
|
|
5
5
|
import { DrawerCustomProps } from '../DrawerCustom';
|
|
6
6
|
/**
|
|
7
7
|
* Адаптивный Drawer: desktop — боковая/верхняя/нижняя панель, `mobile` — `BottomSheet`.
|
|
8
8
|
*
|
|
9
9
|
* Только desktop: `position`, `width`, `heightAuto`, `nestedDrawer` (на mobile игнорируются).
|
|
10
|
-
* Только mobile: `swipeEnabled`, `snapPoints`, `snapIndex`, `onSnapIndexChange`, `safeArea
|
|
10
|
+
* Только mobile: `swipeEnabled`, `snapPoints`, `snapIndex`, `onSnapIndexChange`, `safeArea`
|
|
11
11
|
* (на desktop-панели игнорируются — это анатомия `BottomSheet`).
|
|
12
12
|
*/
|
|
13
|
-
export type DrawerProps = WithSupportProps<Omit<DrawerCustomProps, 'nestedDrawer' | 'push' | 'resizable'> & Pick<BottomSheetProps, 'swipeEnabled' | 'snapPoints' | 'snapIndex' | 'onSnapIndexChange' | 'safeArea'> & Pick<DialogHeaderProps, 'title' | 'slotAfterTitle' | '
|
|
14
|
-
/** Ссылка на скроллируемый контейнер контента (например, для дозагрузки по скроллу). */
|
|
15
|
-
contentRef?: Ref<HTMLElement>;
|
|
16
|
-
/** Только mobile: разделители между шапкой/контентом/футером sheet'а. @default false */
|
|
17
|
-
withDividers?: boolean;
|
|
13
|
+
export type DrawerProps = WithSupportProps<Omit<DrawerCustomProps, 'nestedDrawer' | 'push' | 'resizable'> & Pick<BottomSheetProps, 'swipeEnabled' | 'snapPoints' | 'snapIndex' | 'onSnapIndexChange' | 'safeArea'> & Pick<DialogHeaderProps, 'title' | 'slotAfterTitle' | 'onBackButtonClick'> & Pick<DialogBodyProps, 'content'> & {
|
|
18
14
|
/** Текстовая строка-подзаголовок под title. */
|
|
19
15
|
subtitle?: ReactNode;
|
|
20
16
|
/** CSS-класс */
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { DialogBody, DialogBodyProps,
|
|
1
|
+
import { DialogBody, DialogBodyProps, DialogFooterProps, DialogHeaderProps } from '../../helperComponents';
|
|
2
2
|
import { DrawerCustomProps } from './types';
|
|
3
3
|
/**
|
|
4
4
|
* Адаптивный low-level `DrawerCustom`: на `mobile` — `BottomSheetCustom`, иначе — `DrawerFrame`.
|
|
@@ -9,7 +9,7 @@ export declare namespace DrawerCustom {
|
|
|
9
9
|
type HeaderProps = DialogHeaderProps;
|
|
10
10
|
type BodyProps = DialogBodyProps;
|
|
11
11
|
type FooterProps = DialogFooterProps;
|
|
12
|
-
const Header: typeof
|
|
12
|
+
const Header: typeof import("@cloud-ru/ds-bottom-sheet").SheetHeader;
|
|
13
13
|
const Body: typeof DialogBody;
|
|
14
|
-
const Footer: typeof
|
|
14
|
+
const Footer: typeof import("@cloud-ru/ds-bottom-sheet").SheetFooter;
|
|
15
15
|
}
|
|
@@ -59,7 +59,7 @@ function DrawerFrame(props) {
|
|
|
59
59
|
const resolvedContainer = container ?? (portalContextRef.current ? () => portalContextRef.current : undefined);
|
|
60
60
|
return ((0, jsx_runtime_1.jsx)(RcDrawer, { resizable: drawerResizable, panelRef: checkElement, mask: showBlackout, maskClosable: showBlackout, keyboard: showBlackout, "data-showblackout": showBlackout, open: open, onClose: onClose, push: push, getContainer: resolvedContainer, placement: position, destroyOnHidden: true, rootClassName: (0, classnames_1.default)(styles_module_scss_1.default.drawerRoot, rootClassName), style: drawerPanelStyle, classNames: {
|
|
61
61
|
section: (0, classnames_1.default)(styles_module_scss_1.default.drawer, className),
|
|
62
|
-
}, size: isPredefinedWidth ? 'null' : width, ...(0, utils_1.extractSupportProps)(rest), "data-content-wrapper": true, "data-position": position, "data-width": isPredefinedWidth ? width : undefined, "data-height-auto": heightAutoVertical ? true : undefined, "data-acrylic-appearance": 'neutral', "data-acrylic-level": '1Level', prefixCls:
|
|
62
|
+
}, size: isPredefinedWidth ? 'null' : width, ...(0, utils_1.extractSupportProps)(rest), "data-content-wrapper": true, "data-position": position, "data-width": isPredefinedWidth ? width : undefined, "data-height-auto": heightAutoVertical ? true : undefined, "data-acrylic-appearance": 'neutral', "data-acrylic-level": '1Level', prefixCls: styles_module_scss_1.default.prefixCls, ...(disableMotions ? {} : constants_2.motionProps), children: (0, jsx_runtime_1.jsxs)(react_remove_scroll_1.RemoveScroll, { enabled: showBlackout || outerScrollLock, removeScrollBar: false, ref: focusTrapRef, className: styles_module_scss_1.default.scrollLock, children: [showButtonClosed && ((0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_1.default.showButtonClosedWrapper, children: (0, jsx_runtime_1.jsx)(popup_private_1.PopupCloseButton, { className: styles_module_scss_1.default.showButtonClosed, "aria-label": 'close drawer', "data-test-id": constants_1.TEST_IDS.closeButton, onClick: onClose }) })), (0, jsx_runtime_1.jsx)(bottom_sheet_1.OverlaySurfaceProvider, { surface: bottom_sheet_1.OVERLAY_SURFACE.Drawer, bodyHeightAuto: heightAutoVertical, children: children }), tooltip, nestedDrawer] }) }));
|
|
63
63
|
}
|
|
64
64
|
/**
|
|
65
65
|
* Адаптивный low-level `DrawerCustom`: на `mobile` — `BottomSheetCustom`, иначе — `DrawerFrame`.
|
|
@@ -1,14 +1,18 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
6
|
exports.motionProps = exports.motion = exports.maskMotion = void 0;
|
|
7
|
+
const styles_module_scss_1 = __importDefault(require('./styles.module.css'));
|
|
4
8
|
exports.maskMotion = {
|
|
5
9
|
motionAppear: true,
|
|
6
|
-
motionName:
|
|
10
|
+
motionName: styles_module_scss_1.default.maskMotionName,
|
|
7
11
|
};
|
|
8
12
|
const motion = placement => ({
|
|
9
13
|
motionAppear: true,
|
|
10
14
|
motionDeadline: 300,
|
|
11
|
-
motionName:
|
|
15
|
+
motionName: `${styles_module_scss_1.default.panelMotionName}-${placement}`,
|
|
12
16
|
});
|
|
13
17
|
exports.motion = motion;
|
|
14
18
|
exports.motionProps = {
|
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
6
|
exports.useDrawerResize = useDrawerResize;
|
|
4
7
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
8
|
const tooltip_1 = require("@cloud-ru/ds-tooltip");
|
|
6
9
|
const utils_1 = require("@cloud-ru/ds-utils");
|
|
7
10
|
const react_1 = require("react");
|
|
8
|
-
const
|
|
11
|
+
const styles_module_scss_1 = __importDefault(require('../styles.module.css'));
|
|
12
|
+
const DRAGGER_SELECTOR = `.${styles_module_scss_1.default.prefixCls}-resizable-dragger`;
|
|
9
13
|
function useDrawerResize({ position, resizable: resizableProp }) {
|
|
10
14
|
const targetRef = (0, react_1.useRef)(null);
|
|
11
15
|
const targetRefCallbackRef = (0, react_1.useRef)();
|