@sima-land/ui-nucleons 40.3.0 → 41.2.1

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.
Files changed (45) hide show
  1. package/_internal/body-scroll.d.ts +9 -0
  2. package/_internal/body-scroll.js +21 -1
  3. package/alert/index.js +1 -1
  4. package/arrow-button/index.d.ts +1 -0
  5. package/avatar/user.d.ts +1 -0
  6. package/card/index.d.ts +1 -0
  7. package/carousel/draggable.js +3 -1
  8. package/carousel/index.d.ts +2 -2
  9. package/carousel/index.js +1 -1
  10. package/chips/index.d.ts +5 -14
  11. package/chips/index.js +24 -9
  12. package/chips/item.d.ts +15 -0
  13. package/chips/item.js +20 -0
  14. package/constants.d.ts +6 -0
  15. package/constants.js +9 -0
  16. package/dot-nav/index.d.ts +1 -0
  17. package/hooks/index.d.ts +2 -1
  18. package/hooks/index.js +9 -7
  19. package/no-index-mark/index.d.ts +1 -0
  20. package/package.json +49 -51
  21. package/pagination/utils.d.ts +1 -1
  22. package/price/index.d.ts +1 -0
  23. package/rating/index.js +2 -2
  24. package/readme.md +6 -6
  25. package/screen/index.d.ts +12 -53
  26. package/screen/index.js +31 -85
  27. package/screen/screen.module.scss +16 -15
  28. package/screen/slots.d.ts +32 -0
  29. package/screen/slots.js +97 -0
  30. package/screen/utils.d.ts +13 -2
  31. package/screen/utils.js +3 -7
  32. package/side-page/index.d.ts +15 -2
  33. package/side-page/index.js +2 -2
  34. package/stroked-svg/index.d.ts +17 -0
  35. package/stroked-svg/index.js +52 -0
  36. package/stroked-svg/index.module.scss +17 -0
  37. package/super-ellipse-clip-path/index.d.ts +1 -0
  38. package/tabs/index.d.ts +32 -25
  39. package/tabs/index.js +30 -24
  40. package/tabs/tabs.module.scss +21 -19
  41. package/text-field/index.js +1 -1
  42. package/touch-slider/index.js +2 -1
  43. package/unknown-content/unknown-content.module.scss +3 -3
  44. package/screen/screen-layout.d.ts +0 -57
  45. package/screen/screen-layout.js +0 -116
@@ -12,3 +12,12 @@ export interface WithBodyScrollLock {
12
12
  * @param options Опции.
13
13
  */
14
14
  export declare const useBodyScrollLock: (ref: React.RefObject<HTMLElement>, needDisable: boolean | undefined, options?: BodyScrollOptions | undefined) => void;
15
+ /**
16
+ * Проверяет необходимость блокировки дочерних элементов в прокручиваемом элементе.
17
+ * Необходима для того, чтобы в прокручиваемых контейнерах вложенные прокручиваемые элементы,
18
+ * имеющие специальный атрибут, прокручивались нормально.
19
+ * @see {@link https://github.com/willmcpo/body-scroll-lock#more-complex}
20
+ * @param startEl Начальный элемент.
21
+ * @return Нужно ли позволить перетаскивание элемента.
22
+ */
23
+ export declare const allowTouchMove: Required<BodyScrollOptions>['allowTouchMove'];
@@ -1,8 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.useBodyScrollLock = void 0;
3
+ exports.allowTouchMove = exports.useBodyScrollLock = void 0;
4
4
  const body_scroll_lock_1 = require("body-scroll-lock");
5
5
  const react_1 = require("react");
6
+ const constants_1 = require("../constants");
6
7
  /**
7
8
  * Хук управления блокировкой прокрутки body.
8
9
  * @param ref Реф элемента для которого нужно отключить прокрутку body.
@@ -19,3 +20,22 @@ const useBodyScrollLock = (ref, needDisable, options) => {
19
20
  }, [needDisable, options]);
20
21
  };
21
22
  exports.useBodyScrollLock = useBodyScrollLock;
23
+ /**
24
+ * Проверяет необходимость блокировки дочерних элементов в прокручиваемом элементе.
25
+ * Необходима для того, чтобы в прокручиваемых контейнерах вложенные прокручиваемые элементы,
26
+ * имеющие специальный атрибут, прокручивались нормально.
27
+ * @see {@link https://github.com/willmcpo/body-scroll-lock#more-complex}
28
+ * @param startEl Начальный элемент.
29
+ * @return Нужно ли позволить перетаскивание элемента.
30
+ */
31
+ const allowTouchMove = (startEl) => {
32
+ let el = startEl;
33
+ while (el && el !== document.body) {
34
+ if (el.getAttribute(constants_1.BSL_IGNORE_ATTR) !== null) {
35
+ return true;
36
+ }
37
+ el = el.parentElement;
38
+ }
39
+ return false;
40
+ };
41
+ exports.allowTouchMove = allowTouchMove;
package/alert/index.js CHANGED
@@ -65,7 +65,7 @@ exports.Alert = Alert;
65
65
  const AlertInner = ({ children, className, footer, navBarProps, title, withDivideNavBar, withNavBar = Boolean(title), withScrollDisable = false, scrollDisableOptions, onClose, }) => {
66
66
  const rootRef = (0, react_1.useRef)(null);
67
67
  const layer = (0, layer_1.useLayer)();
68
- (0, body_scroll_1.useBodyScrollLock)(rootRef, withScrollDisable, scrollDisableOptions);
68
+ (0, body_scroll_1.useBodyScrollLock)(rootRef, withScrollDisable, Object.assign({ allowTouchMove: body_scroll_1.allowTouchMove }, scrollDisableOptions));
69
69
  return (react_1.default.createElement("div", { ref: rootRef, className: cx('overlay'), style: { zIndex: layer }, onClick: e => e.target === e.currentTarget && (onClose === null || onClose === void 0 ? void 0 : onClose()), "data-testid": 'alert:overlay' },
70
70
  react_1.default.createElement("div", { className: cx('alert', className), "data-testid": 'alert' },
71
71
  withNavBar && (react_1.default.createElement(nav_bar_1.NavBar, Object.assign({}, navBarProps, { title: title, bottomBordered: withDivideNavBar, className: cx('header') }))),
@@ -1,3 +1,4 @@
1
+ /// <reference types="react" />
1
2
  declare type Size = 's' | 'l';
2
3
  declare type Direction = 'up' | 'right' | 'down' | 'left';
3
4
  export interface ArrowButtonProps extends Omit<JSX.IntrinsicElements['button'], 'size' | 'children'> {
package/avatar/user.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ /// <reference types="react" />
1
2
  import { AvatarProps } from '.';
2
3
  export declare type UserAvatarProps = Omit<AvatarProps, 'bgColor' | 'bgOpacity' | 'textColor'>;
3
4
  export declare const colorKey: unique symbol;
package/card/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ /// <reference types="react" />
1
2
  import { PlateProps } from '../plate';
2
3
  import { CardContent, CardFooter, CardHeader } from './slots';
3
4
  export declare type CardProps = PlateProps;
@@ -238,7 +238,9 @@ class Draggable extends react_1.Component {
238
238
  render() {
239
239
  const { children, containerProps = {}, transitionDuration: duration = 320 } = this.props;
240
240
  const { x, y } = this.currentOffset;
241
- return (react_1.default.createElement("div", Object.assign({}, containerProps, { className: cx('draggable-container', containerProps.className), onClick: this.handleClick, onMouseDown: this.startCapture, onTouchStart: this.startCapture }),
241
+ return (react_1.default.createElement("div", Object.assign({}, containerProps, { className: cx('draggable-container', containerProps.className),
242
+ // обрабатываем захват чтобы при обработке клика на дочернем элементе defaultPrevented уже был true
243
+ onClickCapture: this.handleClick, onMouseDown: this.startCapture, onTouchStart: this.startCapture }),
242
244
  react_1.default.createElement("div", { ref: this.draggableRef, style: {
243
245
  transform: (0, styles_1.getTranslateStyle)(x, y),
244
246
  transition: this.hasTransition ? (0, styles_1.getTransitionStyle)(duration, 'transform') : '',
@@ -77,7 +77,7 @@ export declare class Carousel extends Component<CarouselProps, State> {
77
77
  * @param index Индекс.
78
78
  * @return Элемент списка.
79
79
  */
80
- static defaultRenderItem(item: any, index: React.Key): JSX.Element;
80
+ static defaultRenderItem(item: any, index: number): JSX.Element;
81
81
  /**
82
82
  * Возвращает кнопку управления.
83
83
  * @param data Данные для вывода кнопки.
@@ -179,7 +179,7 @@ export declare class Carousel extends Component<CarouselProps, State> {
179
179
  */
180
180
  moveBackwardFinite(step: number): void;
181
181
  /**
182
- * Выполняет прокрутка в бесконечном режиме.
182
+ * Выполняет прокрутку в бесконечном режиме.
183
183
  * @param step Количество элементов для прокрутки.
184
184
  * @param forward Нужно выполнить прокрутку вперед?
185
185
  */
package/carousel/index.js CHANGED
@@ -276,7 +276,7 @@ class Carousel extends react_1.Component {
276
276
  this.setCurrentIndex(newIndex !== -1 && newIndex - step >= 0 ? newIndex - step : 0);
277
277
  }
278
278
  /**
279
- * Выполняет прокрутка в бесконечном режиме.
279
+ * Выполняет прокрутку в бесконечном режиме.
280
280
  * @param step Количество элементов для прокрутки.
281
281
  * @param forward Нужно выполнить прокрутку вперед?
282
282
  */
package/chips/index.d.ts CHANGED
@@ -1,18 +1,7 @@
1
1
  import React from 'react';
2
- interface ChipsItem {
3
- href?: string;
4
- children?: React.ReactNode;
5
- withCross?: boolean;
6
- target?: string;
7
- [x: string]: any;
8
- }
9
2
  export interface ChipsProps extends React.HTMLAttributes<HTMLDivElement> {
10
3
  /** Элементы списка. */
11
- items: ChipsItem[];
12
- /** Сработает при клике на элемент. */
13
- onItemClick?: (item: ChipsItem, event: React.MouseEvent<HTMLAnchorElement>) => void;
14
- /** Определит, отмечен ли переданный элемент. */
15
- isItemChecked?: (item: ChipsItem, index: number) => boolean;
4
+ children: React.ReactNode;
16
5
  /** Идентификатор для систем автоматизированного тестирования. */
17
6
  'data-testid'?: string;
18
7
  }
@@ -21,5 +10,7 @@ export interface ChipsProps extends React.HTMLAttributes<HTMLDivElement> {
21
10
  * @param props Свойства.
22
11
  * @return Элемент.
23
12
  */
24
- export declare const Chips: ({ items, onItemClick, isItemChecked, className, "data-testid": testId, ...restProps }: ChipsProps) => JSX.Element;
25
- export {};
13
+ export declare const Chips: {
14
+ ({ children, className, "data-testid": testId, ...restProps }: ChipsProps): JSX.Element;
15
+ Item: ({ href, children, withCross, target, onClick, checked, }: import("./item").ChipsItemProps) => JSX.Element;
16
+ };
package/chips/index.js CHANGED
@@ -1,4 +1,23 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
20
+ };
2
21
  var __rest = (this && this.__rest) || function (s, e) {
3
22
  var t = {};
4
23
  for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
@@ -15,9 +34,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
15
34
  };
16
35
  Object.defineProperty(exports, "__esModule", { value: true });
17
36
  exports.Chips = void 0;
18
- const react_1 = __importDefault(require("react"));
37
+ const react_1 = __importStar(require("react"));
38
+ const item_1 = require("./item");
19
39
  const bind_1 = __importDefault(require("classnames/bind"));
20
- const cross_1 = __importDefault(require("@sima-land/ui-quarks/icons/16x16/Stroked/cross"));
21
40
  const chips_module_scss_1 = __importDefault(require("./chips.module.scss"));
22
41
  const cx = bind_1.default.bind(chips_module_scss_1.default);
23
42
  /**
@@ -26,12 +45,8 @@ const cx = bind_1.default.bind(chips_module_scss_1.default);
26
45
  * @return Элемент.
27
46
  */
28
47
  const Chips = (_a) => {
29
- var { items, onItemClick, isItemChecked, className, 'data-testid': testId = 'chips' } = _a, restProps = __rest(_a, ["items", "onItemClick", "isItemChecked", "className", 'data-testid']);
30
- return (react_1.default.createElement("div", Object.assign({}, restProps, { className: cx('list', className), "data-testid": testId }), items.map((item, index) => {
31
- const { href, target, children, withCross } = item;
32
- return (react_1.default.createElement("a", { href: href, role: href ? undefined : 'button', key: index, className: cx('item', (isItemChecked === null || isItemChecked === void 0 ? void 0 : isItemChecked(item, index)) && 'checked'), target: target, onClick: e => onItemClick === null || onItemClick === void 0 ? void 0 : onItemClick(item, e), "data-testid": 'chips:item' },
33
- react_1.default.createElement("span", { className: chips_module_scss_1.default.text }, children),
34
- withCross && react_1.default.createElement(cross_1.default, { className: cx('cross-svg') })));
35
- })));
48
+ var { children, className, 'data-testid': testId = 'chips' } = _a, restProps = __rest(_a, ["children", "className", 'data-testid']);
49
+ return (react_1.default.createElement("div", Object.assign({}, restProps, { className: cx('list', className), "data-testid": testId }), react_1.Children.toArray(children).filter(c => (0, react_1.isValidElement)(c) && c.type === item_1.ChipsItem)));
36
50
  };
37
51
  exports.Chips = Chips;
52
+ exports.Chips.Item = item_1.ChipsItem;
@@ -0,0 +1,15 @@
1
+ import React from 'react';
2
+ export interface ChipsItemProps {
3
+ href?: string;
4
+ children?: React.ReactNode;
5
+ withCross?: boolean;
6
+ target?: string;
7
+ onClick?: React.MouseEventHandler<HTMLAnchorElement>;
8
+ checked?: boolean;
9
+ }
10
+ /**
11
+ * Элемент списка "чипсов".
12
+ * @param props Свойства.
13
+ * @return Элемент.
14
+ */
15
+ export declare const ChipsItem: ({ href, children, withCross, target, onClick, checked, }: ChipsItemProps) => JSX.Element;
package/chips/item.js ADDED
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ChipsItem = void 0;
7
+ const react_1 = __importDefault(require("react"));
8
+ const bind_1 = __importDefault(require("classnames/bind"));
9
+ const cross_1 = __importDefault(require("@sima-land/ui-quarks/icons/16x16/Stroked/cross"));
10
+ const chips_module_scss_1 = __importDefault(require("./chips.module.scss"));
11
+ const cx = bind_1.default.bind(chips_module_scss_1.default);
12
+ /**
13
+ * Элемент списка "чипсов".
14
+ * @param props Свойства.
15
+ * @return Элемент.
16
+ */
17
+ const ChipsItem = ({ href, children, withCross, target, onClick, checked, }) => (react_1.default.createElement("a", { href: href, role: href ? undefined : 'button', className: cx('item', { checked }), target: target, onClick: onClick, "data-testid": 'chips:item' },
18
+ react_1.default.createElement("span", { className: chips_module_scss_1.default.text }, children),
19
+ withCross && react_1.default.createElement(cross_1.default, { className: cx('cross-svg') })));
20
+ exports.ChipsItem = ChipsItem;
package/constants.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Имя атрибута, устанавливаемого на элемент, имеющий прокрутку.
3
+ * Атрибут устанавливается на элемент в случае, если
4
+ * прокручиваемый родитель элемента обрабатывается с помощью body-scroll-lock.
5
+ */
6
+ export declare const BSL_IGNORE_ATTR = "data-bsl-ignore";
package/constants.js ADDED
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BSL_IGNORE_ATTR = void 0;
4
+ /**
5
+ * Имя атрибута, устанавливаемого на элемент, имеющий прокрутку.
6
+ * Атрибут устанавливается на элемент в случае, если
7
+ * прокручиваемый родитель элемента обрабатывается с помощью body-scroll-lock.
8
+ */
9
+ exports.BSL_IGNORE_ATTR = 'data-bsl-ignore';
@@ -1,3 +1,4 @@
1
+ /// <reference types="react" />
1
2
  export declare type DotNavSize = 's' | 'l';
2
3
  export interface DotNavProps {
3
4
  /** Индекс выбранной точки. */
package/hooks/index.d.ts CHANGED
@@ -10,11 +10,12 @@ export declare const useIsTouchDevice: () => boolean;
10
10
  * @param options Опции.
11
11
  * @param options.onFullScroll Сработает при событии полной прокрутки.
12
12
  * @param options.threshold Отступ от конца списка по которому событие должно срабатывать.
13
+ * @param moreDeps Зависимости эффекта (нужны, когда ref заполняется не на этапе render'а).
13
14
  */
14
15
  export declare const useInfiniteScroll: (ref: React.MutableRefObject<HTMLElement | undefined | null>, { onFullScroll, threshold, }: {
15
16
  onFullScroll?: ((event: UIEvent) => void) | undefined;
16
17
  threshold?: number | undefined;
17
- }) => void;
18
+ }, moreDeps?: React.DependencyList | undefined) => void;
18
19
  /**
19
20
  * Запускает переданный обработчик при клике вне элемента.
20
21
  * @param elementRef Ref элемента, клик вне которого нужно обработать.
package/hooks/index.js CHANGED
@@ -8,6 +8,7 @@ const react_1 = require("react");
8
8
  const is_touch_device_1 = require("../helpers/is-touch-device");
9
9
  const lodash_1 = require("lodash");
10
10
  const on_1 = __importDefault(require("../helpers/on"));
11
+ const identity_1 = require("./identity");
11
12
  /**
12
13
  * При монтировании проверяет, поддерживает ли устройство touch события.
13
14
  * @return True - если поддерживает, false - если нет.
@@ -26,21 +27,22 @@ exports.useIsTouchDevice = useIsTouchDevice;
26
27
  * @param options Опции.
27
28
  * @param options.onFullScroll Сработает при событии полной прокрутки.
28
29
  * @param options.threshold Отступ от конца списка по которому событие должно срабатывать.
30
+ * @param moreDeps Зависимости эффекта (нужны, когда ref заполняется не на этапе render'а).
29
31
  */
30
- const useInfiniteScroll = (ref, { onFullScroll, threshold = 0, }) => {
32
+ const useInfiniteScroll = (ref, { onFullScroll, threshold = 0, }, moreDeps) => {
33
+ const callbackRef = (0, identity_1.useIdentityRef)(onFullScroll);
31
34
  (0, react_1.useEffect)(() => {
32
- const { current: element } = ref;
35
+ const element = ref.current;
33
36
  if (element) {
34
- return (0, on_1.default)(element, 'scroll', (event) => {
37
+ return (0, on_1.default)(element, 'scroll', event => {
38
+ var _a;
35
39
  const { scrollTop, clientHeight, scrollHeight } = event.target;
36
40
  const bottom = threshold + scrollTop + clientHeight;
37
41
  const isFullyScrolled = bottom >= scrollHeight;
38
- if (isFullyScrolled && onFullScroll) {
39
- onFullScroll(event);
40
- }
42
+ isFullyScrolled && ((_a = callbackRef.current) === null || _a === void 0 ? void 0 : _a.call(callbackRef, event));
41
43
  });
42
44
  }
43
- }, [ref.current, threshold, onFullScroll]);
45
+ }, [ref, threshold, ...(moreDeps || [])]);
44
46
  };
45
47
  exports.useInfiniteScroll = useInfiniteScroll;
46
48
  /**
@@ -1,3 +1,4 @@
1
+ /// <reference types="react" />
1
2
  export interface NoIndexMarkProps {
2
3
  /** Флаг закрывающегося тэга. */
3
4
  closing?: boolean;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sima-land/ui-nucleons",
3
- "version": "40.3.0",
3
+ "version": "41.2.1",
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",
@@ -10,74 +10,72 @@
10
10
  },
11
11
  "dependencies": {
12
12
  "@krutoo/input-mask": "^0.0.8",
13
- "@sima-land/ui-quarks": "^2.0.1",
14
- "@types/body-scroll-lock": "^2.6.1",
13
+ "@sima-land/ui-quarks": "^2.2.0",
15
14
  "body-scroll-lock": "3.1.5",
16
- "date-fns": "^2.14.0",
17
- "intersection-observer": "^0.7.0",
15
+ "classnames": "^2.3.1",
16
+ "date-fns": "^2.26.0",
17
+ "intersection-observer": "^0.12.0",
18
18
  "lodash": "^4.17.21",
19
19
  "overlayscrollbars": "^1.13.1",
20
- "overlayscrollbars-react": "^0.2.2",
20
+ "overlayscrollbars-react": "^0.2.3",
21
21
  "react-transition-group": "^4.4.2"
22
22
  },
23
23
  "devDependencies": {
24
- "@babel/core": "^7.12.10",
25
- "@babel/plugin-proposal-class-properties": "^7.12.1",
26
- "@babel/plugin-proposal-optional-chaining": "^7.12.7",
27
- "@babel/preset-env": "^7.12.11",
28
- "@babel/preset-react": "^7.12.10",
29
- "@rushstack/eslint-patch": "^1.0.6",
30
- "@sima-land/linters": "^2.1.0",
31
- "@storybook/addon-actions": "^6.3.12",
32
- "@storybook/addon-backgrounds": "^6.3.12",
33
- "@storybook/addon-docs": "^6.3.12",
34
- "@storybook/addon-storysource": "^6.3.12",
35
- "@storybook/addons": "^6.3.12",
36
- "@storybook/react": "^6.3.12",
37
- "@storybook/theming": "^6.3.12",
24
+ "@babel/core": "^7.16.0",
25
+ "@babel/preset-env": "^7.16.4",
26
+ "@babel/preset-react": "^7.16.0",
27
+ "@babel/preset-typescript": "^7.16.5",
28
+ "@rushstack/eslint-patch": "^1.1.0",
29
+ "@sima-land/linters": "^2.1.1",
30
+ "@storybook/addon-actions": "^6.4.13",
31
+ "@storybook/addon-backgrounds": "^6.4.13",
32
+ "@storybook/addon-docs": "^6.4.13",
33
+ "@storybook/addon-storysource": "^6.4.13",
34
+ "@storybook/addons": "^6.4.13",
35
+ "@storybook/builder-webpack5": "^6.4.13",
36
+ "@storybook/manager-webpack5": "^6.4.13",
37
+ "@storybook/react": "^6.4.13",
38
+ "@storybook/theming": "^6.4.13",
38
39
  "@svgr/core": "^5.5.0",
39
40
  "@svgr/plugin-svgo": "^5.5.0",
40
41
  "@svgr/webpack": "^5.5.0",
41
- "@testing-library/react": "^12.0.0",
42
- "@types/classnames": "^2.2.11",
43
- "@types/enzyme": "^3.10.8",
42
+ "@testing-library/react": "^12.1.2",
43
+ "@types/body-scroll-lock": "^3.1.0",
44
+ "@types/enzyme": "^3.10.10",
44
45
  "@types/jest": "^27.0.2",
45
- "@types/lodash": "^4.14.168",
46
- "@types/react": "^17.0.2",
47
- "@types/react-dom": "^17.0.2",
48
- "@types/react-transition-group": "^4.4.3",
49
- "@typescript-eslint/eslint-plugin": "^4.15.2",
50
- "@typescript-eslint/parser": "^4.15.2",
51
- "@wojtekmaj/enzyme-adapter-react-17": "^0.6.3",
52
- "babel-loader": "^8.0.5",
46
+ "@types/lodash": "^4.14.177",
47
+ "@types/react": "^17.0.36",
48
+ "@types/react-dom": "^17.0.11",
49
+ "@types/react-transition-group": "^4.4.4",
50
+ "@typescript-eslint/eslint-plugin": "^5.4.0",
51
+ "@typescript-eslint/parser": "^5.4.0",
52
+ "@wojtekmaj/enzyme-adapter-react-17": "^0.6.5",
53
+ "babel-jest": "^27.4.6",
54
+ "babel-loader": "^8.2.3",
53
55
  "babel-preset-jest": "^27.2.0",
54
- "classnames": "^2.2.6",
55
56
  "copyfiles": "^2.4.1",
56
- "css-loader": "^5.0.1",
57
- "del": "^4.1.1",
57
+ "css-loader": "^5.2.7",
58
58
  "enzyme": "^3.9.0",
59
- "enzyme-adapter-react-16": "^1.13.0",
60
- "enzyme-to-json": "^3.3.5",
59
+ "enzyme-to-json": "^3.6.2",
61
60
  "eslint": "^7.31.0",
62
61
  "file-loader": "^6.2.0",
63
- "husky": "^5.1.1",
64
- "identity-obj-proxy": "^3.0.0",
62
+ "husky": "^7.0.4",
65
63
  "jest": "^27.3.1",
66
64
  "jest-css-modules-transform": "^4.3.0",
67
- "lint-staged": "^10.5.4",
68
- "prettier": "^2.3.2",
65
+ "lint-staged": "^12.1.2",
66
+ "postcss": "^8.3.11",
67
+ "prettier": "^2.4.1",
69
68
  "react": "^17.0.2",
70
69
  "react-docgen-typescript": "^2.1.1",
71
70
  "react-dom": "^17.0.2",
72
71
  "rimraf": "^3.0.2",
73
- "sass": "^1.30.0",
72
+ "sass": "^1.43.4",
74
73
  "sass-loader": "^10.1.0",
75
74
  "style-loader": "^2.0.0",
76
- "stylelint": "^13.8.0",
77
- "ts-jest": "^27.0.7",
78
- "typescript": "^4.4.3",
79
- "typescript-plugin-css-modules": "^3.2.0",
80
- "webpack": "^5.11.0"
75
+ "stylelint": "^14.1.0",
76
+ "typescript": "^4.5.2",
77
+ "typescript-plugin-css-modules": "^3.4.0",
78
+ "webpack": "^5.64.2"
81
79
  },
82
80
  "peerDependencies": {
83
81
  "react": ">=17",
@@ -88,14 +86,14 @@
88
86
  "build:before": "rimraf build",
89
87
  "build:main": "tsc --project tsconfig.build.json",
90
88
  "build:after": "node dist.js",
91
- "build": "yarn build:before && yarn build:main && yarn build:after",
92
- "test": "jest",
89
+ "build": "npm run build:before && npm run build:main && npm run build:after",
90
+ "test": "BROWSERSLIST_ENV=\"test\" npx jest",
91
+ "coverage": "jest --clearCache && BROWSERSLIST_ENV=\"test\" npx jest --coverage",
93
92
  "type-check": "tsc -p . --noEmit",
94
- "coverage": "jest --clearCache && jest --coverage",
95
93
  "lint:scripts": "eslint --cache src/ --ext .js,.jsx,.ts,.tsx",
96
94
  "lint:styles": "stylelint 'src/**/*.{css,scss}'",
97
- "storybook": "start-storybook -p 9009 -c .storybook",
98
- "storybook:build": "build-storybook --no-dll --quiet --loglevel error -o build-storybook",
95
+ "storybook": "BROWSERSLIST_ENV=\"storybook\" npx start-storybook -p 9009 -c .storybook",
96
+ "storybook:build": "BROWSERSLIST_ENV=\"storybook\" npx build-storybook --quiet --loglevel error -o build-storybook",
99
97
  "prettier": "prettier --write \"./src/**/*.{js,jsx,ts,tsx,css,scss}\" --loglevel error",
100
98
  "prettier:check": "prettier --check \"./src/**/*.{js,jsx,ts,tsx,css,scss}\" --loglevel error"
101
99
  }
@@ -7,7 +7,7 @@ declare type State = {
7
7
  range: number;
8
8
  total: number;
9
9
  };
10
- export declare const cx: import("classnames/types").ClassNamesFn;
10
+ export declare const cx: (...args: import("classnames").Argument[]) => string;
11
11
  /**
12
12
  * Фабрика объектов с данными о кнопке страницы.
13
13
  * @param value Номер целевой страницы.
package/price/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ /// <reference types="react" />
1
2
  export interface PriceProps {
2
3
  /** Класс/стили цены. */
3
4
  className?: string;
package/rating/index.js CHANGED
@@ -27,7 +27,7 @@ const cx = bind_1.default.bind(rating_module_scss_1.default);
27
27
  * @return Элемент.
28
28
  */
29
29
  const Rating = (_a) => {
30
- var { size, value, className, 'data-testid': testId = 'rating' } = _a, restProps = __rest(_a, ["size", "value", "className", 'data-testid']);
30
+ var { size = 's', value, className, 'data-testid': testId = 'rating' } = _a, restProps = __rest(_a, ["size", "value", "className", 'data-testid']);
31
31
  return (react_1.default.createElement("div", Object.assign({}, restProps, { className: cx('root', className), "data-testid": testId, "data-rating": value }), (0, utils_1.getStars)(Math.min(5, value), 5).map((type, index) => (react_1.default.createElement(Star, { key: index, type: type, size: size })))));
32
32
  };
33
33
  exports.Rating = Rating;
@@ -36,7 +36,7 @@ exports.Rating = Rating;
36
36
  * @param props Свойства.
37
37
  * @return Элемент.
38
38
  */
39
- const Star = ({ type, size = 's' }) => (react_1.default.createElement("div", { className: cx('star', `size-${size}`) },
39
+ const Star = ({ type, size }) => (react_1.default.createElement("div", { className: cx('star', `size-${size}`) },
40
40
  type === 'empty' && react_1.default.createElement(star_svg_1.default, { className: cx('svg') }),
41
41
  type === 'half' && (react_1.default.createElement(react_1.default.Fragment, null,
42
42
  react_1.default.createElement(star_svg_1.default, { className: cx('svg') }),
package/readme.md CHANGED
@@ -158,12 +158,12 @@ declare module '*.svg' {
158
158
  - компонент интерфейса не должен иметь внешних отступов по умолчанию
159
159
 
160
160
  ### Консольные команды, необходимые в процессе разработки
161
- * ```yarn build``` - сборка компонентов в `./build` для публикации
162
- * ```yarn test``` - запуск тестов *Jest*
163
- * ```yarn lint:scripts``` - запуск линтера *ESLint*
164
- * ```yarn lint:styles``` - запуск линтера *styleLint*
165
- * ```yarn type-check``` - Проверка типов TS
166
- * ```yarn storybook``` - запуск *storybook*
161
+ * ```npm run build``` - сборка компонентов в `./build` для публикации
162
+ * ```npm run test``` - запуск тестов *Jest*
163
+ * ```npm run lint:scripts``` - запуск линтера *ESLint*
164
+ * ```npm run lint:styles``` - запуск линтера *styleLint*
165
+ * ```npm run type-check``` - Проверка типов TS
166
+ * ```npm run storybook``` - запуск *storybook*
167
167
 
168
168
  ### Структура библиотеки
169
169
 
package/screen/index.d.ts CHANGED
@@ -1,64 +1,23 @@
1
1
  import React from 'react';
2
- import { ScreenLayoutProps, CallbackData } from './screen-layout';
3
- import { OrNil } from './utils';
4
- import { LoadingOverlayProps } from '../loading-overlay';
5
- interface AdvancedCallbackData extends CallbackData {
6
- rootElement: OrNil<HTMLDivElement>;
7
- }
8
- export interface ScreenProps {
2
+ import { ScreenInnerProps } from './utils';
3
+ export interface ScreenProps extends ScreenInnerProps {
9
4
  /** Содержимое. */
10
5
  children?: React.ReactNode;
11
- /** Реф контента. */
12
- contentRef?: ScreenLayoutProps['childrenRef'];
13
- /** Содержимое подвала. */
14
- footer?: any;
15
- /** Отступ от нижней границы для срабатывания onFullScroll. */
16
- fullScrollThreshold?: number;
17
- /** Нужно ли выводить вместо содержимого состояние загрузки. */
18
- loading?: boolean;
19
6
  /** Определяет область отображаемую как загружающуюся. */
20
7
  loadingArea?: 'content' | 'full';
21
- /** Свойства компонента LoadingOverlay. */
22
- loadingOverlayProps?: LoadingOverlayProps;
23
- /** Свойства компонента NavBar. */
24
- navBarProps?: ScreenLayoutProps['navBarProps'];
25
- /** Сработает при клике на кнопку "назад". */
26
- onBack?: (data: AdvancedCallbackData) => void;
27
- /** Сработает при кнопке на крест. */
28
- onClose?: (data: AdvancedCallbackData) => void;
29
- /** Сработает при полной прокрутке контента. */
30
- onFullScroll?: ScreenLayoutProps['onFullScroll'];
31
- /** Подзаголовок. */
32
- subtitle?: string;
33
- /** Заголовок. */
34
- title?: string;
35
- /** Нужно ли выводить кнопку "назад". */
36
- withBackButton?: boolean;
37
- /** Нужно ли выводить закрывающий крест. */
38
- withCloseButton?: boolean;
39
- /** Нужно ли рисовать черту между шапкой и основным содержимым. */
40
- withDivideHeader?: boolean;
41
- /** Нужно ли выводить кнопку "назад". */
42
- withHeader?: boolean;
43
- /** Нужно ли выводить Layer (при SSR необходимо указать false). */
44
- inPortal?: boolean;
8
+ /** Идентификатор для систем автоматизированного тестирования. */
9
+ 'data-testid'?: string;
45
10
  }
46
11
  /**
47
12
  * Экран.
48
13
  * @param props Свойства.
49
14
  * @return Элемент.
50
15
  */
51
- export declare const Screen: React.FC<ScreenProps>;
52
- /**
53
- * Записывает переданное значение в ref контента.
54
- * @param ref Ref-контейнер.
55
- * @param value Значение для записи.
56
- */
57
- export declare const setRefValue: (ref: React.RefCallback<any> | React.MutableRefObject<any>, value: any) => void;
58
- /**
59
- * Записывает полученный элемент в ref и отключает прокрутку.
60
- * @param ref Ref-контейнер.
61
- * @param element Элемент для записи.
62
- */
63
- export declare const takeScrollableElement: (ref: React.MutableRefObject<OrNil<HTMLDivElement>>, element?: HTMLDivElement | null | undefined) => void;
64
- export {};
16
+ export declare const Screen: {
17
+ ({ children, loading, loadingArea, loadingOverlayProps, onFullScroll, fullScrollThreshold, "data-testid": testId, }: ScreenProps): JSX.Element;
18
+ Header: ({ divided, title, subtitle, buttons, onBack, onClose, ...restProps }: import("./slots").HeaderSlotProps) => JSX.Element;
19
+ Body: React.ForwardRefExoticComponent<{
20
+ children?: React.ReactNode;
21
+ } & React.RefAttributes<HTMLDivElement | null>>;
22
+ Footer: React.FC<{}>;
23
+ };