@hh.ru/magritte-ui-chips-trigger 2.0.0 → 2.0.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/ChipsTrigger.js CHANGED
@@ -9,7 +9,7 @@ import { FormHelper } from '@hh.ru/magritte-ui-form-helper';
9
9
  import { ChevronDownOutlinedSize24 } from '@hh.ru/magritte-ui-icon/icon';
10
10
  import { useFocus } from '@hh.ru/magritte-ui-input/useFocus';
11
11
 
12
- var styles = {"root":"magritte-root___-zVdz_2-0-0","focused":"magritte-focused___0Uzyu_2-0-0","invalid":"magritte-invalid___tVzQV_2-0-0","disabled":"magritte-disabled___UeqcV_2-0-0","field":"magritte-field___rlEmn_2-0-0","focus-visible":"magritte-focus-visible___ifvAP_2-0-0","focusVisible":"magritte-focus-visible___ifvAP_2-0-0","large":"magritte-large___JIrIy_2-0-0","icon":"magritte-icon___fDMiz_2-0-0","medium":"magritte-medium___Xk-XB_2-0-0","scrollable-area":"magritte-scrollable-area___-xMF2_2-0-0","scrollableArea":"magritte-scrollable-area___-xMF2_2-0-0","chips-and-input":"magritte-chips-and-input___qg-Ba_2-0-0","chipsAndInput":"magritte-chips-and-input___qg-Ba_2-0-0","icon_expanded":"magritte-icon_expanded___RaOT-_2-0-0","iconExpanded":"magritte-icon_expanded___RaOT-_2-0-0"};
12
+ var styles = {"root":"magritte-root___-zVdz_2-0-2","focused":"magritte-focused___0Uzyu_2-0-2","invalid":"magritte-invalid___tVzQV_2-0-2","disabled":"magritte-disabled___UeqcV_2-0-2","field":"magritte-field___rlEmn_2-0-2","focus-visible":"magritte-focus-visible___ifvAP_2-0-2","focusVisible":"magritte-focus-visible___ifvAP_2-0-2","large":"magritte-large___JIrIy_2-0-2","icon":"magritte-icon___fDMiz_2-0-2","medium":"magritte-medium___Xk-XB_2-0-2","scrollable-area":"magritte-scrollable-area___-xMF2_2-0-2","scrollableArea":"magritte-scrollable-area___-xMF2_2-0-2","chips-and-input":"magritte-chips-and-input___qg-Ba_2-0-2","chipsAndInput":"magritte-chips-and-input___qg-Ba_2-0-2","icon_expanded":"magritte-icon_expanded___RaOT-_2-0-2","iconExpanded":"magritte-icon_expanded___RaOT-_2-0-2"};
13
13
 
14
14
  const focusOnLastChip = (event, chipsContainer, input) => {
15
15
  if (!chipsContainer || !input) {
@@ -21,9 +21,10 @@ const focusOnLastChip = (event, chipsContainer, input) => {
21
21
  nextFocusableElement.focus();
22
22
  }
23
23
  };
24
- const ChipsTrigger = forwardRef(({ size = 'large', placeholder, disabled, expanded: externalExpanded, state, invalid, maxHeight, description, errorMessage, wrapperRef, onChange, onFocus, onBlur, onKeyDown, onChangeInput: onChangeInputExternal, allowArbitraryValues = true, }, ref) => {
24
+ const ChipsTrigger = forwardRef(({ size = 'large', placeholder, disabled, expanded: externalExpanded, toggleExpanded: toggleExternalExpanded, state, invalid, maxHeight, description, errorMessage, wrapperRef, onChange, onFocus, onBlur, onKeyDown, onChangeInput: onChangeInputExternal, allowArbitraryValues = true, }, ref) => {
25
25
  const [expanded, setExpanded] = useState(false);
26
26
  const [isFocusVisible, setFocusVisible] = useState(false);
27
+ const stateRef = useRef({ hadFocusWhenClicked: false, wasExpandedWhenClicked: false });
27
28
  const chipsRootRef = useRef(null);
28
29
  const chipsRootRefCallback = useMultipleRefs(wrapperRef, chipsRootRef);
29
30
  const chipsContainerRef = useRef(null);
@@ -104,9 +105,25 @@ const ChipsTrigger = forwardRef(({ size = 'large', placeholder, disabled, expand
104
105
  if (document.activeElement === chipsRootRef.current) {
105
106
  inputRef.current.focus();
106
107
  }
107
- }, onBlur: () => {
108
+ }, onBlur: (event) => {
109
+ stateRef.current.hadFocusWhenClicked &&=
110
+ event.relatedTarget === chipsRootRef.current || event.relatedTarget === inputRef.current;
108
111
  setExpanded(false);
109
- }, onKeyDown: onKeyDown, tabIndex: disabled ? -1 : 0, children: [jsx("div", { style: scrollableAreaStyle, className: styles.scrollableArea, children: jsxs("div", { ref: chipsContainerRef, className: styles.chipsAndInput, children: [state.chips.map((chip, index) => {
112
+ }, onKeyDown: onKeyDown, onMouseDown: () => {
113
+ // при повторном клике по инпуту в фокусе нужно закрыть дроп
114
+ // при этом клик может прийтись на обертку, из-за чего инпут поймает blur и повторный фокус
115
+ // что усложняет проверку того, что инпут уже был в фокусе в момент клика
116
+ // поэтому в цепочке mouseDown -> blur -> focus -> click храним флаг, что фокус не вышел за пределы компонента
117
+ stateRef.current.hadFocusWhenClicked = document.activeElement === inputRef.current;
118
+ stateRef.current.wasExpandedWhenClicked = !!externalExpanded;
119
+ }, onClick: () => {
120
+ if (stateRef.current.hadFocusWhenClicked &&
121
+ stateRef.current.wasExpandedWhenClicked === externalExpanded) {
122
+ toggleExternalExpanded?.();
123
+ }
124
+ stateRef.current.hadFocusWhenClicked = false;
125
+ stateRef.current.wasExpandedWhenClicked = false;
126
+ }, tabIndex: disabled ? -1 : 0, children: [jsx("div", { style: scrollableAreaStyle, className: styles.scrollableArea, children: jsxs("div", { ref: chipsContainerRef, className: styles.chipsAndInput, children: [state.chips.map((chip, index) => {
110
127
  return (jsx(CustomChip, { Element: "button", size: "small", disabled: disabled, onDelete: () => {
111
128
  deleteHandler(index);
112
129
  }, children: chip.label ?? chip.value }, `${chip}-${index}`));
@@ -1 +1 @@
1
- {"version":3,"file":"ChipsTrigger.js","sources":["../src/ChipsTrigger.tsx"],"sourcesContent":["import {\n forwardRef,\n InputHTMLAttributes,\n useState,\n useCallback,\n KeyboardEventHandler,\n useRef,\n SyntheticEvent,\n useEffect,\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 { CustomChip } from '@hh.ru/magritte-ui-chips';\nimport { 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';\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\nexport const ChipsTrigger = forwardRef<\n HTMLInputElement,\n ChipsTriggerProps & Omit<InputHTMLAttributes<HTMLInputElement>, keyof ChipsTriggerProps>\n>(\n (\n {\n size = 'large',\n placeholder,\n disabled,\n expanded: externalExpanded,\n state,\n invalid,\n maxHeight,\n description,\n errorMessage,\n wrapperRef,\n onChange,\n onFocus,\n onBlur,\n onKeyDown,\n onChangeInput: onChangeInputExternal,\n allowArbitraryValues = true,\n },\n ref\n ) => {\n const [expanded, setExpanded] = useState(false);\n const [isFocusVisible, setFocusVisible] = useState(false);\n\n const chipsRootRef = useRef<HTMLDivElement>(null);\n const chipsRootRefCallback = useMultipleRefs(wrapperRef, chipsRootRef);\n const chipsContainerRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const inputRefCallback = useMultipleRefs(ref, inputRef);\n\n const onChangeInput = useCallback(\n (value: string) => {\n onChange({\n value,\n chips: state.chips,\n eventType: 'changeInputValue',\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 state.chips.splice(index, 1);\n onChange({\n value: state.value,\n chips: [...state.chips],\n eventType: 'removeChipByCross',\n });\n // не теряем фокус с инпута\n inputRef.current?.focus();\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 }],\n eventType: 'addChipByEnter',\n });\n onChangeInputExternal?.('');\n }\n // удаляем последний созданный чипс\n if (state.value === '' && keyboardMatch(event.nativeEvent, keyboardKeys.Backspace)) {\n state.chips.pop();\n onChange({\n value: state.value,\n chips: [...state.chips],\n eventType: 'removeChipByBackspace',\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\n ? { maxHeight: `${maxHeight - (size === 'medium' ? 16 : 24)}px` }\n : undefined;\n\n return (\n <>\n <div\n ref={chipsRootRefCallback}\n className={classnames(styles.root, styles[size], {\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={() => {\n setExpanded(false);\n }}\n onKeyDown={onKeyDown}\n tabIndex={disabled ? -1 : 0}\n >\n <div style={scrollableAreaStyle} className={styles.scrollableArea}>\n <div ref={chipsContainerRef} className={styles.chipsAndInput}>\n {state.chips.map((chip, index) => {\n return (\n <CustomChip\n Element=\"button\"\n key={`${chip}-${index}`}\n size=\"small\"\n disabled={disabled}\n onDelete={() => {\n deleteHandler(index);\n }}\n >\n {chip.label ?? chip.value}\n </CustomChip>\n );\n })}\n <input\n ref={inputRefCallback}\n className={styles.field}\n type=\"text\"\n disabled={disabled}\n value={state.value}\n placeholder={state.chips.length === 0 ? placeholder : ''}\n onKeyDown={keyDownHandler}\n onFocus={focusHandler}\n onBlur={blurHandler}\n onChange={changeHandler}\n />\n </div>\n </div>\n <div\n className={classnames(styles.icon, {\n [styles.iconExpanded]: expanded || externalExpanded,\n })}\n >\n <ChevronDownOutlinedSize24 />\n </div>\n </div>\n <FormHelper\n description={description}\n errorMessage={errorMessage}\n disabled={disabled}\n invalid={invalid}\n />\n </>\n );\n }\n);\n\nChipsTrigger.displayName = 'ChipsTrigger';\n"],"names":["_jsxs","_Fragment","_jsx"],"mappings":"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"}
1
+ {"version":3,"file":"ChipsTrigger.js","sources":["../src/ChipsTrigger.tsx"],"sourcesContent":["import {\n forwardRef,\n InputHTMLAttributes,\n useState,\n useCallback,\n KeyboardEventHandler,\n useRef,\n SyntheticEvent,\n useEffect,\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 { CustomChip } from '@hh.ru/magritte-ui-chips';\nimport { 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';\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\nexport const ChipsTrigger = forwardRef<\n HTMLInputElement,\n ChipsTriggerProps & Omit<InputHTMLAttributes<HTMLInputElement>, keyof ChipsTriggerProps>\n>(\n (\n {\n size = 'large',\n placeholder,\n disabled,\n expanded: externalExpanded,\n toggleExpanded: toggleExternalExpanded,\n state,\n invalid,\n maxHeight,\n description,\n errorMessage,\n wrapperRef,\n onChange,\n onFocus,\n onBlur,\n onKeyDown,\n onChangeInput: onChangeInputExternal,\n allowArbitraryValues = true,\n },\n ref\n ) => {\n const [expanded, setExpanded] = useState(false);\n const [isFocusVisible, setFocusVisible] = useState(false);\n const stateRef = useRef<State>({ hadFocusWhenClicked: false, wasExpandedWhenClicked: false });\n\n const chipsRootRef = useRef<HTMLDivElement>(null);\n const chipsRootRefCallback = useMultipleRefs(wrapperRef, chipsRootRef);\n const chipsContainerRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const inputRefCallback = useMultipleRefs(ref, inputRef);\n\n const onChangeInput = useCallback(\n (value: string) => {\n onChange({\n value,\n chips: state.chips,\n eventType: 'changeInputValue',\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 state.chips.splice(index, 1);\n onChange({\n value: state.value,\n chips: [...state.chips],\n eventType: 'removeChipByCross',\n });\n // не теряем фокус с инпута\n inputRef.current?.focus();\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 }],\n eventType: 'addChipByEnter',\n });\n onChangeInputExternal?.('');\n }\n // удаляем последний созданный чипс\n if (state.value === '' && keyboardMatch(event.nativeEvent, keyboardKeys.Backspace)) {\n state.chips.pop();\n onChange({\n value: state.value,\n chips: [...state.chips],\n eventType: 'removeChipByBackspace',\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\n ? { maxHeight: `${maxHeight - (size === 'medium' ? 16 : 24)}px` }\n : undefined;\n\n return (\n <>\n <div\n ref={chipsRootRefCallback}\n className={classnames(styles.root, styles[size], {\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 ? -1 : 0}\n >\n <div style={scrollableAreaStyle} className={styles.scrollableArea}>\n <div ref={chipsContainerRef} className={styles.chipsAndInput}>\n {state.chips.map((chip, index) => {\n return (\n <CustomChip\n Element=\"button\"\n key={`${chip}-${index}`}\n size=\"small\"\n disabled={disabled}\n onDelete={() => {\n deleteHandler(index);\n }}\n >\n {chip.label ?? chip.value}\n </CustomChip>\n );\n })}\n <input\n ref={inputRefCallback}\n className={styles.field}\n type=\"text\"\n disabled={disabled}\n value={state.value}\n placeholder={state.chips.length === 0 ? placeholder : ''}\n onKeyDown={keyDownHandler}\n onFocus={focusHandler}\n onBlur={blurHandler}\n onChange={changeHandler}\n />\n </div>\n </div>\n <div\n className={classnames(styles.icon, {\n [styles.iconExpanded]: expanded || externalExpanded,\n })}\n >\n <ChevronDownOutlinedSize24 />\n </div>\n </div>\n <FormHelper\n description={description}\n errorMessage={errorMessage}\n disabled={disabled}\n invalid={invalid}\n />\n </>\n );\n }\n);\n\nChipsTrigger.displayName = 'ChipsTrigger';\n"],"names":["_jsxs","_Fragment","_jsx"],"mappings":"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"}
package/index.css CHANGED
@@ -67,7 +67,7 @@
67
67
  --magritte-color-component-input-chips-background-state-neutral-disable-v19-1-0:#1B1B1B;
68
68
  --magritte-color-component-input-chips-text-state-neutral-disable-v19-1-0:#474747;
69
69
  }
70
- .magritte-root___-zVdz_2-0-0{
70
+ .magritte-root___-zVdz_2-0-2{
71
71
  display:inline-flex;
72
72
  position:relative;
73
73
  width:100%;
@@ -82,88 +82,88 @@
82
82
  --magritte-ui-icon-color-override:var(--magritte-color-component-input-icon-chevron-v19-1-0);
83
83
  }
84
84
  @media (min-width: 1020px){
85
- body.magritte-old-layout .magritte-root___-zVdz_2-0-0:not(.magritte-focused___0Uzyu_2-0-0):not(.magritte-invalid___tVzQV_2-0-0):not(.magritte-disabled___UeqcV_2-0-0):hover{
85
+ body.magritte-old-layout .magritte-root___-zVdz_2-0-2:not(.magritte-focused___0Uzyu_2-0-2):not(.magritte-invalid___tVzQV_2-0-2):not(.magritte-disabled___UeqcV_2-0-2):hover{
86
86
  background-color:var(--magritte-color-component-input-background-state-field-hovered-v19-1-0);
87
87
  box-shadow:inset 0 0 0 1px var(--magritte-color-component-input-stroke-state-field-hovered-v19-1-0);
88
88
  --magritte-ui-icon-color-override:var(--magritte-color-component-input-icon-state-chevron-hovered-v19-1-0);
89
89
  }
90
- body.magritte-old-layout .magritte-root___-zVdz_2-0-0:not(.magritte-focused___0Uzyu_2-0-0):not(.magritte-invalid___tVzQV_2-0-0):not(.magritte-disabled___UeqcV_2-0-0):hover .magritte-field___rlEmn_2-0-0::placeholder{
90
+ body.magritte-old-layout .magritte-root___-zVdz_2-0-2:not(.magritte-focused___0Uzyu_2-0-2):not(.magritte-invalid___tVzQV_2-0-2):not(.magritte-disabled___UeqcV_2-0-2):hover .magritte-field___rlEmn_2-0-2::placeholder{
91
91
  color:var(--magritte-color-component-input-text-state-placeholder-hovered-v19-1-0);
92
92
  }
93
93
  }
94
94
  @media (min-width: 1024px){
95
- body:not(.magritte-old-layout) .magritte-root___-zVdz_2-0-0:not(.magritte-focused___0Uzyu_2-0-0):not(.magritte-invalid___tVzQV_2-0-0):not(.magritte-disabled___UeqcV_2-0-0):hover{
95
+ body:not(.magritte-old-layout) .magritte-root___-zVdz_2-0-2:not(.magritte-focused___0Uzyu_2-0-2):not(.magritte-invalid___tVzQV_2-0-2):not(.magritte-disabled___UeqcV_2-0-2):hover{
96
96
  background-color:var(--magritte-color-component-input-background-state-field-hovered-v19-1-0);
97
97
  box-shadow:inset 0 0 0 1px var(--magritte-color-component-input-stroke-state-field-hovered-v19-1-0);
98
98
  --magritte-ui-icon-color-override:var(--magritte-color-component-input-icon-state-chevron-hovered-v19-1-0);
99
99
  }
100
- body:not(.magritte-old-layout) .magritte-root___-zVdz_2-0-0:not(.magritte-focused___0Uzyu_2-0-0):not(.magritte-invalid___tVzQV_2-0-0):not(.magritte-disabled___UeqcV_2-0-0):hover .magritte-field___rlEmn_2-0-0::placeholder{
100
+ body:not(.magritte-old-layout) .magritte-root___-zVdz_2-0-2:not(.magritte-focused___0Uzyu_2-0-2):not(.magritte-invalid___tVzQV_2-0-2):not(.magritte-disabled___UeqcV_2-0-2):hover .magritte-field___rlEmn_2-0-2::placeholder{
101
101
  color:var(--magritte-color-component-input-text-state-placeholder-hovered-v19-1-0);
102
102
  }
103
103
  }
104
- .magritte-root___-zVdz_2-0-0:not(.magritte-disabled___UeqcV_2-0-0){
104
+ .magritte-root___-zVdz_2-0-2:not(.magritte-disabled___UeqcV_2-0-2){
105
105
  cursor:text;
106
106
  }
107
- .magritte-root___-zVdz_2-0-0.magritte-focused___0Uzyu_2-0-0{
107
+ .magritte-root___-zVdz_2-0-2.magritte-focused___0Uzyu_2-0-2{
108
108
  background-color:var(--magritte-color-component-input-background-state-field-focused-v19-1-0);
109
109
  box-shadow:inset 0 0 0 2px var(--magritte-color-component-input-stroke-state-field-focused-v19-1-0);
110
110
  --magritte-ui-icon-color-override:var(--magritte-color-component-input-icon-state-chevron-focused-v19-1-0);
111
111
  }
112
- .magritte-root___-zVdz_2-0-0.magritte-focused___0Uzyu_2-0-0 .magritte-field___rlEmn_2-0-0::placeholder{
112
+ .magritte-root___-zVdz_2-0-2.magritte-focused___0Uzyu_2-0-2 .magritte-field___rlEmn_2-0-2::placeholder{
113
113
  color:var(--magritte-color-component-input-text-state-placeholder-focused-v19-1-0);
114
114
  }
115
- .magritte-root___-zVdz_2-0-0.magritte-invalid___tVzQV_2-0-0{
115
+ .magritte-root___-zVdz_2-0-2.magritte-invalid___tVzQV_2-0-2{
116
116
  background-color:var(--magritte-color-component-input-background-state-field-invalid-v19-1-0);
117
117
  box-shadow:inset 0 0 0 1px var(--magritte-color-component-input-stroke-state-field-invalid-v19-1-0);
118
118
  --magritte-ui-icon-color-override:var(--magritte-color-component-input-icon-state-chevron-invalid-v19-1-0);
119
119
  }
120
- .magritte-root___-zVdz_2-0-0.magritte-invalid___tVzQV_2-0-0 .magritte-field___rlEmn_2-0-0::placeholder{
120
+ .magritte-root___-zVdz_2-0-2.magritte-invalid___tVzQV_2-0-2 .magritte-field___rlEmn_2-0-2::placeholder{
121
121
  color:var(--magritte-color-component-input-text-state-placeholder-invalid-v19-1-0);
122
122
  }
123
- .magritte-root___-zVdz_2-0-0.magritte-disabled___UeqcV_2-0-0{
123
+ .magritte-root___-zVdz_2-0-2.magritte-disabled___UeqcV_2-0-2{
124
124
  background-color:var(--magritte-color-component-input-background-state-field-disabled-v19-1-0);
125
125
  box-shadow:inset 0 0 0 1px var(--magritte-color-component-input-stroke-state-field-disabled-v19-1-0);
126
126
  --magritte-ui-icon-color-override:var(--magritte-color-component-input-icon-state-chevron-disabled-v19-1-0);
127
127
  --magritte-ui-chip-text-color-override:var(--magritte-color-component-input-chips-text-state-neutral-disable-v19-1-0);
128
128
  --magritte-ui-chip-background-color-override:var(--magritte-color-component-input-chips-background-state-neutral-disable-v19-1-0);
129
129
  }
130
- .magritte-root___-zVdz_2-0-0.magritte-disabled___UeqcV_2-0-0 .magritte-field___rlEmn_2-0-0::placeholder{
130
+ .magritte-root___-zVdz_2-0-2.magritte-disabled___UeqcV_2-0-2 .magritte-field___rlEmn_2-0-2::placeholder{
131
131
  color:var(--magritte-color-component-input-text-state-placeholder-disabled-v19-1-0);
132
132
  }
133
- .magritte-root___-zVdz_2-0-0.magritte-focus-visible___ifvAP_2-0-0{
133
+ .magritte-root___-zVdz_2-0-2.magritte-focus-visible___ifvAP_2-0-2{
134
134
  outline:var(--magritte-color-component-input-stroke-state-accent-focused-accessible-v19-1-0) solid 4px;
135
135
  }
136
- .magritte-root___-zVdz_2-0-0.magritte-focus-visible___ifvAP_2-0-0.magritte-invalid___tVzQV_2-0-0{
136
+ .magritte-root___-zVdz_2-0-2.magritte-focus-visible___ifvAP_2-0-2.magritte-invalid___tVzQV_2-0-2{
137
137
  outline-color:var(--magritte-color-component-input-stroke-state-negative-focused-accessible-v19-1-0);
138
138
  }
139
- .magritte-large___JIrIy_2-0-0{
139
+ .magritte-large___JIrIy_2-0-2{
140
140
  padding:var(--magritte-static-space-300-v19-1-0);
141
141
  }
142
- .magritte-large___JIrIy_2-0-0 .magritte-field___rlEmn_2-0-0{
142
+ .magritte-large___JIrIy_2-0-2 .magritte-field___rlEmn_2-0-2{
143
143
  padding-left:var(--magritte-static-space-100-v19-1-0);
144
144
  }
145
- .magritte-large___JIrIy_2-0-0 .magritte-icon___fDMiz_2-0-0{
145
+ .magritte-large___JIrIy_2-0-2 .magritte-icon___fDMiz_2-0-2{
146
146
  top:var(--magritte-static-space-300-v19-1-0);
147
147
  right:var(--magritte-static-space-400-v19-1-0);
148
148
  }
149
- .magritte-medium___Xk-XB_2-0-0{
149
+ .magritte-medium___Xk-XB_2-0-2{
150
150
  padding:var(--magritte-static-space-200-v19-1-0);
151
151
  }
152
- .magritte-medium___Xk-XB_2-0-0 .magritte-field___rlEmn_2-0-0{
152
+ .magritte-medium___Xk-XB_2-0-2 .magritte-field___rlEmn_2-0-2{
153
153
  padding-left:var(--magritte-static-space-100-v19-1-0);
154
154
  }
155
- .magritte-medium___Xk-XB_2-0-0 .magritte-icon___fDMiz_2-0-0{
155
+ .magritte-medium___Xk-XB_2-0-2 .magritte-icon___fDMiz_2-0-2{
156
156
  top:var(--magritte-static-space-200-v19-1-0);
157
157
  right:var(--magritte-static-space-300-v19-1-0);
158
158
  }
159
- .magritte-scrollable-area___-xMF2_2-0-0{
159
+ .magritte-scrollable-area___-xMF2_2-0-2{
160
160
  display:flex;
161
161
  align-items:flex-start;
162
162
  overflow-y:auto;
163
163
  width:100%;
164
164
  padding-right:24px;
165
165
  }
166
- .magritte-chips-and-input___qg-Ba_2-0-0{
166
+ .magritte-chips-and-input___qg-Ba_2-0-2{
167
167
  display:flex;
168
168
  gap:6px;
169
169
  flex-wrap:wrap;
@@ -171,7 +171,7 @@
171
171
  width:100%;
172
172
  margin-right:var(--magritte-static-space-300-v19-1-0);
173
173
  }
174
- .magritte-field___rlEmn_2-0-0{
174
+ .magritte-field___rlEmn_2-0-2{
175
175
  border:0;
176
176
  background:none;
177
177
  flex-grow:1;
@@ -187,10 +187,10 @@
187
187
  text-transform:var(--magritte-typography-label-2-regular-text-transform-v19-1-0);
188
188
  text-decoration:var(--magritte-typography-label-2-regular-text-decoration-v19-1-0);
189
189
  }
190
- .magritte-field___rlEmn_2-0-0::placeholder{
190
+ .magritte-field___rlEmn_2-0-2::placeholder{
191
191
  color:var(--magritte-color-component-input-text-placeholder-v19-1-0);
192
192
  }
193
- .magritte-icon___fDMiz_2-0-0{
193
+ .magritte-icon___fDMiz_2-0-2{
194
194
  display:inline-flex;
195
195
  margin-left:auto;
196
196
  padding:var(--magritte-static-space-100-v19-1-0) 0;
@@ -199,7 +199,7 @@
199
199
  transition-duration:var(--magritte-semantic-animation-ease-in-out-100-duration-v19-1-0);
200
200
  transition-timing-function:var(--magritte-semantic-animation-ease-in-out-100-timing-function-v19-1-0);
201
201
  }
202
- .magritte-icon_expanded___RaOT-_2-0-0{
202
+ .magritte-icon_expanded___RaOT-_2-0-2{
203
203
  transform:rotate(-180deg);
204
204
  --magritte-ui-icon-color-override:var(--magritte-color-component-input-icon-state-chevron-focused-v19-1-0);
205
205
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hh.ru/magritte-ui-chips-trigger",
3
- "version": "2.0.0",
3
+ "version": "2.0.2",
4
4
  "main": "index.js",
5
5
  "types": "index.d.ts",
6
6
  "sideEffects": [
@@ -32,7 +32,7 @@
32
32
  "@hh.ru/magritte-ui-chips": "5.2.16",
33
33
  "@hh.ru/magritte-ui-form-helper": "1.0.10",
34
34
  "@hh.ru/magritte-ui-icon": "7.9.0",
35
- "@hh.ru/magritte-ui-input": "6.0.16"
35
+ "@hh.ru/magritte-ui-input": "7.0.0"
36
36
  },
37
- "gitHead": "99998f1c26e7138fa15ff1dcc5fa46aa0c716e4b"
37
+ "gitHead": "6f1beca9a238c607cf3ff855bc8c013d64e69640"
38
38
  }
package/types.d.ts CHANGED
@@ -16,8 +16,10 @@ export interface ChipsTriggerProps {
16
16
  placeholder?: string;
17
17
  /** Флаг отключения инпута */
18
18
  disabled?: boolean;
19
- /** Состояние шеврона */
19
+ /** Состояние внешнего выпадающего компонента */
20
20
  expanded?: boolean;
21
+ /** Функция при переключения состояния внешнего выпадающего компонента */
22
+ toggleExpanded?: VoidFunction;
21
23
  /** Признак невалидности */
22
24
  invalid?: boolean;
23
25
  /** Обработчик события изменения состояния компонента (chip+input) */