@hh.ru/magritte-ui-new-select 1.1.1 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/Select.d.ts CHANGED
@@ -1,11 +1,13 @@
1
1
  import { ReactElement } from 'react';
2
2
  import { StaticDataFetcherItem } from '@hh.ru/magritte-common-data-provider';
3
+ import { SelectOptions } from '@hh.ru/magritte-ui-new-select/SelectOptions';
3
4
  import { SelectSearchTrigger } from '@hh.ru/magritte-ui-new-select/SelectSearchTrigger';
4
5
  import { SelectTrigger } from '@hh.ru/magritte-ui-new-select/SelectTrigger';
5
6
  import { SelectProps } from '@hh.ru/magritte-ui-new-select/types';
6
7
  export interface SelectComponents {
7
8
  Trigger: typeof SelectTrigger;
8
9
  SearchTrigger: typeof SelectSearchTrigger;
10
+ Options: typeof SelectOptions;
9
11
  }
10
12
  declare const SelectRoot: <MultipleType extends boolean, DataType extends StaticDataFetcherItem>({ children, commitModel, dataProvider, error, errorTrls, hints, maxSelectedOptions, multiple, name, loading, onBlur: onBlurExternal, onChange: onChangeExternal, onFocus: onFocusExternal, onOptionsChange: onOptionsChangeExternal, options, value, }: SelectProps<MultipleType, DataType>) => ReactElement;
11
13
  declare const Select: typeof SelectRoot & SelectComponents;
package/Select.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import './index.css';
2
2
  import { jsx } from 'react/jsx-runtime';
3
3
  import { useState } from 'react';
4
+ import { SelectOptions } from './SelectOptions.js';
4
5
  import { SelectSearchTrigger } from './SelectSearchTrigger.js';
5
6
  import { SelectTrigger } from './SelectTrigger.js';
6
7
  import { ConfigProvider } from './internal/ConfigContext.js';
@@ -13,11 +14,18 @@ import { FocusOrchestratorProvider } from './internal/focusOrchestrator.js';
13
14
  import { SelectElementsSlotRegistryProvider } from './internal/slots.js';
14
15
  import { useEventCallback } from './internal/utils.js';
15
16
  import 'classnames';
17
+ import './internal/Option.js';
18
+ import '@hh.ru/magritte-common-keyboard';
16
19
  import '@hh.ru/magritte-common-use-disabled';
20
+ import '@hh.ru/magritte-ui-cell';
21
+ import '@hh.ru/magritte-ui-checkable-card/CheckableCardElement';
22
+ import '@hh.ru/magritte-ui-icon/icon';
23
+ import './internal/OptionControl.js';
24
+ import '@hh.ru/magritte-ui-checkbox-radio';
25
+ import '@hh.ru/magritte-ui-typography';
17
26
  import '@hh.ru/magritte-common-use-multiple-refs';
18
27
  import '@hh.ru/magritte-ui-input/BaseInput';
19
28
  import './useSelectTrigger.js';
20
- import '@hh.ru/magritte-common-keyboard';
21
29
  import '@hh.ru/magritte-ui-trigger';
22
30
  import './internal/useFocusWithin.js';
23
31
  import '@hh.ru/magritte-common-data-provider';
@@ -39,6 +47,7 @@ multiple, name, loading, onBlur: onBlurExternal, onChange: onChangeExternal, onF
39
47
  const Select = SelectRoot;
40
48
  Select.Trigger = SelectTrigger;
41
49
  Select.SearchTrigger = SelectSearchTrigger;
50
+ Select.Options = SelectOptions;
42
51
 
43
52
  export { Select };
44
53
  //# sourceMappingURL=Select.js.map
package/Select.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"Select.js","sources":["src/Select.tsx"],"sourcesContent":["import { ReactElement, useState } from 'react';\n\nimport { StaticDataFetcherItem } from '@hh.ru/magritte-common-data-provider';\nimport { SelectSearchTrigger } from '@hh.ru/magritte-ui-new-select/SelectSearchTrigger';\n// import { ApplyChangesButton } from '@hh.ru/magritte-ui-new-select/ApplyChangesButton';\n// import { ClearButton } from '@hh.ru/magritte-ui-new-select/ClearButton';\n// import { CloseBottomSheet } from '@hh.ru/magritte-ui-new-select/CloseBottomSheet';\n// import { Footer } from '@hh.ru/magritte-ui-new-select/Footer';\n// import { Header } from '@hh.ru/magritte-ui-new-select/Header';\n// import { Options } from '@hh.ru/magritte-ui-new-select/Options';\n// import { SelectBottomSheet } from '@hh.ru/magritte-ui-new-select/SelectBottomSheet';\n// import { SelectDrop } from '@hh.ru/magritte-ui-new-select/SelectDrop';\nimport { SelectTrigger } from '@hh.ru/magritte-ui-new-select/SelectTrigger';\nimport { ConfigProvider } from '@hh.ru/magritte-ui-new-select/internal/ConfigContext';\nimport { NavigationManagement } from '@hh.ru/magritte-ui-new-select/internal/NavigationManagement';\nimport { SearchStateProvider } from '@hh.ru/magritte-ui-new-select/internal/SearchStateContext';\nimport { SelectDataProvider } from '@hh.ru/magritte-ui-new-select/internal/SelectDataProvider';\nimport { SelectStateProvider } from '@hh.ru/magritte-ui-new-select/internal/SelectStateContext';\nimport { VisibilityProvider } from '@hh.ru/magritte-ui-new-select/internal/VisibilityContext';\nimport { FocusOrchestratorProvider } from '@hh.ru/magritte-ui-new-select/internal/focusOrchestrator';\nimport { SelectElementsSlotRegistryProvider } from '@hh.ru/magritte-ui-new-select/internal/slots';\nimport { useEventCallback } from '@hh.ru/magritte-ui-new-select/internal/utils';\nimport { SelectProps } from '@hh.ru/magritte-ui-new-select/types';\n\nexport interface SelectComponents {\n Trigger: typeof SelectTrigger;\n SearchTrigger: typeof SelectSearchTrigger;\n // Options: typeof Options;\n // Drop: typeof SelectDrop;\n // BottomSheet: typeof SelectBottomSheet;\n // ApplyChangesButton: typeof ApplyChangesButton;\n // ClearButton: typeof ClearButton;\n // Footer: typeof Footer;\n // Header: typeof Header;\n // CloseBottomSheet: typeof CloseBottomSheet;\n}\n\nconst SelectRoot = <MultipleType extends boolean, DataType extends StaticDataFetcherItem>({\n children,\n commitModel = 'instant',\n dataProvider,\n error,\n errorTrls,\n hints,\n maxSelectedOptions,\n // TODO commitModel === multiple?\n multiple,\n name,\n loading,\n onBlur: onBlurExternal,\n onChange: onChangeExternal,\n onFocus: onFocusExternal,\n onOptionsChange: onOptionsChangeExternal,\n options,\n value,\n}: SelectProps<MultipleType, DataType>): ReactElement => {\n const onBlur = useEventCallback(onBlurExternal);\n const onFocus = useEventCallback(onFocusExternal);\n const onChange = useEventCallback(onChangeExternal);\n const onOptionsChange = useEventCallback(onOptionsChangeExternal);\n const [showOptions, setShowOptions] = useState(false);\n const [searchValue, setSearchValue] = useState('');\n return (\n <SelectElementsSlotRegistryProvider>\n <ConfigProvider\n maxSelectedOptions={maxSelectedOptions}\n multiple={multiple}\n name={name}\n commitModel={commitModel}\n loading={loading}\n >\n <VisibilityProvider showOptions={showOptions} setShowOptions={setShowOptions}>\n <SelectStateProvider<MultipleType, DataType> onChange={onChange} value={value}>\n <SearchStateProvider searchValue={searchValue} setSearchValue={setSearchValue}>\n <SelectDataProvider<DataType>\n dataProvider={dataProvider}\n error={error}\n errorTrls={errorTrls}\n hints={hints}\n options={options}\n onOptionsChange={onOptionsChange}\n >\n <FocusOrchestratorProvider>\n <NavigationManagement onBlur={onBlur} onFocus={onFocus}>\n {children}\n </NavigationManagement>\n </FocusOrchestratorProvider>\n </SelectDataProvider>\n </SearchStateProvider>\n </SelectStateProvider>\n </VisibilityProvider>\n </ConfigProvider>\n </SelectElementsSlotRegistryProvider>\n );\n};\n\nconst Select = SelectRoot as typeof SelectRoot & SelectComponents;\n\nSelect.Trigger = SelectTrigger;\nSelect.SearchTrigger = SelectSearchTrigger;\n// Select.Options = Options;\n// Select.Drop = SelectDrop;\n// Select.BottomSheet = SelectBottomSheet;\n// Select.ApplyChangesButton = ApplyChangesButton;\n// Select.Footer = Footer;\n// Select.ClearButton = ClearButton;\n// Select.Header = Header;\n// Select.CloseBottomSheet = CloseBottomSheet;\n\nexport { Select };\n"],"names":["_jsx"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAqCA,MAAM,UAAU,GAAG,CAAuE,EACtF,QAAQ,EACR,WAAW,GAAG,SAAS,EACvB,YAAY,EACZ,KAAK,EACL,SAAS,EACT,KAAK,EACL,kBAAkB;AAClB;AACA,QAAQ,EACR,IAAI,EACJ,OAAO,EACP,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,gBAAgB,EAC1B,OAAO,EAAE,eAAe,EACxB,eAAe,EAAE,uBAAuB,EACxC,OAAO,EACP,KAAK,GAC6B,KAAkB;AACpD,IAAA,MAAM,MAAM,GAAG,gBAAgB,CAAC,cAAc,CAAC,CAAC;AAChD,IAAA,MAAM,OAAO,GAAG,gBAAgB,CAAC,eAAe,CAAC,CAAC;AAClD,IAAA,MAAM,QAAQ,GAAG,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;AACpD,IAAA,MAAM,eAAe,GAAG,gBAAgB,CAAC,uBAAuB,CAAC,CAAC;IAClE,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACtD,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACnD,QACIA,GAAC,CAAA,kCAAkC,EAC/B,EAAA,QAAA,EAAAA,GAAA,CAAC,cAAc,EACX,EAAA,kBAAkB,EAAE,kBAAkB,EACtC,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,IAAI,EACV,WAAW,EAAE,WAAW,EACxB,OAAO,EAAE,OAAO,YAEhBA,GAAC,CAAA,kBAAkB,EAAC,EAAA,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE,cAAc,EAAA,QAAA,EACxEA,GAAC,CAAA,mBAAmB,IAAyB,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAA,QAAA,EACzEA,GAAC,CAAA,mBAAmB,EAAC,EAAA,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE,cAAc,EAAA,QAAA,EACzEA,GAAC,CAAA,kBAAkB,IACf,YAAY,EAAE,YAAY,EAC1B,KAAK,EAAE,KAAK,EACZ,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,OAAO,EAChB,eAAe,EAAE,eAAe,EAAA,QAAA,EAEhCA,GAAC,CAAA,yBAAyB,EACtB,EAAA,QAAA,EAAAA,GAAA,CAAC,oBAAoB,EAAC,EAAA,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAA,QAAA,EACjD,QAAQ,EAAA,CACU,EACC,CAAA,EAAA,CACX,EACH,CAAA,EAAA,CACJ,EACL,CAAA,EAAA,CACR,EACgB,CAAA,EACvC;AACN,CAAC,CAAC;AAEI,MAAA,MAAM,GAAG,WAAmD;AAElE,MAAM,CAAC,OAAO,GAAG,aAAa,CAAC;AAC/B,MAAM,CAAC,aAAa,GAAG,mBAAmB;;;;"}
1
+ {"version":3,"file":"Select.js","sources":["src/Select.tsx"],"sourcesContent":["import { ReactElement, useState } from 'react';\n\nimport { StaticDataFetcherItem } from '@hh.ru/magritte-common-data-provider';\nimport { SelectOptions } from '@hh.ru/magritte-ui-new-select/SelectOptions';\nimport { SelectSearchTrigger } from '@hh.ru/magritte-ui-new-select/SelectSearchTrigger';\n// import { ApplyChangesButton } from '@hh.ru/magritte-ui-new-select/ApplyChangesButton';\n// import { ClearButton } from '@hh.ru/magritte-ui-new-select/ClearButton';\n// import { CloseBottomSheet } from '@hh.ru/magritte-ui-new-select/CloseBottomSheet';\n// import { Footer } from '@hh.ru/magritte-ui-new-select/Footer';\n// import { Header } from '@hh.ru/magritte-ui-new-select/Header';\n// import { SelectBottomSheet } from '@hh.ru/magritte-ui-new-select/SelectBottomSheet';\n// import { SelectDrop } from '@hh.ru/magritte-ui-new-select/SelectDrop';\nimport { SelectTrigger } from '@hh.ru/magritte-ui-new-select/SelectTrigger';\nimport { ConfigProvider } from '@hh.ru/magritte-ui-new-select/internal/ConfigContext';\nimport { NavigationManagement } from '@hh.ru/magritte-ui-new-select/internal/NavigationManagement';\nimport { SearchStateProvider } from '@hh.ru/magritte-ui-new-select/internal/SearchStateContext';\nimport { SelectDataProvider } from '@hh.ru/magritte-ui-new-select/internal/SelectDataProvider';\nimport { SelectStateProvider } from '@hh.ru/magritte-ui-new-select/internal/SelectStateContext';\nimport { VisibilityProvider } from '@hh.ru/magritte-ui-new-select/internal/VisibilityContext';\nimport { FocusOrchestratorProvider } from '@hh.ru/magritte-ui-new-select/internal/focusOrchestrator';\nimport { SelectElementsSlotRegistryProvider } from '@hh.ru/magritte-ui-new-select/internal/slots';\nimport { useEventCallback } from '@hh.ru/magritte-ui-new-select/internal/utils';\nimport { SelectProps } from '@hh.ru/magritte-ui-new-select/types';\n\nexport interface SelectComponents {\n Trigger: typeof SelectTrigger;\n SearchTrigger: typeof SelectSearchTrigger;\n Options: typeof SelectOptions;\n // Drop: typeof SelectDrop;\n // BottomSheet: typeof SelectBottomSheet;\n // ApplyChangesButton: typeof ApplyChangesButton;\n // ClearButton: typeof ClearButton;\n // Footer: typeof Footer;\n // Header: typeof Header;\n // CloseBottomSheet: typeof CloseBottomSheet;\n}\n\nconst SelectRoot = <MultipleType extends boolean, DataType extends StaticDataFetcherItem>({\n children,\n commitModel = 'instant',\n dataProvider,\n error,\n errorTrls,\n hints,\n maxSelectedOptions,\n // TODO commitModel === multiple?\n multiple,\n name,\n loading,\n onBlur: onBlurExternal,\n onChange: onChangeExternal,\n onFocus: onFocusExternal,\n onOptionsChange: onOptionsChangeExternal,\n options,\n value,\n}: SelectProps<MultipleType, DataType>): ReactElement => {\n const onBlur = useEventCallback(onBlurExternal);\n const onFocus = useEventCallback(onFocusExternal);\n const onChange = useEventCallback(onChangeExternal);\n const onOptionsChange = useEventCallback(onOptionsChangeExternal);\n const [showOptions, setShowOptions] = useState(false);\n const [searchValue, setSearchValue] = useState('');\n return (\n <SelectElementsSlotRegistryProvider>\n <ConfigProvider\n maxSelectedOptions={maxSelectedOptions}\n multiple={multiple}\n name={name}\n commitModel={commitModel}\n loading={loading}\n >\n <VisibilityProvider showOptions={showOptions} setShowOptions={setShowOptions}>\n <SelectStateProvider<MultipleType, DataType> onChange={onChange} value={value}>\n <SearchStateProvider searchValue={searchValue} setSearchValue={setSearchValue}>\n <SelectDataProvider<DataType>\n dataProvider={dataProvider}\n error={error}\n errorTrls={errorTrls}\n hints={hints}\n options={options}\n onOptionsChange={onOptionsChange}\n >\n <FocusOrchestratorProvider>\n <NavigationManagement onBlur={onBlur} onFocus={onFocus}>\n {children}\n </NavigationManagement>\n </FocusOrchestratorProvider>\n </SelectDataProvider>\n </SearchStateProvider>\n </SelectStateProvider>\n </VisibilityProvider>\n </ConfigProvider>\n </SelectElementsSlotRegistryProvider>\n );\n};\n\nconst Select = SelectRoot as typeof SelectRoot & SelectComponents;\n\nSelect.Trigger = SelectTrigger;\nSelect.SearchTrigger = SelectSearchTrigger;\nSelect.Options = SelectOptions;\n// Select.Drop = SelectDrop;\n// Select.BottomSheet = SelectBottomSheet;\n// Select.ApplyChangesButton = ApplyChangesButton;\n// Select.Footer = Footer;\n// Select.ClearButton = ClearButton;\n// Select.Header = Header;\n// Select.CloseBottomSheet = CloseBottomSheet;\n\nexport { Select };\n"],"names":["_jsx"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqCA,MAAM,UAAU,GAAG,CAAuE,EACtF,QAAQ,EACR,WAAW,GAAG,SAAS,EACvB,YAAY,EACZ,KAAK,EACL,SAAS,EACT,KAAK,EACL,kBAAkB;AAClB;AACA,QAAQ,EACR,IAAI,EACJ,OAAO,EACP,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,gBAAgB,EAC1B,OAAO,EAAE,eAAe,EACxB,eAAe,EAAE,uBAAuB,EACxC,OAAO,EACP,KAAK,GAC6B,KAAkB;AACpD,IAAA,MAAM,MAAM,GAAG,gBAAgB,CAAC,cAAc,CAAC,CAAC;AAChD,IAAA,MAAM,OAAO,GAAG,gBAAgB,CAAC,eAAe,CAAC,CAAC;AAClD,IAAA,MAAM,QAAQ,GAAG,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;AACpD,IAAA,MAAM,eAAe,GAAG,gBAAgB,CAAC,uBAAuB,CAAC,CAAC;IAClE,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACtD,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACnD,QACIA,GAAC,CAAA,kCAAkC,EAC/B,EAAA,QAAA,EAAAA,GAAA,CAAC,cAAc,EACX,EAAA,kBAAkB,EAAE,kBAAkB,EACtC,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,IAAI,EACV,WAAW,EAAE,WAAW,EACxB,OAAO,EAAE,OAAO,YAEhBA,GAAC,CAAA,kBAAkB,EAAC,EAAA,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE,cAAc,EAAA,QAAA,EACxEA,GAAC,CAAA,mBAAmB,IAAyB,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAA,QAAA,EACzEA,GAAC,CAAA,mBAAmB,EAAC,EAAA,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE,cAAc,EAAA,QAAA,EACzEA,GAAC,CAAA,kBAAkB,IACf,YAAY,EAAE,YAAY,EAC1B,KAAK,EAAE,KAAK,EACZ,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,OAAO,EAChB,eAAe,EAAE,eAAe,EAAA,QAAA,EAEhCA,GAAC,CAAA,yBAAyB,EACtB,EAAA,QAAA,EAAAA,GAAA,CAAC,oBAAoB,EAAC,EAAA,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAA,QAAA,EACjD,QAAQ,EAAA,CACU,EACC,CAAA,EAAA,CACX,EACH,CAAA,EAAA,CACJ,EACL,CAAA,EAAA,CACR,EACgB,CAAA,EACvC;AACN,CAAC,CAAC;AAEI,MAAA,MAAM,GAAG,WAAmD;AAElE,MAAM,CAAC,OAAO,GAAG,aAAa,CAAC;AAC/B,MAAM,CAAC,aAAa,GAAG,mBAAmB,CAAC;AAC3C,MAAM,CAAC,OAAO,GAAG,aAAa;;;;"}
@@ -0,0 +1,15 @@
1
+ import { type ReactElement, CSSProperties } from 'react';
2
+ import { StaticDataFetcherItem } from '@hh.ru/magritte-common-data-provider';
3
+ import { OptionCustomLayoutComponent } from '@hh.ru/magritte-ui-new-select/internal/Option';
4
+ import { SelectOptionType } from '@hh.ru/magritte-ui-new-select/types';
5
+ export interface OptionsProps<DataType extends StaticDataFetcherItem> {
6
+ type?: SelectOptionType;
7
+ plain?: boolean;
8
+ optionLayoutComponent?: OptionCustomLayoutComponent<DataType>;
9
+ 'data-qa'?: string;
10
+ className?: string;
11
+ /** Обработчик события выбора option */
12
+ onOptionSelect?: (values: readonly DataType[]) => void;
13
+ inlineStyle?: CSSProperties;
14
+ }
15
+ export declare const SelectOptions: <DataType extends StaticDataFetcherItem>({ type, plain, className, inlineStyle, optionLayoutComponent, onOptionSelect: onOptionSelectExternal, "data-qa": dataQa, }: OptionsProps<DataType>) => ReactElement;
@@ -0,0 +1,68 @@
1
+ import './index.css';
2
+ import { jsx } from 'react/jsx-runtime';
3
+ import { useId, useCallback } from 'react';
4
+ import classnames from 'classnames';
5
+ import { useSelectConfig } from './internal/ConfigContext.js';
6
+ import { Option, OptionLayoutComponentDefault } from './internal/Option.js';
7
+ import { useDataProvider } from './internal/SelectDataProvider.js';
8
+ import { useSelectStore, useSelected } from './internal/SelectStateContext.js';
9
+ import { useVisibility } from './internal/VisibilityContext.js';
10
+ import { useFocusOrchestrator } from './internal/focusOrchestrator.js';
11
+ import { useRegisterSelectElementsSlot } from './internal/slots.js';
12
+ import { useEventCallback, extractValues, getChecked } from './internal/utils.js';
13
+ import '@hh.ru/magritte-common-keyboard';
14
+ import '@hh.ru/magritte-common-use-disabled';
15
+ import '@hh.ru/magritte-ui-cell';
16
+ import '@hh.ru/magritte-ui-checkable-card/CheckableCardElement';
17
+ import '@hh.ru/magritte-ui-icon/icon';
18
+ import './internal/OptionControl.js';
19
+ import '@hh.ru/magritte-ui-checkbox-radio';
20
+ import '@hh.ru/magritte-ui-typography';
21
+ import '@hh.ru/magritte-common-data-provider';
22
+ import './internal/useDataProvider.js';
23
+ import './internal/SearchStateContext.js';
24
+ import './internal/SelectStore.js';
25
+ import '@hh.ru/magritte-internal-slot-registry';
26
+
27
+ var styles = {"options":"magritte-options___8OD3d_1-2-0","options_plain":"magritte-options_plain___Wp-nU_1-2-0","optionsPlain":"magritte-options_plain___Wp-nU_1-2-0"};
28
+
29
+ const SelectOptions = ({ type = 'checkbox', plain, className, inlineStyle, optionLayoutComponent = OptionLayoutComponentDefault, onOptionSelect: onOptionSelectExternal, 'data-qa': dataQa, }) => {
30
+ const listId = useId();
31
+ const { toggleListVisibility } = useVisibility();
32
+ const { maxSelectedOptions, multiple, name, commitModel } = useSelectConfig();
33
+ // TODO регать draft store в пикере и тут получать
34
+ const selectStore = useSelectStore();
35
+ const selected = useSelected(selectStore);
36
+ const { optionList } = useDataProvider();
37
+ const orchestrator = useFocusOrchestrator();
38
+ const onOptionSelect = useEventCallback(onOptionSelectExternal);
39
+ const isLimitExceeded = maxSelectedOptions !== undefined && selected.length >= maxSelectedOptions;
40
+ useRegisterSelectElementsSlot('plain', plain);
41
+ const onChangeOption = useCallback((selectedItem) => {
42
+ if (extractValues(selected).includes(selectedItem.value)) {
43
+ selectStore.remove(selectedItem.value);
44
+ }
45
+ else if (multiple) {
46
+ selectStore.add(selectedItem);
47
+ }
48
+ else {
49
+ selectStore.replace([selectedItem]);
50
+ }
51
+ if (commitModel === 'instant' && !multiple) {
52
+ toggleListVisibility(false);
53
+ }
54
+ if (commitModel === 'confirm') {
55
+ // TODO focus or focus+select?
56
+ orchestrator.yieldFocus();
57
+ }
58
+ onOptionSelect?.(selectStore.getSnapshot());
59
+ }, [commitModel, multiple, orchestrator, selectStore, selected, toggleListVisibility, onOptionSelect]);
60
+ return (jsx("div", { id: listId, className: classnames(styles.options, { [styles.optionsPlain]: plain }, className), "data-qa": "magritte-select-option-list", style: inlineStyle, children: optionList.map((option) => {
61
+ const checked = Boolean(option.data && getChecked(option.data, selected));
62
+ const disabled = !checked && (option.disabled || isLimitExceeded);
63
+ return (jsx(Option, { name: name, checked: checked, onChange: onChangeOption, optionLayoutComponent: optionLayoutComponent, disabled: disabled, type: option.type || type, plain: !!plain, multiple: multiple, "data-qa": dataQa, data: option.data }, option.data.value));
64
+ }) }));
65
+ };
66
+
67
+ export { SelectOptions };
68
+ //# sourceMappingURL=SelectOptions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SelectOptions.js","sources":["src/SelectOptions.tsx"],"sourcesContent":["import { type ReactElement, useId, CSSProperties, useCallback } from 'react';\nimport classnames from 'classnames';\n\nimport { StaticDataFetcherItem } from '@hh.ru/magritte-common-data-provider';\nimport { useSelectConfig } from '@hh.ru/magritte-ui-new-select/internal/ConfigContext';\nimport {\n OptionLayoutComponentDefault,\n OptionCustomLayoutComponent,\n Option,\n} from '@hh.ru/magritte-ui-new-select/internal/Option';\nimport { OnChangeAction } from '@hh.ru/magritte-ui-new-select/internal/OptionControl';\nimport { useDataProvider } from '@hh.ru/magritte-ui-new-select/internal/SelectDataProvider';\nimport { useSelectStore, useSelected } from '@hh.ru/magritte-ui-new-select/internal/SelectStateContext';\nimport { useVisibility } from '@hh.ru/magritte-ui-new-select/internal/VisibilityContext';\nimport { useFocusOrchestrator } from '@hh.ru/magritte-ui-new-select/internal/focusOrchestrator';\nimport { useRegisterSelectElementsSlot } from '@hh.ru/magritte-ui-new-select/internal/slots';\nimport { getChecked, extractValues, useEventCallback } from '@hh.ru/magritte-ui-new-select/internal/utils';\nimport { SelectOptionType } from '@hh.ru/magritte-ui-new-select/types';\n\nimport styles from './select-options.less';\n\nexport interface OptionsProps<DataType extends StaticDataFetcherItem> {\n type?: SelectOptionType;\n plain?: boolean;\n optionLayoutComponent?: OptionCustomLayoutComponent<DataType>;\n 'data-qa'?: string;\n className?: string;\n /** Обработчик события выбора option */\n onOptionSelect?: (values: readonly DataType[]) => void;\n inlineStyle?: CSSProperties;\n}\n\nexport const SelectOptions = <DataType extends StaticDataFetcherItem>({\n type = 'checkbox',\n plain,\n className,\n inlineStyle,\n optionLayoutComponent = OptionLayoutComponentDefault,\n onOptionSelect: onOptionSelectExternal,\n 'data-qa': dataQa,\n}: OptionsProps<DataType>): ReactElement => {\n const listId = useId();\n const { toggleListVisibility } = useVisibility();\n const { maxSelectedOptions, multiple, name, commitModel } = useSelectConfig();\n // TODO регать draft store в пикере и тут получать\n const selectStore = useSelectStore<DataType>();\n const selected = useSelected<DataType>(selectStore);\n const { optionList } = useDataProvider<DataType>();\n const orchestrator = useFocusOrchestrator();\n const onOptionSelect = useEventCallback(onOptionSelectExternal);\n const isLimitExceeded = maxSelectedOptions !== undefined && selected.length >= maxSelectedOptions;\n useRegisterSelectElementsSlot('plain', plain);\n\n const onChangeOption = useCallback<OnChangeAction<DataType>>(\n (selectedItem) => {\n if (extractValues(selected).includes(selectedItem.value)) {\n selectStore.remove(selectedItem.value);\n } else if (multiple) {\n selectStore.add(selectedItem);\n } else {\n selectStore.replace([selectedItem]);\n }\n if (commitModel === 'instant' && !multiple) {\n toggleListVisibility(false);\n }\n if (commitModel === 'confirm') {\n // TODO focus or focus+select?\n orchestrator.yieldFocus();\n }\n onOptionSelect?.(selectStore.getSnapshot());\n },\n [commitModel, multiple, orchestrator, selectStore, selected, toggleListVisibility, onOptionSelect]\n );\n\n return (\n <div\n id={listId}\n className={classnames(styles.options, { [styles.optionsPlain]: plain }, className)}\n data-qa=\"magritte-select-option-list\"\n style={inlineStyle}\n // TODO role + aria-multiselectable\n >\n {optionList.map((option) => {\n const checked = Boolean(option.data && getChecked(option.data, selected));\n const disabled = !checked && (option.disabled || isLimitExceeded);\n return (\n <Option\n key={option.data.value}\n name={name}\n checked={checked}\n onChange={onChangeOption}\n optionLayoutComponent={optionLayoutComponent}\n disabled={disabled}\n type={option.type || type}\n plain={!!plain}\n multiple={multiple}\n data-qa={dataQa}\n data={option.data}\n />\n );\n })}\n </div>\n );\n};\n"],"names":["_jsx"],"mappings":"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"}
@@ -21,7 +21,7 @@ import './internal/SelectStore.js';
21
21
  import './internal/slots.js';
22
22
  import '@hh.ru/magritte-internal-slot-registry';
23
23
 
24
- var styles = {"anchor":"magritte-anchor___IFvZk_1-1-1","anchor-stretched":"magritte-anchor-stretched___L14B-_1-1-1","anchorStretched":"magritte-anchor-stretched___L14B-_1-1-1","default-view":"magritte-default-view___oT4uN_1-1-1","defaultView":"magritte-default-view___oT4uN_1-1-1","input-view":"magritte-input-view___TCeV4_1-1-1","inputView":"magritte-input-view___TCeV4_1-1-1","hidden-view":"magritte-hidden-view___oJ4OI_1-1-1","hiddenView":"magritte-hidden-view___oJ4OI_1-1-1"};
24
+ var styles = {"anchor":"magritte-anchor___IFvZk_1-2-0","anchor-stretched":"magritte-anchor-stretched___L14B-_1-2-0","anchorStretched":"magritte-anchor-stretched___L14B-_1-2-0","default-view":"magritte-default-view___oT4uN_1-2-0","defaultView":"magritte-default-view___oT4uN_1-2-0","input-view":"magritte-input-view___TCeV4_1-2-0","inputView":"magritte-input-view___TCeV4_1-2-0","hidden-view":"magritte-hidden-view___oJ4OI_1-2-0","hiddenView":"magritte-hidden-view___oJ4OI_1-2-0"};
25
25
 
26
26
  const SelectSearchTriggerComponent = ({ 'aria-label': ariaLabel, 'data-qa': dataQa = 'magritte-select-input-activator', disabled, size, maxWidth, stretched, ...triggerProps }, ref) => {
27
27
  const [useSearchInput, setUseSearchInput] = useState(false);
package/index.css CHANGED
@@ -1,14 +1,58 @@
1
- .magritte-anchor___IFvZk_1-1-1{
1
+ .magritte-select-option-plain___B31iR_1-2-0{
2
+ border-radius:8px;
3
+ }
4
+ .magritte-select-option-plain___B31iR_1-2-0.focus-visible{
5
+ outline:var(--magritte-color-component-input-stroke-state-accent-focused-accessible-v24-7-3) solid 4px;
6
+ }
7
+ @media (min-width: 1020px){
8
+ body.magritte-old-layout .magritte-select-option-plain___B31iR_1-2-0:hover{
9
+ cursor:default;
10
+ }
11
+ }
12
+ @media (min-width: 1024px){
13
+ body:not(.magritte-old-layout) .magritte-select-option-plain___B31iR_1-2-0:hover{
14
+ cursor:default;
15
+ }
16
+ }
17
+ @media (min-width: 1020px){
18
+ body.magritte-old-layout .magritte-select-option-plain_active___uIVGr_1-2-0:hover{
19
+ cursor:pointer;
20
+ }
21
+ }
22
+ @media (min-width: 1024px){
23
+ body:not(.magritte-old-layout) .magritte-select-option-plain_active___uIVGr_1-2-0:hover{
24
+ cursor:pointer;
25
+ }
26
+ }
27
+ .magritte-select-label-option___Qs4Fd_1-2-0{
28
+ display:flex;
29
+ justify-content:center;
30
+ }
31
+ .magritte-select-delimiter___rr-59_1-2-0{
32
+ padding-left:16px;
33
+ padding-top:12px;
34
+ }
35
+
36
+ .magritte-options___8OD3d_1-2-0{
37
+ display:flex;
38
+ flex-direction:column;
39
+ gap:8px;
40
+ }
41
+ .magritte-options_plain___Wp-nU_1-2-0{
42
+ gap:16px;
43
+ }
44
+
45
+ .magritte-anchor___IFvZk_1-2-0{
2
46
  position:relative;
3
47
  width:fit-content;
4
48
  }
5
- .magritte-anchor-stretched___L14B-_1-1-1{
49
+ .magritte-anchor-stretched___L14B-_1-2-0{
6
50
  width:100%;
7
51
  }
8
- .magritte-default-view___oT4uN_1-1-1{
52
+ .magritte-default-view___oT4uN_1-2-0{
9
53
  min-width:0;
10
54
  }
11
- .magritte-input-view___TCeV4_1-1-1{
55
+ .magritte-input-view___TCeV4_1-2-0{
12
56
  position:absolute;
13
57
  top:0;
14
58
  left:0;
@@ -16,10 +60,10 @@
16
60
  display:flex;
17
61
  min-width:0;
18
62
  }
19
- .magritte-hidden-view___oJ4OI_1-1-1{
63
+ .magritte-hidden-view___oJ4OI_1-2-0{
20
64
  visibility:hidden;
21
65
  }
22
66
 
23
- .magritte-select-layout___MIlpQ_1-1-1{
67
+ .magritte-select-layout___MIlpQ_1-2-0{
24
68
  display:contents;
25
69
  }
package/index.d.ts CHANGED
@@ -1,2 +1,3 @@
1
1
  export { Select } from '@hh.ru/magritte-ui-new-select/Select';
2
2
  export { useSelectTrigger, useTriggerRef } from '@hh.ru/magritte-ui-new-select/useSelectTrigger';
3
+ export type { OptionCustomLayoutComponent } from '@hh.ru/magritte-ui-new-select/internal/Option';
package/index.js CHANGED
@@ -3,26 +3,34 @@ export { Select } from './Select.js';
3
3
  export { useSelectTrigger, useTriggerRef } from './useSelectTrigger.js';
4
4
  import 'react/jsx-runtime';
5
5
  import 'react';
6
- import './SelectSearchTrigger.js';
6
+ import './SelectOptions.js';
7
7
  import 'classnames';
8
- import '@hh.ru/magritte-common-use-disabled';
9
- import '@hh.ru/magritte-common-use-multiple-refs';
10
- import '@hh.ru/magritte-ui-input/BaseInput';
11
- import './internal/SearchStateContext.js';
8
+ import './internal/ConfigContext.js';
12
9
  import './internal/utils.js';
13
10
  import '@hh.ru/magritte-common-keyboard';
14
- import './internal/focusOrchestrator.js';
15
- import '@hh.ru/magritte-ui-trigger';
16
- import './SelectTrigger.js';
17
- import './internal/ConfigContext.js';
18
- import './internal/NavigationManagement.js';
19
- import './internal/slots.js';
20
- import '@hh.ru/magritte-internal-slot-registry';
21
- import './internal/useFocusWithin.js';
11
+ import './internal/Option.js';
12
+ import '@hh.ru/magritte-common-use-disabled';
13
+ import '@hh.ru/magritte-ui-cell';
14
+ import '@hh.ru/magritte-ui-checkable-card/CheckableCardElement';
15
+ import '@hh.ru/magritte-ui-icon/icon';
16
+ import './internal/OptionControl.js';
17
+ import '@hh.ru/magritte-ui-checkbox-radio';
18
+ import '@hh.ru/magritte-ui-typography';
22
19
  import './internal/SelectDataProvider.js';
23
20
  import '@hh.ru/magritte-common-data-provider';
24
21
  import './internal/useDataProvider.js';
22
+ import './internal/SearchStateContext.js';
25
23
  import './internal/VisibilityContext.js';
26
24
  import './internal/SelectStateContext.js';
27
25
  import './internal/SelectStore.js';
26
+ import './internal/focusOrchestrator.js';
27
+ import './internal/slots.js';
28
+ import '@hh.ru/magritte-internal-slot-registry';
29
+ import './SelectSearchTrigger.js';
30
+ import '@hh.ru/magritte-common-use-multiple-refs';
31
+ import '@hh.ru/magritte-ui-input/BaseInput';
32
+ import '@hh.ru/magritte-ui-trigger';
33
+ import './SelectTrigger.js';
34
+ import './internal/NavigationManagement.js';
35
+ import './internal/useFocusWithin.js';
28
36
  //# 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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -8,7 +8,7 @@ import './utils.js';
8
8
  import '@hh.ru/magritte-common-keyboard';
9
9
  import '@hh.ru/magritte-internal-slot-registry';
10
10
 
11
- var styles = {"select-layout":"magritte-select-layout___MIlpQ_1-1-1","selectLayout":"magritte-select-layout___MIlpQ_1-1-1"};
11
+ var styles = {"select-layout":"magritte-select-layout___MIlpQ_1-2-0","selectLayout":"magritte-select-layout___MIlpQ_1-2-0"};
12
12
 
13
13
  const NavigationManagement = ({ children, onFocus, onBlur }) => {
14
14
  const focusOrchestrator = useFocusOrchestrator();
@@ -0,0 +1,26 @@
1
+ import { type ComponentType, type ReactElement } from 'react';
2
+ import { StaticDataFetcherItem } from '@hh.ru/magritte-common-data-provider';
3
+ import { OnChangeAction } from '@hh.ru/magritte-ui-new-select/internal/OptionControl';
4
+ import { SelectOptionType, DelimiterOptionType } from '@hh.ru/magritte-ui-new-select/types';
5
+ type OptionCustomLayoutBaseProps<DataType extends StaticDataFetcherItem> = Pick<OptionProps<DataType>, 'data' | 'plain' | 'checked' | 'isMobile' | 'disabled' | 'onChange' | 'multiple'>;
6
+ export type OptionCustomLayoutProps<DataType extends StaticDataFetcherItem> = OptionCustomLayoutBaseProps<DataType> & {
7
+ type: SelectOptionType | DelimiterOptionType;
8
+ input?: ReactElement;
9
+ };
10
+ export type OptionCustomLayoutComponent<DataType extends StaticDataFetcherItem> = ComponentType<OptionCustomLayoutProps<DataType>>;
11
+ interface OptionProps<DataType extends StaticDataFetcherItem> {
12
+ disabled?: boolean;
13
+ data: DataType;
14
+ checked: boolean;
15
+ name?: string;
16
+ type: SelectOptionType | DelimiterOptionType;
17
+ optionLayoutComponent: OptionCustomLayoutComponent<DataType>;
18
+ onChange: OnChangeAction<DataType>;
19
+ plain: boolean;
20
+ multiple?: boolean;
21
+ isMobile?: boolean;
22
+ 'data-qa'?: string;
23
+ }
24
+ export declare const OptionLayoutComponentDefault: <DataType extends StaticDataFetcherItem>({ data, type, plain, checked, isMobile, input, }: OptionCustomLayoutProps<DataType>) => ReactElement;
25
+ export declare const Option: <DataType extends StaticDataFetcherItem>({ checked, name, disabled, optionLayoutComponent: OptionLayoutComponent, type, onChange, plain, data, multiple, isMobile, "data-qa": dataQa, }: OptionProps<DataType>) => ReactElement;
26
+ export {};
@@ -0,0 +1,70 @@
1
+ import './../index.css';
2
+ import { jsx } from 'react/jsx-runtime';
3
+ import { useState } from 'react';
4
+ import classnames from 'classnames';
5
+ import { keyboardMatches, keyboardKeys } from '@hh.ru/magritte-common-keyboard';
6
+ import { DisabledContext } from '@hh.ru/magritte-common-use-disabled';
7
+ import { CellText, Cell } from '@hh.ru/magritte-ui-cell';
8
+ import { CheckableCardElement } from '@hh.ru/magritte-ui-checkable-card/CheckableCardElement';
9
+ import { CheckOutlinedSize24 } from '@hh.ru/magritte-ui-icon/icon';
10
+ import { OptionControl } from './OptionControl.js';
11
+ import { Text } from '@hh.ru/magritte-ui-typography';
12
+ import '@hh.ru/magritte-ui-checkbox-radio';
13
+
14
+ var styles = {"select-option-plain":"magritte-select-option-plain___B31iR_1-2-0","selectOptionPlain":"magritte-select-option-plain___B31iR_1-2-0","select-option-plain_active":"magritte-select-option-plain_active___uIVGr_1-2-0","selectOptionPlainActive":"magritte-select-option-plain_active___uIVGr_1-2-0","select-label-option":"magritte-select-label-option___Qs4Fd_1-2-0","selectLabelOption":"magritte-select-label-option___Qs4Fd_1-2-0","select-delimiter":"magritte-select-delimiter___rr-59_1-2-0","selectDelimiter":"magritte-select-delimiter___rr-59_1-2-0"};
15
+
16
+ const OptionLayoutComponentDefault = ({ data, type, plain, checked, isMobile, input, }) => {
17
+ if (type === 'delimiter') {
18
+ return (jsx(CellText, { maxLines: 1, style: "secondary", children: data.text }));
19
+ }
20
+ if (type === 'label') {
21
+ return (jsx(Cell, { Element: "div", right: checked && plain ? jsx(CheckOutlinedSize24, {}) : undefined, vertPadding: isMobile, children: jsx("div", { className: classnames({ [styles.selectLabelOption]: !plain }), children: jsx(CellText, { maxLines: 1, children: data.text }) }) }));
22
+ }
23
+ return (jsx(Cell, { Element: "div", align: "center", left: isMobile ? undefined : input, right: isMobile ? input : undefined, children: jsx(CellText, { maxLines: 1, children: data.text }) }));
24
+ };
25
+ const Option = ({ checked, name, disabled, optionLayoutComponent: OptionLayoutComponent, type, onChange, plain, data, multiple, isMobile, 'data-qa': dataQa, }) => {
26
+ const [focusVisible, setFocusVisible] = useState(false);
27
+ if (type === 'delimiter') {
28
+ return (jsx("div", { className: classnames({ [styles.selectDelimiter]: !plain }), children: jsx(Text, { typography: "label-3-regular", children: jsx(OptionLayoutComponent, { data: data, type: type, plain: plain, checked: checked, isMobile: isMobile, disabled: disabled, onChange: onChange, multiple: multiple }) }) }));
29
+ }
30
+ const optionLayoutComponentProps = {
31
+ data,
32
+ input: (jsx(OptionControl, { type: type, data: data, checked: checked, name: name, onChange: onChange, "data-qa": dataQa })),
33
+ type,
34
+ plain,
35
+ checked,
36
+ isMobile,
37
+ disabled,
38
+ onChange,
39
+ multiple,
40
+ };
41
+ if (plain) {
42
+ return (jsx("div", { className: classnames(styles.selectOptionPlain, { [styles.selectOptionPlainActive]: !disabled }), "data-qa": `magritte-select-option-${data.value}`, "data-magritte-select-option": data.value, role: "option", "aria-selected": checked, tabIndex: disabled ? -1 : 0, "aria-disabled": disabled, onClick: () => {
43
+ if (disabled) {
44
+ return;
45
+ }
46
+ onChange(data);
47
+ }, onKeyDown: (event) => {
48
+ if (disabled) {
49
+ return;
50
+ }
51
+ if (keyboardMatches(event.nativeEvent, [keyboardKeys.Enter, keyboardKeys.Space])) {
52
+ onChange(data);
53
+ }
54
+ }, children: jsx(DisabledContext.Provider, { value: !!disabled, children: jsx(OptionLayoutComponent, { ...optionLayoutComponentProps }) }) }));
55
+ }
56
+ return (jsx(CheckableCardElement, { Element: "label", role: "option", padding: 16, borderRadius: 12, flexible: false, checked: checked, "data-magritte-select-option": data.value, focusVisible: focusVisible, "data-qa": `magritte-select-option-${data.value}`, disabled: disabled, "aria-selected": checked, toneHover: true, onClick: () => {
57
+ if (type === 'label' && !disabled) {
58
+ onChange(data);
59
+ }
60
+ }, onKeyDown: (event) => {
61
+ if (keyboardMatches(event.nativeEvent, [keyboardKeys.Enter, keyboardKeys.Space])) {
62
+ onChange(data);
63
+ event.preventDefault();
64
+ setFocusVisible(true);
65
+ }
66
+ }, onBlur: () => setFocusVisible(false), children: jsx(OptionLayoutComponent, { ...optionLayoutComponentProps }) }));
67
+ };
68
+
69
+ export { Option, OptionLayoutComponentDefault };
70
+ //# sourceMappingURL=Option.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Option.js","sources":["src/internal/Option.tsx"],"sourcesContent":["import { type ComponentType, type ReactElement, useState } from 'react';\nimport classnames from 'classnames';\n\nimport { StaticDataFetcherItem } from '@hh.ru/magritte-common-data-provider';\nimport { keyboardMatches, keyboardKeys } from '@hh.ru/magritte-common-keyboard';\nimport { DisabledContext } from '@hh.ru/magritte-common-use-disabled';\nimport { Cell, CellText } from '@hh.ru/magritte-ui-cell';\nimport { CheckableCardElement } from '@hh.ru/magritte-ui-checkable-card/CheckableCardElement';\nimport { CheckOutlinedSize24 } from '@hh.ru/magritte-ui-icon/icon';\nimport { OptionControl, OnChangeAction } from '@hh.ru/magritte-ui-new-select/internal/OptionControl';\nimport { SelectOptionType, DelimiterOptionType } from '@hh.ru/magritte-ui-new-select/types';\nimport { Text } from '@hh.ru/magritte-ui-typography';\n\nimport styles from './option.less';\n\ntype OptionCustomLayoutBaseProps<DataType extends StaticDataFetcherItem> = Pick<\n OptionProps<DataType>,\n 'data' | 'plain' | 'checked' | 'isMobile' | 'disabled' | 'onChange' | 'multiple'\n>;\n\n// для delimiter input не создается, но delimiter через рендер компонент пропустить нужно\nexport type OptionCustomLayoutProps<DataType extends StaticDataFetcherItem> = OptionCustomLayoutBaseProps<DataType> & {\n type: SelectOptionType | DelimiterOptionType;\n input?: ReactElement;\n};\n\nexport type OptionCustomLayoutComponent<DataType extends StaticDataFetcherItem> = ComponentType<\n OptionCustomLayoutProps<DataType>\n>;\n\ninterface OptionProps<DataType extends StaticDataFetcherItem> {\n disabled?: boolean;\n data: DataType;\n checked: boolean;\n name?: string;\n type: SelectOptionType | DelimiterOptionType;\n optionLayoutComponent: OptionCustomLayoutComponent<DataType>;\n onChange: OnChangeAction<DataType>;\n plain: boolean;\n multiple?: boolean;\n isMobile?: boolean;\n 'data-qa'?: string;\n}\n\nexport const OptionLayoutComponentDefault = <DataType extends StaticDataFetcherItem>({\n data,\n type,\n plain,\n checked,\n isMobile,\n input,\n}: OptionCustomLayoutProps<DataType>): ReactElement => {\n if (type === 'delimiter') {\n return (\n <CellText maxLines={1} style=\"secondary\">\n {data.text}\n </CellText>\n );\n }\n\n if (type === 'label') {\n return (\n <Cell Element=\"div\" right={checked && plain ? <CheckOutlinedSize24 /> : undefined} vertPadding={isMobile}>\n <div className={classnames({ [styles.selectLabelOption]: !plain })}>\n <CellText maxLines={1}>{data.text}</CellText>\n </div>\n </Cell>\n );\n }\n\n return (\n <Cell Element=\"div\" align=\"center\" left={isMobile ? undefined : input} right={isMobile ? input : undefined}>\n <CellText maxLines={1}>{data.text}</CellText>\n </Cell>\n );\n};\n\nexport const Option = <DataType extends StaticDataFetcherItem>({\n checked,\n name,\n disabled,\n optionLayoutComponent: OptionLayoutComponent,\n type,\n onChange,\n plain,\n data,\n multiple,\n isMobile,\n 'data-qa': dataQa,\n}: OptionProps<DataType>): ReactElement => {\n const [focusVisible, setFocusVisible] = useState(false);\n\n if (type === 'delimiter') {\n return (\n <div className={classnames({ [styles.selectDelimiter]: !plain })}>\n <Text typography=\"label-3-regular\">\n <OptionLayoutComponent\n data={data}\n type={type}\n plain={plain}\n checked={checked}\n isMobile={isMobile}\n disabled={disabled}\n onChange={onChange}\n multiple={multiple}\n />\n </Text>\n </div>\n );\n }\n\n const optionLayoutComponentProps = {\n data,\n input: (\n <OptionControl type={type} data={data} checked={checked} name={name} onChange={onChange} data-qa={dataQa} />\n ),\n type,\n plain,\n checked,\n isMobile,\n disabled,\n onChange,\n multiple,\n };\n\n if (plain) {\n return (\n <div\n className={classnames(styles.selectOptionPlain, { [styles.selectOptionPlainActive]: !disabled })}\n data-qa={`magritte-select-option-${data.value}`}\n data-magritte-select-option={data.value}\n role=\"option\"\n aria-selected={checked}\n tabIndex={disabled ? -1 : 0}\n aria-disabled={disabled}\n onClick={() => {\n if (disabled) {\n return;\n }\n onChange(data);\n }}\n onKeyDown={(event) => {\n if (disabled) {\n return;\n }\n if (keyboardMatches(event.nativeEvent, [keyboardKeys.Enter, keyboardKeys.Space])) {\n onChange(data);\n }\n }}\n >\n <DisabledContext.Provider value={!!disabled}>\n <OptionLayoutComponent {...optionLayoutComponentProps} />\n </DisabledContext.Provider>\n </div>\n );\n }\n return (\n <CheckableCardElement\n Element=\"label\"\n role=\"option\"\n padding={16}\n borderRadius={12}\n flexible={false}\n checked={checked}\n data-magritte-select-option={data.value}\n focusVisible={focusVisible}\n data-qa={`magritte-select-option-${data.value}`}\n disabled={disabled}\n aria-selected={checked}\n toneHover\n onClick={() => {\n if (type === 'label' && !disabled) {\n onChange(data);\n }\n }}\n onKeyDown={(event) => {\n if (keyboardMatches(event.nativeEvent, [keyboardKeys.Enter, keyboardKeys.Space])) {\n onChange(data);\n event.preventDefault();\n setFocusVisible(true);\n }\n }}\n onBlur={() => setFocusVisible(false)}\n >\n <OptionLayoutComponent {...optionLayoutComponentProps} />\n </CheckableCardElement>\n );\n};\n"],"names":["_jsx"],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { type ReactElement } from 'react';
2
+ import { StaticDataFetcherItem } from '@hh.ru/magritte-common-data-provider';
3
+ import { SelectOptionType } from '@hh.ru/magritte-ui-new-select/types';
4
+ export interface OnChangeAction<DataType extends StaticDataFetcherItem> {
5
+ (value: DataType): void;
6
+ }
7
+ export interface OptionControlProps<DataType extends StaticDataFetcherItem> {
8
+ type: SelectOptionType;
9
+ data: DataType;
10
+ checked: boolean;
11
+ name?: string;
12
+ onChange: OnChangeAction<DataType>;
13
+ 'data-qa'?: string;
14
+ }
15
+ export declare const OptionControl: {
16
+ <DataType extends StaticDataFetcherItem>({ type, data, checked, name, onChange, "data-qa": dataQa, }: OptionControlProps<DataType>): ReactElement;
17
+ displayName: string;
18
+ };
@@ -0,0 +1,17 @@
1
+ import './../index.css';
2
+ import { jsx } from 'react/jsx-runtime';
3
+ import { Radio, Checkbox } from '@hh.ru/magritte-ui-checkbox-radio';
4
+
5
+ const OptionControl = ({ type, data, checked, name, onChange, 'data-qa': dataQa, }) => {
6
+ if (type === 'label') {
7
+ return jsx("input", { type: "hidden", name: name, value: data.value, "data-qa": dataQa });
8
+ }
9
+ if (type === 'radio') {
10
+ return (jsx(Radio, { "data-focus-visible-skip": "true", "data-qa": dataQa, tabIndex: -1, name: name, value: data.value, checked: checked, onChange: () => onChange(data) }));
11
+ }
12
+ return (jsx(Checkbox, { "data-focus-visible-skip": "true", "data-qa": dataQa, tabIndex: -1, name: name, value: data.value, checked: checked, onChange: () => onChange(data) }));
13
+ };
14
+ OptionControl.displayName = 'OptionControl';
15
+
16
+ export { OptionControl };
17
+ //# sourceMappingURL=OptionControl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OptionControl.js","sources":["src/internal/OptionControl.tsx"],"sourcesContent":["import { type ReactElement } from 'react';\n\nimport { StaticDataFetcherItem } from '@hh.ru/magritte-common-data-provider';\nimport { Radio, Checkbox } from '@hh.ru/magritte-ui-checkbox-radio';\nimport { SelectOptionType } from '@hh.ru/magritte-ui-new-select/types';\n\nexport interface OnChangeAction<DataType extends StaticDataFetcherItem> {\n (value: DataType): void;\n}\n\nexport interface OptionControlProps<DataType extends StaticDataFetcherItem> {\n type: SelectOptionType;\n data: DataType;\n checked: boolean;\n name?: string;\n onChange: OnChangeAction<DataType>;\n 'data-qa'?: string;\n}\n\nexport const OptionControl = <DataType extends StaticDataFetcherItem>({\n type,\n data,\n checked,\n name,\n onChange,\n 'data-qa': dataQa,\n}: OptionControlProps<DataType>): ReactElement => {\n if (type === 'label') {\n return <input type=\"hidden\" name={name} value={data.value} data-qa={dataQa} />;\n }\n if (type === 'radio') {\n return (\n <Radio\n data-focus-visible-skip=\"true\"\n data-qa={dataQa}\n tabIndex={-1}\n name={name}\n value={data.value}\n checked={checked}\n onChange={() => onChange(data)}\n />\n );\n }\n return (\n <Checkbox\n data-focus-visible-skip=\"true\"\n data-qa={dataQa}\n tabIndex={-1}\n name={name}\n value={data.value}\n checked={checked}\n onChange={() => onChange(data)}\n />\n );\n};\n\nOptionControl.displayName = 'OptionControl';\n"],"names":["_jsx"],"mappings":";;;MAmBa,aAAa,GAAG,CAAyC,EAClE,IAAI,EACJ,IAAI,EACJ,OAAO,EACP,IAAI,EACJ,QAAQ,EACR,SAAS,EAAE,MAAM,GACU,KAAkB;AAC7C,IAAA,IAAI,IAAI,KAAK,OAAO,EAAE;AAClB,QAAA,OAAOA,eAAO,IAAI,EAAC,QAAQ,EAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAW,SAAA,EAAA,MAAM,GAAI,CAAC;KAClF;AACD,IAAA,IAAI,IAAI,KAAK,OAAO,EAAE;AAClB,QAAA,QACIA,GAAC,CAAA,KAAK,EACsB,EAAA,yBAAA,EAAA,MAAM,aACrB,MAAM,EACf,QAAQ,EAAE,CAAC,CAAC,EACZ,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,IAAI,CAAC,KAAK,EACjB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,MAAM,QAAQ,CAAC,IAAI,CAAC,EAAA,CAChC,EACJ;KACL;AACD,IAAA,QACIA,GAAC,CAAA,QAAQ,EACmB,EAAA,yBAAA,EAAA,MAAM,aACrB,MAAM,EACf,QAAQ,EAAE,CAAC,CAAC,EACZ,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,IAAI,CAAC,KAAK,EACjB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,MAAM,QAAQ,CAAC,IAAI,CAAC,EAAA,CAChC,EACJ;AACN,EAAE;AAEF,aAAa,CAAC,WAAW,GAAG,eAAe;;;;"}
@@ -4,6 +4,7 @@ interface SelectElementsSlots {
4
4
  hasClearButton: boolean;
5
5
  pickerRef: RefObject<HTMLElement>;
6
6
  activatorRef: RefObject<HTMLElement>;
7
+ plain?: boolean;
7
8
  }
8
9
  export declare const SelectElementsSlotRegistryProvider: import("react").FC<{
9
10
  children?: import("react").ReactNode | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"slots.js","sources":["src/internal/slots.ts"],"sourcesContent":["import { RefObject } from 'react';\n\nimport { createSlotRegistry } from '@hh.ru/magritte-internal-slot-registry';\n\ninterface SelectElementsSlots {\n hasApplyChangesButton: boolean;\n hasClearButton: boolean;\n pickerRef: RefObject<HTMLElement>;\n activatorRef: RefObject<HTMLElement>;\n}\n\n// наличие кнопок влияет на аттрибуты доступности в пикере\nexport const {\n SlotRegistryProvider: SelectElementsSlotRegistryProvider,\n useRegisterSlot: useRegisterSelectElementsSlot,\n useSlotRegistryValue: useSelectElementsValue,\n} = createSlotRegistry<SelectElementsSlots>('SelectElements');\n"],"names":[],"mappings":";;AAWA;MACa,EACT,oBAAoB,EAAE,kCAAkC,EACxD,eAAe,EAAE,6BAA6B,EAC9C,oBAAoB,EAAE,sBAAsB,GAC/C,GAAG,kBAAkB,CAAsB,gBAAgB;;;;"}
1
+ {"version":3,"file":"slots.js","sources":["src/internal/slots.ts"],"sourcesContent":["import { RefObject } from 'react';\n\nimport { createSlotRegistry } from '@hh.ru/magritte-internal-slot-registry';\n\ninterface SelectElementsSlots {\n hasApplyChangesButton: boolean;\n hasClearButton: boolean;\n pickerRef: RefObject<HTMLElement>;\n activatorRef: RefObject<HTMLElement>;\n plain?: boolean;\n}\n\n// наличие кнопок влияет на аттрибуты доступности в пикере\nexport const {\n SlotRegistryProvider: SelectElementsSlotRegistryProvider,\n useRegisterSlot: useRegisterSelectElementsSlot,\n useSlotRegistryValue: useSelectElementsValue,\n} = createSlotRegistry<SelectElementsSlots>('SelectElements');\n"],"names":[],"mappings":";;AAYA;MACa,EACT,oBAAoB,EAAE,kCAAkC,EACxD,eAAe,EAAE,6BAA6B,EAC9C,oBAAoB,EAAE,sBAAsB,GAC/C,GAAG,kBAAkB,CAAsB,gBAAgB;;;;"}
@@ -8,4 +8,5 @@ export declare const useSelectedLabels: <DataType extends StaticDataFetcherItem>
8
8
  export declare const value2Array: <MultipleType extends boolean, DataType extends StaticDataFetcherItem>(value: ValueTypeHelper<MultipleType, DataType> | undefined) => DataType[];
9
9
  export declare const extractValues: <DataType extends StaticDataFetcherItem>(items: readonly DataType[]) => string[];
10
10
  export declare const focusOptionsList: (event: SyntheticEvent, drop: HTMLElement | null | undefined, direction: "up" | "down") => void;
11
+ export declare const getChecked: <DataType extends StaticDataFetcherItem>(current: DataType, selected: readonly DataType[]) => boolean;
11
12
  export type DistributiveOmit<T, K extends PropertyKey> = T extends unknown ? Omit<T, K> : never;
package/internal/utils.js CHANGED
@@ -49,6 +49,7 @@ const focusOptionsList = (event, drop, direction) => {
49
49
  }
50
50
  }
51
51
  };
52
+ const getChecked = (current, selected) => !!selected.find((item) => item.value === current.value);
52
53
 
53
- export { assertSelectContext, extractValues, focusOptionsList, isArraysEquals, useEventCallback, useSelectedLabels, value2Array };
54
+ export { assertSelectContext, extractValues, focusOptionsList, getChecked, isArraysEquals, useEventCallback, useSelectedLabels, value2Array };
54
55
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sources":["src/internal/utils.ts"],"sourcesContent":["import { useRef, useCallback, useLayoutEffect, useMemo, SyntheticEvent } from 'react';\n\nimport { StaticDataFetcherItem } from '@hh.ru/magritte-common-data-provider';\nimport { findNextFocusableElement } from '@hh.ru/magritte-common-keyboard';\nimport { ValueTypeHelper } from '@hh.ru/magritte-ui-new-select/types';\n\n// не проверяет порядок и дубликаты\nexport const isArraysEquals = <T>(arrayA: T[], arrayB: T[]): boolean =>\n arrayA.length === arrayB.length && arrayA.every((item) => arrayB.includes(item));\n\n// убирает `null` с контекста и падает с внятной ошибкой\nexport const assertSelectContext = <T>(value: T | null, hookName: string): T => {\n if (value === null) {\n throw new Error(`${hookName} must be used within <Select>`);\n }\n return value;\n};\n\n// возвращает стабильную ссылку на колбэк (не вызывать в рендере)\nexport const useEventCallback = <Callback extends (...args: never[]) => unknown>(\n callback: Callback | undefined\n): Callback => {\n const callbackRef = useRef(callback);\n\n useLayoutEffect(() => {\n callbackRef.current = callback;\n });\n\n const stableCallback = useCallback((...args: Parameters<Callback>) => {\n return callbackRef.current?.(...args);\n }, []) as Callback;\n\n return stableCallback;\n};\n\n// placeholder в тригерах собирается одинаково\nexport const useSelectedLabels = <DataType extends StaticDataFetcherItem>(values: readonly DataType[]): string[] => {\n return useMemo(() => {\n return values.map((item) => item.text ?? item.value);\n }, [values]);\n};\n\n// single select работает с обьектом DataType, multiple с массивом\nexport const value2Array = <MultipleType extends boolean, DataType extends StaticDataFetcherItem>(\n value: ValueTypeHelper<MultipleType, DataType> | undefined\n): DataType[] => {\n if (!value) {\n return [];\n }\n return (Array.isArray(value) ? value : [value]) as DataType[];\n};\n\n// достает value из DataType на базе StaticDataFetcherItem\nexport const extractValues = <DataType extends StaticDataFetcherItem>(items: readonly DataType[]): string[] => {\n return items.map((item) => item.value);\n};\n\n// навигация по дропу\nexport const focusOptionsList = (\n event: SyntheticEvent,\n drop: HTMLElement | null | undefined,\n direction: 'up' | 'down'\n): void => {\n if (drop) {\n const nextFocusableElement = findNextFocusableElement(drop, null, direction, 'list');\n if (nextFocusableElement !== null) {\n event.preventDefault();\n nextFocusableElement.focus();\n }\n }\n};\n\n// применяет Omit к каждому варианту union-типа отдельно\nexport type DistributiveOmit<T, K extends PropertyKey> = T extends unknown ? Omit<T, K> : never;\n"],"names":[],"mappings":";;;AAMA;AACO,MAAM,cAAc,GAAG,CAAI,MAAW,EAAE,MAAW,KACtD,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;AAErF;MACa,mBAAmB,GAAG,CAAI,KAAe,EAAE,QAAgB,KAAO;AAC3E,IAAA,IAAI,KAAK,KAAK,IAAI,EAAE;AAChB,QAAA,MAAM,IAAI,KAAK,CAAC,GAAG,QAAQ,CAAA,6BAAA,CAA+B,CAAC,CAAC;KAC/D;AACD,IAAA,OAAO,KAAK,CAAC;AACjB,EAAE;AAEF;AACa,MAAA,gBAAgB,GAAG,CAC5B,QAA8B,KACpB;AACV,IAAA,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IAErC,eAAe,CAAC,MAAK;AACjB,QAAA,WAAW,CAAC,OAAO,GAAG,QAAQ,CAAC;AACnC,KAAC,CAAC,CAAC;IAEH,MAAM,cAAc,GAAG,WAAW,CAAC,CAAC,GAAG,IAA0B,KAAI;QACjE,OAAO,WAAW,CAAC,OAAO,GAAG,GAAG,IAAI,CAAC,CAAC;KACzC,EAAE,EAAE,CAAa,CAAC;AAEnB,IAAA,OAAO,cAAc,CAAC;AAC1B,EAAE;AAEF;AACa,MAAA,iBAAiB,GAAG,CAAyC,MAA2B,KAAc;IAC/G,OAAO,OAAO,CAAC,MAAK;AAChB,QAAA,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;AACzD,KAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;AACjB,EAAE;AAEF;AACa,MAAA,WAAW,GAAG,CACvB,KAA0D,KAC9C;IACZ,IAAI,CAAC,KAAK,EAAE;AACR,QAAA,OAAO,EAAE,CAAC;KACb;AACD,IAAA,QAAQ,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,CAAC,EAAgB;AAClE,EAAE;AAEF;AACa,MAAA,aAAa,GAAG,CAAyC,KAA0B,KAAc;AAC1G,IAAA,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC;AAC3C,EAAE;AAEF;AACa,MAAA,gBAAgB,GAAG,CAC5B,KAAqB,EACrB,IAAoC,EACpC,SAAwB,KAClB;IACN,IAAI,IAAI,EAAE;AACN,QAAA,MAAM,oBAAoB,GAAG,wBAAwB,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;AACrF,QAAA,IAAI,oBAAoB,KAAK,IAAI,EAAE;YAC/B,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,oBAAoB,CAAC,KAAK,EAAE,CAAC;SAChC;KACJ;AACL;;;;"}
1
+ {"version":3,"file":"utils.js","sources":["src/internal/utils.ts"],"sourcesContent":["import { useRef, useCallback, useLayoutEffect, useMemo, SyntheticEvent } from 'react';\n\nimport { StaticDataFetcherItem } from '@hh.ru/magritte-common-data-provider';\nimport { findNextFocusableElement } from '@hh.ru/magritte-common-keyboard';\nimport { ValueTypeHelper } from '@hh.ru/magritte-ui-new-select/types';\n\n// не проверяет порядок и дубликаты\nexport const isArraysEquals = <T>(arrayA: T[], arrayB: T[]): boolean =>\n arrayA.length === arrayB.length && arrayA.every((item) => arrayB.includes(item));\n\n// убирает `null` с контекста и падает с внятной ошибкой\nexport const assertSelectContext = <T>(value: T | null, hookName: string): T => {\n if (value === null) {\n throw new Error(`${hookName} must be used within <Select>`);\n }\n return value;\n};\n\n// возвращает стабильную ссылку на колбэк (не вызывать в рендере)\nexport const useEventCallback = <Callback extends (...args: never[]) => unknown>(\n callback: Callback | undefined\n): Callback => {\n const callbackRef = useRef(callback);\n\n useLayoutEffect(() => {\n callbackRef.current = callback;\n });\n\n const stableCallback = useCallback((...args: Parameters<Callback>) => {\n return callbackRef.current?.(...args);\n }, []) as Callback;\n\n return stableCallback;\n};\n\n// placeholder в тригерах собирается одинаково\nexport const useSelectedLabels = <DataType extends StaticDataFetcherItem>(values: readonly DataType[]): string[] => {\n return useMemo(() => {\n return values.map((item) => item.text ?? item.value);\n }, [values]);\n};\n\n// single select работает с обьектом DataType, multiple с массивом\nexport const value2Array = <MultipleType extends boolean, DataType extends StaticDataFetcherItem>(\n value: ValueTypeHelper<MultipleType, DataType> | undefined\n): DataType[] => {\n if (!value) {\n return [];\n }\n return (Array.isArray(value) ? value : [value]) as DataType[];\n};\n\n// достает value из DataType на базе StaticDataFetcherItem\nexport const extractValues = <DataType extends StaticDataFetcherItem>(items: readonly DataType[]): string[] => {\n return items.map((item) => item.value);\n};\n\n// навигация по дропу\nexport const focusOptionsList = (\n event: SyntheticEvent,\n drop: HTMLElement | null | undefined,\n direction: 'up' | 'down'\n): void => {\n if (drop) {\n const nextFocusableElement = findNextFocusableElement(drop, null, direction, 'list');\n if (nextFocusableElement !== null) {\n event.preventDefault();\n nextFocusableElement.focus();\n }\n }\n};\n\nexport const getChecked = <DataType extends StaticDataFetcherItem>(\n current: DataType,\n selected: readonly DataType[]\n): boolean => !!selected.find((item) => item.value === current.value);\n\n// применяет Omit к каждому варианту union-типа отдельно\nexport type DistributiveOmit<T, K extends PropertyKey> = T extends unknown ? Omit<T, K> : never;\n"],"names":[],"mappings":";;;AAMA;AACO,MAAM,cAAc,GAAG,CAAI,MAAW,EAAE,MAAW,KACtD,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;AAErF;MACa,mBAAmB,GAAG,CAAI,KAAe,EAAE,QAAgB,KAAO;AAC3E,IAAA,IAAI,KAAK,KAAK,IAAI,EAAE;AAChB,QAAA,MAAM,IAAI,KAAK,CAAC,GAAG,QAAQ,CAAA,6BAAA,CAA+B,CAAC,CAAC;KAC/D;AACD,IAAA,OAAO,KAAK,CAAC;AACjB,EAAE;AAEF;AACa,MAAA,gBAAgB,GAAG,CAC5B,QAA8B,KACpB;AACV,IAAA,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IAErC,eAAe,CAAC,MAAK;AACjB,QAAA,WAAW,CAAC,OAAO,GAAG,QAAQ,CAAC;AACnC,KAAC,CAAC,CAAC;IAEH,MAAM,cAAc,GAAG,WAAW,CAAC,CAAC,GAAG,IAA0B,KAAI;QACjE,OAAO,WAAW,CAAC,OAAO,GAAG,GAAG,IAAI,CAAC,CAAC;KACzC,EAAE,EAAE,CAAa,CAAC;AAEnB,IAAA,OAAO,cAAc,CAAC;AAC1B,EAAE;AAEF;AACa,MAAA,iBAAiB,GAAG,CAAyC,MAA2B,KAAc;IAC/G,OAAO,OAAO,CAAC,MAAK;AAChB,QAAA,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;AACzD,KAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;AACjB,EAAE;AAEF;AACa,MAAA,WAAW,GAAG,CACvB,KAA0D,KAC9C;IACZ,IAAI,CAAC,KAAK,EAAE;AACR,QAAA,OAAO,EAAE,CAAC;KACb;AACD,IAAA,QAAQ,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,CAAC,EAAgB;AAClE,EAAE;AAEF;AACa,MAAA,aAAa,GAAG,CAAyC,KAA0B,KAAc;AAC1G,IAAA,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC;AAC3C,EAAE;AAEF;AACa,MAAA,gBAAgB,GAAG,CAC5B,KAAqB,EACrB,IAAoC,EACpC,SAAwB,KAClB;IACN,IAAI,IAAI,EAAE;AACN,QAAA,MAAM,oBAAoB,GAAG,wBAAwB,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;AACrF,QAAA,IAAI,oBAAoB,KAAK,IAAI,EAAE;YAC/B,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,oBAAoB,CAAC,KAAK,EAAE,CAAC;SAChC;KACJ;AACL,EAAE;AAEK,MAAM,UAAU,GAAG,CACtB,OAAiB,EACjB,QAA6B,KACnB,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hh.ru/magritte-ui-new-select",
3
- "version": "1.1.1",
3
+ "version": "1.2.0",
4
4
  "main": "index.js",
5
5
  "types": "index.d.ts",
6
6
  "sideEffects": [
@@ -37,10 +37,13 @@
37
37
  "@hh.ru/magritte-ui-button": "7.2.17",
38
38
  "@hh.ru/magritte-ui-cell": "7.2.29",
39
39
  "@hh.ru/magritte-ui-checkable-card": "5.0.36",
40
- "@hh.ru/magritte-ui-drop": "12.3.35",
40
+ "@hh.ru/magritte-ui-checkbox-radio": "4.1.25",
41
+ "@hh.ru/magritte-ui-drop": "12.3.36",
42
+ "@hh.ru/magritte-ui-icon": "14.2.14",
41
43
  "@hh.ru/magritte-ui-input": "9.4.31",
42
44
  "@hh.ru/magritte-ui-title": "8.3.4",
43
- "@hh.ru/magritte-ui-trigger": "4.3.26"
45
+ "@hh.ru/magritte-ui-trigger": "4.3.26",
46
+ "@hh.ru/magritte-ui-typography": "5.3.7"
44
47
  },
45
- "gitHead": "dcac3032190e4bd234a2c49a73b17adc5b595fcb"
48
+ "gitHead": "d966658c6e1071eea19675fdd49638b09f224960"
46
49
  }
package/types.d.ts CHANGED
@@ -9,9 +9,6 @@ export type CommitModel = 'instant' | 'confirm';
9
9
  type ControlledTriggerKeys = 'expanded' | 'onBlur' | 'onChange' | 'onClear' | 'onFocus' | 'onKeyDown' | 'values';
10
10
  export type SelectUncontrolledTriggerProps = DistributiveOmit<TriggerProps, ControlledTriggerKeys>;
11
11
  export type SelectControlledTriggerProps = Pick<TriggerProps, ControlledTriggerKeys>;
12
- export interface OnChangeAction<DataType extends StaticDataFetcherItem> {
13
- (value: DataType, needToPut: boolean): void;
14
- }
15
12
  export interface OnOptionsChangeCallback<DataType extends StaticDataFetcherItem> {
16
13
  (options: SelectOption<DataType>[]): void;
17
14
  }
@@ -48,7 +45,6 @@ export interface SelectBaseProps<MultipleType extends boolean, DataType extends
48
45
  onFocus?: VoidFunction;
49
46
  /** Обработчик получения опций */
50
47
  onOptionsChange?: OnOptionsChangeCallback<DataType>;
51
- /** Обработчик события выбора option */
52
48
  /** Значение Select, для multiple — это массив */
53
49
  value?: ValueTypeHelper<MultipleType, DataType>;
54
50
  /** Флаг включения загрузки */