@sima-land/ui-nucleons 43.0.1 → 43.1.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.
@@ -1,11 +1,11 @@
1
1
  /// <reference types="react" />
2
- declare type Size = 's' | 'l';
3
- declare type Direction = 'up' | 'right' | 'down' | 'left';
2
+ export declare type ArrowButtonSize = 's' | 'l';
3
+ export declare type ArrowDirection = 'up' | 'right' | 'down' | 'left';
4
4
  export interface ArrowButtonProps extends Omit<JSX.IntrinsicElements['button'], 'size' | 'children'> {
5
5
  /** Размер. */
6
- size?: Size;
6
+ size?: ArrowButtonSize;
7
7
  /** Направление (отвечает за иконку). */
8
- direction?: Direction;
8
+ direction?: ArrowDirection;
9
9
  /** Идентификатор для систем автоматизированного тестирования. */
10
10
  'data-testid'?: string;
11
11
  }
@@ -15,4 +15,3 @@ export interface ArrowButtonProps extends Omit<JSX.IntrinsicElements['button'],
15
15
  * @return Элемент.
16
16
  */
17
17
  export declare const ArrowButton: ({ size, direction, className, "data-testid": testId, ...buttonProps }: ArrowButtonProps) => JSX.Element;
18
- export {};
@@ -1,8 +1,14 @@
1
+ @use '../colors';
2
+
1
3
  .root {
2
4
  position: relative;
3
5
  width: var(--width, 320px);
4
6
  }
5
7
 
8
+ .arrow {
9
+ fill: colors.$basic-gray38;
10
+ }
11
+
6
12
  .field {
7
13
  width: 100%;
8
14
  }
@@ -22,14 +22,6 @@ export interface AutocompleteProps extends Omit<TextFieldProps, 'ref' | 'value'
22
22
  /**
23
23
  * Поле ввода с подсказками.
24
24
  * @param props Свойства.
25
- * @param props.defaultValue Значение по умолчанию.
26
- * @param props.items Элементы меню.
27
- * @param props.itemSize Размер элемента меню.
28
- * @param props.loading Нужно ли выводить состояние загрузки списка.
29
- * @param props.onSelect Сработает при выборе.
30
- * @param props.preset Пресет (со стрелкой или без).
31
- * @param props.renderItem Выведет содержимое элемента.
32
- * @param props.value Значение.
33
25
  * @return Элемент.
34
26
  */
35
- export declare const Autocomplete: ({ items, itemSize, onSelect, onChange, onClick, onKeyDown, style, className, value, defaultValue, loading, renderItem, preset, "data-testid": dataTestId, ...restProps }: AutocompleteProps) => JSX.Element;
27
+ export declare const Autocomplete: ({ items, itemSize, onSelect, onChange, onKeyDown, style, className, value, defaultValue, loading, renderItem, preset, "data-testid": dataTestId, ...restProps }: AutocompleteProps) => JSX.Element;
@@ -39,41 +39,28 @@ const dropdown_1 = require("../dropdown");
39
39
  const dropdown_item_1 = require("../dropdown-item");
40
40
  const text_field_1 = require("../text-field");
41
41
  const dropdown_2 = require("../_internal/utils/dropdown");
42
- const bind_1 = __importDefault(require("classnames/bind"));
43
42
  const down_1 = __importDefault(require("@sima-land/ui-quarks/icons/16x16/Stroked/Arrows/down"));
44
- const colors_1 = require("../colors");
45
- const hooks_1 = require("../hooks");
43
+ const up_1 = __importDefault(require("@sima-land/ui-quarks/icons/16x16/Stroked/Arrows/up"));
46
44
  const dropdown_loading_1 = require("../_internal/dropdown-loading");
47
- const lodash_1 = require("lodash");
45
+ const bind_1 = __importDefault(require("classnames/bind"));
48
46
  const autocomplete_module_scss_1 = __importDefault(require("./autocomplete.module.scss"));
49
47
  const cx = bind_1.default.bind(autocomplete_module_scss_1.default);
50
48
  /**
51
49
  * Поле ввода с подсказками.
52
50
  * @param props Свойства.
53
- * @param props.defaultValue Значение по умолчанию.
54
- * @param props.items Элементы меню.
55
- * @param props.itemSize Размер элемента меню.
56
- * @param props.loading Нужно ли выводить состояние загрузки списка.
57
- * @param props.onSelect Сработает при выборе.
58
- * @param props.preset Пресет (со стрелкой или без).
59
- * @param props.renderItem Выведет содержимое элемента.
60
- * @param props.value Значение.
61
51
  * @return Элемент.
62
52
  */
63
53
  const Autocomplete = (_a) => {
64
- var { items, itemSize, onSelect, onChange, onClick, onKeyDown, style, className, value, defaultValue, loading, renderItem = String, preset = 'default', 'data-testid': dataTestId } = _a, restProps = __rest(_a, ["items", "itemSize", "onSelect", "onChange", "onClick", "onKeyDown", "style", "className", "value", "defaultValue", "loading", "renderItem", "preset", 'data-testid']);
54
+ var { items, itemSize, onSelect, onChange, onKeyDown, style, className, value, defaultValue, loading, renderItem = String, preset = 'default', 'data-testid': dataTestId } = _a, restProps = __rest(_a, ["items", "itemSize", "onSelect", "onChange", "onKeyDown", "style", "className", "value", "defaultValue", "loading", "renderItem", "preset", 'data-testid']);
65
55
  const osComponentRef = (0, react_1.useRef)(null);
66
- const rootRef = (0, react_1.useRef)(null);
67
- const fieldRef = (0, react_1.useRef)();
68
- const menuRef = (0, react_1.useRef)();
56
+ const fieldRef = (0, react_1.useRef)(null);
57
+ const menuRef = (0, react_1.useRef)(null);
69
58
  const [withMenu, toggleMenu] = (0, react_1.useState)(false);
70
59
  const [realValue, setRealValue] = (0, react_1.useState)(value || defaultValue);
71
60
  const [activeIndex, setActiveIndex] = (0, react_1.useState)(null);
72
- const canShowDropdown = preset === 'filled-only-list' ? withMenu && realValue && realValue.length > 0 : withMenu;
73
- const endAdornment = preset === 'default' ? react_1.default.createElement(down_1.default, { fill: colors_1.COLORS.get('basic-gray38') }) : undefined;
74
- (0, hooks_1.useOutsideClick)(rootRef, () => {
75
- toggleMenu(false);
76
- });
61
+ const needMenu = preset === 'filled-only-list' ? withMenu && realValue && realValue.length > 0 : withMenu;
62
+ const arrowIcon = needMenu ? (react_1.default.createElement(up_1.default, { className: cx('arrow'), "data-testid": 'autocomplete:arrow-up' })) : (react_1.default.createElement(down_1.default, { className: cx('arrow'), "data-testid": 'autocomplete:arrow-down' }));
63
+ const endAdornment = preset === 'default' ? arrowIcon : undefined;
77
64
  (0, react_1.useEffect)(() => {
78
65
  setRealValue(value);
79
66
  }, [value]);
@@ -93,40 +80,47 @@ const Autocomplete = (_a) => {
93
80
  });
94
81
  }
95
82
  }, [activeIndex]);
96
- return (react_1.default.createElement("div", { ref: rootRef, style: style, className: cx('root', className), "data-testid": dataTestId },
97
- react_1.default.createElement(text_field_1.TextField, Object.assign({}, restProps, { ref: fieldRef, focused: withMenu, endAdornment: endAdornment, "data-testid": 'autocomplete:field', variant: 'desktop', value: value, multiline: false, onClick: e => {
83
+ return (react_1.default.createElement("div", { style: style, className: cx('root', className), "data-testid": dataTestId },
84
+ react_1.default.createElement(text_field_1.TextField, Object.assign({}, restProps, { ref: fieldRef, focused: withMenu, endAdornment: endAdornment, "data-testid": 'autocomplete:field', variant: 'desktop', value: realValue, multiline: false, className: cx('field'), onFocus: () => {
98
85
  toggleMenu(true);
99
- onClick && onClick(e);
100
- }, onChange: (e) => {
86
+ setActiveIndex(null);
87
+ }, onBlur: () => {
88
+ toggleMenu(false);
89
+ }, onChange: (event) => {
101
90
  toggleMenu(true);
102
- setRealValue(e.target.value);
91
+ setRealValue(event.target.value);
103
92
  setActiveIndex(0);
104
- onChange && onChange(e);
105
- }, className: cx('field'), onKeyDown: (e) => {
93
+ onChange === null || onChange === void 0 ? void 0 : onChange(event);
94
+ }, onKeyDown: (event) => {
106
95
  const size = (items === null || items === void 0 ? void 0 : items.length) || 0;
107
96
  let nextIndex;
108
- switch (e.key) {
97
+ switch (event.key) {
109
98
  case 'ArrowDown':
110
- nextIndex = (!(0, lodash_1.isNull)(activeIndex) ? size + activeIndex + 1 : 0) % size;
99
+ nextIndex = (activeIndex !== null ? size + activeIndex + 1 : 0) % size;
111
100
  break;
112
101
  case 'ArrowUp':
113
102
  nextIndex = (size + Number(activeIndex) - 1) % size;
114
103
  break;
115
104
  case 'Enter':
116
- if (items && !(0, lodash_1.isNull)(activeIndex) && items.length > activeIndex) {
105
+ if (items && activeIndex !== null && items.length > activeIndex) {
117
106
  onSelect && onSelect(items[activeIndex]);
118
107
  toggleMenu(false);
119
108
  }
120
109
  break;
121
110
  }
122
- Number.isFinite(nextIndex) && setActiveIndex(nextIndex);
123
- onKeyDown && onKeyDown(e);
111
+ if (typeof nextIndex === 'number') {
112
+ event.preventDefault(); // не даём каретке в поле перемещаться
113
+ setActiveIndex(nextIndex);
114
+ }
115
+ onKeyDown === null || onKeyDown === void 0 ? void 0 : onKeyDown(event);
124
116
  } })),
125
- canShowDropdown && (react_1.default.createElement(dropdown_1.Dropdown, Object.assign({}, (0, dropdown_2.placeDropdown)(restProps.size), { ref: menuRef, "data-testid": 'autocomplete:menu', className: cx('menu'), role: 'menu', customScrollbarProps: { osComponentRef } }), loading ? (react_1.default.createElement(dropdown_loading_1.DropdownLoading, { "data-testid": 'autocomplete:loading-area' })) : (react_1.default.createElement(react_1.default.Fragment, null, items && items.length > 0 ? (items.map((item, index) => (react_1.default.createElement(dropdown_item_1.DropdownItem, { size: itemSize, key: index, role: 'menuitem', checked: index === activeIndex, onClick: () => {
126
- onSelect && onSelect(item);
117
+ needMenu && (react_1.default.createElement(dropdown_1.Dropdown, Object.assign({}, (0, dropdown_2.placeDropdown)(restProps.size), { ref: menuRef, "data-testid": 'autocomplete:menu', className: cx('menu'), role: 'menu', customScrollbarProps: { osComponentRef } }), loading ? (react_1.default.createElement(dropdown_loading_1.DropdownLoading, { "data-testid": 'autocomplete:loading-area' })) : (react_1.default.createElement(react_1.default.Fragment, null, items && items.length > 0 ? (items.map((item, index) => (react_1.default.createElement(dropdown_item_1.DropdownItem, { size: itemSize, key: index, role: 'menuitem', checked: index === activeIndex, onMouseDown: event => {
118
+ // чтобы при нажатии на опцию предотвратить blur на поле
119
+ event.preventDefault();
120
+ }, onClick: () => {
121
+ onSelect === null || onSelect === void 0 ? void 0 : onSelect(item);
127
122
  setActiveIndex(null);
128
123
  toggleMenu(false);
129
- fieldRef.current && fieldRef.current.focus();
130
124
  } }, renderItem(item))))) : (react_1.default.createElement(dropdown_item_1.DropdownItem, { size: 'm', noHover: true }, "\u041D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043E"))))))));
131
125
  };
132
126
  exports.Autocomplete = Autocomplete;
@@ -1,3 +1,5 @@
1
+ @use '../utils';
2
+
1
3
  .reset {
2
4
  border: 0;
3
5
  box-sizing: border-box;
@@ -38,14 +40,7 @@
38
40
  }
39
41
  &.multiline {
40
42
  resize: none;
41
-
42
- // скрытие полосы прокрутки
43
- scrollbar-width: none; // Firefox
44
- overflow: -moz-scrollbars-none; // old Firefox
45
- -ms-overflow-style: none; // IE, old Edge
46
- &::-webkit-scrollbar {
47
- display: none; // Chrome, Safari, Opera
48
- }
43
+ @include utils.hidden-scrollbars;
49
44
  }
50
45
  }
51
46
 
@@ -22,7 +22,6 @@ export interface DraggableProps {
22
22
  transitionDuration?: number;
23
23
  containerProps?: React.HTMLProps<HTMLDivElement>;
24
24
  }
25
- declare type Cb = () => void;
26
25
  /**
27
26
  * Компонент области, которую можно прокручивать перетаскиванием.
28
27
  */
@@ -33,7 +32,7 @@ export default class Draggable extends Component<DraggableProps> {
33
32
  currentOffset: IPoint;
34
33
  clientPosition: IPoint;
35
34
  draggableRef: React.RefObject<HTMLDivElement>;
36
- offList: Array<Cb>;
35
+ offList: Array<VoidFunction>;
37
36
  /**
38
37
  * Конструктор компонента области, которую можно прокручивать перетаскиванием.
39
38
  * @param props Свойства.
@@ -76,7 +75,7 @@ export default class Draggable extends Component<DraggableProps> {
76
75
  * Предотвращает клик если было произведено смещение мышью.
77
76
  * @param event Событие окончания захвата.
78
77
  */
79
- handleClick(event: React.MouseEvent<HTMLDivElement>): void;
78
+ handleClickCapture(event: React.MouseEvent<HTMLDivElement>): void;
80
79
  /**
81
80
  * Возвращает разницу последней сохраненной позиции и позиции в переданном событии.
82
81
  * @param event Touch- или mouse-событие.
@@ -116,4 +115,3 @@ export default class Draggable extends Component<DraggableProps> {
116
115
  */
117
116
  render(): JSX.Element;
118
117
  }
119
- export {};
@@ -51,7 +51,7 @@ class Draggable extends react_1.Component {
51
51
  this.currentOffset = (0, point_1.default)();
52
52
  this.clientPosition = (0, point_1.default)();
53
53
  this.draggableRef = (0, react_1.createRef)();
54
- this.handleClick = this.handleClick.bind(this);
54
+ this.handleClickCapture = this.handleClickCapture.bind(this);
55
55
  this.startCapture = this.startCapture.bind(this);
56
56
  this.offList = [];
57
57
  }
@@ -166,7 +166,7 @@ class Draggable extends react_1.Component {
166
166
  * Предотвращает клик если было произведено смещение мышью.
167
167
  * @param event Событие окончания захвата.
168
168
  */
169
- handleClick(event) {
169
+ handleClickCapture(event) {
170
170
  if (this.needPreventClick) {
171
171
  event.preventDefault();
172
172
  this.togglePreventClickNeed(false);
@@ -240,7 +240,7 @@ class Draggable extends react_1.Component {
240
240
  const { x, y } = this.currentOffset;
241
241
  return (react_1.default.createElement("div", Object.assign({}, containerProps, { className: cx('draggable-container', containerProps.className),
242
242
  // обрабатываем захват чтобы при обработке клика на дочернем элементе defaultPrevented уже был true
243
- onClickCapture: this.handleClick, onMouseDown: this.startCapture, onTouchStart: this.startCapture }),
243
+ onClickCapture: this.handleClickCapture, onMouseDown: this.startCapture, onTouchStart: this.startCapture }),
244
244
  react_1.default.createElement("div", { ref: this.draggableRef, style: {
245
245
  transform: (0, styles_1.getTranslateStyle)(x, y),
246
246
  transition: this.hasTransition ? (0, styles_1.getTransitionStyle)(duration, 'transform') : '',
package/carousel/index.js CHANGED
@@ -36,6 +36,7 @@ const arrow_button_1 = require("../arrow-button");
36
36
  const on_1 = __importDefault(require("../helpers/on"));
37
37
  const bind_1 = __importDefault(require("classnames/bind"));
38
38
  const carousel_module_scss_1 = __importDefault(require("./carousel.module.scss"));
39
+ const is_browser_1 = __importDefault(require("../helpers/is-browser"));
39
40
  const CLONE_FACTOR = 3;
40
41
  const cx = bind_1.default.bind(carousel_module_scss_1.default);
41
42
  const isAuto = (0, fp_1.eq)('auto');
@@ -531,7 +532,7 @@ class Carousel extends react_1.Component {
531
532
  * @return Данные прямоугольной области видимости карусели.
532
533
  */
533
534
  getViewport() {
534
- return (0, bounds_of_1.default)(this.wrapperRef.current);
535
+ return (0, is_browser_1.default)() ? (0, bounds_of_1.default)(this.wrapperRef.current) : null;
535
536
  }
536
537
  /**
537
538
  * Сохраняет смещение карусели и позицию из события при старте захвата.
@@ -3,5 +3,5 @@
3
3
  * @param rect Прямоугольник.
4
4
  * @return Центр.
5
5
  */
6
- declare const centerOf: (rect: ClientRect) => import("./point").IPoint;
6
+ declare const centerOf: (rect: DOMRect) => import("./point").IPoint;
7
7
  export default centerOf;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sima-land/ui-nucleons",
3
- "version": "43.0.1",
3
+ "version": "43.1.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",
package/range/index.d.ts CHANGED
@@ -35,7 +35,7 @@ export declare class Range extends Component<RangeProps> {
35
35
  start: Container<number>;
36
36
  finish: Container<number>;
37
37
  activeBounds: [number, number];
38
- unsubscribers?: Array<() => void>;
38
+ unsubscribeList: Array<() => void>;
39
39
  activeThumbEl?: HTMLElement;
40
40
  isGrabbed?: boolean;
41
41
  /**
package/range/index.js CHANGED
@@ -67,6 +67,7 @@ class Range extends react_1.Component {
67
67
  this.rangeRef = (0, react_1.createRef)();
68
68
  this.startThumbRef = (0, react_1.createRef)();
69
69
  this.finishThumbRef = (0, react_1.createRef)();
70
+ this.unsubscribeList = [];
70
71
  this.start = (0, create_container_1.default)(readyStart);
71
72
  this.finish = (0, create_container_1.default)(readyFinish);
72
73
  this.activeBounds = [0, 0];
@@ -77,7 +78,7 @@ class Range extends react_1.Component {
77
78
  /** @inheritdoc */
78
79
  componentDidMount() {
79
80
  const { current: containerElem } = this.containerRef;
80
- this.unsubscribers = [
81
+ this.unsubscribeList = [
81
82
  (0, on_1.default)(window, 'mousemove', this.updateValues),
82
83
  (0, on_1.default)(window, 'touchmove', this.updateValues),
83
84
  (0, on_1.default)(window, 'mouseup', this.handleDragEnd),
@@ -103,7 +104,7 @@ class Range extends react_1.Component {
103
104
  }
104
105
  /** @inheritdoc */
105
106
  componentWillUnmount() {
106
- this.unsubscribers.forEach(fn => fn());
107
+ this.unsubscribeList.forEach(fn => fn());
107
108
  }
108
109
  /**
109
110
  * Обрабатывает событие как начало слежения за указателем/пальцем.
@@ -5,6 +5,7 @@ export interface TouchSliderProps {
5
5
  }
6
6
  /**
7
7
  * Компонент блока, прокручиваемого по горизонтали. Реализует отступы MobileLayout.
8
+ * Предназначен для использования на странице без дополнительных отступов по горизонтали.
8
9
  * @param props Свойства.
9
10
  * @return Элемент.
10
11
  */
@@ -7,15 +7,14 @@ exports.TouchSlider = void 0;
7
7
  const react_1 = __importDefault(require("react"));
8
8
  const layout_1 = require("../layout");
9
9
  const constants_1 = require("../constants");
10
- const bind_1 = __importDefault(require("classnames/bind"));
11
10
  const touch_slider_module_scss_1 = __importDefault(require("./touch-slider.module.scss"));
12
- const cx = bind_1.default.bind(touch_slider_module_scss_1.default);
13
11
  /**
14
12
  * Компонент блока, прокручиваемого по горизонтали. Реализует отступы MobileLayout.
13
+ * Предназначен для использования на странице без дополнительных отступов по горизонтали.
15
14
  * @param props Свойства.
16
15
  * @return Элемент.
17
16
  */
18
17
  const TouchSlider = ({ children }) => (react_1.default.createElement(layout_1.MobileLayout, null,
19
- react_1.default.createElement("div", Object.assign({ className: cx('outer', 'invisible-scroll') }, { [constants_1.BSL_IGNORE_ATTR]: true }),
20
- react_1.default.createElement("div", { className: cx('inner') }, children))));
18
+ react_1.default.createElement("div", Object.assign({ className: touch_slider_module_scss_1.default.outer }, { [constants_1.BSL_IGNORE_ATTR]: true }),
19
+ react_1.default.createElement("div", { className: touch_slider_module_scss_1.default.inner }, children))));
21
20
  exports.TouchSlider = TouchSlider;
@@ -1,22 +1,24 @@
1
+ @use '../breakpoints';
2
+ @use '../utils';
3
+
1
4
  .outer {
2
5
  display: flex;
3
6
  overflow: hidden;
4
7
  overflow-x: auto;
5
8
  -webkit-overflow-scrolling: touch;
6
- --slider-gutter: calc((100vw - var(--l-width)) / 2);
7
- margin: 0 calc(-1 * var(--slider-gutter));
9
+ @include utils.hidden-scrollbars;
8
10
  }
9
11
 
10
12
  .inner {
11
13
  display: flex;
12
- padding: 0 var(--slider-gutter);
13
14
  }
14
15
 
15
- .invisible-scroll {
16
- scrollbar-width: none; // Firefox
17
- overflow: -moz-scrollbars-none; // old Firefox
18
- -ms-overflow-style: none; // IE, old Edge
19
- &::-webkit-scrollbar {
20
- display: none; // Chrome, Safari, Opera
16
+ @include breakpoints.down('mm') {
17
+ .outer {
18
+ --slider-gutter: calc((100vw - var(--l-width)) / 2);
19
+ margin: 0 calc(-1 * var(--slider-gutter));
20
+ }
21
+ .inner {
22
+ padding: 0 var(--slider-gutter);
21
23
  }
22
24
  }
package/utils.scss ADDED
@@ -0,0 +1,9 @@
1
+ // скрывает полосы прокрутки у элемента
2
+ @mixin hidden-scrollbars {
3
+ scrollbar-width: none; // Firefox
4
+ overflow: -moz-scrollbars-none; // old Firefox
5
+ -ms-overflow-style: none; // IE, old Edge
6
+ &::-webkit-scrollbar {
7
+ display: none; // Chrome, Safari, Opera
8
+ }
9
+ }