@sima-land/ui-nucleons 44.1.0 → 44.2.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/carousel/index.js CHANGED
@@ -101,7 +101,7 @@ class Carousel extends react_1.Component {
101
101
  static defaultRenderControl({ canUse, onUse, type, vertical }, props = { size: 's' }) {
102
102
  const forward = vertical ? 'down' : 'right';
103
103
  const backward = vertical ? 'up' : 'left';
104
- return (react_1.default.createElement(arrow_button_1.ArrowButton, Object.assign({}, props, { className: cx('control', vertical && 'vertical', type), direction: type === 'forward' ? forward : backward, onClick: onUse, disabled: !canUse })));
104
+ return (react_1.default.createElement(arrow_button_1.ArrowButton, Object.assign({}, props, { className: cx('control', vertical && 'vertical', type, props.className), direction: type === 'forward' ? forward : backward, onClick: onUse, disabled: !canUse })));
105
105
  }
106
106
  /**
107
107
  * Возвращает функцию для поиска наиболее отдаленного элемента карусели от стартовой границы viewport'а.
@@ -12,6 +12,12 @@ export interface CleanGroupProps {
12
12
  /** Содержимое. */
13
13
  children?: React.ReactNode;
14
14
  }
15
+ /**
16
+ * Компонент группы прозрачных кнопок.
17
+ * @param props Свойства.
18
+ * @return Элемент.
19
+ */
20
+ export declare const CleanGroup: React.FC<CleanGroupProps>;
15
21
  export declare const Clean: {
16
22
  Group: React.FC<CleanGroupProps>;
17
23
  Button: ({ size, href, asLink, ...restProps }: CleanButtonProps) => JSX.Element;
@@ -37,7 +37,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
37
37
  return (mod && mod.__esModule) ? mod : { "default": mod };
38
38
  };
39
39
  Object.defineProperty(exports, "__esModule", { value: true });
40
- exports.Clean = void 0;
40
+ exports.Clean = exports.CleanGroup = void 0;
41
41
  const react_1 = __importStar(require("react"));
42
42
  const bind_1 = __importDefault(require("classnames/bind"));
43
43
  const link_1 = require("../link");
@@ -55,6 +55,7 @@ const CleanGroup = ({ size: sizeFromProps, children }) => {
55
55
  const size = sizeFromProps || sizeFromContext;
56
56
  return (react_1.default.createElement("div", { className: cx('group') }, react_1.Children.toArray(children).map(item => (0, react_1.isValidElement)(item) && item.type === CleanButton ? (0, react_1.cloneElement)(item, { size }) : null)));
57
57
  };
58
+ exports.CleanGroup = CleanGroup;
58
59
  /**
59
60
  * Компонент прозрачной кнопки.
60
61
  * @param props Свойства.
@@ -65,6 +66,6 @@ const CleanButton = (_a) => {
65
66
  return (react_1.default.createElement(link_1.Link, Object.assign({ pseudo: !asLink, className: cx('button', `size-${size}`), href: href }, restProps)));
66
67
  };
67
68
  exports.Clean = {
68
- Group: CleanGroup,
69
+ Group: exports.CleanGroup,
69
70
  Button: CleanButton,
70
71
  };
@@ -1,16 +1,27 @@
1
1
  import React, { ReactNode, MouseEventHandler, CSSProperties } from 'react';
2
2
  export interface ExpandableGroupProps {
3
+ /** Расстояние между элементами группы в пикселях. */
3
4
  gap?: number;
5
+ /** Высота каждого элемента группы в пикселях. */
4
6
  itemHeight?: number;
7
+ /** Развернут ли список по умолчанию. */
5
8
  defaultExpanded?: boolean;
9
+ /** Количество строк в свернутом состоянии группы. */
6
10
  lineLimit?: number;
11
+ /** Содержимое. */
7
12
  children?: ReactNode;
13
+ /** Функция, возвращающая содержимое кнопки разворачивания списка. */
8
14
  opener?: (data: {
9
15
  hiddenCount: number;
10
16
  }) => ReactNode;
17
+ /** Сработает при разворачивании списка. */
11
18
  onExpand?: () => void;
19
+ /** CSS-класс корневого элемента. */
12
20
  className?: string;
21
+ /** Стили корневого элемента. */
13
22
  style?: CSSProperties;
23
+ /** Нужно ли выводить список развернутым. */
24
+ expanded?: boolean;
14
25
  }
15
26
  export interface GroupItemProps {
16
27
  children?: ReactNode;
@@ -22,9 +33,8 @@ export interface GroupItemProps {
22
33
  * @param props Свойства.
23
34
  * @return Элемент.
24
35
  */
25
- declare function ExpandableGroup({ gap, itemHeight, lineLimit, defaultExpanded, children, onExpand, opener, className, style, }: ExpandableGroupProps): JSX.Element;
36
+ export declare function ExpandableGroup({ gap, itemHeight, lineLimit, defaultExpanded, children, onExpand, opener, className, style, expanded: expandedProp, }: ExpandableGroupProps): JSX.Element;
26
37
  export declare const Expandable: {
27
38
  readonly Group: typeof ExpandableGroup;
28
39
  readonly Item: React.ForwardRefExoticComponent<GroupItemProps & React.RefAttributes<HTMLDivElement>>;
29
40
  };
30
- export {};
@@ -26,7 +26,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
26
26
  return (mod && mod.__esModule) ? mod : { "default": mod };
27
27
  };
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
- exports.Expandable = void 0;
29
+ exports.Expandable = exports.ExpandableGroup = void 0;
30
30
  const react_1 = __importStar(require("react"));
31
31
  const utils_1 = require("./utils");
32
32
  const bind_1 = __importDefault(require("classnames/bind"));
@@ -41,29 +41,33 @@ const ItemContext = (0, react_1.createContext)({});
41
41
  */
42
42
  function ExpandableGroup({ gap = 8, itemHeight = 32, lineLimit = 2, defaultExpanded = false, children, onExpand, opener = data => react_1.default.createElement(react_1.default.Fragment, null,
43
43
  "\u0415\u0449\u0451 ",
44
- data.hiddenCount), className, style, }) {
44
+ data.hiddenCount), className, style, expanded: expandedProp, }) {
45
45
  const containerRef = (0, react_1.useRef)(null);
46
46
  const openerRef = (0, react_1.useRef)(null);
47
47
  const [expanded, setExpanded] = (0, react_1.useState)(defaultExpanded);
48
48
  const viewState = (0, utils_1.useViewState)(containerRef, openerRef);
49
+ const needHideItems = viewState.lastVisibleIndex !== -1 && !expanded;
49
50
  const items = react_1.Children.toArray(children).reduce((result, child, index) => {
50
- const needHideItems = viewState.lastVisibleIndex !== -1 && !expanded;
51
51
  const isDisplayed = !needHideItems || index < viewState.lastVisibleIndex;
52
- (0, react_1.isValidElement)(child) &&
53
- child.type === ExpandableItem &&
52
+ if ((0, react_1.isValidElement)(child) && child.type === ExpandableItem) {
54
53
  result.push(react_1.default.createElement(ItemContext.Provider, { key: index, value: { hidden: !isDisplayed } }, (0, react_1.cloneElement)(child, { hidden: !isDisplayed })));
54
+ }
55
55
  return result;
56
56
  }, []);
57
+ (0, react_1.useEffect)(() => {
58
+ expandedProp !== undefined && setExpanded(expandedProp);
59
+ }, [expandedProp]);
57
60
  return (react_1.default.createElement(GroupContext.Provider, { value: { gap, itemHeight } },
58
61
  react_1.default.createElement("div", { ref: containerRef, className: cx('root', className), style: Object.assign(Object.assign({}, style), { maxHeight: expanded ? undefined : `${itemHeight * lineLimit + gap * (lineLimit - 1)}px` }) },
59
- react_1.default.createElement("div", { className: expandable_group_module_scss_1.default.inner, style: { marginRight: `${-gap}px` } },
62
+ react_1.default.createElement("div", { className: expandable_group_module_scss_1.default.inner, style: { marginRight: `${-gap}px`, marginBottom: `${-gap}px` } },
60
63
  items,
61
- !expanded && (react_1.default.createElement(ItemContext.Provider, { value: { invisible: viewState.lastVisibleIndex === -1 } },
64
+ !expanded && (react_1.default.createElement(ItemContext.Provider, { value: { invisible: false } },
62
65
  react_1.default.createElement(ExpandableItem, { ref: openerRef, onClick: () => {
63
66
  setExpanded(true);
64
67
  onExpand === null || onExpand === void 0 ? void 0 : onExpand();
65
68
  }, "data-testid": 'expandable:opener' }, opener({ hiddenCount: items.length - viewState.lastVisibleIndex }))))))));
66
69
  }
70
+ exports.ExpandableGroup = ExpandableGroup;
67
71
  const ExpandableItem = (0, react_1.forwardRef)(({ children, onClick, 'data-testid': testId = 'expandable:item' }, ref) => {
68
72
  const { gap, itemHeight } = (0, react_1.useContext)(GroupContext);
69
73
  const { invisible, hidden } = (0, react_1.useContext)(ItemContext);
@@ -18,6 +18,7 @@ exports.initialViewState = {
18
18
  * @return Состояние.
19
19
  */
20
20
  function useViewState(containerRef, openerRef) {
21
+ const prevPhaseRef = (0, react_1.useRef)(null);
21
22
  const [viewState, setViewState] = (0, react_1.useState)(exports.initialViewState);
22
23
  (0, react_1.useEffect)(() => {
23
24
  const off = (0, on_1.default)(window, 'resize', () => {
@@ -29,7 +30,15 @@ function useViewState(containerRef, openerRef) {
29
30
  if (viewState.phase === 'default') {
30
31
  setViewState(defineViewState(containerRef, openerRef));
31
32
  }
32
- }, [viewState.phase, containerRef, openerRef]);
33
+ // если произошел рендер и на предыдущем рендере уже все было готово - сбрасываем состояние
34
+ if (viewState.phase === 'ready' && prevPhaseRef.current === 'ready') {
35
+ setViewState({
36
+ phase: 'default',
37
+ lastVisibleIndex: -1,
38
+ });
39
+ }
40
+ prevPhaseRef.current = viewState.phase;
41
+ });
33
42
  return viewState;
34
43
  }
35
44
  exports.useViewState = useViewState;
package/modal/index.js CHANGED
@@ -35,17 +35,17 @@ const shadows_1 = require("../styling/shadows");
35
35
  const lodash_1 = require("lodash");
36
36
  const slots_1 = require("./slots");
37
37
  const layer_1 = require("../helpers/layer");
38
- const bind_1 = __importDefault(require("classnames/bind"));
39
- const modal_module_scss_1 = __importDefault(require("./modal.module.scss"));
40
38
  const define_slots_1 = require("../helpers/define-slots");
41
39
  const body_scroll_1 = require("../_internal/body-scroll");
40
+ const bind_1 = __importDefault(require("classnames/bind"));
41
+ const modal_module_scss_1 = __importDefault(require("./modal.module.scss"));
42
42
  const cx = bind_1.default.bind(modal_module_scss_1.default);
43
43
  /**
44
44
  * Компонент модального окна.
45
45
  * @param props Свойства.
46
46
  * @return Элемент.
47
47
  */
48
- const Modal = ({ children, height, onClose, scrollDisableOptions = { reserveScrollBarGap: true }, size = 'm', withScrollDisable = false, 'data-testid': testId = 'modal', }) => {
48
+ const Modal = ({ children, height, onClose, scrollDisableOptions, size = 'm', withScrollDisable = false, 'data-testid': testId = 'modal', }) => {
49
49
  const layer = (0, layer_1.useLayer)() + 100;
50
50
  const rootRef = (0, react_1.useRef)(null);
51
51
  const bind = (0, utils_1.useCloseHandler)(onClose);
@@ -67,7 +67,9 @@ const Modal = ({ children, height, onClose, scrollDisableOptions = { reserveScro
67
67
  '--header-height': `${headerHeight}px`,
68
68
  '--footer-height': `${footerHeight}px`,
69
69
  };
70
- (0, body_scroll_1.useBodyScrollLock)(rootRef, withScrollDisable, scrollDisableOptions);
70
+ (0, body_scroll_1.useBodyScrollLock)(rootRef, withScrollDisable, Object.assign({
71
+ // defaults
72
+ reserveScrollBarGap: true, allowTouchMove: body_scroll_1.allowTouchMove }, scrollDisableOptions));
71
73
  return (react_1.default.createElement("div", Object.assign({ ref: rootRef, className: cx('overlay'), "data-testid": 'modal:overlay', style: { zIndex: layer } }, bind),
72
74
  react_1.default.createElement("div", { className: cx('modal', `size-${size}`, !fullscreen && shadows_1.BoxShadow.z4), style: style, "data-testid": testId },
73
75
  header &&
package/modal/slots.js CHANGED
@@ -46,6 +46,7 @@ const bottom_bar_1 = require("../bottom-bar");
46
46
  const custom_scrollbar_1 = require("../_internal/custom-scrollbar");
47
47
  const modal_module_scss_1 = __importDefault(require("./modal.module.scss"));
48
48
  const viewport_1 = require("../context/viewport");
49
+ const constants_1 = require("../constants");
49
50
  /**
50
51
  * Шапка окна.
51
52
  * @param props Свойства.
@@ -77,7 +78,7 @@ const ModalBody = ({ children, onFullScroll, fullScrollThreshold, }) => {
77
78
  const ref = (0, react_1.useRef)(null);
78
79
  return (react_1.default.createElement(custom_scrollbar_1.CustomScrollbar, { inFlexBox: true, className: modal_module_scss_1.default.body, overflow: { x: 'h', y: 's' }, onFullScroll: onFullScroll, fullScrollThreshold: fullScrollThreshold },
79
80
  react_1.default.createElement(viewport_1.ViewportContext.Provider, { value: ref },
80
- react_1.default.createElement("div", { className: modal_module_scss_1.default.main, ref: ref }, children))));
81
+ react_1.default.createElement("div", Object.assign({ className: modal_module_scss_1.default.main, ref: ref }, { [constants_1.BSL_IGNORE_ATTR]: true }), children))));
81
82
  };
82
83
  exports.ModalBody = ModalBody;
83
84
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sima-land/ui-nucleons",
3
- "version": "44.1.0",
3
+ "version": "44.2.0",
4
4
  "repository": "ssh://git@github.com:sima-land/ui-nucleons.git",
5
5
  "author": "www.sima-land.ru team",
6
6
  "license": "Apache-2.0",