@ozen-ui/kit 0.16.0 → 0.17.0-canary.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.
Files changed (132) hide show
  1. package/__inner__/cjs/components/DataList/DataList.css +19 -46
  2. package/__inner__/cjs/components/DataList/DataList.js +101 -40
  3. package/__inner__/cjs/components/DataList/components/DataListCheckIcon/DataListCheckIcon.css +13 -0
  4. package/__inner__/cjs/components/{Select/components/SelectCheckIcon/SelectCheckIcon.d.ts → DataList/components/DataListCheckIcon/DataListCheckIcon.d.ts} +2 -2
  5. package/__inner__/cjs/components/DataList/components/DataListCheckIcon/DataListCheckIcon.js +16 -0
  6. package/__inner__/cjs/components/DataList/components/DataListCheckIcon/index.d.ts +1 -0
  7. package/__inner__/cjs/components/DataList/components/DataListCheckIcon/index.js +4 -0
  8. package/__inner__/cjs/components/DataList/components/DataListOption/DataListOption.css +20 -0
  9. package/__inner__/{esm/components/DataList/components → cjs/components/DataList/components/DataListOption}/DataListOption.d.ts +15 -4
  10. package/__inner__/cjs/components/DataList/components/DataListOption/DataListOption.js +39 -0
  11. package/__inner__/cjs/components/DataList/components/DataListOption/index.d.ts +1 -0
  12. package/__inner__/cjs/components/{Select/components/SelectCheckIcon → DataList/components/DataListOption}/index.js +1 -1
  13. package/__inner__/cjs/components/DataList/constants.d.ts +1 -0
  14. package/__inner__/cjs/components/DataList/constants.js +3 -1
  15. package/__inner__/cjs/components/DataList/helpers/index.d.ts +4 -0
  16. package/__inner__/cjs/components/DataList/helpers/index.js +7 -0
  17. package/__inner__/cjs/components/DataList/helpers/lastSelectedValue.d.ts +1 -0
  18. package/__inner__/cjs/components/DataList/helpers/lastSelectedValue.js +8 -0
  19. package/__inner__/cjs/components/DataList/helpers/types.d.ts +10 -0
  20. package/__inner__/cjs/components/DataList/helpers/types.js +7 -0
  21. package/__inner__/cjs/components/DataList/helpers/useDataListNavigation.d.ts +23 -0
  22. package/__inner__/cjs/components/DataList/helpers/useDataListNavigation.js +85 -0
  23. package/__inner__/cjs/components/DataList/helpers/useScrollContainerToElement.d.ts +3 -0
  24. package/__inner__/cjs/components/DataList/helpers/useScrollContainerToElement.js +15 -0
  25. package/__inner__/cjs/components/DataList/types.d.ts +3 -4
  26. package/__inner__/cjs/components/DataList/types.js +0 -5
  27. package/__inner__/cjs/components/FieldControl/FieldControl.js +1 -0
  28. package/__inner__/cjs/components/IconButton/IconButton.css +1 -1
  29. package/__inner__/cjs/components/Input/Input.js +1 -1
  30. package/__inner__/cjs/components/Input/types.d.ts +3 -2
  31. package/__inner__/cjs/components/Select/Select.css +33 -128
  32. package/__inner__/cjs/components/Select/Select.d.ts +2 -3
  33. package/__inner__/cjs/components/Select/Select.js +92 -80
  34. package/__inner__/cjs/components/Select/components/SelectConsumer/SelectInputConsumer.d.ts +5 -0
  35. package/__inner__/cjs/components/Select/components/SelectConsumer/SelectInputConsumer.js +21 -0
  36. package/__inner__/cjs/components/Select/components/SelectConsumer/index.d.ts +1 -0
  37. package/__inner__/cjs/components/Select/components/SelectConsumer/index.js +4 -0
  38. package/__inner__/cjs/components/Select/components/SelectInput/SelectInput.d.ts +1 -72
  39. package/__inner__/cjs/components/Select/components/SelectInput/SelectInput.js +23 -22
  40. package/__inner__/cjs/components/Select/components/SelectInput/index.d.ts +1 -0
  41. package/__inner__/cjs/components/Select/components/SelectInput/index.js +1 -0
  42. package/__inner__/cjs/components/Select/components/SelectInput/types.d.ts +89 -0
  43. package/__inner__/cjs/components/Select/components/SelectInput/types.js +2 -0
  44. package/__inner__/cjs/components/Select/components/index.d.ts +0 -1
  45. package/__inner__/cjs/components/Select/components/index.js +0 -1
  46. package/__inner__/cjs/components/Select/constants.d.ts +1 -1
  47. package/__inner__/cjs/components/Select/constants.js +2 -2
  48. package/__inner__/cjs/components/Select/helpers/index.d.ts +1 -0
  49. package/__inner__/cjs/components/Select/helpers/index.js +4 -0
  50. package/__inner__/cjs/components/Select/helpers/types.d.ts +8 -0
  51. package/__inner__/cjs/components/Select/helpers/types.js +7 -0
  52. package/__inner__/cjs/components/Select/index.d.ts +2 -1
  53. package/__inner__/cjs/components/Select/index.js +5 -4
  54. package/__inner__/cjs/components/Select/types.d.ts +31 -18
  55. package/__inner__/cjs/components/Textarea/Textarea.js +1 -1
  56. package/__inner__/cjs/components/Textarea/types.d.ts +2 -2
  57. package/__inner__/cjs/utils/scrollContainerToElement.d.ts +3 -4
  58. package/__inner__/esm/components/DataList/DataList.css +19 -46
  59. package/__inner__/esm/components/DataList/DataList.js +101 -40
  60. package/__inner__/esm/components/DataList/components/DataListCheckIcon/DataListCheckIcon.css +13 -0
  61. package/__inner__/esm/components/{Select/components/SelectCheckIcon/SelectCheckIcon.d.ts → DataList/components/DataListCheckIcon/DataListCheckIcon.d.ts} +2 -2
  62. package/__inner__/esm/components/DataList/components/DataListCheckIcon/DataListCheckIcon.js +11 -0
  63. package/__inner__/esm/components/DataList/components/DataListCheckIcon/index.d.ts +1 -0
  64. package/__inner__/esm/components/DataList/components/DataListCheckIcon/index.js +1 -0
  65. package/__inner__/esm/components/DataList/components/DataListOption/DataListOption.css +20 -0
  66. package/__inner__/{cjs/components/DataList/components → esm/components/DataList/components/DataListOption}/DataListOption.d.ts +15 -4
  67. package/__inner__/esm/components/DataList/components/DataListOption/DataListOption.js +36 -0
  68. package/__inner__/esm/components/DataList/components/DataListOption/index.d.ts +1 -0
  69. package/__inner__/esm/components/DataList/components/DataListOption/index.js +1 -0
  70. package/__inner__/esm/components/DataList/constants.d.ts +1 -0
  71. package/__inner__/esm/components/DataList/constants.js +2 -0
  72. package/__inner__/esm/components/DataList/helpers/index.d.ts +4 -0
  73. package/__inner__/esm/components/DataList/helpers/index.js +4 -0
  74. package/__inner__/esm/components/DataList/helpers/lastSelectedValue.d.ts +1 -0
  75. package/__inner__/esm/components/DataList/helpers/lastSelectedValue.js +4 -0
  76. package/__inner__/esm/components/DataList/helpers/types.d.ts +10 -0
  77. package/__inner__/esm/components/DataList/helpers/types.js +2 -0
  78. package/__inner__/esm/components/DataList/helpers/useDataListNavigation.d.ts +23 -0
  79. package/__inner__/esm/components/DataList/helpers/useDataListNavigation.js +81 -0
  80. package/__inner__/esm/components/DataList/helpers/useScrollContainerToElement.d.ts +3 -0
  81. package/__inner__/esm/components/DataList/helpers/useScrollContainerToElement.js +11 -0
  82. package/__inner__/esm/components/DataList/types.d.ts +3 -4
  83. package/__inner__/esm/components/DataList/types.js +1 -2
  84. package/__inner__/esm/components/FieldControl/FieldControl.js +1 -0
  85. package/__inner__/esm/components/IconButton/IconButton.css +1 -1
  86. package/__inner__/esm/components/Input/Input.js +1 -1
  87. package/__inner__/esm/components/Input/types.d.ts +3 -2
  88. package/__inner__/esm/components/Select/Select.css +33 -128
  89. package/__inner__/esm/components/Select/Select.d.ts +2 -3
  90. package/__inner__/esm/components/Select/Select.js +96 -84
  91. package/__inner__/esm/components/Select/components/SelectConsumer/SelectInputConsumer.d.ts +5 -0
  92. package/__inner__/esm/components/Select/components/SelectConsumer/SelectInputConsumer.js +17 -0
  93. package/__inner__/esm/components/Select/components/SelectConsumer/index.d.ts +1 -0
  94. package/__inner__/esm/components/Select/components/SelectConsumer/index.js +1 -0
  95. package/__inner__/esm/components/Select/components/SelectInput/SelectInput.d.ts +1 -72
  96. package/__inner__/esm/components/Select/components/SelectInput/SelectInput.js +25 -24
  97. package/__inner__/esm/components/Select/components/SelectInput/index.d.ts +1 -0
  98. package/__inner__/esm/components/Select/components/SelectInput/index.js +1 -0
  99. package/__inner__/esm/components/Select/components/SelectInput/types.d.ts +89 -0
  100. package/__inner__/esm/components/Select/components/SelectInput/types.js +1 -0
  101. package/__inner__/esm/components/Select/components/index.d.ts +0 -1
  102. package/__inner__/esm/components/Select/components/index.js +0 -1
  103. package/__inner__/esm/components/Select/constants.d.ts +1 -1
  104. package/__inner__/esm/components/Select/constants.js +1 -1
  105. package/__inner__/esm/components/Select/helpers/index.d.ts +1 -0
  106. package/__inner__/esm/components/Select/helpers/index.js +1 -0
  107. package/__inner__/esm/components/Select/helpers/types.d.ts +8 -0
  108. package/__inner__/esm/components/Select/helpers/types.js +2 -0
  109. package/__inner__/esm/components/Select/index.d.ts +2 -1
  110. package/__inner__/esm/components/Select/index.js +2 -1
  111. package/__inner__/esm/components/Select/types.d.ts +31 -18
  112. package/__inner__/esm/components/Textarea/Textarea.js +1 -1
  113. package/__inner__/esm/components/Textarea/types.d.ts +2 -2
  114. package/__inner__/esm/utils/scrollContainerToElement.d.ts +3 -4
  115. package/package.json +1 -1
  116. package/__inner__/cjs/components/DataList/DataListProvider.d.ts +0 -16
  117. package/__inner__/cjs/components/DataList/DataListProvider.js +0 -11
  118. package/__inner__/cjs/components/DataList/components/DataListOption.js +0 -40
  119. package/__inner__/cjs/components/DataList/useDataListNavigation.d.ts +0 -23
  120. package/__inner__/cjs/components/DataList/useDataListNavigation.js +0 -109
  121. package/__inner__/cjs/components/Select/components/SelectCheckIcon/SelectCheckIcon.css +0 -13
  122. package/__inner__/cjs/components/Select/components/SelectCheckIcon/SelectCheckIcon.js +0 -14
  123. package/__inner__/cjs/components/Select/components/SelectCheckIcon/index.d.ts +0 -1
  124. package/__inner__/esm/components/DataList/DataListProvider.d.ts +0 -16
  125. package/__inner__/esm/components/DataList/DataListProvider.js +0 -7
  126. package/__inner__/esm/components/DataList/components/DataListOption.js +0 -37
  127. package/__inner__/esm/components/DataList/useDataListNavigation.d.ts +0 -23
  128. package/__inner__/esm/components/DataList/useDataListNavigation.js +0 -105
  129. package/__inner__/esm/components/Select/components/SelectCheckIcon/SelectCheckIcon.css +0 -13
  130. package/__inner__/esm/components/Select/components/SelectCheckIcon/SelectCheckIcon.js +0 -9
  131. package/__inner__/esm/components/Select/components/SelectCheckIcon/index.d.ts +0 -1
  132. package/__inner__/esm/components/Select/components/SelectCheckIcon/index.js +0 -1
@@ -1,10 +1,10 @@
1
- .DataList-List {
2
- --scroll-bar-size: 12px;
3
- }
4
- .DataList-List::-webkit-scrollbar {
1
+ .DataList {
2
+ --scroll-bar-size: 12px;
3
+ }
4
+ .DataList::-webkit-scrollbar {
5
5
  inline-size: var(--scroll-bar-size);
6
6
  }
7
- .DataList-List::-webkit-scrollbar-thumb {
7
+ .DataList::-webkit-scrollbar-thumb {
8
8
  background-color: var(--color-background-secondary);
9
9
  border-radius: calc(var(--scroll-bar-size) / 2);
10
10
  border: calc(var(--scroll-bar-size) / 4) solid transparent;
@@ -12,57 +12,30 @@
12
12
  border-image: initial;
13
13
  min-block-size: 24px;
14
14
  }
15
- .DataList-List::-webkit-scrollbar-thumb:hover,
16
- .DataList-List::-webkit-scrollbar-thumb:active {
15
+ .DataList::-webkit-scrollbar-thumb:hover,
16
+ .DataList::-webkit-scrollbar-thumb:active {
17
17
  border: calc(var(--scroll-bar-size) / 4) solid transparent;
18
18
  background-clip: padding-box;
19
19
  }
20
- .DataList-List::-webkit-scrollbar-thumb:hover {
20
+ .DataList::-webkit-scrollbar-thumb:hover {
21
21
  background-color: var(--color-background-secondary-hover);
22
22
  }
23
- .DataList-List::-webkit-scrollbar-thumb:active {
23
+ .DataList::-webkit-scrollbar-thumb:active {
24
24
  background-color: var(--color-background-secondary-pressed);
25
25
  }
26
- .DataList-List::-webkit-scrollbar-corner {
26
+ .DataList::-webkit-scrollbar-corner {
27
27
  background: transparent;
28
28
  }
29
- .DataList-List {
30
- overflow: hidden auto;
31
- max-block-size: 40vb;
29
+ .DataList {
30
+ overflow: hidden auto;
31
+ max-block-size: 40vb;
32
32
  }
33
- .DataList-Option {
34
- cursor: pointer;
35
- }
36
- .DataList-Option_focused {
37
- box-shadow: inset var(--shadow-outline-focused);
38
- }
39
- .DataList-Option_highlighted {
40
- background-color: var(--color-background-main-hover);
41
- }
42
- .DataList-Option_disabled {
43
- cursor: not-allowed;
44
- }
45
- .DataList-Option_disabled .ListItemText-TextPrimary,
46
- .DataList-Option_disabled .ListItemText-TextSecondary {
47
- color: var(--color-content-tertiary);
48
- }
49
- .DataList-IconWrapper {
50
- min-inline-size: var(--select-check-icon-size);
51
- min-block-size: var(--select-check-icon-size);
52
- display: flex;
53
- }
54
- .DataList-IconWrapper_size_s {
55
- --select-check-icon-size: 16px;
56
- }
57
- .DataList-IconWrapper_size_m {
58
- --select-check-icon-size: 24px;
59
- }
60
- .DataList_animation-enter {
33
+ .DataList-animation-enter {
61
34
  opacity: 0;
62
35
  transform: translate(0, calc(var(--space-s) * -1));
63
36
  pointer-events: none;
64
37
  }
65
- .DataList_animation-enter-active {
38
+ .DataList-animation-enter-active {
66
39
  opacity: 1;
67
40
  transition:
68
41
  opacity var(--transition-default),
@@ -70,16 +43,16 @@
70
43
  transform: translate(0);
71
44
  pointer-events: none;
72
45
  }
73
- .DataList_animation-enter-done {
46
+ .DataList-animation-enter-done {
74
47
  opacity: 1;
75
48
  transform: translate(0);
76
49
  }
77
- .DataList_animation-exit {
50
+ .DataList-animation-exit {
78
51
  opacity: 1;
79
52
  transform: translate(0);
80
53
  pointer-events: none;
81
54
  }
82
- .DataList_animation-exit-active {
55
+ .DataList-animation-exit-active {
83
56
  opacity: 0;
84
57
  transition:
85
58
  opacity var(--transition-default),
@@ -87,7 +60,7 @@
87
60
  transform: translate(0, calc(var(--space-s) * -1));
88
61
  pointer-events: none;
89
62
  }
90
- .DataList_animation-exit-done {
63
+ .DataList-animation-exit-done {
91
64
  opacity: 0;
92
65
  transform: translate(0, calc(var(--space-s) * -1));
93
66
  pointer-events: none;
@@ -3,7 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.DataList = exports.cnDataList = void 0;
4
4
  var tslib_1 = require("tslib");
5
5
  require("./DataList.css");
6
- var react_1 = tslib_1.__importDefault(require("react"));
6
+ var react_1 = tslib_1.__importStar(require("react"));
7
+ var react_is_1 = require("react-is");
7
8
  var useBoolean_1 = require("../../hooks/useBoolean");
8
9
  var useControlled_1 = require("../../hooks/useControlled");
9
10
  var useEventListener_1 = require("../../hooks/useEventListener");
@@ -15,58 +16,88 @@ var polymorphicComponentWithRef_1 = require("../../utils/polymorphicComponentWit
15
16
  var List_1 = require("../List");
16
17
  var Popover_1 = require("../Popover");
17
18
  var constants_1 = require("./constants");
18
- var DataListProvider_1 = require("./DataListProvider");
19
+ var helpers_1 = require("./helpers");
19
20
  var index_1 = require("./index");
20
- var useDataListNavigation_1 = require("./useDataListNavigation");
21
21
  exports.cnDataList = (0, classname_1.cn)('DataList');
22
22
  var DataListRender = function (inProps, ref) {
23
23
  var _a = (0, useThemeProps_1.useThemeProps)({ props: inProps, name: 'DataList' }), _b = _a.open, open = _b === void 0 ? constants_1.DATA_LIST_DEFAULT_OPEN : _b, _c = _a.size, size = _c === void 0 ? constants_1.DATA_LIST_DEFAULT_SIZE : _c, _d = _a.as, as = _d === void 0 ? constants_1.DATA_LIST_DEFAULT_TAG : _d, name = _a.name, children = _a.children, anchorRef = _a.anchorRef, selectedProp = _a.selected, defaultSelected = _a.defaultSelected, onClose = _a.onClose, onEnteredProp = _a.onEntered, onExitedProp = _a.onExited, listProps = _a.listProps, other = tslib_1.__rest(_a, ["open", "size", "as", "name", "children", "anchorRef", "selected", "defaultSelected", "onClose", "onEntered", "onExited", "listProps"]);
24
- // Состояние полностью представленного компонента
24
+ var listRef = (0, react_1.useRef)(null);
25
+ // Состояние представленного компонента с завершенной анимацией
25
26
  var _e = tslib_1.__read((0, useBoolean_1.useBoolean)(false), 2), opened = _e[0], _f = _e[1], onEntered = _f.on, onExited = _f.off;
26
27
  var _g = tslib_1.__read((0, useControlled_1.useControlled)({
27
28
  name: 'DataList',
28
29
  defaultValue: defaultSelected,
29
30
  value: selectedProp,
30
31
  state: 'selected',
31
- }), 2), selected = _g[0], setSelected = _g[1];
32
+ }), 2), selectedState = _g[0], setSelected = _g[1];
33
+ var nodes = (0, react_1.useMemo)(function () { return new Map(); }, [children]);
34
+ var resolvedChildren = (0, react_is_1.isFragment)(children)
35
+ ? children.props.children
36
+ : children;
37
+ var isNotSelectOption = function (child) {
38
+ return !(0, react_1.isValidElement)(child) ||
39
+ child.type !== index_1.DataListOption ||
40
+ !!child.props.disabled;
41
+ };
42
+ react_1.Children.forEach(resolvedChildren, function (child, idx) {
43
+ if (!isNotSelectOption(child)) {
44
+ nodes.set(child.props.value, idx);
45
+ }
46
+ });
32
47
  var handleSelect = function (event, value) {
33
- var _a, _b, _c;
34
- var res;
35
- var props = tslib_1.__assign(tslib_1.__assign({}, inProps), { selected: selected });
36
- if ((0, index_1.isMultipleParams)(props)) {
37
- res = ((_a = props.selected) === null || _a === void 0 ? void 0 : _a.includes(value))
38
- ? props.selected.filter(function (item) { return item !== value; })
39
- : tslib_1.__spreadArray(tslib_1.__spreadArray([], tslib_1.__read((selected || [])), false), [value], false);
40
- (_b = props.onSelect) === null || _b === void 0 ? void 0 : _b.call(props, event, { name: name, value: res });
48
+ var params = {
49
+ multiple: inProps.multiple,
50
+ onSelect: inProps.onSelect,
51
+ selected: selectedState,
52
+ setSelected: setSelected,
53
+ };
54
+ if ((0, helpers_1.isMultipleParams)(params)) {
55
+ var selected_1 = params.selected, onSelect = params.onSelect, setSelected_1 = params.setSelected;
56
+ var res = (selected_1 === null || selected_1 === void 0 ? void 0 : selected_1.includes(value || ''))
57
+ ? selected_1.filter(function (item) { return item !== value; })
58
+ : tslib_1.__spreadArray(tslib_1.__spreadArray([], tslib_1.__read((selected_1 || [])), false), [value], false);
59
+ onSelect === null || onSelect === void 0 ? void 0 : onSelect(event, { name: name, value: res });
60
+ setSelected_1(res);
41
61
  }
42
- if ((0, index_1.isNotMultipleParams)(props)) {
43
- res = value;
44
- (_c = props.onSelect) === null || _c === void 0 ? void 0 : _c.call(props, event, { name: name, value: value });
62
+ if ((0, helpers_1.isNotMultipleParams)(params)) {
63
+ var onSelect = params.onSelect, setSelected_2 = params.setSelected;
64
+ onSelect === null || onSelect === void 0 ? void 0 : onSelect(event, { name: name, value: value });
65
+ setSelected_2(value);
45
66
  }
46
- setSelected(res || '');
47
67
  };
48
- // Фиксируем последний выбранный элемент в списке, чтобы потом переводить на него scroll в контейнере
49
- var lastSelectedOption = Array.isArray(selected)
50
- ? selected[selected.length - 1]
51
- : selected;
52
- var _h = (0, useDataListNavigation_1.useDataListNavigation)({
53
- name: name,
68
+ // Навигация по списку
69
+ var _h = (0, helpers_1.useDataListNavigation)({
54
70
  active: opened,
55
- selected: lastSelectedOption,
56
- onSelect: function (e, selectedItem) {
57
- handleSelect(e, selectedItem);
71
+ items: tslib_1.__spreadArray([], tslib_1.__read(nodes.keys()), false),
72
+ current: (0, helpers_1.lastSelectedValue)(selectedState),
73
+ onSelect: function (event, item) {
74
+ handleSelect(event, item || '');
58
75
  },
59
- }), onKeyDown = _h.onKeyDown, listRef = _h.ref, navigation = tslib_1.__rest(_h, ["onKeyDown", "ref"]);
60
- // Назначает элементу контроля события управления списком с клавиатуры
76
+ }), selected = _h.selected, focused = _h.focused, highlighted = _h.highlighted, onKeyDown = _h.onKeyDown, onClick = _h.onClick, onMouseEnter = _h.onMouseEnter, onMouseLeave = _h.onMouseLeave;
77
+ var _j = tslib_1.__read((0, react_1.useState)({ current: null }), 2), selectedElRef = _j[0], setSelectedElRef = _j[1];
78
+ // Находит элемент по ключу
79
+ (0, react_1.useEffect)(function () {
80
+ var _a, _b;
81
+ var current = focused || selected || '';
82
+ var idx = nodes.get(current);
83
+ if (idx) {
84
+ setSelectedElRef({
85
+ current: (_b = (_a = listRef.current) === null || _a === void 0 ? void 0 : _a.children) === null || _b === void 0 ? void 0 : _b[idx],
86
+ });
87
+ }
88
+ }, [focused, selected]);
89
+ // Прокрутка списка
90
+ (0, helpers_1.useScrollContainerToElement)(listRef, selectedElRef, focused ? 'smooth' : 'instant');
91
+ // Назначает элементу контроля событие управления списком с клавиатуры
61
92
  (0, useEventListener_1.useEventListener)({
62
- active: open,
93
+ active: opened,
63
94
  eventName: 'keydown',
64
95
  element: anchorRef,
65
- handler: onKeyDown,
96
+ handler: function (event) {
97
+ onKeyDown === null || onKeyDown === void 0 ? void 0 : onKeyDown(event);
98
+ },
66
99
  });
67
- // Закрывает список нажатию клавиши {Tab}
68
- // Событие focusout может не срабатывать на устройствах iOS,
69
- // так как многие интерактивные элементы по клику не получают фокус.
100
+ // Закрывает список по нажатию на клавишу {Tab}
70
101
  (0, useEventListener_1.useEventListener)({
71
102
  active: open,
72
103
  eventName: 'keydown',
@@ -77,8 +108,39 @@ var DataListRender = function (inProps, ref) {
77
108
  }
78
109
  },
79
110
  });
111
+ // Представление раскрывающегося списка
112
+ var renderChildren = react_1.Children.map(resolvedChildren, function (child) {
113
+ if (isNotSelectOption(child)) {
114
+ return child;
115
+ }
116
+ var key = child.props.value;
117
+ var elementChild = child;
118
+ var props = {
119
+ onClick: function (event) {
120
+ var _a, _b;
121
+ onClick === null || onClick === void 0 ? void 0 : onClick(event, key);
122
+ (_b = (_a = child.props).onClick) === null || _b === void 0 ? void 0 : _b.call(_a, event);
123
+ },
124
+ onMouseEnter: function (event) {
125
+ var _a, _b;
126
+ onMouseEnter === null || onMouseEnter === void 0 ? void 0 : onMouseEnter(key);
127
+ (_b = (_a = child.props).onMouseEnter) === null || _b === void 0 ? void 0 : _b.call(_a, event);
128
+ },
129
+ onMouseLeave: function (event) {
130
+ var _a, _b;
131
+ onMouseLeave === null || onMouseLeave === void 0 ? void 0 : onMouseLeave();
132
+ (_b = (_a = child.props).onMouseLeave) === null || _b === void 0 ? void 0 : _b.call(_a, event);
133
+ },
134
+ highlighted: key === highlighted,
135
+ focused: key === focused,
136
+ selected: Array.isArray(selectedState)
137
+ ? selectedState.includes(key)
138
+ : selectedState === key,
139
+ };
140
+ return (0, react_1.cloneElement)(elementChild, tslib_1.__assign({}, props));
141
+ });
80
142
  return (react_1.default.createElement(Popover_1.Popover, tslib_1.__assign({ as: as, open: open, placement: "bottom-start", disableReturnFocus: true, disableEnforceFocus: true, offset: [0, 4], onClose: onClose, anchorRef: anchorRef, transitionProps: {
81
- classNames: (0, exports.cnDataList)({ animation: true }),
143
+ classNames: 'DataList-animation',
82
144
  } }, other, { onEntered: function () {
83
145
  onEntered();
84
146
  onEnteredProp === null || onEnteredProp === void 0 ? void 0 : onEnteredProp();
@@ -86,11 +148,10 @@ var DataListRender = function (inProps, ref) {
86
148
  onExited();
87
149
  onExitedProp === null || onExitedProp === void 0 ? void 0 : onExitedProp();
88
150
  }, ref: ref }),
89
- react_1.default.createElement(DataListProvider_1.DataListContext.Provider, { value: tslib_1.__assign({ selected: selected, size: size }, navigation) },
90
- react_1.default.createElement(List_1.List, tslib_1.__assign({ as: "ul", size: size }, listProps, { onMouseDown: function (e) {
91
- var _a;
92
- e.preventDefault();
93
- (_a = listProps === null || listProps === void 0 ? void 0 : listProps.onMouseDown) === null || _a === void 0 ? void 0 : _a.call(listProps, e);
94
- }, ref: (0, useMultiRef_1.useMultiRef)([listRef, listProps === null || listProps === void 0 ? void 0 : listProps.ref]), className: (0, exports.cnDataList)('List', [listProps === null || listProps === void 0 ? void 0 : listProps.className]) }), children))));
151
+ react_1.default.createElement(List_1.List, tslib_1.__assign({ as: "ul", size: size }, listProps, { onMouseDown: function (e) {
152
+ var _a;
153
+ e.preventDefault();
154
+ (_a = listProps === null || listProps === void 0 ? void 0 : listProps.onMouseDown) === null || _a === void 0 ? void 0 : _a.call(listProps, e);
155
+ }, ref: (0, useMultiRef_1.useMultiRef)([listRef, listProps === null || listProps === void 0 ? void 0 : listProps.ref]), className: (0, exports.cnDataList)('', [listProps === null || listProps === void 0 ? void 0 : listProps.className]) }), renderChildren)));
95
156
  };
96
157
  exports.DataList = (0, polymorphicComponentWithRef_1.polymorphicComponentWithRef)(DataListRender);
@@ -0,0 +1,13 @@
1
+ .DataListCheckIcon {
2
+ inline-size: var(--data-list-check-icon-size);
3
+ block-size: var(--data-list-check-icon-size);
4
+ display: flex;
5
+ }
6
+
7
+ .DataListCheckIcon_size_s {
8
+ --data-list-check-icon-size: 16px;
9
+ }
10
+
11
+ .DataListCheckIcon_size_m {
12
+ --data-list-check-icon-size: 24px;
13
+ }
@@ -1,8 +1,8 @@
1
- import './SelectCheckIcon.css';
1
+ import './DataListCheckIcon.css';
2
2
  import React from 'react';
3
3
  import { type IconSize } from '@ozen-ui/icons';
4
4
  export type SelectCheckIconProps = {
5
5
  size?: IconSize;
6
6
  selected?: boolean;
7
7
  };
8
- export declare const SelectCheckIcon: React.FC<SelectCheckIconProps>;
8
+ export declare const DataListCheckIcon: React.FC<SelectCheckIconProps>;
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DataListCheckIcon = void 0;
4
+ var tslib_1 = require("tslib");
5
+ require("./DataListCheckIcon.css");
6
+ var react_1 = tslib_1.__importDefault(require("react"));
7
+ var icons_1 = require("@ozen-ui/icons");
8
+ var classname_1 = require("../../../../utils/classname");
9
+ var List_1 = require("../../../List");
10
+ var cnDataListCheckIcon = (0, classname_1.cn)('DataListCheckIcon');
11
+ var DataListCheckIcon = function (_a) {
12
+ var size = _a.size, selected = _a.selected;
13
+ return (react_1.default.createElement("div", { className: cnDataListCheckIcon('', { size: size }) }, selected && (react_1.default.createElement(List_1.ListItemIcon, null,
14
+ react_1.default.createElement(icons_1.TickIcon, { size: size })))));
15
+ };
16
+ exports.DataListCheckIcon = DataListCheckIcon;
@@ -0,0 +1 @@
1
+ export * from './DataListCheckIcon';
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ var tslib_1 = require("tslib");
4
+ tslib_1.__exportStar(require("./DataListCheckIcon"), exports);
@@ -0,0 +1,20 @@
1
+ .DataListOption {
2
+ cursor: pointer;
3
+ }
4
+
5
+ .DataListOption_focused {
6
+ box-shadow: inset var(--shadow-outline-focused);
7
+ }
8
+
9
+ .DataListOption_highlighted {
10
+ background-color: var(--color-background-main-hover);
11
+ }
12
+
13
+ .DataListOption_disabled {
14
+ cursor: not-allowed;
15
+ }
16
+
17
+ .DataListOption_disabled .ListItemText-TextPrimary,
18
+ .DataListOption_disabled .ListItemText-TextSecondary {
19
+ color: var(--color-content-tertiary);
20
+ }
@@ -1,10 +1,21 @@
1
+ import './DataListOption.css';
1
2
  import React from 'react';
2
3
  import type { KeyboardEventHandler, MouseEventHandler, ReactNode, ComponentPropsWithRef } from 'react';
4
+ import type { DATA_LIST_OPTION_DEFAULT_TAG } from '../../constants';
5
+ export declare const cnDataListOption: import("@bem-react/classname").ClassNameFormatter;
3
6
  export type DataListOptionProps = {
7
+ /** Значение опции */
8
+ value: string | number;
9
+ /** Лейбл опции */
10
+ label?: string;
4
11
  /** Если {true} отображает опцию заблокированной */
5
12
  disabled?: boolean;
6
- /** Значение, если оно отличается от содержимого опции */
7
- value: string;
13
+ /** Если {true} отображает опцию сфокусированной (клавиатура) */
14
+ focused?: boolean;
15
+ /** Если {true} отображает опцию наведенной (мышь) */
16
+ highlighted?: boolean;
17
+ /** Если {true} отображает опцию выбранной */
18
+ selected?: boolean;
8
19
  /** Функция обратного вызова обработчик нажатий на клавиатуре */
9
20
  onKeyDown?: KeyboardEventHandler<HTMLLIElement>;
10
21
  /** Функция обратного вызова обработчик нажатий на клавиатуре */
@@ -12,6 +23,6 @@ export type DataListOptionProps = {
12
23
  /** Функция обратного вызова обработчик нажатий на клавиатуре */
13
24
  onMouseLeave?: MouseEventHandler<HTMLLIElement>;
14
25
  /** Содержимое компонента */
15
- children: ReactNode;
16
- } & ComponentPropsWithRef<'li'>;
26
+ children?: ReactNode;
27
+ } & Omit<ComponentPropsWithRef<typeof DATA_LIST_OPTION_DEFAULT_TAG>, 'value'>;
17
28
  export declare const DataListOption: React.ForwardRefExoticComponent<Omit<DataListOptionProps, "ref"> & React.RefAttributes<HTMLLIElement>>;
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DataListOption = exports.cnDataListOption = void 0;
4
+ var tslib_1 = require("tslib");
5
+ require("./DataListOption.css");
6
+ var react_1 = tslib_1.__importStar(require("react"));
7
+ var classname_1 = require("../../../../utils/classname");
8
+ var getIconSizeToFormElement_1 = require("../../../../utils/getIconSizeToFormElement");
9
+ var isString_1 = require("../../../../utils/isString");
10
+ var List_1 = require("../../../List");
11
+ var constants_1 = require("../../constants");
12
+ var DataListCheckIcon_1 = require("../DataListCheckIcon");
13
+ exports.cnDataListOption = (0, classname_1.cn)('DataListOption');
14
+ var DataListContent = function (_a) {
15
+ var label = _a.label, selected = _a.selected;
16
+ var size = (0, List_1.useListContext)().size;
17
+ var iconSize = (0, getIconSizeToFormElement_1.getIconSizeToFormElement)(size);
18
+ return (react_1.default.createElement(react_1.default.Fragment, null,
19
+ react_1.default.createElement(List_1.ListItemText, { className: (0, exports.cnDataListOption)('Text'), primary: label }),
20
+ react_1.default.createElement(DataListCheckIcon_1.DataListCheckIcon, { selected: selected, size: iconSize })));
21
+ };
22
+ exports.DataListOption = (0, react_1.forwardRef)(function (_a, ref) {
23
+ var _b = _a.disabled, disabled = _b === void 0 ? constants_1.DATA_LIST_OPTION_DEFAULT_DISABLED : _b, value = _a.value, label = _a.label, children = _a.children, className = _a.className, highlighted = _a.highlighted, selected = _a.selected, focused = _a.focused, other = tslib_1.__rest(_a, ["disabled", "value", "label", "children", "className", "highlighted", "selected", "focused"]);
24
+ var renderChildren = function () {
25
+ if ((0, isString_1.isString)(children)) {
26
+ return react_1.default.createElement(DataListContent, { label: children, selected: selected });
27
+ }
28
+ if (label && !children) {
29
+ return react_1.default.createElement(DataListContent, { label: label, selected: selected });
30
+ }
31
+ return children;
32
+ };
33
+ return (react_1.default.createElement(List_1.ListItem, tslib_1.__assign({ role: "option", "aria-selected": selected, "aria-disabled": disabled, "data-label": label, "data-value": value, className: (0, exports.cnDataListOption)({
34
+ disabled: disabled,
35
+ highlighted: !disabled && highlighted,
36
+ focused: !disabled && focused,
37
+ }, [className]) }, other, { ref: ref }), renderChildren()));
38
+ });
39
+ exports.DataListOption.displayName = 'DataListOption';
@@ -0,0 +1 @@
1
+ export * from './DataListOption';
@@ -1,4 +1,4 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  var tslib_1 = require("tslib");
4
- tslib_1.__exportStar(require("./SelectCheckIcon"), exports);
4
+ tslib_1.__exportStar(require("./DataListOption"), exports);
@@ -2,3 +2,4 @@ export declare const DATA_LIST_DEFAULT_TAG: import("../../utils/polymorphicCompo
2
2
  export declare const DATA_LIST_DEFAULT_SIZE = "m";
3
3
  export declare const DATA_LIST_DEFAULT_OPEN = false;
4
4
  export declare const DATA_LIST_OPTION_DEFAULT_DISABLED = false;
5
+ export declare const DATA_LIST_OPTION_DEFAULT_TAG = "li";
@@ -1,8 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DATA_LIST_OPTION_DEFAULT_DISABLED = exports.DATA_LIST_DEFAULT_OPEN = exports.DATA_LIST_DEFAULT_SIZE = exports.DATA_LIST_DEFAULT_TAG = void 0;
3
+ exports.DATA_LIST_OPTION_DEFAULT_TAG = exports.DATA_LIST_OPTION_DEFAULT_DISABLED = exports.DATA_LIST_DEFAULT_OPEN = exports.DATA_LIST_DEFAULT_SIZE = exports.DATA_LIST_DEFAULT_TAG = void 0;
4
+ var constants_1 = require("../List/constants");
4
5
  var Paper_1 = require("../Paper");
5
6
  exports.DATA_LIST_DEFAULT_TAG = Paper_1.Paper;
6
7
  exports.DATA_LIST_DEFAULT_SIZE = 'm';
7
8
  exports.DATA_LIST_DEFAULT_OPEN = false;
8
9
  exports.DATA_LIST_OPTION_DEFAULT_DISABLED = false;
10
+ exports.DATA_LIST_OPTION_DEFAULT_TAG = constants_1.LIST_ITEM_DEFAULT_TAG;
@@ -0,0 +1,4 @@
1
+ export * from './lastSelectedValue';
2
+ export * from './types';
3
+ export * from './useDataListNavigation';
4
+ export * from './useScrollContainerToElement';
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ var tslib_1 = require("tslib");
4
+ tslib_1.__exportStar(require("./lastSelectedValue"), exports);
5
+ tslib_1.__exportStar(require("./types"), exports);
6
+ tslib_1.__exportStar(require("./useDataListNavigation"), exports);
7
+ tslib_1.__exportStar(require("./useScrollContainerToElement"), exports);
@@ -0,0 +1 @@
1
+ export declare const lastSelectedValue: <T>(selected: T) => any;
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.lastSelectedValue = void 0;
4
+ // Фиксируем последний выбранный элемент в списке, чтобы потом переводить на него scroll в контейнере
5
+ var lastSelectedValue = function (selected) {
6
+ return Array.isArray(selected) ? selected[selected.length - 1] : selected;
7
+ };
8
+ exports.lastSelectedValue = lastSelectedValue;
@@ -0,0 +1,10 @@
1
+ import type { DataListBaseProps, DataListSelected } from '../index';
2
+ export type SetSelect<MULTIPLE extends boolean> = (newValue: DataListSelected<MULTIPLE>) => void;
3
+ export type SelectedParams<MULTIPLE extends boolean = false> = {
4
+ multiple: DataListBaseProps<MULTIPLE>['multiple'];
5
+ onSelect: DataListBaseProps<MULTIPLE>['onSelect'];
6
+ selected: DataListSelected<MULTIPLE>;
7
+ setSelected: SetSelect<MULTIPLE>;
8
+ };
9
+ export declare const isMultipleParams: (params: SelectedParams<boolean>) => params is SelectedParams<true>;
10
+ export declare const isNotMultipleParams: (params: SelectedParams<boolean>) => params is SelectedParams<false>;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isNotMultipleParams = exports.isMultipleParams = void 0;
4
+ var isMultipleParams = function (params) { return !!params.multiple; };
5
+ exports.isMultipleParams = isMultipleParams;
6
+ var isNotMultipleParams = function (params) { return !params.multiple; };
7
+ exports.isNotMultipleParams = isNotMultipleParams;
@@ -0,0 +1,23 @@
1
+ import type { MouseEvent } from 'react';
2
+ export type UseListNavigationItem = string | number | null;
3
+ export type UseListNavigationItems = UseListNavigationItem[];
4
+ export type UseListNavigationProps = {
5
+ active?: boolean;
6
+ items?: UseListNavigationItems;
7
+ current?: UseListNavigationItem;
8
+ onSelect?: (event: KeyboardEvent | MouseEvent<HTMLElement>, item?: UseListNavigationItem) => void;
9
+ };
10
+ export type UseListNavigationState = {
11
+ focused?: UseListNavigationItem;
12
+ selected?: UseListNavigationItem;
13
+ highlighted?: UseListNavigationItem;
14
+ };
15
+ export type UseListNavigationEvents = {
16
+ onMouseLeave?: () => void;
17
+ onKeyDown?: (event: KeyboardEvent) => void;
18
+ onClick?: (event: MouseEvent<HTMLElement>, item: UseListNavigationItem) => void;
19
+ onMouseEnter?: (item: UseListNavigationItem) => void;
20
+ };
21
+ export type UseListNavigationReturn = UseListNavigationState & UseListNavigationEvents;
22
+ /** Навигация по элементам списка без перехвата фокуса с элемента контроля */
23
+ export declare function useDataListNavigation({ current, onSelect, active, items: itemsProps, }: UseListNavigationProps): UseListNavigationReturn;
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useDataListNavigation = void 0;
4
+ var tslib_1 = require("tslib");
5
+ var react_1 = require("react");
6
+ var getNextIndex_1 = require("../../../utils/getNextIndex");
7
+ var getPrevIndex_1 = require("../../../utils/getPrevIndex");
8
+ var isKey_1 = require("../../../utils/isKey");
9
+ /** Навигация по элементам списка без перехвата фокуса с элемента контроля */
10
+ function useDataListNavigation(_a) {
11
+ var current = _a.current, onSelect = _a.onSelect, _b = _a.active, active = _b === void 0 ? false : _b, itemsProps = _a.items;
12
+ var savedItems = (0, react_1.useRef)(itemsProps);
13
+ var savedOnSelect = (0, react_1.useRef)();
14
+ (0, react_1.useEffect)(function () {
15
+ savedItems.current = itemsProps;
16
+ }, [itemsProps]);
17
+ (0, react_1.useEffect)(function () {
18
+ savedOnSelect.current = onSelect;
19
+ }, [onSelect]);
20
+ var _c = tslib_1.__read((0, react_1.useState)({}), 2), state = _c[0], setState = _c[1];
21
+ var findInItems = function (value) { var _a; return (_a = savedItems.current) === null || _a === void 0 ? void 0 : _a.find(function (item) { return item === value; }); };
22
+ // Актуализирует состояние при каждом изменении текущего значения
23
+ (0, react_1.useEffect)(function () {
24
+ if (active) {
25
+ setState(function (prevState) {
26
+ var _a, _b, _c;
27
+ return (tslib_1.__assign(tslib_1.__assign({}, prevState), { focused: (_a = findInItems(prevState.focused)) !== null && _a !== void 0 ? _a : null, selected: (_b = findInItems(current)) !== null && _b !== void 0 ? _b : (_c = savedItems.current) === null || _c === void 0 ? void 0 : _c[0] }));
28
+ });
29
+ }
30
+ }, [active, current]);
31
+ (0, react_1.useEffect)(function () {
32
+ if (!active) {
33
+ return undefined;
34
+ }
35
+ // Инициализация всех событий
36
+ var onMouseLeave = function () {
37
+ setState(function (prevState) { return (tslib_1.__assign(tslib_1.__assign({}, prevState), { highlighted: null })); });
38
+ };
39
+ var onMouseEnter = function (item) {
40
+ setState(function (prevState) { return (tslib_1.__assign(tslib_1.__assign({}, prevState), { highlighted: item })); });
41
+ };
42
+ var onClick = function (event, item) {
43
+ var _a;
44
+ setState(function (prevState) { return (tslib_1.__assign(tslib_1.__assign({}, prevState), { focused: item === prevState.focused ? item : null, selected: item })); });
45
+ (_a = savedOnSelect.current) === null || _a === void 0 ? void 0 : _a.call(savedOnSelect, event, item);
46
+ };
47
+ var onKeyDown = function (event) {
48
+ var _a;
49
+ if ((0, isKey_1.isKey)(event, 'Enter')) {
50
+ event.preventDefault();
51
+ var selected_1;
52
+ setState(function (prevState) {
53
+ var _a;
54
+ selected_1 = (_a = prevState.focused) !== null && _a !== void 0 ? _a : prevState.selected;
55
+ return tslib_1.__assign(tslib_1.__assign({}, prevState), { selected: selected_1, focused: selected_1 });
56
+ });
57
+ (_a = savedOnSelect.current) === null || _a === void 0 ? void 0 : _a.call(savedOnSelect, event, selected_1);
58
+ }
59
+ if (!(0, isKey_1.isKey)(event, 'ArrowUp') && !(0, isKey_1.isKey)(event, 'ArrowDown')) {
60
+ return;
61
+ }
62
+ event.preventDefault();
63
+ setState(function (prevState) {
64
+ var _a, _b, _c, _d, _e;
65
+ var selected = (_a = prevState.focused) !== null && _a !== void 0 ? _a : prevState.selected;
66
+ var currentIndex = typeof selected !== 'undefined'
67
+ ? (_b = savedItems.current) === null || _b === void 0 ? void 0 : _b.indexOf(selected)
68
+ : null;
69
+ var isArrowUp = (0, isKey_1.isKey)(event, 'ArrowUp');
70
+ var newIndex = isArrowUp
71
+ ? (0, getPrevIndex_1.getPrevIndex)(currentIndex !== null && currentIndex !== void 0 ? currentIndex : 0, ((_c = savedItems.current) === null || _c === void 0 ? void 0 : _c.length) || 0)
72
+ : (0, getNextIndex_1.getNextIndex)(currentIndex !== null && currentIndex !== void 0 ? currentIndex : -1, ((_d = savedItems.current) === null || _d === void 0 ? void 0 : _d.length) || 0);
73
+ var newItem = (_e = savedItems.current) === null || _e === void 0 ? void 0 : _e[newIndex];
74
+ return tslib_1.__assign(tslib_1.__assign({}, prevState), { focused: newItem });
75
+ });
76
+ };
77
+ setState(function (prevState) { return (tslib_1.__assign(tslib_1.__assign({}, prevState), { onClick: onClick, onKeyDown: onKeyDown, onMouseEnter: onMouseEnter, onMouseLeave: onMouseLeave })); });
78
+ return function () {
79
+ // Сброс
80
+ setState({});
81
+ };
82
+ }, [active]);
83
+ return state;
84
+ }
85
+ exports.useDataListNavigation = useDataListNavigation;