@hh.ru/magritte-ui-chips-trigger 4.5.7 → 4.6.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.
@@ -0,0 +1,60 @@
1
+ import './index.css';
2
+ import { jsx, Fragment } from 'react/jsx-runtime';
3
+ import { useCallback } from 'react';
4
+ import { useTranslation } from '@hh.ru/magritte-common-use-translation';
5
+ import { CustomChip } from '@hh.ru/magritte-ui-chips';
6
+
7
+ var styles = {"root":"magritte-root___-zVdz_4-6-1","focused":"magritte-focused___0Uzyu_4-6-1","invalid":"magritte-invalid___tVzQV_4-6-1","disabled":"magritte-disabled___UeqcV_4-6-1","label":"magritte-label___j7Trt_4-6-1","field-input":"magritte-field-input___04Cag_4-6-1","fieldInput":"magritte-field-input___04Cag_4-6-1","scrollable-area":"magritte-scrollable-area___-xMF2_4-6-1","scrollableArea":"magritte-scrollable-area___-xMF2_4-6-1","focus-visible":"magritte-focus-visible___ifvAP_4-6-1","focusVisible":"magritte-focus-visible___ifvAP_4-6-1","large":"magritte-large___JIrIy_4-6-1","field":"magritte-field___rlEmn_4-6-1","icon":"magritte-icon___fDMiz_4-6-1","scrollable-area-wrapper":"magritte-scrollable-area-wrapper___hZNQd_4-6-1","scrollableAreaWrapper":"magritte-scrollable-area-wrapper___hZNQd_4-6-1","scrollable-area-wrapper_with-icon":"magritte-scrollable-area-wrapper_with-icon___2VoX9_4-6-1","scrollableAreaWrapperWithIcon":"magritte-scrollable-area-wrapper_with-icon___2VoX9_4-6-1","medium":"magritte-medium___Xk-XB_4-6-1","chips-and-input":"magritte-chips-and-input___qg-Ba_4-6-1","chipsAndInput":"magritte-chips-and-input___qg-Ba_4-6-1","label-wrapper":"magritte-label-wrapper___De7Bm_4-6-1","labelWrapper":"magritte-label-wrapper___De7Bm_4-6-1","icon_expanded":"magritte-icon_expanded___RaOT-_4-6-1","iconExpanded":"magritte-icon_expanded___RaOT-_4-6-1","custom-chip-wrapper":"magritte-custom-chip-wrapper___a9kJ6_4-6-1","customChipWrapper":"magritte-custom-chip-wrapper___a9kJ6_4-6-1","mobile-root":"magritte-mobile-root___-hey4_4-6-1","mobileRoot":"magritte-mobile-root___-hey4_4-6-1","mobile-chips":"magritte-mobile-chips___cuB21_4-6-1","mobileChips":"magritte-mobile-chips___cuB21_4-6-1"};
8
+
9
+ const ChipLayoutComponentDefault = ({ data: _, ...props }) => /* @__PURE__ */ jsx(CustomChip, { ...props });
10
+ const ChipsList = ({
11
+ state,
12
+ onChange,
13
+ chipLayoutComponent,
14
+ disabled,
15
+ deleteButtonAriaLabel
16
+ }) => {
17
+ const deleteButtonAriaTrl = useTranslation("ChipsTrigger", "delete");
18
+ const ChipLayoutComponent = chipLayoutComponent ?? ChipLayoutComponentDefault;
19
+ const deleteHandler = useCallback(
20
+ (index) => {
21
+ const chips = [...state.chips];
22
+ const [deletedChip] = chips.splice(index, 1);
23
+ onChange({
24
+ value: state.value,
25
+ chips,
26
+ event: { type: "remove", modifier: "cross", element: deletedChip }
27
+ });
28
+ },
29
+ [onChange, state.chips, state.value]
30
+ );
31
+ return /* @__PURE__ */ jsx(Fragment, { children: state.chips.map((chip, index) => {
32
+ return /* @__PURE__ */ jsx(
33
+ "div",
34
+ {
35
+ className: styles.customChipWrapper,
36
+ onMouseDown: (event) => event.preventDefault(),
37
+ children: /* @__PURE__ */ jsx(
38
+ ChipLayoutComponent,
39
+ {
40
+ Element: "button",
41
+ size: "extra-small",
42
+ onDelete: () => {
43
+ deleteHandler(index);
44
+ },
45
+ dataQaWrapper: `chips-trigger-chip-${chip.value}`,
46
+ deleteButtonAriaLabel: deleteButtonAriaLabel ?? deleteButtonAriaTrl,
47
+ disabled,
48
+ data: chip.data,
49
+ deleteOnly: true,
50
+ children: chip.label ?? chip.value
51
+ }
52
+ )
53
+ },
54
+ `${chip.value}-${index}`
55
+ );
56
+ }) });
57
+ };
58
+
59
+ export { ChipsList as C, styles as s };
60
+ //# sourceMappingURL=ChipsList-F41a4_2C.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChipsList-F41a4_2C.js","sources":["src/ChipsList.tsx"],"sourcesContent":["import { ReactElement, useCallback } from 'react';\n\nimport { useTranslation } from '@hh.ru/magritte-common-use-translation';\nimport { CustomChip } from '@hh.ru/magritte-ui-chips';\nimport { ChipCustomLayoutProps, ChipsTriggerProps } from '@hh.ru/magritte-ui-chips-trigger/types';\n\nimport styles from './chips-trigger.less';\n\nconst ChipLayoutComponentDefault = ({ data: _, ...props }: ChipCustomLayoutProps): ReactElement => (\n <CustomChip {...props} />\n);\n\ntype ChipsListProps<T> = Pick<\n ChipsTriggerProps<T>,\n 'state' | 'onChange' | 'chipLayoutComponent' | 'disabled' | 'deleteButtonAriaLabel'\n>;\n\nconst ChipsList = <T,>({\n state,\n onChange,\n chipLayoutComponent,\n disabled,\n deleteButtonAriaLabel,\n}: ChipsListProps<T>): ReactElement => {\n const deleteButtonAriaTrl = useTranslation('ChipsTrigger', 'delete');\n const ChipLayoutComponent = chipLayoutComponent ?? ChipLayoutComponentDefault;\n\n const deleteHandler = useCallback(\n (index: number) => {\n const chips = [...state.chips];\n const [deletedChip] = chips.splice(index, 1);\n onChange({\n value: state.value,\n chips,\n event: { type: 'remove', modifier: 'cross', element: deletedChip },\n });\n },\n [onChange, state.chips, state.value]\n );\n\n return (\n <>\n {state.chips.map((chip, index) => {\n return (\n <div\n key={`${chip.value}-${index}`}\n className={styles.customChipWrapper}\n onMouseDown={(event) => event.preventDefault()}\n >\n <ChipLayoutComponent\n Element=\"button\"\n size=\"extra-small\"\n onDelete={() => {\n deleteHandler(index);\n }}\n dataQaWrapper={`chips-trigger-chip-${chip.value}`}\n deleteButtonAriaLabel={deleteButtonAriaLabel ?? deleteButtonAriaTrl}\n disabled={disabled}\n data={chip.data}\n deleteOnly\n >\n {chip.label ?? chip.value}\n </ChipLayoutComponent>\n </div>\n );\n })}\n </>\n );\n};\n\nexport { ChipsList };\n"],"names":[],"mappings":";;;;;;;AAQA,MAAM,0BAAA,GAA6B,CAAC,EAAE,IAAM,EAAA,CAAA,EAAG,GAAG,KAAA,EAC9C,qBAAA,GAAA,CAAC,UAAY,EAAA,EAAA,GAAG,KAAO,EAAA,CAAA,CAAA;AAQ3B,MAAM,YAAY,CAAK;AAAA,EACnB,KAAA;AAAA,EACA,QAAA;AAAA,EACA,mBAAA;AAAA,EACA,QAAA;AAAA,EACA,qBAAA;AACJ,CAAuC,KAAA;AACnC,EAAM,MAAA,mBAAA,GAAsB,cAAe,CAAA,cAAA,EAAgB,QAAQ,CAAA,CAAA;AACnE,EAAA,MAAM,sBAAsB,mBAAuB,IAAA,0BAAA,CAAA;AAEnD,EAAA,MAAM,aAAgB,GAAA,WAAA;AAAA,IAClB,CAAC,KAAkB,KAAA;AACf,MAAA,MAAM,KAAQ,GAAA,CAAC,GAAG,KAAA,CAAM,KAAK,CAAA,CAAA;AAC7B,MAAA,MAAM,CAAC,WAAW,CAAA,GAAI,KAAM,CAAA,MAAA,CAAO,OAAO,CAAC,CAAA,CAAA;AAC3C,MAAS,QAAA,CAAA;AAAA,QACL,OAAO,KAAM,CAAA,KAAA;AAAA,QACb,KAAA;AAAA,QACA,OAAO,EAAE,IAAA,EAAM,UAAU,QAAU,EAAA,OAAA,EAAS,SAAS,WAAY,EAAA;AAAA,OACpE,CAAA,CAAA;AAAA,KACL;AAAA,IACA,CAAC,QAAA,EAAU,KAAM,CAAA,KAAA,EAAO,MAAM,KAAK,CAAA;AAAA,GACvC,CAAA;AAEA,EAAA,uCAES,QAAM,EAAA,KAAA,CAAA,KAAA,CAAM,GAAI,CAAA,CAAC,MAAM,KAAU,KAAA;AAC9B,IACI,uBAAA,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QAEG,WAAW,MAAO,CAAA,iBAAA;AAAA,QAClB,WAAa,EAAA,CAAC,KAAU,KAAA,KAAA,CAAM,cAAe,EAAA;AAAA,QAE7C,QAAA,kBAAA,GAAA;AAAA,UAAC,mBAAA;AAAA,UAAA;AAAA,YACG,OAAQ,EAAA,QAAA;AAAA,YACR,IAAK,EAAA,aAAA;AAAA,YACL,UAAU,MAAM;AACZ,cAAA,aAAA,CAAc,KAAK,CAAA,CAAA;AAAA,aACvB;AAAA,YACA,aAAA,EAAe,CAAsB,mBAAA,EAAA,IAAA,CAAK,KAAK,CAAA,CAAA;AAAA,YAC/C,uBAAuB,qBAAyB,IAAA,mBAAA;AAAA,YAChD,QAAA;AAAA,YACA,MAAM,IAAK,CAAA,IAAA;AAAA,YACX,UAAU,EAAA,IAAA;AAAA,YAET,QAAA,EAAA,IAAA,CAAK,SAAS,IAAK,CAAA,KAAA;AAAA,WAAA;AAAA,SACxB;AAAA,OAAA;AAAA,MAjBK,CAAG,EAAA,IAAA,CAAK,KAAK,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA;AAAA,KAkB/B,CAAA;AAAA,GAEP,CACL,EAAA,CAAA,CAAA;AAER;;;;"}
package/ChipsList.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ import { ReactElement } from 'react';
2
+ import { ChipsTriggerProps } from './types';
3
+ type ChipsListProps<T> = Pick<ChipsTriggerProps<T>, 'state' | 'onChange' | 'chipLayoutComponent' | 'disabled' | 'deleteButtonAriaLabel'>;
4
+ declare const ChipsList: <T>({ state, onChange, chipLayoutComponent, disabled, deleteButtonAriaLabel, }: ChipsListProps<T>) => ReactElement;
5
+ export { ChipsList };
package/ChipsList.js ADDED
@@ -0,0 +1,7 @@
1
+ import './index.css';
2
+ import 'react/jsx-runtime';
3
+ import 'react';
4
+ import '@hh.ru/magritte-common-use-translation';
5
+ import '@hh.ru/magritte-ui-chips';
6
+ export { C as ChipsList } from './ChipsList-F41a4_2C.js';
7
+ //# sourceMappingURL=ChipsList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChipsList.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
package/ChipsTrigger.js CHANGED
@@ -1,262 +1,25 @@
1
1
  import './index.css';
2
2
  import { jsxs, jsx } from 'react/jsx-runtime';
3
- import { forwardRef, useState, useRef, useId, useCallback, useEffect, isValidElement } from 'react';
4
- import classnames from 'classnames';
5
- import { keyboardMatch, keyboardKeys, findNextFocusableElement } from '@hh.ru/magritte-common-keyboard';
6
- import { useMultipleRefs } from '@hh.ru/magritte-common-use-multiple-refs';
7
- import { useTranslation } from '@hh.ru/magritte-common-use-translation';
3
+ import { forwardRef } from 'react';
8
4
  import { useBreakpoint } from '@hh.ru/magritte-ui-breakpoint';
9
- import { CustomChip } from '@hh.ru/magritte-ui-chips';
5
+ import { DesktopChipsTrigger } from './DesktopChipsTrigger.js';
6
+ import { MobileChipsTrigger } from './MobileChipsTrigger.js';
10
7
  import { FormHelper } from '@hh.ru/magritte-ui-form-helper';
11
- import { ChevronDownOutlinedSize24 } from '@hh.ru/magritte-ui-icon/icon';
12
- import { useFocus } from '@hh.ru/magritte-ui-input/useFocus';
13
- import { useScrollbar, Scrollbar } from '@hh.ru/magritte-ui-scrollbar';
8
+ import 'classnames';
9
+ import '@hh.ru/magritte-common-keyboard';
10
+ import '@hh.ru/magritte-common-use-multiple-refs';
11
+ import './ChipsList-F41a4_2C.js';
12
+ import '@hh.ru/magritte-common-use-translation';
13
+ import '@hh.ru/magritte-ui-chips';
14
+ import '@hh.ru/magritte-ui-icon/icon';
15
+ import '@hh.ru/magritte-ui-input/useFocus';
16
+ import '@hh.ru/magritte-ui-scrollbar';
14
17
 
15
- var styles = {"root":"magritte-root___-zVdz_4-5-7","focused":"magritte-focused___0Uzyu_4-5-7","invalid":"magritte-invalid___tVzQV_4-5-7","disabled":"magritte-disabled___UeqcV_4-5-7","label":"magritte-label___j7Trt_4-5-7","field-input":"magritte-field-input___04Cag_4-5-7","fieldInput":"magritte-field-input___04Cag_4-5-7","scrollable-area":"magritte-scrollable-area___-xMF2_4-5-7","scrollableArea":"magritte-scrollable-area___-xMF2_4-5-7","focus-visible":"magritte-focus-visible___ifvAP_4-5-7","focusVisible":"magritte-focus-visible___ifvAP_4-5-7","large":"magritte-large___JIrIy_4-5-7","field":"magritte-field___rlEmn_4-5-7","icon":"magritte-icon___fDMiz_4-5-7","scrollable-area-wrapper":"magritte-scrollable-area-wrapper___hZNQd_4-5-7","scrollableAreaWrapper":"magritte-scrollable-area-wrapper___hZNQd_4-5-7","scrollable-area-wrapper_with-icon":"magritte-scrollable-area-wrapper_with-icon___2VoX9_4-5-7","scrollableAreaWrapperWithIcon":"magritte-scrollable-area-wrapper_with-icon___2VoX9_4-5-7","medium":"magritte-medium___Xk-XB_4-5-7","chips-and-input":"magritte-chips-and-input___qg-Ba_4-5-7","chipsAndInput":"magritte-chips-and-input___qg-Ba_4-5-7","label-wrapper":"magritte-label-wrapper___De7Bm_4-5-7","labelWrapper":"magritte-label-wrapper___De7Bm_4-5-7","icon_expanded":"magritte-icon_expanded___RaOT-_4-5-7","iconExpanded":"magritte-icon_expanded___RaOT-_4-5-7","custom-chip-wrapper":"magritte-custom-chip-wrapper___a9kJ6_4-5-7","customChipWrapper":"magritte-custom-chip-wrapper___a9kJ6_4-5-7"};
16
-
17
- const focusOnLastChip = (event, chipsContainer, input) => {
18
- if (!chipsContainer || !input) {
19
- return;
20
- }
21
- const nextFocusableElement = findNextFocusableElement(chipsContainer, input, "left", "list");
22
- if (nextFocusableElement !== null) {
23
- event.preventDefault();
24
- nextFocusableElement.focus();
25
- }
26
- };
27
- const ChipLayoutComponentDefault = ({ data: _, ...props }) => /* @__PURE__ */ jsx(CustomChip, { ...props });
28
- const ChipsTriggerComponent = ({
29
- size = "large",
30
- placeholder,
31
- disabled,
32
- expanded: externalExpanded,
33
- toggleExpanded: toggleExternalExpanded,
34
- state,
35
- chipLayoutComponent,
36
- invalid,
37
- maxHeight,
38
- description,
39
- errorMessage,
40
- wrapperRef,
41
- rightIcon = true,
42
- onChange,
43
- onFocus,
44
- onBlur,
45
- onKeyDown,
46
- onChangeInput: onChangeInputExternal,
47
- allowArbitraryValues = true,
48
- "data-qa": dataQa = "chips-trigger",
49
- deleteButtonAriaLabel: _deleteButtonAriaLabel,
50
- "aria-expanded": ariaExpanded,
51
- "aria-controls": ariaControls
52
- }, ref) => {
18
+ const ChipsTriggerComponent = (props, ref) => {
53
19
  const { isMobile } = useBreakpoint();
54
- const [expanded, setExpanded] = useState(false);
55
- const [isFocusVisible, setFocusVisible] = useState(false);
56
- const stateRef = useRef({ hadFocusWhenClicked: false, wasExpandedWhenClicked: false });
57
- const { hasVerticalScroll, verticalScrollbarProps, ...scrollbar } = useScrollbar({
58
- axis: disabled ? "none" : "vertical"
59
- });
60
- const chipsRootRef = useRef(null);
61
- const chipsRootRefCallback = useMultipleRefs(wrapperRef, chipsRootRef);
62
- const chipsContainerRef = useRef(null);
63
- const chipsContainerRefCallback = useMultipleRefs(chipsContainerRef, scrollbar.contentWrapperRef);
64
- const inputRef = useRef(null);
65
- const inputRefCallback = useMultipleRefs(inputRef, ref);
66
- const showLabel = state.value === "" && state.chips.length === 0 && placeholder !== "";
67
- const labelId = useId();
68
- const ariaLabeledBy = `chips-trigger-label-${labelId}`;
69
- const deleteButtonAriaTrl = useTranslation("ChipsTrigger", "delete");
70
- const onChangeInput = useCallback(
71
- (value) => {
72
- onChange({
73
- value,
74
- chips: state.chips,
75
- event: { type: "change", modifier: "keyboard" }
76
- });
77
- onChangeInputExternal?.(value);
78
- },
79
- [state.chips, onChange, onChangeInputExternal]
80
- );
81
- const { changeHandler, focusHandler, blurHandler, isFocused } = useFocus(onChangeInput, onFocus, onBlur);
82
- useEffect(() => {
83
- if (inputRef.current) {
84
- setFocusVisible(isFocused && inputRef.current.classList.contains("focus-visible"));
85
- }
86
- }, [isFocused]);
87
- const deleteHandler = useCallback(
88
- (index) => {
89
- const chips = [...state.chips];
90
- const [deletedChip] = chips.splice(index, 1);
91
- onChange({
92
- value: state.value,
93
- chips,
94
- event: { type: "remove", modifier: "cross", element: deletedChip }
95
- });
96
- },
97
- [onChange, state.chips, state.value]
98
- );
99
- const keyDownHandler = useCallback(
100
- (event) => {
101
- if (allowArbitraryValues && keyboardMatch(event.nativeEvent, keyboardKeys.Enter)) {
102
- if (state.value.length === 0) {
103
- return;
104
- }
105
- onChange({
106
- value: "",
107
- chips: [...state.chips, { value: state.value, userInput: true }],
108
- event: { type: "add", modifier: "enter" }
109
- });
110
- onChangeInputExternal?.("");
111
- }
112
- if (state.value === "" && keyboardMatch(event.nativeEvent, keyboardKeys.Backspace)) {
113
- if (state.chips.length === 0) {
114
- return;
115
- }
116
- const chips = [...state.chips];
117
- const deletedChip = chips.pop();
118
- onChange({
119
- value: state.value,
120
- chips,
121
- event: { type: "remove", modifier: "backspace", element: deletedChip }
122
- });
123
- }
124
- if (state.value === "" && keyboardMatch(event.nativeEvent, keyboardKeys.ArrowLeft)) {
125
- focusOnLastChip(event, chipsContainerRef.current, inputRef.current);
126
- }
127
- },
128
- [allowArbitraryValues, onChange, onChangeInputExternal, state]
129
- );
130
- const scrollableAreaStyle = maxHeight ? { maxHeight: `${maxHeight - (size === "medium" ? 16 : 24)}px` } : void 0;
131
- const ChipLayoutComponent = chipLayoutComponent ?? ChipLayoutComponentDefault;
132
- const showIcon = rightIcon !== false;
133
- const showCustomIcon = isValidElement(rightIcon);
20
+ const { description, errorMessage, disabled, invalid } = props;
134
21
  return /* @__PURE__ */ jsxs("div", { children: [
135
- /* @__PURE__ */ jsxs(
136
- "div",
137
- {
138
- ref: chipsRootRefCallback,
139
- className: classnames(styles.root, styles[size], scrollbar.hoverContainerCssClass, {
140
- [styles.focused]: isFocused,
141
- [styles.focusVisible]: isFocusVisible,
142
- [styles.disabled]: !!disabled,
143
- [styles.invalid]: !!invalid
144
- }),
145
- onFocus: () => {
146
- if (disabled) {
147
- return;
148
- }
149
- if (!inputRef.current) {
150
- return;
151
- }
152
- setExpanded(true);
153
- if (document.activeElement === chipsRootRef.current) {
154
- inputRef.current.focus();
155
- }
156
- },
157
- onBlur: (event) => {
158
- stateRef.current.hadFocusWhenClicked &&= event.relatedTarget === chipsRootRef.current || event.relatedTarget === inputRef.current;
159
- setExpanded(false);
160
- },
161
- onKeyDown,
162
- onMouseDown: () => {
163
- stateRef.current.hadFocusWhenClicked = document.activeElement === inputRef.current;
164
- stateRef.current.wasExpandedWhenClicked = !!externalExpanded;
165
- },
166
- onClick: () => {
167
- if (stateRef.current.hadFocusWhenClicked && stateRef.current.wasExpandedWhenClicked === externalExpanded) {
168
- toggleExternalExpanded?.();
169
- }
170
- stateRef.current.hadFocusWhenClicked = false;
171
- stateRef.current.wasExpandedWhenClicked = false;
172
- },
173
- tabIndex: disabled ? void 0 : 0,
174
- "data-qa": dataQa,
175
- "aria-disabled": disabled,
176
- children: [
177
- /* @__PURE__ */ jsx(
178
- "div",
179
- {
180
- style: scrollableAreaStyle,
181
- className: classnames(styles.scrollableAreaWrapper, {
182
- [styles.scrollableAreaWrapperWithIcon]: showIcon
183
- }),
184
- children: /* @__PURE__ */ jsx(
185
- "div",
186
- {
187
- className: styles.scrollableArea,
188
- ref: scrollbar.scrollContainerRef,
189
- children: /* @__PURE__ */ jsxs("div", { ref: chipsContainerRefCallback, className: styles.chipsAndInput, children: [
190
- state.chips.map((chip, index) => {
191
- return /* @__PURE__ */ jsx(
192
- "div",
193
- {
194
- className: styles.customChipWrapper,
195
- onMouseDown: (event) => event.preventDefault(),
196
- children: /* @__PURE__ */ jsx(
197
- ChipLayoutComponent,
198
- {
199
- Element: "button",
200
- size: "extra-small",
201
- onDelete: () => {
202
- deleteHandler(index);
203
- },
204
- dataQaWrapper: `chips-trigger-chip-${chip.value}`,
205
- deleteButtonAriaLabel: _deleteButtonAriaLabel ?? deleteButtonAriaTrl,
206
- disabled,
207
- data: chip.data,
208
- deleteOnly: true,
209
- children: chip.label ?? chip.value
210
- }
211
- )
212
- },
213
- `${chip.value}-${index}`
214
- );
215
- }),
216
- /* @__PURE__ */ jsxs("div", { className: styles.field, children: [
217
- /* @__PURE__ */ jsx(
218
- "input",
219
- {
220
- ref: inputRefCallback,
221
- className: styles.fieldInput,
222
- type: "text",
223
- disabled,
224
- value: state.value,
225
- onKeyDown: keyDownHandler,
226
- onFocus: focusHandler,
227
- onBlur: blurHandler,
228
- onChange: changeHandler,
229
- "data-qa": "chips-trigger-input",
230
- readOnly: isMobile,
231
- "aria-labelledby": showLabel ? ariaLabeledBy : void 0,
232
- role: "combobox",
233
- "aria-haspopup": "listbox",
234
- "aria-autocomplete": "list",
235
- "aria-expanded": ariaExpanded,
236
- "aria-controls": ariaControls
237
- }
238
- ),
239
- showLabel && /* @__PURE__ */ jsx("div", { className: styles.labelWrapper, children: /* @__PURE__ */ jsx("label", { className: styles.label, id: ariaLabeledBy, children: placeholder }) })
240
- ] })
241
- ] })
242
- }
243
- )
244
- }
245
- ),
246
- showIcon && /* @__PURE__ */ jsx(
247
- "div",
248
- {
249
- className: classnames(styles.icon, {
250
- [styles.iconExpanded]: (expanded || externalExpanded) && !showCustomIcon
251
- }),
252
- "data-qa": "chips-trigger-icon",
253
- children: showCustomIcon ? rightIcon : /* @__PURE__ */ jsx(ChevronDownOutlinedSize24, {})
254
- }
255
- ),
256
- hasVerticalScroll && /* @__PURE__ */ jsx(Scrollbar, { ...verticalScrollbarProps })
257
- ]
258
- }
259
- ),
22
+ isMobile ? /* @__PURE__ */ jsx(MobileChipsTrigger, { ...props, innerRef: ref }) : /* @__PURE__ */ jsx(DesktopChipsTrigger, { ...props, innerRef: ref }),
260
23
  /* @__PURE__ */ jsx(FormHelper, { description, errorMessage, disabled, invalid })
261
24
  ] });
262
25
  };
@@ -1 +1 @@
1
- {"version":3,"file":"ChipsTrigger.js","sources":["src/ChipsTrigger.tsx"],"sourcesContent":["import {\n ForwardedRef,\n LegacyRef,\n InputHTMLAttributes,\n KeyboardEventHandler,\n ReactElement,\n SyntheticEvent,\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useRef,\n useState,\n isValidElement,\n} from 'react';\nimport classnames from 'classnames';\n\nimport { findNextFocusableElement, keyboardKeys, keyboardMatch } from '@hh.ru/magritte-common-keyboard';\nimport { useMultipleRefs } from '@hh.ru/magritte-common-use-multiple-refs';\nimport { useTranslation } from '@hh.ru/magritte-common-use-translation';\nimport { useBreakpoint } from '@hh.ru/magritte-ui-breakpoint';\nimport { CustomChip } from '@hh.ru/magritte-ui-chips';\nimport { ChipCustomLayoutProps, ChipsTriggerProps } from '@hh.ru/magritte-ui-chips-trigger/types';\nimport { FormHelper } from '@hh.ru/magritte-ui-form-helper';\nimport { ChevronDownOutlinedSize24 } from '@hh.ru/magritte-ui-icon/icon';\nimport { useFocus } from '@hh.ru/magritte-ui-input/useFocus';\nimport { Scrollbar, useScrollbar } from '@hh.ru/magritte-ui-scrollbar';\n\nimport styles from './chips-trigger.less';\n\nconst focusOnLastChip = (event: SyntheticEvent, chipsContainer: HTMLElement | null, input: HTMLElement | null) => {\n if (!chipsContainer || !input) {\n return;\n }\n const nextFocusableElement = findNextFocusableElement(chipsContainer, input, 'left', 'list');\n if (nextFocusableElement !== null) {\n event.preventDefault();\n nextFocusableElement.focus();\n }\n};\n\nconst ChipLayoutComponentDefault = ({ data: _, ...props }: ChipCustomLayoutProps): ReactElement => (\n <CustomChip {...props} />\n);\n\ntype State = {\n hadFocusWhenClicked: boolean;\n wasExpandedWhenClicked: boolean;\n};\n\nconst ChipsTriggerComponent = <T,>(\n {\n size = 'large',\n placeholder,\n disabled,\n expanded: externalExpanded,\n toggleExpanded: toggleExternalExpanded,\n state,\n chipLayoutComponent,\n invalid,\n maxHeight,\n description,\n errorMessage,\n wrapperRef,\n rightIcon = true,\n onChange,\n onFocus,\n onBlur,\n onKeyDown,\n onChangeInput: onChangeInputExternal,\n allowArbitraryValues = true,\n 'data-qa': dataQa = 'chips-trigger',\n deleteButtonAriaLabel: _deleteButtonAriaLabel,\n 'aria-expanded': ariaExpanded,\n 'aria-controls': ariaControls,\n }: ChipsTriggerProps<T> & Omit<InputHTMLAttributes<HTMLInputElement>, keyof ChipsTriggerProps<T>>,\n ref: ForwardedRef<HTMLInputElement>\n) => {\n const { isMobile } = useBreakpoint();\n const [expanded, setExpanded] = useState(false);\n const [isFocusVisible, setFocusVisible] = useState(false);\n const stateRef = useRef<State>({ hadFocusWhenClicked: false, wasExpandedWhenClicked: false });\n\n const { hasVerticalScroll, verticalScrollbarProps, ...scrollbar } = useScrollbar({\n axis: disabled ? 'none' : 'vertical',\n });\n\n const chipsRootRef = useRef<HTMLDivElement>(null);\n const chipsRootRefCallback = useMultipleRefs(wrapperRef, chipsRootRef);\n const chipsContainerRef = useRef<HTMLDivElement>(null);\n const chipsContainerRefCallback = useMultipleRefs(chipsContainerRef, scrollbar.contentWrapperRef);\n const inputRef = useRef<HTMLInputElement>(null);\n const inputRefCallback = useMultipleRefs(inputRef, ref);\n const showLabel = state.value === '' && state.chips.length === 0 && placeholder !== '';\n const labelId = useId();\n const ariaLabeledBy = `chips-trigger-label-${labelId}`;\n const deleteButtonAriaTrl = useTranslation('ChipsTrigger', 'delete');\n\n const onChangeInput = useCallback(\n (value: string) => {\n onChange({\n value,\n chips: state.chips,\n event: { type: 'change', modifier: 'keyboard' },\n });\n onChangeInputExternal?.(value);\n },\n [state.chips, onChange, onChangeInputExternal]\n );\n const { changeHandler, focusHandler, blurHandler, isFocused } = useFocus(onChangeInput, onFocus, onBlur);\n\n useEffect(() => {\n if (inputRef.current) {\n setFocusVisible(isFocused && inputRef.current.classList.contains('focus-visible'));\n }\n }, [isFocused]);\n\n const deleteHandler = useCallback(\n (index: number) => {\n const chips = [...state.chips];\n const [deletedChip] = chips.splice(index, 1);\n onChange({\n value: state.value,\n chips,\n event: { type: 'remove', modifier: 'cross', element: deletedChip },\n });\n },\n [onChange, state.chips, state.value]\n );\n\n const keyDownHandler = useCallback<KeyboardEventHandler>(\n (event) => {\n // создаем новый чипс и затираем текстовый инпут\n if (allowArbitraryValues && keyboardMatch(event.nativeEvent, keyboardKeys.Enter)) {\n if (state.value.length === 0) {\n return;\n }\n onChange({\n value: '',\n chips: [...state.chips, { value: state.value, userInput: true }],\n event: { type: 'add', modifier: 'enter' },\n });\n onChangeInputExternal?.('');\n }\n // удаляем последний созданный чипс\n if (state.value === '' && keyboardMatch(event.nativeEvent, keyboardKeys.Backspace)) {\n if (state.chips.length === 0) {\n return;\n }\n const chips = [...state.chips];\n const deletedChip = chips.pop();\n onChange({\n value: state.value,\n chips,\n event: { type: 'remove', modifier: 'backspace', element: deletedChip },\n });\n }\n // пытаемся найти ближайший чипс для фокуса\n if (state.value === '' && keyboardMatch(event.nativeEvent, keyboardKeys.ArrowLeft)) {\n focusOnLastChip(event, chipsContainerRef.current, inputRef.current);\n }\n },\n [allowArbitraryValues, onChange, onChangeInputExternal, state]\n );\n\n // при выставлении высоты учитваем падинги\n // иначе высота будет больше значения свойства\n const scrollableAreaStyle = maxHeight ? { maxHeight: `${maxHeight - (size === 'medium' ? 16 : 24)}px` } : undefined;\n const ChipLayoutComponent = chipLayoutComponent ?? ChipLayoutComponentDefault;\n\n const showIcon = rightIcon !== false;\n const showCustomIcon = isValidElement(rightIcon);\n\n return (\n <div>\n <div\n ref={chipsRootRefCallback}\n className={classnames(styles.root, styles[size], scrollbar.hoverContainerCssClass, {\n [styles.focused]: isFocused,\n [styles.focusVisible]: isFocusVisible,\n [styles.disabled]: !!disabled,\n [styles.invalid]: !!invalid,\n })}\n onFocus={() => {\n if (disabled) {\n return;\n }\n if (!inputRef.current) {\n return;\n }\n setExpanded(true);\n // добавляем .focus() еще и тут\n // чтобы не сбрасывать фокус во время клика по chip\n // или по клику на враппер\n if (document.activeElement === chipsRootRef.current) {\n inputRef.current.focus();\n }\n }}\n onBlur={(event) => {\n stateRef.current.hadFocusWhenClicked &&=\n event.relatedTarget === chipsRootRef.current || event.relatedTarget === inputRef.current;\n setExpanded(false);\n }}\n onKeyDown={onKeyDown}\n onMouseDown={() => {\n // при повторном клике по инпуту в фокусе нужно закрыть дроп\n // при этом клик может прийтись на обертку, из-за чего инпут поймает blur и повторный фокус\n // что усложняет проверку того, что инпут уже был в фокусе в момент клика\n // поэтому в цепочке mouseDown -> blur -> focus -> click храним флаг, что фокус не вышел за пределы компонента\n stateRef.current.hadFocusWhenClicked = document.activeElement === inputRef.current;\n stateRef.current.wasExpandedWhenClicked = !!externalExpanded;\n }}\n onClick={() => {\n if (\n stateRef.current.hadFocusWhenClicked &&\n stateRef.current.wasExpandedWhenClicked === externalExpanded\n ) {\n toggleExternalExpanded?.();\n }\n stateRef.current.hadFocusWhenClicked = false;\n stateRef.current.wasExpandedWhenClicked = false;\n }}\n tabIndex={disabled ? undefined : 0}\n data-qa={dataQa}\n aria-disabled={disabled}\n >\n <div\n style={scrollableAreaStyle}\n className={classnames(styles.scrollableAreaWrapper, {\n [styles.scrollableAreaWrapperWithIcon]: showIcon,\n })}\n >\n <div\n className={styles.scrollableArea}\n ref={scrollbar.scrollContainerRef as React.Ref<HTMLDivElement>}\n >\n <div ref={chipsContainerRefCallback} className={styles.chipsAndInput}>\n {state.chips.map((chip, index) => {\n return (\n <div\n key={`${chip.value}-${index}`}\n className={styles.customChipWrapper}\n onMouseDown={(event) => event.preventDefault()}\n >\n <ChipLayoutComponent\n Element=\"button\"\n size=\"extra-small\"\n onDelete={() => {\n deleteHandler(index);\n }}\n dataQaWrapper={`chips-trigger-chip-${chip.value}`}\n deleteButtonAriaLabel={_deleteButtonAriaLabel ?? deleteButtonAriaTrl}\n disabled={disabled}\n data={chip.data}\n deleteOnly\n >\n {chip.label ?? chip.value}\n </ChipLayoutComponent>\n </div>\n );\n })}\n <div className={styles.field}>\n <input\n ref={inputRefCallback}\n className={styles.fieldInput}\n type=\"text\"\n disabled={disabled}\n value={state.value}\n onKeyDown={keyDownHandler}\n onFocus={focusHandler}\n onBlur={blurHandler}\n onChange={changeHandler}\n data-qa=\"chips-trigger-input\"\n readOnly={isMobile}\n aria-labelledby={showLabel ? ariaLabeledBy : undefined}\n role={'combobox'}\n aria-haspopup={'listbox'}\n aria-autocomplete={'list'}\n aria-expanded={ariaExpanded}\n aria-controls={ariaControls}\n />\n {showLabel && (\n <div className={styles.labelWrapper}>\n <label className={styles.label} id={ariaLabeledBy}>\n {placeholder}\n </label>\n </div>\n )}\n </div>\n </div>\n </div>\n </div>\n {showIcon && (\n <div\n className={classnames(styles.icon, {\n [styles.iconExpanded]: (expanded || externalExpanded) && !showCustomIcon,\n })}\n data-qa=\"chips-trigger-icon\"\n >\n {showCustomIcon ? rightIcon : <ChevronDownOutlinedSize24 />}\n </div>\n )}\n {hasVerticalScroll && <Scrollbar {...verticalScrollbarProps} />}\n </div>\n <FormHelper description={description} errorMessage={errorMessage} disabled={disabled} invalid={invalid} />\n </div>\n );\n};\n\nconst ChipsTrigger = forwardRef(ChipsTriggerComponent) as (<T>(\n props: ChipsTriggerProps<T> &\n Omit<InputHTMLAttributes<HTMLInputElement>, keyof ChipsTriggerProps<T>> & {\n ref?: LegacyRef<HTMLInputElement>;\n }\n) => ReactElement | null) & { displayName: string };\n\nChipsTrigger.displayName = 'ChipsTrigger';\n\nexport { ChipsTrigger };\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ChipsTrigger.js","sources":["src/ChipsTrigger.tsx"],"sourcesContent":["import { ForwardedRef, LegacyRef, InputHTMLAttributes, ReactElement, forwardRef } from 'react';\n\nimport { useBreakpoint } from '@hh.ru/magritte-ui-breakpoint';\nimport { DesktopChipsTrigger } from '@hh.ru/magritte-ui-chips-trigger/DesktopChipsTrigger';\nimport { MobileChipsTrigger } from '@hh.ru/magritte-ui-chips-trigger/MobileChipsTrigger';\nimport { ChipsTriggerProps } from '@hh.ru/magritte-ui-chips-trigger/types';\nimport { FormHelper } from '@hh.ru/magritte-ui-form-helper';\n\nconst ChipsTriggerComponent = <T,>(\n props: ChipsTriggerProps<T> & Omit<InputHTMLAttributes<HTMLInputElement>, keyof ChipsTriggerProps<T>>,\n ref: ForwardedRef<HTMLInputElement>\n) => {\n const { isMobile } = useBreakpoint();\n const { description, errorMessage, disabled, invalid } = props;\n\n return (\n <div>\n {isMobile ? (\n <MobileChipsTrigger {...props} innerRef={ref} />\n ) : (\n <DesktopChipsTrigger {...props} innerRef={ref} />\n )}\n <FormHelper description={description} errorMessage={errorMessage} disabled={disabled} invalid={invalid} />\n </div>\n );\n};\n\nconst ChipsTrigger = forwardRef(ChipsTriggerComponent) as (<T>(\n props: ChipsTriggerProps<T> &\n Omit<InputHTMLAttributes<HTMLInputElement>, keyof ChipsTriggerProps<T>> & {\n ref?: LegacyRef<HTMLInputElement>;\n }\n) => ReactElement | null) & { displayName: string };\n\nChipsTrigger.displayName = 'ChipsTrigger';\n\nexport { ChipsTrigger };\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAQA,MAAM,qBAAA,GAAwB,CAC1B,KAAA,EACA,GACC,KAAA;AACD,EAAM,MAAA,EAAE,QAAS,EAAA,GAAI,aAAc,EAAA,CAAA;AACnC,EAAA,MAAM,EAAE,WAAA,EAAa,YAAc,EAAA,QAAA,EAAU,SAAY,GAAA,KAAA,CAAA;AAEzD,EAAA,4BACK,KACI,EAAA,EAAA,QAAA,EAAA;AAAA,IAAA,QAAA,mBACI,GAAA,CAAA,kBAAA,EAAA,EAAoB,GAAG,KAAA,EAAO,QAAU,EAAA,GAAA,EAAK,CAE9C,mBAAA,GAAA,CAAC,mBAAqB,EAAA,EAAA,GAAG,KAAO,EAAA,QAAA,EAAU,GAAK,EAAA,CAAA;AAAA,oBAElD,GAAA,CAAA,UAAA,EAAA,EAAW,WAA0B,EAAA,YAAA,EAA4B,UAAoB,OAAkB,EAAA,CAAA;AAAA,GAC5G,EAAA,CAAA,CAAA;AAER,CAAA,CAAA;AAEM,MAAA,YAAA,GAAe,WAAW,qBAAqB,EAAA;AAOrD,YAAA,CAAa,WAAc,GAAA,cAAA;;;;"}
@@ -0,0 +1,7 @@
1
+ import { ForwardedRef, InputHTMLAttributes, ReactElement } from 'react';
2
+ import { ChipsTriggerProps } from './types';
3
+ type DesktopChipsTriggerProps<T> = ChipsTriggerProps<T> & Omit<InputHTMLAttributes<HTMLInputElement>, keyof ChipsTriggerProps<T>> & {
4
+ innerRef: ForwardedRef<HTMLInputElement>;
5
+ };
6
+ declare const DesktopChipsTrigger: <T>({ size, placeholder, disabled, expanded: externalExpanded, toggleExpanded: toggleExternalExpanded, state, chipLayoutComponent, invalid, maxHeight, wrapperRef, rightIcon, onChange, onFocus, onBlur, onKeyDown, onChangeInput: onChangeInputExternal, allowArbitraryValues, 'data-qa': dataQa, deleteButtonAriaLabel, 'aria-expanded': ariaExpanded, 'aria-controls': ariaControls, innerRef, }: DesktopChipsTriggerProps<T>) => ReactElement;
7
+ export { DesktopChipsTrigger };
@@ -0,0 +1,218 @@
1
+ import './index.css';
2
+ import { jsxs, jsx } from 'react/jsx-runtime';
3
+ import { useState, useRef, useId, useCallback, useEffect, isValidElement } from 'react';
4
+ import classnames from 'classnames';
5
+ import { keyboardMatch, keyboardKeys, findNextFocusableElement } from '@hh.ru/magritte-common-keyboard';
6
+ import { useMultipleRefs } from '@hh.ru/magritte-common-use-multiple-refs';
7
+ import { s as styles, C as ChipsList } from './ChipsList-F41a4_2C.js';
8
+ import { ChevronDownOutlinedSize24 } from '@hh.ru/magritte-ui-icon/icon';
9
+ import { useFocus } from '@hh.ru/magritte-ui-input/useFocus';
10
+ import { useScrollbar, Scrollbar } from '@hh.ru/magritte-ui-scrollbar';
11
+ import '@hh.ru/magritte-common-use-translation';
12
+ import '@hh.ru/magritte-ui-chips';
13
+
14
+ const focusOnLastChip = (event, chipsContainer, input) => {
15
+ if (!chipsContainer || !input) {
16
+ return;
17
+ }
18
+ const nextFocusableElement = findNextFocusableElement(chipsContainer, input, "left", "list");
19
+ if (nextFocusableElement !== null) {
20
+ event.preventDefault();
21
+ nextFocusableElement.focus();
22
+ }
23
+ };
24
+ const DesktopChipsTrigger = ({
25
+ size = "large",
26
+ placeholder,
27
+ disabled,
28
+ expanded: externalExpanded,
29
+ toggleExpanded: toggleExternalExpanded,
30
+ state,
31
+ chipLayoutComponent,
32
+ invalid,
33
+ maxHeight,
34
+ wrapperRef,
35
+ rightIcon = true,
36
+ onChange,
37
+ onFocus,
38
+ onBlur,
39
+ onKeyDown,
40
+ onChangeInput: onChangeInputExternal,
41
+ allowArbitraryValues = true,
42
+ "data-qa": dataQa = "chips-trigger",
43
+ deleteButtonAriaLabel,
44
+ "aria-expanded": ariaExpanded,
45
+ "aria-controls": ariaControls,
46
+ innerRef
47
+ }) => {
48
+ const [expanded, setExpanded] = useState(false);
49
+ const [isFocusVisible, setFocusVisible] = useState(false);
50
+ const stateRef = useRef({ hadFocusWhenClicked: false, wasExpandedWhenClicked: false });
51
+ const { hasVerticalScroll, verticalScrollbarProps, ...scrollbar } = useScrollbar({
52
+ axis: disabled ? "none" : "vertical"
53
+ });
54
+ const chipsRootRef = useRef(null);
55
+ const chipsRootRefCallback = useMultipleRefs(wrapperRef, chipsRootRef);
56
+ const chipsContainerRef = useRef(null);
57
+ const chipsContainerRefCallback = useMultipleRefs(chipsContainerRef, scrollbar.contentWrapperRef);
58
+ const inputRef = useRef(null);
59
+ const inputRefCallback = useMultipleRefs(inputRef, innerRef);
60
+ const showLabel = state.value === "" && state.chips.length === 0 && placeholder !== "";
61
+ const labelId = useId();
62
+ const ariaLabeledBy = `chips-trigger-label-${labelId}`;
63
+ const onChangeInput = useCallback(
64
+ (value) => {
65
+ onChange({
66
+ value,
67
+ chips: state.chips,
68
+ event: { type: "change", modifier: "keyboard" }
69
+ });
70
+ onChangeInputExternal?.(value);
71
+ },
72
+ [state.chips, onChange, onChangeInputExternal]
73
+ );
74
+ const { changeHandler, focusHandler, blurHandler, isFocused } = useFocus(onChangeInput, onFocus, onBlur);
75
+ useEffect(() => {
76
+ if (inputRef.current) {
77
+ setFocusVisible(isFocused && inputRef.current.classList.contains("focus-visible"));
78
+ }
79
+ }, [isFocused]);
80
+ const keyDownHandler = useCallback(
81
+ (event) => {
82
+ if (allowArbitraryValues && keyboardMatch(event.nativeEvent, keyboardKeys.Enter)) {
83
+ if (state.value.length === 0) {
84
+ return;
85
+ }
86
+ onChange({
87
+ value: "",
88
+ chips: [...state.chips, { value: state.value, userInput: true }],
89
+ event: { type: "add", modifier: "enter" }
90
+ });
91
+ onChangeInputExternal?.("");
92
+ }
93
+ if (state.value === "" && keyboardMatch(event.nativeEvent, keyboardKeys.Backspace)) {
94
+ if (state.chips.length === 0) {
95
+ return;
96
+ }
97
+ const chips = [...state.chips];
98
+ const deletedChip = chips.pop();
99
+ onChange({
100
+ value: state.value,
101
+ chips,
102
+ event: { type: "remove", modifier: "backspace", element: deletedChip }
103
+ });
104
+ }
105
+ if (state.value === "" && keyboardMatch(event.nativeEvent, keyboardKeys.ArrowLeft)) {
106
+ focusOnLastChip(event, chipsContainerRef.current, inputRef.current);
107
+ }
108
+ },
109
+ [allowArbitraryValues, onChange, onChangeInputExternal, state]
110
+ );
111
+ const scrollableAreaStyle = maxHeight ? { maxHeight: `${maxHeight - (size === "medium" ? 16 : 24)}px` } : void 0;
112
+ const showIcon = rightIcon !== false;
113
+ const showCustomIcon = isValidElement(rightIcon);
114
+ return /* @__PURE__ */ jsxs(
115
+ "div",
116
+ {
117
+ ref: chipsRootRefCallback,
118
+ className: classnames(styles.root, styles[size], scrollbar.hoverContainerCssClass, {
119
+ [styles.focused]: isFocused,
120
+ [styles.focusVisible]: isFocusVisible,
121
+ [styles.disabled]: !!disabled,
122
+ [styles.invalid]: !!invalid
123
+ }),
124
+ onFocus: () => {
125
+ if (disabled) {
126
+ return;
127
+ }
128
+ if (!inputRef.current) {
129
+ return;
130
+ }
131
+ setExpanded(true);
132
+ if (document.activeElement === chipsRootRef.current) {
133
+ inputRef.current.focus();
134
+ }
135
+ },
136
+ onBlur: (event) => {
137
+ stateRef.current.hadFocusWhenClicked &&= event.relatedTarget === chipsRootRef.current || event.relatedTarget === inputRef.current;
138
+ setExpanded(false);
139
+ },
140
+ onKeyDown,
141
+ onMouseDown: () => {
142
+ stateRef.current.hadFocusWhenClicked = document.activeElement === inputRef.current;
143
+ stateRef.current.wasExpandedWhenClicked = !!externalExpanded;
144
+ },
145
+ onClick: () => {
146
+ if (stateRef.current.hadFocusWhenClicked && stateRef.current.wasExpandedWhenClicked === externalExpanded) {
147
+ toggleExternalExpanded?.();
148
+ }
149
+ stateRef.current.hadFocusWhenClicked = false;
150
+ stateRef.current.wasExpandedWhenClicked = false;
151
+ },
152
+ tabIndex: disabled ? void 0 : 0,
153
+ "data-qa": dataQa,
154
+ "aria-disabled": disabled,
155
+ children: [
156
+ /* @__PURE__ */ jsx(
157
+ "div",
158
+ {
159
+ style: scrollableAreaStyle,
160
+ className: classnames(styles.scrollableAreaWrapper, {
161
+ [styles.scrollableAreaWrapperWithIcon]: showIcon
162
+ }),
163
+ children: /* @__PURE__ */ jsx("div", { className: styles.scrollableArea, ref: scrollbar.scrollContainerRef, children: /* @__PURE__ */ jsxs("div", { ref: chipsContainerRefCallback, className: styles.chipsAndInput, children: [
164
+ /* @__PURE__ */ jsx(
165
+ ChipsList,
166
+ {
167
+ state,
168
+ onChange,
169
+ chipLayoutComponent,
170
+ disabled,
171
+ deleteButtonAriaLabel
172
+ }
173
+ ),
174
+ /* @__PURE__ */ jsxs("div", { className: styles.field, children: [
175
+ /* @__PURE__ */ jsx(
176
+ "input",
177
+ {
178
+ ref: inputRefCallback,
179
+ className: styles.fieldInput,
180
+ type: "text",
181
+ disabled,
182
+ value: state.value,
183
+ onKeyDown: keyDownHandler,
184
+ onFocus: focusHandler,
185
+ onBlur: blurHandler,
186
+ onChange: changeHandler,
187
+ "data-qa": "chips-trigger-input",
188
+ "aria-labelledby": showLabel ? ariaLabeledBy : void 0,
189
+ role: "combobox",
190
+ "aria-haspopup": "listbox",
191
+ "aria-autocomplete": "list",
192
+ "aria-expanded": ariaExpanded,
193
+ "aria-controls": ariaControls
194
+ }
195
+ ),
196
+ showLabel && /* @__PURE__ */ jsx("div", { className: styles.labelWrapper, children: /* @__PURE__ */ jsx("label", { className: styles.label, id: ariaLabeledBy, children: placeholder }) })
197
+ ] })
198
+ ] }) })
199
+ }
200
+ ),
201
+ showIcon && /* @__PURE__ */ jsx(
202
+ "div",
203
+ {
204
+ className: classnames(styles.icon, {
205
+ [styles.iconExpanded]: (expanded || externalExpanded) && !showCustomIcon
206
+ }),
207
+ "data-qa": "chips-trigger-icon",
208
+ children: showCustomIcon ? rightIcon : /* @__PURE__ */ jsx(ChevronDownOutlinedSize24, {})
209
+ }
210
+ ),
211
+ hasVerticalScroll && /* @__PURE__ */ jsx(Scrollbar, { ...verticalScrollbarProps })
212
+ ]
213
+ }
214
+ );
215
+ };
216
+
217
+ export { DesktopChipsTrigger };
218
+ //# sourceMappingURL=DesktopChipsTrigger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DesktopChipsTrigger.js","sources":["src/DesktopChipsTrigger.tsx"],"sourcesContent":["import {\n ForwardedRef,\n InputHTMLAttributes,\n KeyboardEventHandler,\n ReactElement,\n SyntheticEvent,\n useCallback,\n useEffect,\n useId,\n useRef,\n useState,\n isValidElement,\n} from 'react';\nimport classnames from 'classnames';\n\nimport { findNextFocusableElement, keyboardKeys, keyboardMatch } from '@hh.ru/magritte-common-keyboard';\nimport { useMultipleRefs } from '@hh.ru/magritte-common-use-multiple-refs';\nimport { ChipsList } from '@hh.ru/magritte-ui-chips-trigger/ChipsList';\nimport { ChipsTriggerProps } from '@hh.ru/magritte-ui-chips-trigger/types';\nimport { ChevronDownOutlinedSize24 } from '@hh.ru/magritte-ui-icon/icon';\nimport { useFocus } from '@hh.ru/magritte-ui-input/useFocus';\nimport { Scrollbar, useScrollbar } from '@hh.ru/magritte-ui-scrollbar';\n\nimport styles from './chips-trigger.less';\n\nconst focusOnLastChip = (event: SyntheticEvent, chipsContainer: HTMLElement | null, input: HTMLElement | null) => {\n if (!chipsContainer || !input) {\n return;\n }\n const nextFocusableElement = findNextFocusableElement(chipsContainer, input, 'left', 'list');\n if (nextFocusableElement !== null) {\n event.preventDefault();\n nextFocusableElement.focus();\n }\n};\n\ntype State = {\n hadFocusWhenClicked: boolean;\n wasExpandedWhenClicked: boolean;\n};\n\ntype DesktopChipsTriggerProps<T> = ChipsTriggerProps<T> &\n Omit<InputHTMLAttributes<HTMLInputElement>, keyof ChipsTriggerProps<T>> & {\n innerRef: ForwardedRef<HTMLInputElement>;\n };\n\nconst DesktopChipsTrigger = <T,>({\n size = 'large',\n placeholder,\n disabled,\n expanded: externalExpanded,\n toggleExpanded: toggleExternalExpanded,\n state,\n chipLayoutComponent,\n invalid,\n maxHeight,\n wrapperRef,\n rightIcon = true,\n onChange,\n onFocus,\n onBlur,\n onKeyDown,\n onChangeInput: onChangeInputExternal,\n allowArbitraryValues = true,\n 'data-qa': dataQa = 'chips-trigger',\n deleteButtonAriaLabel,\n 'aria-expanded': ariaExpanded,\n 'aria-controls': ariaControls,\n innerRef,\n}: DesktopChipsTriggerProps<T>): ReactElement => {\n const [expanded, setExpanded] = useState(false);\n const [isFocusVisible, setFocusVisible] = useState(false);\n const stateRef = useRef<State>({ hadFocusWhenClicked: false, wasExpandedWhenClicked: false });\n\n const { hasVerticalScroll, verticalScrollbarProps, ...scrollbar } = useScrollbar({\n axis: disabled ? 'none' : 'vertical',\n });\n\n const chipsRootRef = useRef<HTMLDivElement>(null);\n const chipsRootRefCallback = useMultipleRefs(wrapperRef, chipsRootRef);\n const chipsContainerRef = useRef<HTMLDivElement>(null);\n const chipsContainerRefCallback = useMultipleRefs(chipsContainerRef, scrollbar.contentWrapperRef);\n const inputRef = useRef<HTMLInputElement>(null);\n const inputRefCallback = useMultipleRefs(inputRef, innerRef);\n const showLabel = state.value === '' && state.chips.length === 0 && placeholder !== '';\n const labelId = useId();\n const ariaLabeledBy = `chips-trigger-label-${labelId}`;\n\n const onChangeInput = useCallback(\n (value: string) => {\n onChange({\n value,\n chips: state.chips,\n event: { type: 'change', modifier: 'keyboard' },\n });\n onChangeInputExternal?.(value);\n },\n [state.chips, onChange, onChangeInputExternal]\n );\n const { changeHandler, focusHandler, blurHandler, isFocused } = useFocus(onChangeInput, onFocus, onBlur);\n\n useEffect(() => {\n if (inputRef.current) {\n setFocusVisible(isFocused && inputRef.current.classList.contains('focus-visible'));\n }\n }, [isFocused]);\n\n const keyDownHandler = useCallback<KeyboardEventHandler>(\n (event) => {\n // создаем новый чипс и затираем текстовый инпут\n if (allowArbitraryValues && keyboardMatch(event.nativeEvent, keyboardKeys.Enter)) {\n if (state.value.length === 0) {\n return;\n }\n onChange({\n value: '',\n chips: [...state.chips, { value: state.value, userInput: true }],\n event: { type: 'add', modifier: 'enter' },\n });\n onChangeInputExternal?.('');\n }\n // удаляем последний созданный чипс\n if (state.value === '' && keyboardMatch(event.nativeEvent, keyboardKeys.Backspace)) {\n if (state.chips.length === 0) {\n return;\n }\n const chips = [...state.chips];\n const deletedChip = chips.pop();\n onChange({\n value: state.value,\n chips,\n event: { type: 'remove', modifier: 'backspace', element: deletedChip },\n });\n }\n // пытаемся найти ближайший чипс для фокуса\n if (state.value === '' && keyboardMatch(event.nativeEvent, keyboardKeys.ArrowLeft)) {\n focusOnLastChip(event, chipsContainerRef.current, inputRef.current);\n }\n },\n [allowArbitraryValues, onChange, onChangeInputExternal, state]\n );\n\n // при выставлении высоты учитваем падинги\n // иначе высота будет больше значения свойства\n const scrollableAreaStyle = maxHeight ? { maxHeight: `${maxHeight - (size === 'medium' ? 16 : 24)}px` } : undefined;\n\n const showIcon = rightIcon !== false;\n const showCustomIcon = isValidElement(rightIcon);\n\n return (\n <div\n ref={chipsRootRefCallback}\n className={classnames(styles.root, styles[size], scrollbar.hoverContainerCssClass, {\n [styles.focused]: isFocused,\n [styles.focusVisible]: isFocusVisible,\n [styles.disabled]: !!disabled,\n [styles.invalid]: !!invalid,\n })}\n onFocus={() => {\n if (disabled) {\n return;\n }\n if (!inputRef.current) {\n return;\n }\n setExpanded(true);\n // добавляем .focus() еще и тут\n // чтобы не сбрасывать фокус во время клика по chip\n // или по клику на враппер\n if (document.activeElement === chipsRootRef.current) {\n inputRef.current.focus();\n }\n }}\n onBlur={(event) => {\n stateRef.current.hadFocusWhenClicked &&=\n event.relatedTarget === chipsRootRef.current || event.relatedTarget === inputRef.current;\n setExpanded(false);\n }}\n onKeyDown={onKeyDown}\n onMouseDown={() => {\n // при повторном клике по инпуту в фокусе нужно закрыть дроп\n // при этом клик может прийтись на обертку, из-за чего инпут поймает blur и повторный фокус\n // что усложняет проверку того, что инпут уже был в фокусе в момент клика\n // поэтому в цепочке mouseDown -> blur -> focus -> click храним флаг, что фокус не вышел за пределы компонента\n stateRef.current.hadFocusWhenClicked = document.activeElement === inputRef.current;\n stateRef.current.wasExpandedWhenClicked = !!externalExpanded;\n }}\n onClick={() => {\n if (\n stateRef.current.hadFocusWhenClicked &&\n stateRef.current.wasExpandedWhenClicked === externalExpanded\n ) {\n toggleExternalExpanded?.();\n }\n stateRef.current.hadFocusWhenClicked = false;\n stateRef.current.wasExpandedWhenClicked = false;\n }}\n tabIndex={disabled ? undefined : 0}\n data-qa={dataQa}\n aria-disabled={disabled}\n >\n <div\n style={scrollableAreaStyle}\n className={classnames(styles.scrollableAreaWrapper, {\n [styles.scrollableAreaWrapperWithIcon]: showIcon,\n })}\n >\n <div className={styles.scrollableArea} ref={scrollbar.scrollContainerRef as React.Ref<HTMLDivElement>}>\n <div ref={chipsContainerRefCallback} className={styles.chipsAndInput}>\n <ChipsList\n state={state}\n onChange={onChange}\n chipLayoutComponent={chipLayoutComponent}\n disabled={disabled}\n deleteButtonAriaLabel={deleteButtonAriaLabel}\n />\n <div className={styles.field}>\n <input\n ref={inputRefCallback}\n className={styles.fieldInput}\n type=\"text\"\n disabled={disabled}\n value={state.value}\n onKeyDown={keyDownHandler}\n onFocus={focusHandler}\n onBlur={blurHandler}\n onChange={changeHandler}\n data-qa=\"chips-trigger-input\"\n aria-labelledby={showLabel ? ariaLabeledBy : undefined}\n role={'combobox'}\n aria-haspopup={'listbox'}\n aria-autocomplete={'list'}\n aria-expanded={ariaExpanded}\n aria-controls={ariaControls}\n />\n {showLabel && (\n <div className={styles.labelWrapper}>\n <label className={styles.label} id={ariaLabeledBy}>\n {placeholder}\n </label>\n </div>\n )}\n </div>\n </div>\n </div>\n </div>\n {showIcon && (\n <div\n className={classnames(styles.icon, {\n [styles.iconExpanded]: (expanded || externalExpanded) && !showCustomIcon,\n })}\n data-qa=\"chips-trigger-icon\"\n >\n {showCustomIcon ? rightIcon : <ChevronDownOutlinedSize24 />}\n </div>\n )}\n {hasVerticalScroll && <Scrollbar {...verticalScrollbarProps} />}\n </div>\n );\n};\n\nexport { DesktopChipsTrigger };\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { AriaAttributes, ForwardedRef, ReactElement } from 'react';
2
+ import { ChipsTriggerProps } from './types';
3
+ type MobileChipsTriggerProps<T> = Pick<ChipsTriggerProps<T>, 'state' | 'onChange' | 'chipLayoutComponent' | 'deleteButtonAriaLabel' | 'triggerChipProps' | 'disabled' | 'wrapperRef' | 'onFocus' | 'onBlur' | 'onKeyDown'> & {
4
+ 'data-qa'?: string;
5
+ 'aria-expanded'?: AriaAttributes['aria-expanded'];
6
+ 'aria-controls'?: AriaAttributes['aria-controls'];
7
+ innerRef: ForwardedRef<HTMLInputElement>;
8
+ };
9
+ declare const MobileChipsTrigger: <T>({ state, onChange, chipLayoutComponent, deleteButtonAriaLabel, triggerChipProps, disabled, wrapperRef, onFocus, onBlur, onKeyDown, 'data-qa': dataQa, 'aria-expanded': ariaExpanded, 'aria-controls': ariaControls, innerRef, }: MobileChipsTriggerProps<T>) => ReactElement;
10
+ export { MobileChipsTrigger };
@@ -0,0 +1,69 @@
1
+ import './index.css';
2
+ import { jsxs, jsx } from 'react/jsx-runtime';
3
+ import { useRef } from 'react';
4
+ import { useMultipleRefs } from '@hh.ru/magritte-common-use-multiple-refs';
5
+ import { useTranslation } from '@hh.ru/magritte-common-use-translation';
6
+ import { CustomChip } from '@hh.ru/magritte-ui-chips';
7
+ import { s as styles, C as ChipsList } from './ChipsList-F41a4_2C.js';
8
+ import { PlusOutlinedSize16 } from '@hh.ru/magritte-ui-icon/icon';
9
+
10
+ const MobileChipsTrigger = ({
11
+ state,
12
+ onChange,
13
+ chipLayoutComponent,
14
+ deleteButtonAriaLabel,
15
+ triggerChipProps,
16
+ disabled,
17
+ wrapperRef,
18
+ onFocus,
19
+ onBlur,
20
+ onKeyDown,
21
+ "data-qa": dataQa = "chips-trigger",
22
+ "aria-expanded": ariaExpanded,
23
+ "aria-controls": ariaControls,
24
+ innerRef
25
+ }) => {
26
+ const rootRefCallback = useMultipleRefs(wrapperRef);
27
+ const chipRef = useRef(null);
28
+ const chipRefCallback = useMultipleRefs(innerRef, chipRef);
29
+ const chipLabelTrl = useTranslation("ChipsTrigger", "select");
30
+ const chipChildren = triggerChipProps?.children ?? chipLabelTrl ?? "";
31
+ return /* @__PURE__ */ jsxs("div", { ref: rootRefCallback, className: styles.mobileRoot, onKeyDown, children: [
32
+ state.chips.length > 0 && /* @__PURE__ */ jsx("div", { className: styles.mobileChips, children: /* @__PURE__ */ jsx(
33
+ ChipsList,
34
+ {
35
+ state,
36
+ onChange,
37
+ chipLayoutComponent,
38
+ disabled,
39
+ deleteButtonAriaLabel
40
+ }
41
+ ) }),
42
+ /* @__PURE__ */ jsx(
43
+ CustomChip,
44
+ {
45
+ ...triggerChipProps,
46
+ ref: chipRefCallback,
47
+ Element: "button",
48
+ size: "extra-small",
49
+ style: triggerChipProps?.style ?? "accent",
50
+ addon: triggerChipProps?.addon ?? /* @__PURE__ */ jsx(PlusOutlinedSize16, {}),
51
+ disabled,
52
+ onFocus,
53
+ onBlur,
54
+ dataQaWrapper: triggerChipProps?.dataQaWrapper ?? "chips-trigger-select",
55
+ "data-qa": triggerChipProps?.["data-qa"] ?? dataQa,
56
+ "aria-haspopup": "listbox",
57
+ "aria-expanded": ariaExpanded,
58
+ "aria-controls": ariaControls,
59
+ onClick: () => {
60
+ chipRef.current?.focus({ preventScroll: true });
61
+ },
62
+ children: chipChildren
63
+ }
64
+ )
65
+ ] });
66
+ };
67
+
68
+ export { MobileChipsTrigger };
69
+ //# sourceMappingURL=MobileChipsTrigger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MobileChipsTrigger.js","sources":["src/MobileChipsTrigger.tsx"],"sourcesContent":["import { AriaAttributes, FocusEventHandler, ForwardedRef, Ref, ReactElement, useRef } from 'react';\n\nimport { useMultipleRefs } from '@hh.ru/magritte-common-use-multiple-refs';\nimport { useTranslation } from '@hh.ru/magritte-common-use-translation';\nimport { CustomChip } from '@hh.ru/magritte-ui-chips';\nimport { ChipsList } from '@hh.ru/magritte-ui-chips-trigger/ChipsList';\nimport { ChipsTriggerProps } from '@hh.ru/magritte-ui-chips-trigger/types';\nimport { PlusOutlinedSize16 } from '@hh.ru/magritte-ui-icon/icon';\n\nimport styles from './chips-trigger.less';\n\ntype MobileChipsTriggerProps<T> = Pick<\n ChipsTriggerProps<T>,\n | 'state'\n | 'onChange'\n | 'chipLayoutComponent'\n | 'deleteButtonAriaLabel'\n | 'triggerChipProps'\n | 'disabled'\n | 'wrapperRef'\n | 'onFocus'\n | 'onBlur'\n | 'onKeyDown'\n> & {\n 'data-qa'?: string;\n 'aria-expanded'?: AriaAttributes['aria-expanded'];\n 'aria-controls'?: AriaAttributes['aria-controls'];\n innerRef: ForwardedRef<HTMLInputElement>;\n};\n\nconst MobileChipsTrigger = <T,>({\n state,\n onChange,\n chipLayoutComponent,\n deleteButtonAriaLabel,\n triggerChipProps,\n disabled,\n wrapperRef,\n onFocus,\n onBlur,\n onKeyDown,\n 'data-qa': dataQa = 'chips-trigger',\n 'aria-expanded': ariaExpanded,\n 'aria-controls': ariaControls,\n innerRef,\n}: MobileChipsTriggerProps<T>): ReactElement => {\n const rootRefCallback = useMultipleRefs(wrapperRef);\n const chipRef = useRef<HTMLButtonElement>(null);\n const chipRefCallback = useMultipleRefs(innerRef as unknown as Ref<HTMLButtonElement>, chipRef);\n const chipLabelTrl = useTranslation('ChipsTrigger', 'select');\n const chipChildren = triggerChipProps?.children ?? chipLabelTrl ?? '';\n\n return (\n <div ref={rootRefCallback} className={styles.mobileRoot} onKeyDown={onKeyDown}>\n {state.chips.length > 0 && (\n <div className={styles.mobileChips}>\n <ChipsList\n state={state}\n onChange={onChange}\n chipLayoutComponent={chipLayoutComponent}\n disabled={disabled}\n deleteButtonAriaLabel={deleteButtonAriaLabel}\n />\n </div>\n )}\n <CustomChip\n {...triggerChipProps}\n ref={chipRefCallback}\n Element=\"button\"\n size=\"extra-small\"\n style={triggerChipProps?.style ?? 'accent'}\n addon={triggerChipProps?.addon ?? <PlusOutlinedSize16 />}\n disabled={disabled}\n // чипс инпут описан через HTMLInputElement, а тут нужен HTMLButtonElement\n onFocus={onFocus as unknown as FocusEventHandler<HTMLButtonElement> | undefined}\n onBlur={onBlur as unknown as FocusEventHandler<HTMLButtonElement> | undefined}\n dataQaWrapper={triggerChipProps?.dataQaWrapper ?? 'chips-trigger-select'}\n data-qa={triggerChipProps?.['data-qa'] ?? dataQa}\n aria-haspopup=\"listbox\"\n aria-expanded={ariaExpanded}\n aria-controls={ariaControls}\n onClick={() => {\n chipRef.current?.focus({ preventScroll: true });\n }}\n >\n {chipChildren}\n </CustomChip>\n </div>\n );\n};\n\nexport { MobileChipsTrigger };\n"],"names":[],"mappings":";;;;;;;;AA8BA,MAAM,qBAAqB,CAAK;AAAA,EAC5B,KAAA;AAAA,EACA,QAAA;AAAA,EACA,mBAAA;AAAA,EACA,qBAAA;AAAA,EACA,gBAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAW,MAAS,GAAA,eAAA;AAAA,EACpB,eAAiB,EAAA,YAAA;AAAA,EACjB,eAAiB,EAAA,YAAA;AAAA,EACjB,QAAA;AACJ,CAAgD,KAAA;AAC5C,EAAM,MAAA,eAAA,GAAkB,gBAAgB,UAAU,CAAA,CAAA;AAClD,EAAM,MAAA,OAAA,GAAU,OAA0B,IAAI,CAAA,CAAA;AAC9C,EAAM,MAAA,eAAA,GAAkB,eAAgB,CAAA,QAAA,EAA+C,OAAO,CAAA,CAAA;AAC9F,EAAM,MAAA,YAAA,GAAe,cAAe,CAAA,cAAA,EAAgB,QAAQ,CAAA,CAAA;AAC5D,EAAM,MAAA,YAAA,GAAe,gBAAkB,EAAA,QAAA,IAAY,YAAgB,IAAA,EAAA,CAAA;AAEnE,EAAA,4BACK,KAAI,EAAA,EAAA,GAAA,EAAK,iBAAiB,SAAW,EAAA,MAAA,CAAO,YAAY,SACpD,EAAA,QAAA,EAAA;AAAA,IAAA,KAAA,CAAM,MAAM,MAAS,GAAA,CAAA,wBACjB,KAAI,EAAA,EAAA,SAAA,EAAW,OAAO,WACnB,EAAA,QAAA,kBAAA,GAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACG,KAAA;AAAA,QACA,QAAA;AAAA,QACA,mBAAA;AAAA,QACA,QAAA;AAAA,QACA,qBAAA;AAAA,OAAA;AAAA,KAER,EAAA,CAAA;AAAA,oBAEJ,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACI,GAAG,gBAAA;AAAA,QACJ,GAAK,EAAA,eAAA;AAAA,QACL,OAAQ,EAAA,QAAA;AAAA,QACR,IAAK,EAAA,aAAA;AAAA,QACL,KAAA,EAAO,kBAAkB,KAAS,IAAA,QAAA;AAAA,QAClC,KAAO,EAAA,gBAAA,EAAkB,KAAS,oBAAA,GAAA,CAAC,kBAAmB,EAAA,EAAA,CAAA;AAAA,QACtD,QAAA;AAAA,QAEA,OAAA;AAAA,QACA,MAAA;AAAA,QACA,aAAA,EAAe,kBAAkB,aAAiB,IAAA,sBAAA;AAAA,QAClD,SAAA,EAAS,gBAAmB,GAAA,SAAS,CAAK,IAAA,MAAA;AAAA,QAC1C,eAAc,EAAA,SAAA;AAAA,QACd,eAAe,EAAA,YAAA;AAAA,QACf,eAAe,EAAA,YAAA;AAAA,QACf,SAAS,MAAM;AACX,UAAA,OAAA,CAAQ,OAAS,EAAA,KAAA,CAAM,EAAE,aAAA,EAAe,MAAM,CAAA,CAAA;AAAA,SAClD;AAAA,QAEC,QAAA,EAAA,YAAA;AAAA,OAAA;AAAA,KACL;AAAA,GACJ,EAAA,CAAA,CAAA;AAER;;;;"}
@@ -2,16 +2,19 @@ import './index.css';
2
2
  import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
3
3
  import { forwardRef, useState } from 'react';
4
4
  import { ChipsTrigger } from './ChipsTrigger.js';
5
+ import '@hh.ru/magritte-ui-breakpoint';
6
+ import './DesktopChipsTrigger.js';
5
7
  import 'classnames';
6
8
  import '@hh.ru/magritte-common-keyboard';
7
9
  import '@hh.ru/magritte-common-use-multiple-refs';
10
+ import './ChipsList-F41a4_2C.js';
8
11
  import '@hh.ru/magritte-common-use-translation';
9
- import '@hh.ru/magritte-ui-breakpoint';
10
12
  import '@hh.ru/magritte-ui-chips';
11
- import '@hh.ru/magritte-ui-form-helper';
12
13
  import '@hh.ru/magritte-ui-icon/icon';
13
14
  import '@hh.ru/magritte-ui-input/useFocus';
14
15
  import '@hh.ru/magritte-ui-scrollbar';
16
+ import './MobileChipsTrigger.js';
17
+ import '@hh.ru/magritte-ui-form-helper';
15
18
 
16
19
  const DEFAULT_STATE = {
17
20
  value: "",
@@ -1 +1 @@
1
- {"version":3,"file":"UncontrolledChipsTrigger.js","sources":["src/UncontrolledChipsTrigger.tsx"],"sourcesContent":["import { ForwardedRef, LegacyRef, ReactElement, forwardRef, InputHTMLAttributes, useState } from 'react';\n\nimport { ChipsTrigger } from '@hh.ru/magritte-ui-chips-trigger/ChipsTrigger';\nimport { UncontrolledChipsTriggerProps, ChipsTriggerState } from '@hh.ru/magritte-ui-chips-trigger/types';\n\nconst DEFAULT_STATE = {\n value: '',\n chips: [],\n};\n\nconst UncontrolledChipsTriggerComponent = <T,>(\n {\n state: defaultState = DEFAULT_STATE,\n onChange,\n name,\n ...restProps\n }: UncontrolledChipsTriggerProps<T> &\n Omit<InputHTMLAttributes<HTMLInputElement>, keyof UncontrolledChipsTriggerProps<T>>,\n ref: ForwardedRef<HTMLInputElement>\n) => {\n const [state, setState] = useState<ChipsTriggerState<T>>({ ...defaultState });\n return (\n <>\n <ChipsTrigger\n {...restProps}\n state={state}\n onChange={(newState) => {\n setState(newState);\n onChange?.(newState);\n }}\n ref={ref}\n />\n {state.chips.map((chip) => (\n <input type=\"hidden\" name={name} value={chip.value} key={chip.value} />\n ))}\n </>\n );\n};\n\nconst UncontrolledChipsTrigger = forwardRef(UncontrolledChipsTriggerComponent) as (<T>(\n props: UncontrolledChipsTriggerProps<T> &\n Omit<InputHTMLAttributes<HTMLInputElement>, keyof UncontrolledChipsTriggerProps<T>> & {\n ref?: LegacyRef<HTMLInputElement>;\n }\n) => ReactElement | null) & { displayName: string };\n\nUncontrolledChipsTrigger.displayName = 'UncontrolledChipsTrigger';\n\nexport { UncontrolledChipsTrigger };\n"],"names":[],"mappings":";;;;;;;;;;;;;;AAKA,MAAM,aAAgB,GAAA;AAAA,EAClB,KAAO,EAAA,EAAA;AAAA,EACP,OAAO,EAAC;AACZ,CAAA,CAAA;AAEA,MAAM,oCAAoC,CACtC;AAAA,EACI,OAAO,YAAe,GAAA,aAAA;AAAA,EACtB,QAAA;AAAA,EACA,IAAA;AAAA,EACA,GAAG,SAAA;AACP,CAAA,EAEA,GACC,KAAA;AACD,EAAM,MAAA,CAAC,OAAO,QAAQ,CAAA,GAAI,SAA+B,EAAE,GAAG,cAAc,CAAA,CAAA;AAC5E,EAAA,uBAEQ,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACI,GAAG,SAAA;AAAA,QACJ,KAAA;AAAA,QACA,QAAA,EAAU,CAAC,QAAa,KAAA;AACpB,UAAA,QAAA,CAAS,QAAQ,CAAA,CAAA;AACjB,UAAA,QAAA,GAAW,QAAQ,CAAA,CAAA;AAAA,SACvB;AAAA,QACA,GAAA;AAAA,OAAA;AAAA,KACJ;AAAA,IACC,KAAM,CAAA,KAAA,CAAM,GAAI,CAAA,CAAC,yBACb,GAAA,CAAA,OAAA,EAAA,EAAM,IAAK,EAAA,QAAA,EAAS,MAAY,KAAO,EAAA,IAAA,CAAK,KAAY,EAAA,EAAA,IAAA,CAAK,KAAO,CACxE,CAAA;AAAA,GACL,EAAA,CAAA,CAAA;AAER,CAAA,CAAA;AAEM,MAAA,wBAAA,GAA2B,WAAW,iCAAiC,EAAA;AAO7E,wBAAA,CAAyB,WAAc,GAAA,0BAAA;;;;"}
1
+ {"version":3,"file":"UncontrolledChipsTrigger.js","sources":["src/UncontrolledChipsTrigger.tsx"],"sourcesContent":["import { ForwardedRef, LegacyRef, ReactElement, forwardRef, InputHTMLAttributes, useState } from 'react';\n\nimport { ChipsTrigger } from '@hh.ru/magritte-ui-chips-trigger/ChipsTrigger';\nimport { UncontrolledChipsTriggerProps, ChipsTriggerState } from '@hh.ru/magritte-ui-chips-trigger/types';\n\nconst DEFAULT_STATE = {\n value: '',\n chips: [],\n};\n\nconst UncontrolledChipsTriggerComponent = <T,>(\n {\n state: defaultState = DEFAULT_STATE,\n onChange,\n name,\n ...restProps\n }: UncontrolledChipsTriggerProps<T> &\n Omit<InputHTMLAttributes<HTMLInputElement>, keyof UncontrolledChipsTriggerProps<T>>,\n ref: ForwardedRef<HTMLInputElement>\n) => {\n const [state, setState] = useState<ChipsTriggerState<T>>({ ...defaultState });\n return (\n <>\n <ChipsTrigger\n {...restProps}\n state={state}\n onChange={(newState) => {\n setState(newState);\n onChange?.(newState);\n }}\n ref={ref}\n />\n {state.chips.map((chip) => (\n <input type=\"hidden\" name={name} value={chip.value} key={chip.value} />\n ))}\n </>\n );\n};\n\nconst UncontrolledChipsTrigger = forwardRef(UncontrolledChipsTriggerComponent) as (<T>(\n props: UncontrolledChipsTriggerProps<T> &\n Omit<InputHTMLAttributes<HTMLInputElement>, keyof UncontrolledChipsTriggerProps<T>> & {\n ref?: LegacyRef<HTMLInputElement>;\n }\n) => ReactElement | null) & { displayName: string };\n\nUncontrolledChipsTrigger.displayName = 'UncontrolledChipsTrigger';\n\nexport { UncontrolledChipsTrigger };\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAKA,MAAM,aAAgB,GAAA;AAAA,EAClB,KAAO,EAAA,EAAA;AAAA,EACP,OAAO,EAAC;AACZ,CAAA,CAAA;AAEA,MAAM,oCAAoC,CACtC;AAAA,EACI,OAAO,YAAe,GAAA,aAAA;AAAA,EACtB,QAAA;AAAA,EACA,IAAA;AAAA,EACA,GAAG,SAAA;AACP,CAAA,EAEA,GACC,KAAA;AACD,EAAM,MAAA,CAAC,OAAO,QAAQ,CAAA,GAAI,SAA+B,EAAE,GAAG,cAAc,CAAA,CAAA;AAC5E,EAAA,uBAEQ,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACI,GAAG,SAAA;AAAA,QACJ,KAAA;AAAA,QACA,QAAA,EAAU,CAAC,QAAa,KAAA;AACpB,UAAA,QAAA,CAAS,QAAQ,CAAA,CAAA;AACjB,UAAA,QAAA,GAAW,QAAQ,CAAA,CAAA;AAAA,SACvB;AAAA,QACA,GAAA;AAAA,OAAA;AAAA,KACJ;AAAA,IACC,KAAM,CAAA,KAAA,CAAM,GAAI,CAAA,CAAC,yBACb,GAAA,CAAA,OAAA,EAAA,EAAM,IAAK,EAAA,QAAA,EAAS,MAAY,KAAO,EAAA,IAAA,CAAK,KAAY,EAAA,EAAA,IAAA,CAAK,KAAO,CACxE,CAAA;AAAA,GACL,EAAA,CAAA,CAAA;AAER,CAAA,CAAA;AAEM,MAAA,wBAAA,GAA2B,WAAW,iCAAiC,EAAA;AAO7E,wBAAA,CAAyB,WAAc,GAAA,0BAAA;;;;"}
package/index.css CHANGED
@@ -68,7 +68,7 @@
68
68
  --magritte-color-component-input-icon-state-chevron-hovered-v26-0-2:#8293a2;
69
69
  --magritte-color-component-input-icon-state-chevron-disabled-v26-0-2:#96aabb;
70
70
  }
71
- .magritte-root___-zVdz_4-5-7{
71
+ .magritte-root___-zVdz_4-6-1{
72
72
  display:inline-flex;
73
73
  position:relative;
74
74
  width:100%;
@@ -84,139 +84,139 @@
84
84
  --magritte-ui-scrollbar-border-radius:12px;
85
85
  }
86
86
  @media (min-width: 1020px){
87
- body.magritte-old-layout .magritte-root___-zVdz_4-5-7:not(.magritte-focused___0Uzyu_4-5-7):not(.magritte-invalid___tVzQV_4-5-7):not(.magritte-disabled___UeqcV_4-5-7):hover{
87
+ body.magritte-old-layout .magritte-root___-zVdz_4-6-1:not(.magritte-focused___0Uzyu_4-6-1):not(.magritte-invalid___tVzQV_4-6-1):not(.magritte-disabled___UeqcV_4-6-1):hover{
88
88
  background-color:var(--magritte-color-component-input-background-state-field-hovered-v26-0-2);
89
89
  box-shadow:inset 0 0 0 1px var(--magritte-color-component-input-stroke-state-field-hovered-v26-0-2);
90
90
  --magritte-ui-icon-color-override:var(--magritte-color-component-input-icon-state-chevron-hovered-v26-0-2);
91
91
  }
92
- body.magritte-old-layout .magritte-root___-zVdz_4-5-7:not(.magritte-focused___0Uzyu_4-5-7):not(.magritte-invalid___tVzQV_4-5-7):not(.magritte-disabled___UeqcV_4-5-7):hover .magritte-label___j7Trt_4-5-7{
92
+ body.magritte-old-layout .magritte-root___-zVdz_4-6-1:not(.magritte-focused___0Uzyu_4-6-1):not(.magritte-invalid___tVzQV_4-6-1):not(.magritte-disabled___UeqcV_4-6-1):hover .magritte-label___j7Trt_4-6-1{
93
93
  color:var(--magritte-color-component-input-text-state-placeholder-hovered-v26-0-2);
94
94
  }
95
- body.magritte-old-layout .magritte-root___-zVdz_4-5-7:not(.magritte-focused___0Uzyu_4-5-7):not(.magritte-invalid___tVzQV_4-5-7):not(.magritte-disabled___UeqcV_4-5-7):hover .magritte-field-input___04Cag_4-5-7{
95
+ body.magritte-old-layout .magritte-root___-zVdz_4-6-1:not(.magritte-focused___0Uzyu_4-6-1):not(.magritte-invalid___tVzQV_4-6-1):not(.magritte-disabled___UeqcV_4-6-1):hover .magritte-field-input___04Cag_4-6-1{
96
96
  color:var(--magritte-color-component-input-text-state-content-hovered-v26-0-2);
97
97
  }
98
98
  }
99
99
  @media (min-width: 1024px){
100
- body:not(.magritte-old-layout) .magritte-root___-zVdz_4-5-7:not(.magritte-focused___0Uzyu_4-5-7):not(.magritte-invalid___tVzQV_4-5-7):not(.magritte-disabled___UeqcV_4-5-7):hover{
100
+ body:not(.magritte-old-layout) .magritte-root___-zVdz_4-6-1:not(.magritte-focused___0Uzyu_4-6-1):not(.magritte-invalid___tVzQV_4-6-1):not(.magritte-disabled___UeqcV_4-6-1):hover{
101
101
  background-color:var(--magritte-color-component-input-background-state-field-hovered-v26-0-2);
102
102
  box-shadow:inset 0 0 0 1px var(--magritte-color-component-input-stroke-state-field-hovered-v26-0-2);
103
103
  --magritte-ui-icon-color-override:var(--magritte-color-component-input-icon-state-chevron-hovered-v26-0-2);
104
104
  }
105
- body:not(.magritte-old-layout) .magritte-root___-zVdz_4-5-7:not(.magritte-focused___0Uzyu_4-5-7):not(.magritte-invalid___tVzQV_4-5-7):not(.magritte-disabled___UeqcV_4-5-7):hover .magritte-label___j7Trt_4-5-7{
105
+ body:not(.magritte-old-layout) .magritte-root___-zVdz_4-6-1:not(.magritte-focused___0Uzyu_4-6-1):not(.magritte-invalid___tVzQV_4-6-1):not(.magritte-disabled___UeqcV_4-6-1):hover .magritte-label___j7Trt_4-6-1{
106
106
  color:var(--magritte-color-component-input-text-state-placeholder-hovered-v26-0-2);
107
107
  }
108
- body:not(.magritte-old-layout) .magritte-root___-zVdz_4-5-7:not(.magritte-focused___0Uzyu_4-5-7):not(.magritte-invalid___tVzQV_4-5-7):not(.magritte-disabled___UeqcV_4-5-7):hover .magritte-field-input___04Cag_4-5-7{
108
+ body:not(.magritte-old-layout) .magritte-root___-zVdz_4-6-1:not(.magritte-focused___0Uzyu_4-6-1):not(.magritte-invalid___tVzQV_4-6-1):not(.magritte-disabled___UeqcV_4-6-1):hover .magritte-field-input___04Cag_4-6-1{
109
109
  color:var(--magritte-color-component-input-text-state-content-hovered-v26-0-2);
110
110
  }
111
111
  }
112
- .magritte-root___-zVdz_4-5-7:not(.magritte-disabled___UeqcV_4-5-7){
112
+ .magritte-root___-zVdz_4-6-1:not(.magritte-disabled___UeqcV_4-6-1){
113
113
  cursor:text;
114
114
  }
115
- .magritte-root___-zVdz_4-5-7.magritte-focused___0Uzyu_4-5-7{
115
+ .magritte-root___-zVdz_4-6-1.magritte-focused___0Uzyu_4-6-1{
116
116
  background-color:var(--magritte-color-component-input-background-state-field-focused-v26-0-2);
117
117
  box-shadow:inset 0 0 0 2px var(--magritte-color-component-input-stroke-state-field-focused-v26-0-2);
118
118
  --magritte-ui-icon-color-override:var(--magritte-color-component-input-icon-state-chevron-focused-v26-0-2);
119
119
  }
120
- .magritte-root___-zVdz_4-5-7.magritte-focused___0Uzyu_4-5-7 .magritte-label___j7Trt_4-5-7{
120
+ .magritte-root___-zVdz_4-6-1.magritte-focused___0Uzyu_4-6-1 .magritte-label___j7Trt_4-6-1{
121
121
  color:var(--magritte-color-component-input-text-state-placeholder-focused-v26-0-2);
122
122
  }
123
- .magritte-root___-zVdz_4-5-7.magritte-focused___0Uzyu_4-5-7 .magritte-field-input___04Cag_4-5-7{
123
+ .magritte-root___-zVdz_4-6-1.magritte-focused___0Uzyu_4-6-1 .magritte-field-input___04Cag_4-6-1{
124
124
  color:var(--magritte-color-component-input-text-state-content-focused-v26-0-2);
125
125
  }
126
- .magritte-root___-zVdz_4-5-7.magritte-invalid___tVzQV_4-5-7{
126
+ .magritte-root___-zVdz_4-6-1.magritte-invalid___tVzQV_4-6-1{
127
127
  background-color:var(--magritte-color-component-input-background-state-field-invalid-v26-0-2);
128
128
  box-shadow:inset 0 0 0 1px var(--magritte-color-component-input-stroke-state-field-invalid-v26-0-2);
129
129
  --magritte-ui-icon-color-override:var(--magritte-color-component-input-icon-state-chevron-invalid-v26-0-2);
130
130
  }
131
- .magritte-root___-zVdz_4-5-7.magritte-invalid___tVzQV_4-5-7 .magritte-label___j7Trt_4-5-7{
131
+ .magritte-root___-zVdz_4-6-1.magritte-invalid___tVzQV_4-6-1 .magritte-label___j7Trt_4-6-1{
132
132
  color:var(--magritte-color-component-input-text-state-placeholder-invalid-v26-0-2);
133
133
  }
134
- .magritte-root___-zVdz_4-5-7.magritte-invalid___tVzQV_4-5-7 .magritte-field-input___04Cag_4-5-7{
134
+ .magritte-root___-zVdz_4-6-1.magritte-invalid___tVzQV_4-6-1 .magritte-field-input___04Cag_4-6-1{
135
135
  color:var(--magritte-color-component-input-text-state-content-invalid-v26-0-2);
136
136
  }
137
- .magritte-root___-zVdz_4-5-7.magritte-disabled___UeqcV_4-5-7{
137
+ .magritte-root___-zVdz_4-6-1.magritte-disabled___UeqcV_4-6-1{
138
138
  background-color:var(--magritte-color-component-input-background-state-field-disabled-v26-0-2);
139
139
  box-shadow:inset 0 0 0 1px var(--magritte-color-component-input-stroke-state-field-disabled-v26-0-2);
140
140
  --magritte-ui-icon-color-override:var(--magritte-color-component-input-icon-state-chevron-disabled-v26-0-2);
141
141
  --magritte-ui-chip-text-color-override:var(--magritte-color-component-input-chips-text-state-neutral-disable-v26-0-2);
142
142
  --magritte-ui-chip-background-color-override:var(--magritte-color-component-input-chips-background-state-neutral-disable-v26-0-2);
143
143
  }
144
- .magritte-root___-zVdz_4-5-7.magritte-disabled___UeqcV_4-5-7 .magritte-label___j7Trt_4-5-7{
144
+ .magritte-root___-zVdz_4-6-1.magritte-disabled___UeqcV_4-6-1 .magritte-label___j7Trt_4-6-1{
145
145
  color:var(--magritte-color-component-input-text-state-placeholder-disabled-v26-0-2);
146
146
  }
147
- .magritte-root___-zVdz_4-5-7.magritte-disabled___UeqcV_4-5-7 .magritte-field-input___04Cag_4-5-7{
147
+ .magritte-root___-zVdz_4-6-1.magritte-disabled___UeqcV_4-6-1 .magritte-field-input___04Cag_4-6-1{
148
148
  color:var(--magritte-color-component-input-text-state-content-disabled-v26-0-2);
149
149
  }
150
- .magritte-root___-zVdz_4-5-7.magritte-disabled___UeqcV_4-5-7 .magritte-scrollable-area___-xMF2_4-5-7{
150
+ .magritte-root___-zVdz_4-6-1.magritte-disabled___UeqcV_4-6-1 .magritte-scrollable-area___-xMF2_4-6-1{
151
151
  overflow:hidden;
152
152
  }
153
- .magritte-root___-zVdz_4-5-7.magritte-focus-visible___ifvAP_4-5-7{
153
+ .magritte-root___-zVdz_4-6-1.magritte-focus-visible___ifvAP_4-6-1{
154
154
  outline:var(--magritte-color-component-input-stroke-state-accent-focused-accessible-v26-0-2) solid 4px;
155
155
  }
156
- .magritte-root___-zVdz_4-5-7.magritte-focus-visible___ifvAP_4-5-7.magritte-invalid___tVzQV_4-5-7{
156
+ .magritte-root___-zVdz_4-6-1.magritte-focus-visible___ifvAP_4-6-1.magritte-invalid___tVzQV_4-6-1{
157
157
  outline-color:var(--magritte-color-component-input-stroke-state-negative-focused-accessible-v26-0-2);
158
158
  }
159
- .magritte-large___JIrIy_4-5-7{
159
+ .magritte-large___JIrIy_4-6-1{
160
160
  padding-left:12px;
161
161
  padding-top:12px;
162
162
  padding-bottom:12px;
163
163
  padding-right:2px;
164
164
  }
165
- .magritte-large___JIrIy_4-5-7 .magritte-field___rlEmn_4-5-7{
165
+ .magritte-large___JIrIy_4-6-1 .magritte-field___rlEmn_4-6-1{
166
166
  margin-left:4px;
167
167
  }
168
- .magritte-large___JIrIy_4-5-7 .magritte-icon___fDMiz_4-5-7{
168
+ .magritte-large___JIrIy_4-6-1 .magritte-icon___fDMiz_4-6-1{
169
169
  top:12px;
170
170
  right:16px;
171
171
  }
172
- .magritte-large___JIrIy_4-5-7 .magritte-scrollable-area-wrapper___hZNQd_4-5-7{
172
+ .magritte-large___JIrIy_4-6-1 .magritte-scrollable-area-wrapper___hZNQd_4-6-1{
173
173
  padding-right:10px;
174
174
  }
175
- .magritte-large___JIrIy_4-5-7 .magritte-scrollable-area-wrapper_with-icon___2VoX9_4-5-7{
175
+ .magritte-large___JIrIy_4-6-1 .magritte-scrollable-area-wrapper_with-icon___2VoX9_4-6-1{
176
176
  padding-right:calc(24px + 10px + 12px);
177
177
  }
178
- .magritte-medium___Xk-XB_4-5-7{
178
+ .magritte-medium___Xk-XB_4-6-1{
179
179
  padding-left:8px;
180
180
  padding-top:8px;
181
181
  padding-bottom:8px;
182
182
  padding-right:2px;
183
183
  }
184
- .magritte-medium___Xk-XB_4-5-7 .magritte-field___rlEmn_4-5-7{
184
+ .magritte-medium___Xk-XB_4-6-1 .magritte-field___rlEmn_4-6-1{
185
185
  margin-left:8px;
186
186
  }
187
- .magritte-medium___Xk-XB_4-5-7 .magritte-icon___fDMiz_4-5-7{
187
+ .magritte-medium___Xk-XB_4-6-1 .magritte-icon___fDMiz_4-6-1{
188
188
  top:8px;
189
189
  right:12px;
190
190
  }
191
- .magritte-medium___Xk-XB_4-5-7 .magritte-scrollable-area-wrapper___hZNQd_4-5-7{
191
+ .magritte-medium___Xk-XB_4-6-1 .magritte-scrollable-area-wrapper___hZNQd_4-6-1{
192
192
  padding-right:6px;
193
193
  }
194
- .magritte-medium___Xk-XB_4-5-7 .magritte-scrollable-area-wrapper_with-icon___2VoX9_4-5-7{
194
+ .magritte-medium___Xk-XB_4-6-1 .magritte-scrollable-area-wrapper_with-icon___2VoX9_4-6-1{
195
195
  padding-right:calc(24px + 6px + 12px);
196
196
  }
197
- .magritte-scrollable-area-wrapper___hZNQd_4-5-7{
197
+ .magritte-scrollable-area-wrapper___hZNQd_4-6-1{
198
198
  width:100%;
199
199
  position:relative;
200
200
  overflow:hidden;
201
201
  }
202
- .magritte-scrollable-area___-xMF2_4-5-7{
202
+ .magritte-scrollable-area___-xMF2_4-6-1{
203
203
  height:100%;
204
204
  display:flex;
205
205
  align-items:flex-start;
206
206
  overflow-y:auto;
207
207
  scrollbar-width:none;
208
208
  }
209
- .magritte-scrollable-area___-xMF2_4-5-7::-webkit-scrollbar{
209
+ .magritte-scrollable-area___-xMF2_4-6-1::-webkit-scrollbar{
210
210
  display:none;
211
211
  }
212
- .magritte-chips-and-input___qg-Ba_4-5-7{
212
+ .magritte-chips-and-input___qg-Ba_4-6-1{
213
213
  display:flex;
214
214
  gap:8px;
215
215
  flex-wrap:wrap;
216
216
  align-items:center;
217
217
  width:100%;
218
218
  }
219
- .magritte-field___rlEmn_4-5-7{
219
+ .magritte-field___rlEmn_4-6-1{
220
220
  display:flex;
221
221
  align-items:center;
222
222
  position:relative;
@@ -232,7 +232,7 @@
232
232
  text-transform:none;
233
233
  text-decoration:none;
234
234
  }
235
- .magritte-field-input___04Cag_4-5-7{
235
+ .magritte-field-input___04Cag_4-6-1{
236
236
  border:0;
237
237
  padding:0;
238
238
  background:none;
@@ -241,19 +241,19 @@
241
241
  z-index:1;
242
242
  color:var(--magritte-color-component-input-text-content-v26-0-2);
243
243
  }
244
- .magritte-label-wrapper___De7Bm_4-5-7{
244
+ .magritte-label-wrapper___De7Bm_4-6-1{
245
245
  display:flex;
246
246
  align-items:center;
247
247
  position:absolute;
248
248
  height:100%;
249
249
  inset:0;
250
250
  }
251
- .magritte-label___j7Trt_4-5-7{
251
+ .magritte-label___j7Trt_4-6-1{
252
252
  color:var(--magritte-color-component-input-text-placeholder-v26-0-2);
253
253
  overflow:hidden;
254
254
  text-overflow:ellipsis;
255
255
  }
256
- .magritte-icon___fDMiz_4-5-7{
256
+ .magritte-icon___fDMiz_4-6-1{
257
257
  display:inline-flex;
258
258
  margin-left:auto;
259
259
  padding:4px 0;
@@ -262,11 +262,22 @@
262
262
  transition-duration:var(--magritte-semantic-animation-ease-in-out-100-duration-v26-0-2);
263
263
  transition-timing-function:var(--magritte-semantic-animation-ease-in-out-100-timing-function-v26-0-2);
264
264
  }
265
- .magritte-icon_expanded___RaOT-_4-5-7{
265
+ .magritte-icon_expanded___RaOT-_4-6-1{
266
266
  transform:rotate(-180deg);
267
267
  --magritte-ui-icon-color-override:var(--magritte-color-component-input-icon-state-chevron-focused-v26-0-2);
268
268
  }
269
- .magritte-custom-chip-wrapper___a9kJ6_4-5-7{
269
+ .magritte-custom-chip-wrapper___a9kJ6_4-6-1{
270
270
  display:inline-flex;
271
271
  min-width:0;
272
272
  }
273
+ .magritte-mobile-root___-hey4_4-6-1{
274
+ display:flex;
275
+ flex-direction:column;
276
+ align-items:flex-start;
277
+ gap:12px;
278
+ }
279
+ .magritte-mobile-chips___cuB21_4-6-1{
280
+ display:flex;
281
+ flex-wrap:wrap;
282
+ gap:8px;
283
+ }
package/index.js CHANGED
@@ -3,14 +3,17 @@ export { ChipsTrigger } from './ChipsTrigger.js';
3
3
  export { UncontrolledChipsTrigger } from './UncontrolledChipsTrigger.js';
4
4
  import 'react/jsx-runtime';
5
5
  import 'react';
6
+ import '@hh.ru/magritte-ui-breakpoint';
7
+ import './DesktopChipsTrigger.js';
6
8
  import 'classnames';
7
9
  import '@hh.ru/magritte-common-keyboard';
8
10
  import '@hh.ru/magritte-common-use-multiple-refs';
11
+ import './ChipsList-F41a4_2C.js';
9
12
  import '@hh.ru/magritte-common-use-translation';
10
- import '@hh.ru/magritte-ui-breakpoint';
11
13
  import '@hh.ru/magritte-ui-chips';
12
- import '@hh.ru/magritte-ui-form-helper';
13
14
  import '@hh.ru/magritte-ui-icon/icon';
14
15
  import '@hh.ru/magritte-ui-input/useFocus';
15
16
  import '@hh.ru/magritte-ui-scrollbar';
17
+ import './MobileChipsTrigger.js';
18
+ import '@hh.ru/magritte-ui-form-helper';
16
19
  //# sourceMappingURL=index.js.map
package/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hh.ru/magritte-ui-chips-trigger",
3
- "version": "4.5.7",
3
+ "version": "4.6.1",
4
4
  "main": "index.js",
5
5
  "types": "index.d.ts",
6
6
  "sideEffects": [
@@ -29,15 +29,15 @@
29
29
  "dependencies": {
30
30
  "@hh.ru/magritte-common-keyboard": "4.3.7",
31
31
  "@hh.ru/magritte-common-use-multiple-refs": "1.1.13",
32
- "@hh.ru/magritte-common-use-translation": "3.6.2",
32
+ "@hh.ru/magritte-common-use-translation": "3.7.0",
33
33
  "@hh.ru/magritte-design-tokens": "26.0.2",
34
34
  "@hh.ru/magritte-ui-breakpoint": "6.1.3",
35
- "@hh.ru/magritte-ui-chips": "7.0.49",
35
+ "@hh.ru/magritte-ui-chips": "7.0.51",
36
36
  "@hh.ru/magritte-ui-form-helper": "2.1.27",
37
37
  "@hh.ru/magritte-ui-icon": "15.1.6",
38
- "@hh.ru/magritte-ui-input": "9.4.55",
38
+ "@hh.ru/magritte-ui-input": "9.4.56",
39
39
  "@hh.ru/magritte-ui-mock-component": "1.1.9",
40
40
  "@hh.ru/magritte-ui-scrollbar": "1.0.40"
41
41
  },
42
- "gitHead": "ca948a3b83c1141cea0f32e35a9d4dc56f8d0077"
42
+ "gitHead": "c8093595868a906e4e0f860f0deafc6c44f07d69"
43
43
  }
package/types.d.ts CHANGED
@@ -24,6 +24,11 @@ export type ChipCustomLayoutProps<T = unknown> = {
24
24
  /** Данные элемента, из которого собран чипс */
25
25
  data?: T;
26
26
  } & CustomChipProps;
27
+ type DistributiveOmit<T, K extends PropertyKey> = T extends unknown ? Omit<T, K> : never;
28
+ export type ChipsTriggerChipProps = DistributiveOmit<CustomChipProps, 'children'> & {
29
+ /** Содержимое лейбла чипса, по умолчанию берётся перевод `ChipsTrigger.select` */
30
+ children?: CustomChipProps['children'];
31
+ };
27
32
  export type ChipCustomLayoutComponent<T = unknown> = ComponentType<ChipCustomLayoutProps<T>>;
28
33
  export interface ChipsTriggerProps<T = unknown> {
29
34
  /** Размер для chips-trigger */
@@ -53,6 +58,10 @@ export interface ChipsTriggerProps<T = unknown> {
53
58
  rightIcon?: ReactElement | boolean;
54
59
  /** Компонент для кастомной верстки чипса, по умолчанию чипс рисуется через CustomChip */
55
60
  chipLayoutComponent?: ChipCustomLayoutComponent<T>;
61
+ /**
62
+ * Свойства чипса, который на мобильном разрешении является триггером
63
+ */
64
+ triggerChipProps?: ChipsTriggerChipProps;
56
65
  /** Обработчик события получения фокуса */
57
66
  onFocus?: FocusEventHandler<HTMLInputElement>;
58
67
  /** Обработчик события потери фокуса */