@snack-uikit/list 0.11.1 → 0.11.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,18 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## 0.11.2 (2024-04-25)
7
+
8
+
9
+ ### Bug Fixes
10
+
11
+ * **PDS-0000:** fix arrowRight key event handle ([50b911f](https://github.com/cloud-ru-tech/snack-uikit/commit/50b911fde10d9f7eff1a46728329f47070645b8f))
12
+ * **PDS-0000:** set default button type as button ([4ec64de](https://github.com/cloud-ru-tech/snack-uikit/commit/4ec64de508826df4a1e82fd8c75448d9919e563f))
13
+
14
+
15
+
16
+
17
+
6
18
  ## 0.11.1 (2024-04-23)
7
19
 
8
20
 
package/README.md CHANGED
@@ -12,7 +12,7 @@
12
12
  ### Props
13
13
  | name | type | default value | description |
14
14
  |------|------|---------------|-------------|
15
- | items* | `any[]` | - | |
15
+ | items* | `Item[]` | - | |
16
16
  | prefix | `ItemId` | - | |
17
17
  | parentId | `ItemId` | - | |
18
18
  ## isAccordionItem
@@ -55,24 +55,74 @@
55
55
  ### Props
56
56
  | name | type | default value | description |
57
57
  |------|------|---------------|-------------|
58
- | triggerClassName* | `DropdownProps` | - | |
59
- | onOpenChange* | `DropdownProps` | - | |
60
- | open* | `DropdownProps` | - | |
61
- | widthStrategy* | `DropdownProps` | - | |
62
- | placement* | `DropdownProps` | - | |
63
- | trigger* | `DropdownProps` | - | |
58
+ | items* | `Item[]` | - | Основные элементы списка |
64
59
  | children* | `ReactNode \| ({onKeyDown}) => ReactNode * Рендер функция принимает аргументы `onKeyDown` - хендлер ввода, для поддержки управления с клавиатуры` | - | Триггер для дроплиста |
65
60
  | triggerElemRef | `RefObject<HTMLElement>` | - | Ссылка на элемент-триггер для дроплиста |
61
+ | triggerClassName | `string` | - | CSS-класс триггера |
62
+ | open | `boolean` | - | Управляет состоянием показан/не показан. |
63
+ | onOpenChange | `(isOpen: boolean) => void` | - | Колбек отображения компонента. Срабатывает при изменении состояния open. |
64
+ | widthStrategy | enum PopoverWidthStrategy: `"auto"`, `"gte"`, `"eq"` | auto | Стратегия управления шириной контейнера поповера <br> - `auto` - соответствует ширине контента, <br> - `gte` - Great Than or Equal, равен ширине таргета или больше ее, если контент в поповере шире, <br> - `eq` - Equal, строго равен ширине таргета. |
65
+ | trigger | enum Trigger: `"click"`, `"hover"`, `"focusVisible"`, `"focus"`, `"hoverAndFocusVisible"`, `"hoverAndFocus"`, `"clickAndFocusVisible"` | - | Условие отображения поповера: <br> - `click` - открывать по клику <br> - `hover` - открывать по ховеру <br> - `focusVisible` - открывать по focus-visible <br> - `focus` - открывать по фокусу <br> - `hoverAndFocusVisible` - открывать по ховеру и focus-visible <br> - `hoverAndFocus` - открывать по ховеру и фокусу <br> - `clickAndFocusVisible` - открывать по клику и focus-visible |
66
+ | placement | enum Placement: `"left"`, `"left-start"`, `"left-end"`, `"right"`, `"right-start"`, `"right-end"`, `"top"`, `"top-start"`, `"top-end"`, `"bottom"`, `"bottom-start"`, `"bottom-end"` | top | Положение поповера относительно своего триггера (children). |
67
+ | className | `string` | - | CSS-класс |
68
+ | pinTop | `Item[]` | - | Элементы списка, закрепленные сверху |
69
+ | pinBottom | `Item[]` | - | Элементы списка, закрепленные снизу |
70
+ | footer | `ReactNode ;` | - | Кастомизируемый элемент в конце списка |
71
+ | footerActiveElementsRefs | `RefObject<HTMLElement>[]` | - | Список ссылок на кастомные элементы, помещенные в специальную секцию внизу списка |
72
+ | search | `SearchState` | - | Настройки поисковой строки |
73
+ | collapse | `CollapseState` | {} | Настройки раскрытия элементов |
74
+ | loading | `boolean` | - | Флаг, отвещающий за состояние загрузки списка |
75
+ | selection | `SelectionSingleState \| SelectionMultipleState` | - | |
76
+ | size | "s" \| "m" \| "l" | s | Размер списка |
77
+ | marker | `boolean` | true | Отображать ли маркер у выбранного жлемента списка |
78
+ | contentRender | `(props: ContentRenderProps) => ReactNode` | - | Рендер функция основного контента айтема |
79
+ | scroll | `boolean` | - | Включить ли скролл для основной части списка |
80
+ | scrollRef | `RefObject<HTMLElement>` | - | Ссылка на элемент, обозначающий самый конец прокручиваемого списка |
81
+ | scrollContainerRef | `RefObject<HTMLElement>` | - | Ссылка на контейнер, который скроллится |
82
+ | dataFiltered | `boolean` | - | |
83
+ | dataError | `boolean` | - | |
84
+ | noDataState | `EmptyStateProps` | - | Экран при отстутствии данных |
85
+ | noResultsState | `EmptyStateProps` | - | Экран при отстутствии результатов поиска или фильтров |
86
+ | errorDataState | `EmptyStateProps` | - | Экран при ошибке запроса |
66
87
  ## List
67
88
  ### Props
68
89
  | name | type | default value | description |
69
90
  |------|------|---------------|-------------|
91
+ | items* | `Item[]` | - | Основные элементы списка |
92
+ | pinTop | `Item[]` | - | Элементы списка, закрепленные сверху |
93
+ | pinBottom | `Item[]` | - | Элементы списка, закрепленные снизу |
94
+ | footer | `ReactNode ;` | - | Кастомизируемый элемент в конце списка |
95
+ | footerActiveElementsRefs | `RefObject<HTMLElement>[]` | - | Список ссылок на кастомные элементы, помещенные в специальную секцию внизу списка |
96
+ | search | `SearchState` | - | Настройки поисковой строки |
97
+ | tabIndex | `number` | - | Tab Index |
98
+ | collapse | `CollapseState` | {} | Настройки раскрытия элементов |
99
+ | className | `string` | - | CSS-класс |
100
+ | onKeyDown | `(e: KeyboardEvent<HTMLElement>) => void` | - | |
101
+ | loading | `boolean` | - | Флаг, отвещающий за состояние загрузки списка |
102
+ | selection | `SelectionSingleState \| SelectionMultipleState` | - | |
103
+ | size | "s" \| "m" \| "l" | s | Размер списка |
104
+ | marker | `boolean` | true | Отображать ли маркер у выбранного жлемента списка |
105
+ | contentRender | `(props: ContentRenderProps) => ReactNode` | - | Рендер функция основного контента айтема |
106
+ | scroll | `boolean` | - | Включить ли скролл для основной части списка |
107
+ | scrollRef | `RefObject<HTMLElement>` | - | Ссылка на элемент, обозначающий самый конец прокручиваемого списка |
108
+ | scrollContainerRef | `RefObject<HTMLElement>` | - | Ссылка на контейнер, который скроллится |
109
+ | dataFiltered | `boolean` | - | |
110
+ | dataError | `boolean` | - | |
111
+ | noDataState | `EmptyStateProps` | - | Экран при отстутствии данных |
112
+ | noResultsState | `EmptyStateProps` | - | Экран при отстутствии результатов поиска или фильтров |
113
+ | errorDataState | `EmptyStateProps` | - | Экран при ошибке запроса |
70
114
  | ref | `Ref<HTMLElement>` | - | Allows getting a ref to the component instance. Once the component unmounts, React will set `ref.current` to `null` (or call the ref with `null` if you passed a callback ref). @see https://react.dev/learn/referencing-values-with-refs#refs-and-the-dom |
71
115
  | key | `Key` | - | |
72
116
  ## ItemContent
73
117
  ### Props
74
118
  | name | type | default value | description |
75
119
  |------|------|---------------|-------------|
120
+ | option* | `string \| number` | - | |
121
+ | caption | `string` | - | |
122
+ | description | `string` | - | |
123
+ | truncate | `{ option?: number; description?: number; variant?: "end" \| "middle"; }` | - | |
124
+ | disabled | `boolean` | - | |
125
+ | className | `string` | - | CSS-класс |
76
126
 
77
127
 
78
128
  [//]: DOCUMENTATION_SECTION_END
@@ -44,8 +44,8 @@ export function BaseItem(_a) {
44
44
  };
45
45
  const handleItemKeyDown = (e) => {
46
46
  onKeyDown === null || onKeyDown === void 0 ? void 0 : onKeyDown(e);
47
- if (e.key === 'ArrowRight') {
48
- onOpenNestedList === null || onOpenNestedList === void 0 ? void 0 : onOpenNestedList(e);
47
+ if (e.key === 'ArrowRight' && onOpenNestedList) {
48
+ onOpenNestedList(e);
49
49
  e.preventDefault();
50
50
  e.stopPropagation();
51
51
  return;
@@ -10,10 +10,6 @@ export function SearchItem({ search, itemRef }) {
10
10
  if (['ArrowDown', 'ArrowUp'].includes(e.key)) {
11
11
  e.preventDefault();
12
12
  }
13
- if (['ArrowRight'].includes(e.key)) {
14
- e.stopPropagation();
15
- e.preventDefault();
16
- }
17
13
  };
18
14
  const handleFocus = (e) => {
19
15
  e.stopPropagation();
@@ -63,9 +63,9 @@ export function useNewKeyboardNavigation({ mainRef, btnRef, focusFlattenItems, }
63
63
  activeItemIdRef.current = newItemId;
64
64
  setActiveItemId(newItemId);
65
65
  setTimeout(() => { var _a, _b; return (_b = (_a = newItem.itemRef) === null || _a === void 0 ? void 0 : _a.current) === null || _b === void 0 ? void 0 : _b.focus(); }, 0);
66
+ e.stopPropagation();
67
+ e.preventDefault();
66
68
  }
67
- e.stopPropagation();
68
- e.preventDefault();
69
69
  return;
70
70
  }
71
71
  case 'Tab': {
@@ -13,5 +13,5 @@ export const HiddenTabButton = forwardRef(({ listRef, tabIndex }, ref) => {
13
13
  const handleKeyDown = useCallback((e) => {
14
14
  e.stopPropagation();
15
15
  }, []);
16
- return (_jsx("button", { "aria-hidden": true, ref: ref, onKeyDown: handleKeyDown, onFocus: handleFocus, className: styles.hiddenBtn, tabIndex: tabIndex }));
16
+ return (_jsx("button", { type: 'button', "aria-hidden": true, ref: ref, onKeyDown: handleKeyDown, onFocus: handleFocus, className: styles.hiddenBtn, tabIndex: tabIndex }));
17
17
  });
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "access": "public"
5
5
  },
6
6
  "title": "List",
7
- "version": "0.11.1",
7
+ "version": "0.11.2",
8
8
  "sideEffects": [
9
9
  "*.css",
10
10
  "*.woff",
@@ -49,5 +49,5 @@
49
49
  "peerDependencies": {
50
50
  "@snack-uikit/locale": "*"
51
51
  },
52
- "gitHead": "bf1e1f3cfabccc1ee288c18722e33009bd001798"
52
+ "gitHead": "17bfcf1150776cd35c77d9cca8f45dde97472bf1"
53
53
  }
@@ -81,8 +81,8 @@ export function BaseItem({
81
81
  const handleItemKeyDown = (e: KeyboardEvent<HTMLElement>) => {
82
82
  onKeyDown?.(e);
83
83
 
84
- if (e.key === 'ArrowRight') {
85
- onOpenNestedList?.(e);
84
+ if (e.key === 'ArrowRight' && onOpenNestedList) {
85
+ onOpenNestedList(e);
86
86
 
87
87
  e.preventDefault();
88
88
  e.stopPropagation();
@@ -20,11 +20,6 @@ export function SearchItem({ search, itemRef }: SearchItemProps) {
20
20
  if (['ArrowDown', 'ArrowUp'].includes(e.key)) {
21
21
  e.preventDefault();
22
22
  }
23
-
24
- if (['ArrowRight'].includes(e.key)) {
25
- e.stopPropagation();
26
- e.preventDefault();
27
- }
28
23
  };
29
24
 
30
25
  const handleFocus = (e: FocusEvent<HTMLInputElement>) => {
@@ -92,10 +92,10 @@ export function useNewKeyboardNavigation<T extends HTMLElement>({
92
92
  setActiveItemId(newItemId);
93
93
 
94
94
  setTimeout(() => newItem.itemRef?.current?.focus(), 0);
95
- }
96
95
 
97
- e.stopPropagation();
98
- e.preventDefault();
96
+ e.stopPropagation();
97
+ e.preventDefault();
98
+ }
99
99
 
100
100
  return;
101
101
  }
@@ -26,6 +26,7 @@ export const HiddenTabButton = forwardRef<HTMLButtonElement, HiddenTabButtonProp
26
26
 
27
27
  return (
28
28
  <button
29
+ type='button'
29
30
  aria-hidden
30
31
  ref={ref}
31
32
  onKeyDown={handleKeyDown}