@bitrise/bitkit-v2 0.3.201 → 0.3.203
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/dist/components/BitkitCombobox/BitkitCombobox.d.ts +6 -4
- package/dist/components/BitkitCombobox/BitkitCombobox.js +13 -14
- package/dist/components/BitkitCombobox/BitkitCombobox.js.map +1 -1
- package/dist/components/BitkitMultiselect/BitkitMultiselect.d.ts +20 -0
- package/dist/components/BitkitMultiselect/BitkitMultiselect.js +183 -0
- package/dist/components/BitkitMultiselect/BitkitMultiselect.js.map +1 -0
- package/dist/components/BitkitMultiselectMenu/BitkitMultiselectMenu.d.ts +17 -0
- package/dist/components/BitkitMultiselectMenu/BitkitMultiselectMenu.js +66 -0
- package/dist/components/BitkitMultiselectMenu/BitkitMultiselectMenu.js.map +1 -0
- package/dist/components/BitkitNativeSelect/BitkitNativeSelect.js +1 -1
- package/dist/components/BitkitNativeSelect/BitkitNativeSelect.js.map +1 -1
- package/dist/components/BitkitSelect/BitkitSelect.d.ts +2 -3
- package/dist/components/BitkitSelect/BitkitSelect.js +12 -6
- package/dist/components/BitkitSelect/BitkitSelect.js.map +1 -1
- package/dist/components/BitkitSelectMenu/BitkitSelectMenu.d.ts +16 -7
- package/dist/components/BitkitSelectMenu/BitkitSelectMenu.js +63 -71
- package/dist/components/BitkitSelectMenu/BitkitSelectMenu.js.map +1 -1
- package/dist/components/BitkitSelectMenu/SelectMenuShell.d.ts +29 -0
- package/dist/components/BitkitSelectMenu/SelectMenuShell.js +115 -0
- package/dist/components/BitkitSelectMenu/SelectMenuShell.js.map +1 -0
- package/dist/components/index.d.ts +2 -0
- package/dist/main.js +5 -3
- package/dist/theme/common/ComboboxAndSelect.common.js +0 -7
- package/dist/theme/common/ComboboxAndSelect.common.js.map +1 -1
- package/dist/theme/slot-recipes/Combobox.recipe.d.ts +1 -1
- package/dist/theme/slot-recipes/Multiselect.recipe.d.ts +48 -0
- package/dist/theme/slot-recipes/Multiselect.recipe.js +150 -0
- package/dist/theme/slot-recipes/Multiselect.recipe.js.map +1 -0
- package/dist/theme/slot-recipes/SectionHeading.recipe.d.ts +1 -1
- package/dist/theme/slot-recipes/Select.recipe.js +191 -18
- package/dist/theme/slot-recipes/Select.recipe.js.map +1 -1
- package/dist/theme/slot-recipes/Sidebar.recipe.d.ts +1 -1
- package/dist/theme/slot-recipes/TagsInput.recipe.d.ts +1 -1
- package/dist/theme/slot-recipes/index.js +2 -0
- package/dist/theme/slot-recipes/index.js.map +1 -1
- package/dist/utilities/AssetSelectChevron.js +0 -1
- package/dist/utilities/AssetSelectChevron.js.map +1 -1
- package/package.json +1 -1
- package/dist/theme/slot-recipes/DatePickerSelect.recipe.d.ts +0 -27
- package/dist/theme/slot-recipes/Select.recipe.d.ts +0 -21
- package/dist/theme/slot-recipes/index.d.ts +0 -2044
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
import { ComboboxRootProps } from '@chakra-ui/react/combobox';
|
|
2
2
|
import { BitkitFieldProps } from '../BitkitField/BitkitField';
|
|
3
|
-
import {
|
|
3
|
+
import { BitkitSelectMenuCreateItemProps, BitkitSelectMenuEmptyStateProps, BitkitSelectMenuItemProps, BitkitSelectMenuSearchProps } from '../BitkitSelectMenu/BitkitSelectMenu';
|
|
4
4
|
export type BitkitComboboxProps = Omit<BitkitFieldProps, 'children' | 'state'> & {
|
|
5
|
-
comboboxProps?: ComboboxRootProps
|
|
6
|
-
|
|
5
|
+
comboboxProps?: Omit<ComboboxRootProps, 'collection' | 'defaultValue' | 'onValueChange' | 'value'>;
|
|
6
|
+
defaultValue?: string;
|
|
7
7
|
isLoading?: boolean;
|
|
8
8
|
items: Array<BitkitSelectMenuItemProps>;
|
|
9
|
+
onValueChange?: (newVal: string | undefined) => void;
|
|
9
10
|
placeholder?: string;
|
|
10
11
|
size?: 'md' | 'lg';
|
|
11
12
|
state?: 'disabled' | 'error' | 'readOnly' | 'warning';
|
|
12
|
-
|
|
13
|
+
value?: string;
|
|
14
|
+
} & BitkitSelectMenuCreateItemProps & BitkitSelectMenuSearchProps & BitkitSelectMenuEmptyStateProps;
|
|
13
15
|
declare const BitkitCombobox: import('react').ForwardRefExoticComponent<BitkitComboboxProps & import('react').RefAttributes<HTMLDivElement>>;
|
|
14
16
|
export default BitkitCombobox;
|
|
@@ -4,8 +4,6 @@ import IconWarningYellow from "../../icons/IconWarningYellow.js";
|
|
|
4
4
|
import BitkitCloseButton from "../BitkitCloseButton/BitkitCloseButton.js";
|
|
5
5
|
import BitkitSelectMenu from "../BitkitSelectMenu/BitkitSelectMenu.js";
|
|
6
6
|
import BitkitField from "../BitkitField/BitkitField.js";
|
|
7
|
-
import { useSlotRecipe } from "@chakra-ui/react/styled-system";
|
|
8
|
-
import { Text } from "@chakra-ui/react/text";
|
|
9
7
|
import { forwardRef } from "react";
|
|
10
8
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
11
9
|
import { Portal } from "@chakra-ui/react/portal";
|
|
@@ -14,13 +12,13 @@ import { useListCollection } from "@chakra-ui/react/hooks";
|
|
|
14
12
|
import { useFilter } from "@chakra-ui/react/locale";
|
|
15
13
|
//#region lib/components/BitkitCombobox/BitkitCombobox.tsx
|
|
16
14
|
var BitkitCombobox = forwardRef((props, ref) => {
|
|
17
|
-
const { comboboxProps,
|
|
15
|
+
const { comboboxProps, createItemLabel, defaultValue, emptyHelperText, emptyLabel, hasSearch, isLoading, items, onCreateItem, onSearchChange, onValueChange, placeholder = "Enter a value or select", searchValue, size, state, value, ...fieldProps } = props;
|
|
18
16
|
const { contains } = useFilter({ sensitivity: "base" });
|
|
19
17
|
const { collection, filter } = useListCollection({
|
|
20
18
|
initialItems: items,
|
|
21
|
-
filter: (_itemText, filterText, item) => contains(item.label, filterText)
|
|
19
|
+
filter: (_itemText, filterText, item) => contains(item.label, filterText),
|
|
20
|
+
isItemDisabled: (item) => !!item.disabled
|
|
22
21
|
});
|
|
23
|
-
const styles = useSlotRecipe({ key: "combobox" })({ size });
|
|
24
22
|
const hasWarning = state === "warning" || !!fieldProps.warningText;
|
|
25
23
|
const isInvalid = state === "error" || !!fieldProps.errorText;
|
|
26
24
|
const iconSize = size === "md" ? "16" : "24";
|
|
@@ -37,13 +35,17 @@ var BitkitCombobox = forwardRef((props, ref) => {
|
|
|
37
35
|
children: /* @__PURE__ */ jsxs(Combobox.Root, {
|
|
38
36
|
...comboboxProps,
|
|
39
37
|
collection,
|
|
38
|
+
defaultValue: defaultValue ? [defaultValue] : void 0,
|
|
40
39
|
disabled: state === "disabled",
|
|
41
40
|
invalid: isInvalid,
|
|
42
41
|
onInputValueChange: (e) => {
|
|
43
42
|
filter(e.inputValue);
|
|
44
43
|
},
|
|
44
|
+
onValueChange: (details) => onValueChange?.(details.value[0]),
|
|
45
45
|
readOnly: state === "readOnly",
|
|
46
|
+
scrollToIndexFn: ({ getElement }) => getElement()?.scrollIntoView({ block: "nearest" }),
|
|
46
47
|
size,
|
|
48
|
+
value: value ? [value] : void 0,
|
|
47
49
|
children: [/* @__PURE__ */ jsxs(Combobox.Control, {
|
|
48
50
|
className: "group",
|
|
49
51
|
children: [/* @__PURE__ */ jsx(Combobox.Input, { placeholder }), /* @__PURE__ */ jsxs(Combobox.IndicatorGroup, { children: [
|
|
@@ -57,24 +59,21 @@ var BitkitCombobox = forwardRef((props, ref) => {
|
|
|
57
59
|
children: /* @__PURE__ */ jsx(AssetSelectChevron, {})
|
|
58
60
|
})
|
|
59
61
|
] })]
|
|
60
|
-
}), /* @__PURE__ */ jsx(Portal, { children: /* @__PURE__ */ jsx(Combobox.Positioner, { children: /* @__PURE__ */
|
|
61
|
-
css: styles.emptyHelperText,
|
|
62
|
-
children: "Enter custom value"
|
|
63
|
-
})] }), /* @__PURE__ */ jsx(BitkitSelectMenu, {
|
|
62
|
+
}), /* @__PURE__ */ jsx(Portal, { children: /* @__PURE__ */ jsx(Combobox.Positioner, { children: /* @__PURE__ */ jsx(BitkitSelectMenu, {
|
|
64
63
|
collection,
|
|
65
|
-
createItemHref,
|
|
66
64
|
createItemLabel,
|
|
67
|
-
|
|
68
|
-
|
|
65
|
+
emptyHelperText,
|
|
66
|
+
emptyLabel,
|
|
69
67
|
isLoading,
|
|
70
68
|
onCreateItem,
|
|
71
69
|
size,
|
|
72
70
|
variant: "combobox",
|
|
73
71
|
...hasSearch ? {
|
|
74
72
|
hasSearch: true,
|
|
75
|
-
onSearchChange
|
|
73
|
+
onSearchChange,
|
|
74
|
+
searchValue
|
|
76
75
|
} : { hasSearch: false }
|
|
77
|
-
})
|
|
76
|
+
}) }) })]
|
|
78
77
|
})
|
|
79
78
|
});
|
|
80
79
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BitkitCombobox.js","names":[],"sources":["../../../lib/components/BitkitCombobox/BitkitCombobox.tsx"],"sourcesContent":["import { Combobox, type ComboboxRootProps } from '@chakra-ui/react/combobox';\nimport { useListCollection } from '@chakra-ui/react/hooks';\nimport { useFilter } from '@chakra-ui/react/locale';\nimport { Portal } from '@chakra-ui/react/portal';\nimport {
|
|
1
|
+
{"version":3,"file":"BitkitCombobox.js","names":[],"sources":["../../../lib/components/BitkitCombobox/BitkitCombobox.tsx"],"sourcesContent":["import { Combobox, type ComboboxRootProps } from '@chakra-ui/react/combobox';\nimport { useListCollection } from '@chakra-ui/react/hooks';\nimport { useFilter } from '@chakra-ui/react/locale';\nimport { Portal } from '@chakra-ui/react/portal';\nimport { forwardRef } from 'react';\n\nimport IconErrorCircleFilled from '../../icons/IconErrorCircleFilled';\nimport IconWarningYellow from '../../icons/IconWarningYellow';\nimport AssetSelectChevron from '../../utilities/AssetSelectChevron';\nimport BitkitCloseButton from '../BitkitCloseButton/BitkitCloseButton';\nimport BitkitField, { type BitkitFieldProps } from '../BitkitField/BitkitField';\nimport BitkitSelectMenu, {\n type BitkitSelectMenuCreateItemProps,\n type BitkitSelectMenuEmptyStateProps,\n type BitkitSelectMenuItemProps,\n type BitkitSelectMenuSearchProps,\n} from '../BitkitSelectMenu/BitkitSelectMenu';\n\nexport type BitkitComboboxProps = Omit<BitkitFieldProps, 'children' | 'state'> & {\n comboboxProps?: Omit<ComboboxRootProps, 'collection' | 'defaultValue' | 'onValueChange' | 'value'>;\n defaultValue?: string;\n isLoading?: boolean;\n items: Array<BitkitSelectMenuItemProps>;\n onValueChange?: (newVal: string | undefined) => void;\n placeholder?: string;\n size?: 'md' | 'lg';\n state?: 'disabled' | 'error' | 'readOnly' | 'warning';\n value?: string;\n} & BitkitSelectMenuCreateItemProps &\n BitkitSelectMenuSearchProps &\n BitkitSelectMenuEmptyStateProps;\n\nconst BitkitCombobox = forwardRef<HTMLDivElement, BitkitComboboxProps>((props: BitkitComboboxProps, ref) => {\n const {\n comboboxProps,\n createItemLabel,\n defaultValue,\n emptyHelperText,\n emptyLabel,\n hasSearch,\n isLoading,\n items,\n onCreateItem,\n onSearchChange,\n onValueChange,\n placeholder = 'Enter a value or select',\n searchValue,\n size,\n state,\n value,\n ...fieldProps\n } = props;\n\n const { contains } = useFilter({ sensitivity: 'base' });\n const { collection, filter } = useListCollection<BitkitSelectMenuItemProps>({\n initialItems: items,\n filter: (_itemText, filterText, item) => contains(item.label, filterText),\n isItemDisabled: (item) => !!item.disabled,\n });\n\n const hasWarning = state === 'warning' || !!fieldProps.warningText;\n const isInvalid = state === 'error' || !!fieldProps.errorText;\n const iconSize = size === 'md' ? '16' : '24';\n\n let statusIcon;\n if (isInvalid) {\n statusIcon = <IconErrorCircleFilled size={iconSize} color=\"icon/negative\" />;\n } else if (hasWarning) {\n statusIcon = <IconWarningYellow size={iconSize} />;\n }\n\n return (\n <BitkitField ref={ref} state={state} {...fieldProps}>\n <Combobox.Root\n {...comboboxProps}\n collection={collection}\n defaultValue={defaultValue ? [defaultValue] : undefined}\n disabled={state === 'disabled'}\n invalid={isInvalid}\n onInputValueChange={(e) => {\n filter(e.inputValue);\n }}\n onValueChange={(details) => onValueChange?.(details.value[0])}\n readOnly={state === 'readOnly'}\n // Bypass Zag's isScrollable(contentEl) gate — our Content is overflow:hidden flex\n // column, so the real scroll container is itemList. See BitkitMultiselect for why.\n scrollToIndexFn={({ getElement }) => getElement()?.scrollIntoView({ block: 'nearest' })}\n size={size}\n value={value ? [value] : undefined}\n >\n <Combobox.Control className=\"group\">\n <Combobox.Input placeholder={placeholder} />\n <Combobox.IndicatorGroup>\n <Combobox.ClearTrigger asChild>\n <BitkitCloseButton size=\"sm\" />\n </Combobox.ClearTrigger>\n {statusIcon}\n <Combobox.Trigger asChild>\n <AssetSelectChevron />\n </Combobox.Trigger>\n </Combobox.IndicatorGroup>\n </Combobox.Control>\n <Portal>\n <Combobox.Positioner>\n <BitkitSelectMenu\n collection={collection}\n createItemLabel={createItemLabel}\n emptyHelperText={emptyHelperText}\n emptyLabel={emptyLabel}\n isLoading={isLoading}\n onCreateItem={onCreateItem}\n size={size}\n variant=\"combobox\"\n {...(hasSearch\n ? { hasSearch: true as const, onSearchChange, searchValue }\n : { hasSearch: false as const })}\n />\n </Combobox.Positioner>\n </Portal>\n </Combobox.Root>\n </BitkitField>\n );\n});\n\nBitkitCombobox.displayName = 'BitkitCombobox';\n\nexport default BitkitCombobox;\n"],"mappings":";;;;;;;;;;;;;AAgCA,IAAM,iBAAiB,YAAiD,OAA4B,QAAQ;CAC1G,MAAM,EACJ,eACA,iBACA,cACA,iBACA,YACA,WACA,WACA,OACA,cACA,gBACA,eACA,cAAc,2BACd,aACA,MACA,OACA,OACA,GAAG,eACD;CAEJ,MAAM,EAAE,aAAa,UAAU,EAAE,aAAa,QAAQ,CAAC;CACvD,MAAM,EAAE,YAAY,WAAW,kBAA6C;EAC1E,cAAc;EACd,SAAS,WAAW,YAAY,SAAS,SAAS,KAAK,OAAO,WAAW;EACzE,iBAAiB,SAAS,CAAC,CAAC,KAAK;EAClC,CAAC;CAEF,MAAM,aAAa,UAAU,aAAa,CAAC,CAAC,WAAW;CACvD,MAAM,YAAY,UAAU,WAAW,CAAC,CAAC,WAAW;CACpD,MAAM,WAAW,SAAS,OAAO,OAAO;CAExC,IAAI;AACJ,KAAI,UACF,cAAa,oBAAC,uBAAD;EAAuB,MAAM;EAAU,OAAM;EAAkB,CAAA;UACnE,WACT,cAAa,oBAAC,mBAAD,EAAmB,MAAM,UAAY,CAAA;AAGpD,QACE,oBAAC,aAAD;EAAkB;EAAY;EAAO,GAAI;YACvC,qBAAC,SAAS,MAAV;GACE,GAAI;GACQ;GACZ,cAAc,eAAe,CAAC,aAAa,GAAG,KAAA;GAC9C,UAAU,UAAU;GACpB,SAAS;GACT,qBAAqB,MAAM;AACzB,WAAO,EAAE,WAAW;;GAEtB,gBAAgB,YAAY,gBAAgB,QAAQ,MAAM,GAAG;GAC7D,UAAU,UAAU;GAGpB,kBAAkB,EAAE,iBAAiB,YAAY,EAAE,eAAe,EAAE,OAAO,WAAW,CAAC;GACjF;GACN,OAAO,QAAQ,CAAC,MAAM,GAAG,KAAA;aAf3B,CAiBE,qBAAC,SAAS,SAAV;IAAkB,WAAU;cAA5B,CACE,oBAAC,SAAS,OAAV,EAA6B,aAAe,CAAA,EAC5C,qBAAC,SAAS,gBAAV,EAAA,UAAA;KACE,oBAAC,SAAS,cAAV;MAAuB,SAAA;gBACrB,oBAAC,mBAAD,EAAmB,MAAK,MAAO,CAAA;MACT,CAAA;KACvB;KACD,oBAAC,SAAS,SAAV;MAAkB,SAAA;gBAChB,oBAAC,oBAAD,EAAsB,CAAA;MACL,CAAA;KACK,EAAA,CAAA,CACT;OACnB,oBAAC,QAAD,EAAA,UACE,oBAAC,SAAS,YAAV,EAAA,UACE,oBAAC,kBAAD;IACc;IACK;IACA;IACL;IACD;IACG;IACR;IACN,SAAQ;IACR,GAAK,YACD;KAAE,WAAW;KAAe;KAAgB;KAAa,GACzD,EAAE,WAAW,OAAgB;IACjC,CAAA,EACkB,CAAA,EACf,CAAA,CACK;;EACJ,CAAA;EAEhB;AAEF,eAAe,cAAc"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { SelectRootProps, SelectTriggerProps } from '@chakra-ui/react/select';
|
|
2
|
+
import { BitkitFieldProps } from '../BitkitField/BitkitField';
|
|
3
|
+
import { BitkitMultiselectMenuItemProps } from '../BitkitMultiselectMenu/BitkitMultiselectMenu';
|
|
4
|
+
import { BitkitSelectMenuCreateItemProps, BitkitSelectMenuEmptyStateProps, BitkitSelectMenuSearchProps } from '../BitkitSelectMenu/BitkitSelectMenu';
|
|
5
|
+
export type BitkitMultiselectTriggerProps = SelectTriggerProps;
|
|
6
|
+
export type BitkitMultiselectProps = Omit<BitkitFieldProps, 'children' | 'state'> & {
|
|
7
|
+
constrained?: boolean;
|
|
8
|
+
defaultValue?: Array<string>;
|
|
9
|
+
isLoading?: boolean;
|
|
10
|
+
items: Array<BitkitMultiselectMenuItemProps>;
|
|
11
|
+
onValueChange?: (newVal: Array<string>) => void;
|
|
12
|
+
placeholder?: string;
|
|
13
|
+
selectProps?: Omit<SelectRootProps, 'collection' | 'defaultValue' | 'multiple' | 'onValueChange' | 'value'>;
|
|
14
|
+
size?: 'md' | 'lg';
|
|
15
|
+
state?: 'disabled' | 'error' | 'readOnly' | 'warning';
|
|
16
|
+
triggerProps?: BitkitMultiselectTriggerProps;
|
|
17
|
+
value?: Array<string>;
|
|
18
|
+
} & BitkitSelectMenuCreateItemProps & BitkitSelectMenuSearchProps & BitkitSelectMenuEmptyStateProps;
|
|
19
|
+
declare const BitkitMultiselect: import('react').ForwardRefExoticComponent<BitkitMultiselectProps & import('react').RefAttributes<HTMLDivElement>>;
|
|
20
|
+
export default BitkitMultiselect;
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import AssetSelectChevron from "../../utilities/AssetSelectChevron.js";
|
|
2
|
+
import IconErrorCircleFilled from "../../icons/IconErrorCircleFilled.js";
|
|
3
|
+
import IconWarningYellow from "../../icons/IconWarningYellow.js";
|
|
4
|
+
import BitkitCloseButton from "../BitkitCloseButton/BitkitCloseButton.js";
|
|
5
|
+
import BitkitField from "../BitkitField/BitkitField.js";
|
|
6
|
+
import BitkitMultiselectMenu from "../BitkitMultiselectMenu/BitkitMultiselectMenu.js";
|
|
7
|
+
import BitkitTag from "../BitkitTag/BitkitTag.js";
|
|
8
|
+
import { Box } from "@chakra-ui/react/box";
|
|
9
|
+
import { useSlotRecipe } from "@chakra-ui/react/styled-system";
|
|
10
|
+
import { Text } from "@chakra-ui/react/text";
|
|
11
|
+
import { forwardRef } from "react";
|
|
12
|
+
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
13
|
+
import { Portal } from "@chakra-ui/react/portal";
|
|
14
|
+
import { createListCollection } from "@chakra-ui/react/collection";
|
|
15
|
+
import { Select, useSelectContext } from "@chakra-ui/react/select";
|
|
16
|
+
//#region lib/components/BitkitMultiselect/BitkitMultiselect.tsx
|
|
17
|
+
var NON_INTERACTIVE_STATES = [
|
|
18
|
+
"disabled",
|
|
19
|
+
"readOnly",
|
|
20
|
+
"error",
|
|
21
|
+
"warning"
|
|
22
|
+
];
|
|
23
|
+
/** Whether the clear-all button should be rendered (and the overlay should reserve extra room for it). */
|
|
24
|
+
var shouldShowClearButton = (constrained, selectionCount, state) => !constrained && selectionCount > 0 && !NON_INTERACTIVE_STATES.includes(state);
|
|
25
|
+
var MultiselectOverlay = ({ constrained, placeholder, size, state }) => {
|
|
26
|
+
const select = useSelectContext();
|
|
27
|
+
const styles = useSlotRecipe({ key: "multiselect" })({
|
|
28
|
+
constrained,
|
|
29
|
+
size
|
|
30
|
+
});
|
|
31
|
+
const selectedItems = select.selectedItems;
|
|
32
|
+
const selectedValues = select.value;
|
|
33
|
+
const isDisabled = state === "disabled";
|
|
34
|
+
const isReadOnly = state === "readOnly";
|
|
35
|
+
const tagState = isDisabled ? "disabled" : void 0;
|
|
36
|
+
const overlayPaddingEnd = shouldShowClearButton(constrained, selectedValues.length, state) ? "96" : "48";
|
|
37
|
+
const resolvedPlaceholder = placeholder ?? (isReadOnly ? "(not selected)" : "Select options");
|
|
38
|
+
const canRemove = !isDisabled && !isReadOnly;
|
|
39
|
+
const hasSelection = selectedValues.length > 0;
|
|
40
|
+
const renderTags = () => {
|
|
41
|
+
if (constrained) return /* @__PURE__ */ jsxs(Fragment$1, { children: [hasSelection && /* @__PURE__ */ jsx(TagSlot, { children: /* @__PURE__ */ jsx(BitkitTag, {
|
|
42
|
+
size: "sm",
|
|
43
|
+
colorPalette: "neutral",
|
|
44
|
+
labelText: String(selectedValues.length),
|
|
45
|
+
state: tagState,
|
|
46
|
+
onRemove: canRemove ? () => select.clearValue() : void 0
|
|
47
|
+
}) }), /* @__PURE__ */ jsx(Text, {
|
|
48
|
+
as: "span",
|
|
49
|
+
css: styles.placeholderText,
|
|
50
|
+
"data-placeholder": hasSelection ? void 0 : "",
|
|
51
|
+
children: resolvedPlaceholder
|
|
52
|
+
})] });
|
|
53
|
+
if (selectedItems.length === 0) return /* @__PURE__ */ jsx(Text, {
|
|
54
|
+
as: "span",
|
|
55
|
+
css: styles.placeholderText,
|
|
56
|
+
"data-placeholder": "",
|
|
57
|
+
children: resolvedPlaceholder
|
|
58
|
+
});
|
|
59
|
+
return selectedItems.map((item) => /* @__PURE__ */ jsx(TagSlot, { children: /* @__PURE__ */ jsx(BitkitTag, {
|
|
60
|
+
size: "sm",
|
|
61
|
+
colorPalette: "neutral",
|
|
62
|
+
labelText: item.label,
|
|
63
|
+
state: tagState,
|
|
64
|
+
onRemove: canRemove ? () => select.setValue(selectedValues.filter((v) => v !== item.value)) : void 0
|
|
65
|
+
}) }, item.value));
|
|
66
|
+
};
|
|
67
|
+
return /* @__PURE__ */ jsx(Box, {
|
|
68
|
+
css: styles.overlay,
|
|
69
|
+
pointerEvents: "none",
|
|
70
|
+
paddingInlineEnd: overlayPaddingEnd,
|
|
71
|
+
children: /* @__PURE__ */ jsx(Box, {
|
|
72
|
+
css: styles.tagsBlock,
|
|
73
|
+
children: renderTags()
|
|
74
|
+
})
|
|
75
|
+
});
|
|
76
|
+
};
|
|
77
|
+
var TagSlot = ({ children }) => /* @__PURE__ */ jsx(Box, {
|
|
78
|
+
"data-slot": "tag",
|
|
79
|
+
display: "inline-flex",
|
|
80
|
+
pointerEvents: "auto",
|
|
81
|
+
children
|
|
82
|
+
});
|
|
83
|
+
var ClearAllButton = ({ state }) => {
|
|
84
|
+
const select = useSelectContext();
|
|
85
|
+
if (!shouldShowClearButton(false, select.value.length, state)) return null;
|
|
86
|
+
return /* @__PURE__ */ jsx(BitkitCloseButton, {
|
|
87
|
+
size: "sm",
|
|
88
|
+
colorPalette: "neutral",
|
|
89
|
+
"aria-label": "Clear all",
|
|
90
|
+
onClick: () => select.clearValue()
|
|
91
|
+
});
|
|
92
|
+
};
|
|
93
|
+
var BitkitMultiselect = forwardRef((props, ref) => {
|
|
94
|
+
const { constrained = false, createItemLabel, defaultValue, emptyHelperText, emptyLabel, hasSearch, isLoading, items, onCreateItem, onSearchChange, onValueChange, placeholder, searchValue, selectProps, size = "lg", state, triggerProps, value, ...fieldProps } = props;
|
|
95
|
+
const collection = createListCollection({
|
|
96
|
+
items,
|
|
97
|
+
groupBy: (item) => item.group || "",
|
|
98
|
+
isItemDisabled: (item) => !!item.disabled
|
|
99
|
+
});
|
|
100
|
+
const styles = useSlotRecipe({ key: "multiselect" })({
|
|
101
|
+
constrained,
|
|
102
|
+
size
|
|
103
|
+
});
|
|
104
|
+
const iconSize = size === "lg" ? "24" : "16";
|
|
105
|
+
const isInvalid = state === "error" || !!fieldProps.errorText;
|
|
106
|
+
return /* @__PURE__ */ jsx(BitkitField, {
|
|
107
|
+
ref,
|
|
108
|
+
state,
|
|
109
|
+
...fieldProps,
|
|
110
|
+
children: /* @__PURE__ */ jsxs(Select.Root, {
|
|
111
|
+
collection,
|
|
112
|
+
multiple: true,
|
|
113
|
+
...selectProps,
|
|
114
|
+
defaultValue,
|
|
115
|
+
disabled: state === "disabled",
|
|
116
|
+
invalid: isInvalid,
|
|
117
|
+
onValueChange: (details) => onValueChange?.(details.value),
|
|
118
|
+
readOnly: state === "readOnly",
|
|
119
|
+
scrollToIndexFn: ({ getElement }) => getElement()?.scrollIntoView({ block: "nearest" }),
|
|
120
|
+
value,
|
|
121
|
+
children: [
|
|
122
|
+
/* @__PURE__ */ jsx(Select.HiddenSelect, {}),
|
|
123
|
+
/* @__PURE__ */ jsxs(Select.Control, {
|
|
124
|
+
css: styles.control,
|
|
125
|
+
className: "group",
|
|
126
|
+
children: [
|
|
127
|
+
/* @__PURE__ */ jsx(Select.Trigger, {
|
|
128
|
+
css: styles.trigger,
|
|
129
|
+
...triggerProps
|
|
130
|
+
}),
|
|
131
|
+
/* @__PURE__ */ jsx(MultiselectOverlay, {
|
|
132
|
+
constrained,
|
|
133
|
+
placeholder,
|
|
134
|
+
size,
|
|
135
|
+
state
|
|
136
|
+
}),
|
|
137
|
+
/* @__PURE__ */ jsxs(Select.IndicatorGroup, {
|
|
138
|
+
css: styles.indicatorGroup,
|
|
139
|
+
children: [
|
|
140
|
+
!constrained && /* @__PURE__ */ jsx(ClearAllButton, { state }),
|
|
141
|
+
state === "error" && /* @__PURE__ */ jsx(Select.Indicator, {
|
|
142
|
+
css: styles.indicator,
|
|
143
|
+
children: /* @__PURE__ */ jsx(IconErrorCircleFilled, {
|
|
144
|
+
size: iconSize,
|
|
145
|
+
color: "icon/negative"
|
|
146
|
+
})
|
|
147
|
+
}),
|
|
148
|
+
state === "warning" && /* @__PURE__ */ jsx(Select.Indicator, {
|
|
149
|
+
css: styles.indicator,
|
|
150
|
+
children: /* @__PURE__ */ jsx(IconWarningYellow, { size: iconSize })
|
|
151
|
+
}),
|
|
152
|
+
/* @__PURE__ */ jsx(Select.Indicator, {
|
|
153
|
+
css: styles.indicator,
|
|
154
|
+
asChild: true,
|
|
155
|
+
children: /* @__PURE__ */ jsx(AssetSelectChevron, {})
|
|
156
|
+
})
|
|
157
|
+
]
|
|
158
|
+
})
|
|
159
|
+
]
|
|
160
|
+
}),
|
|
161
|
+
/* @__PURE__ */ jsx(Portal, { children: /* @__PURE__ */ jsx(Select.Positioner, { children: /* @__PURE__ */ jsx(BitkitMultiselectMenu, {
|
|
162
|
+
collection,
|
|
163
|
+
createItemLabel,
|
|
164
|
+
emptyHelperText,
|
|
165
|
+
emptyLabel,
|
|
166
|
+
isLoading,
|
|
167
|
+
onCreateItem,
|
|
168
|
+
...hasSearch ? {
|
|
169
|
+
hasSearch: true,
|
|
170
|
+
onSearchChange,
|
|
171
|
+
searchValue
|
|
172
|
+
} : { hasSearch: false },
|
|
173
|
+
size
|
|
174
|
+
}) }) })
|
|
175
|
+
]
|
|
176
|
+
})
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
BitkitMultiselect.displayName = "BitkitMultiselect";
|
|
180
|
+
//#endregion
|
|
181
|
+
export { BitkitMultiselect as default };
|
|
182
|
+
|
|
183
|
+
//# sourceMappingURL=BitkitMultiselect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BitkitMultiselect.js","names":[],"sources":["../../../lib/components/BitkitMultiselect/BitkitMultiselect.tsx"],"sourcesContent":["import { Box } from '@chakra-ui/react/box';\nimport { createListCollection } from '@chakra-ui/react/collection';\nimport { Portal } from '@chakra-ui/react/portal';\nimport { Select, type SelectRootProps, type SelectTriggerProps, useSelectContext } from '@chakra-ui/react/select';\nimport { useSlotRecipe } from '@chakra-ui/react/styled-system';\nimport { Text } from '@chakra-ui/react/text';\nimport { forwardRef, type ReactNode } from 'react';\n\nimport { IconErrorCircleFilled, IconWarningYellow } from '../../icons';\nimport AssetSelectChevron from '../../utilities/AssetSelectChevron';\nimport BitkitCloseButton from '../BitkitCloseButton/BitkitCloseButton';\nimport BitkitField, { type BitkitFieldProps } from '../BitkitField/BitkitField';\nimport BitkitMultiselectMenu, {\n type BitkitMultiselectMenuItemProps,\n} from '../BitkitMultiselectMenu/BitkitMultiselectMenu';\nimport {\n type BitkitSelectMenuCreateItemProps,\n type BitkitSelectMenuEmptyStateProps,\n type BitkitSelectMenuSearchProps,\n} from '../BitkitSelectMenu/BitkitSelectMenu';\nimport BitkitTag from '../BitkitTag/BitkitTag';\n\nexport type BitkitMultiselectTriggerProps = SelectTriggerProps;\n\nexport type BitkitMultiselectProps = Omit<BitkitFieldProps, 'children' | 'state'> & {\n constrained?: boolean;\n defaultValue?: Array<string>;\n isLoading?: boolean;\n items: Array<BitkitMultiselectMenuItemProps>;\n onValueChange?: (newVal: Array<string>) => void;\n placeholder?: string;\n selectProps?: Omit<SelectRootProps, 'collection' | 'defaultValue' | 'multiple' | 'onValueChange' | 'value'>;\n size?: 'md' | 'lg';\n state?: 'disabled' | 'error' | 'readOnly' | 'warning';\n triggerProps?: BitkitMultiselectTriggerProps;\n value?: Array<string>;\n} & BitkitSelectMenuCreateItemProps &\n BitkitSelectMenuSearchProps &\n BitkitSelectMenuEmptyStateProps;\n\ntype MultiselectState = BitkitMultiselectProps['state'];\n\nconst NON_INTERACTIVE_STATES: ReadonlyArray<MultiselectState> = ['disabled', 'readOnly', 'error', 'warning'];\n\n/** Whether the clear-all button should be rendered (and the overlay should reserve extra room for it). */\nconst shouldShowClearButton = (constrained: boolean, selectionCount: number, state: MultiselectState): boolean =>\n !constrained && selectionCount > 0 && !NON_INTERACTIVE_STATES.includes(state);\n\ntype MultiselectOverlayProps = {\n constrained: boolean;\n placeholder?: string;\n size: 'md' | 'lg';\n state?: MultiselectState;\n};\n\nconst MultiselectOverlay = ({ constrained, placeholder, size, state }: MultiselectOverlayProps) => {\n const select = useSelectContext();\n const recipe = useSlotRecipe({ key: 'multiselect' });\n const styles = recipe({ constrained, size });\n\n const selectedItems = select.selectedItems as Array<BitkitMultiselectMenuItemProps>;\n const selectedValues = select.value;\n const isDisabled = state === 'disabled';\n const isReadOnly = state === 'readOnly';\n const tagState = isDisabled ? 'disabled' : undefined;\n // Overlay reserves ~96px on the right when the clear-all is visible (to keep the chevron +\n // clear button out of the tag row), otherwise ~48px (chevron only). Using spacing tokens\n // because '80' (the minimum that fits both icons with gaps) isn't a valid token; '96' is\n // the next one up.\n const overlayPaddingEnd = shouldShowClearButton(constrained, selectedValues.length, state) ? '96' : '48';\n\n const resolvedPlaceholder = placeholder ?? (isReadOnly ? '(not selected)' : 'Select options');\n const canRemove = !isDisabled && !isReadOnly;\n\n const hasSelection = selectedValues.length > 0;\n\n const renderTags = () => {\n if (constrained) {\n return (\n <>\n {hasSelection && (\n <TagSlot>\n <BitkitTag\n size=\"sm\"\n colorPalette=\"neutral\"\n labelText={String(selectedValues.length)}\n state={tagState}\n onRemove={canRemove ? () => select.clearValue() : undefined}\n />\n </TagSlot>\n )}\n <Text as=\"span\" css={styles.placeholderText} data-placeholder={hasSelection ? undefined : ''}>\n {resolvedPlaceholder}\n </Text>\n </>\n );\n }\n\n if (selectedItems.length === 0) {\n return (\n <Text as=\"span\" css={styles.placeholderText} data-placeholder=\"\">\n {resolvedPlaceholder}\n </Text>\n );\n }\n\n return selectedItems.map((item) => (\n <TagSlot key={item.value}>\n <BitkitTag\n size=\"sm\"\n colorPalette=\"neutral\"\n labelText={item.label}\n state={tagState}\n onRemove={canRemove ? () => select.setValue(selectedValues.filter((v) => v !== item.value)) : undefined}\n />\n </TagSlot>\n ));\n };\n\n return (\n <Box css={styles.overlay} pointerEvents=\"none\" paddingInlineEnd={overlayPaddingEnd}>\n <Box css={styles.tagsBlock}>{renderTags()}</Box>\n </Box>\n );\n};\n\nconst TagSlot = ({ children }: { children: ReactNode }) => (\n <Box data-slot=\"tag\" display=\"inline-flex\" pointerEvents=\"auto\">\n {children}\n </Box>\n);\n\ntype ClearAllButtonProps = {\n state?: MultiselectState;\n};\n\nconst ClearAllButton = ({ state }: ClearAllButtonProps) => {\n const select = useSelectContext();\n\n // Constrained mode has its own inline clear-all on the counter tag; this is the non-constrained trigger-level clear.\n if (!shouldShowClearButton(false, select.value.length, state)) return null;\n\n return (\n <BitkitCloseButton size=\"sm\" colorPalette=\"neutral\" aria-label=\"Clear all\" onClick={() => select.clearValue()} />\n );\n};\n\nconst BitkitMultiselect = forwardRef<HTMLDivElement, BitkitMultiselectProps>((props, ref) => {\n const {\n constrained = false,\n createItemLabel,\n defaultValue,\n emptyHelperText,\n emptyLabel,\n hasSearch,\n isLoading,\n items,\n onCreateItem,\n onSearchChange,\n onValueChange,\n placeholder,\n searchValue,\n selectProps,\n size = 'lg',\n state,\n triggerProps,\n value,\n ...fieldProps\n } = props;\n\n const collection = createListCollection({\n items,\n groupBy: (item) => item.group || '',\n isItemDisabled: (item) => !!item.disabled,\n });\n\n const recipe = useSlotRecipe({ key: 'multiselect' });\n const styles = recipe({ constrained, size });\n\n const iconSize = size === 'lg' ? '24' : '16';\n const isInvalid = state === 'error' || !!fieldProps.errorText;\n\n return (\n <BitkitField ref={ref} state={state} {...fieldProps}>\n <Select.Root\n collection={collection}\n multiple\n {...selectProps}\n defaultValue={defaultValue}\n disabled={state === 'disabled'}\n invalid={isInvalid}\n onValueChange={(details) => onValueChange?.(details.value)}\n readOnly={state === 'readOnly'}\n // Zag's default scrollIntoView gates on `isScrollable(contentEl)`. Our content is\n // overflow:hidden + flex column (so the sticky-bottom create row stays visible while\n // the inner itemList Box scrolls). That gate fails, so keyboard highlight never\n // scrolls the items into view. Providing scrollToIndexFn bypasses the gate and lets\n // the browser's native scrollIntoView walk up to the real scroll container (itemList).\n scrollToIndexFn={({ getElement }) => getElement()?.scrollIntoView({ block: 'nearest' })}\n value={value}\n >\n <Select.HiddenSelect />\n <Select.Control css={styles.control} className=\"group\">\n <Select.Trigger css={styles.trigger} {...triggerProps} />\n <MultiselectOverlay constrained={constrained} placeholder={placeholder} size={size} state={state} />\n <Select.IndicatorGroup css={styles.indicatorGroup}>\n {!constrained && <ClearAllButton state={state} />}\n {state === 'error' && (\n <Select.Indicator css={styles.indicator}>\n <IconErrorCircleFilled size={iconSize} color=\"icon/negative\" />\n </Select.Indicator>\n )}\n {state === 'warning' && (\n <Select.Indicator css={styles.indicator}>\n <IconWarningYellow size={iconSize} />\n </Select.Indicator>\n )}\n <Select.Indicator css={styles.indicator} asChild>\n <AssetSelectChevron />\n </Select.Indicator>\n </Select.IndicatorGroup>\n </Select.Control>\n <Portal>\n <Select.Positioner>\n <BitkitMultiselectMenu\n collection={collection}\n createItemLabel={createItemLabel}\n emptyHelperText={emptyHelperText}\n emptyLabel={emptyLabel}\n isLoading={isLoading}\n onCreateItem={onCreateItem}\n {...(hasSearch\n ? { hasSearch: true as const, onSearchChange, searchValue }\n : { hasSearch: false as const })}\n size={size}\n />\n </Select.Positioner>\n </Portal>\n </Select.Root>\n </BitkitField>\n );\n});\n\nBitkitMultiselect.displayName = 'BitkitMultiselect';\n\nexport default BitkitMultiselect;\n"],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { ListCollection } from '@chakra-ui/react/collection';
|
|
2
|
+
import { BitkitSelectMenuCreateItemProps, BitkitSelectMenuEmptyStateProps, BitkitSelectMenuSearchProps } from '../BitkitSelectMenu/BitkitSelectMenu';
|
|
3
|
+
export type BitkitMultiselectMenuItemProps = {
|
|
4
|
+
value: string;
|
|
5
|
+
label: string;
|
|
6
|
+
group?: string;
|
|
7
|
+
helperText?: string;
|
|
8
|
+
disabled?: boolean;
|
|
9
|
+
loading?: boolean;
|
|
10
|
+
};
|
|
11
|
+
export type BitkitMultiselectMenuProps = {
|
|
12
|
+
collection: ListCollection<BitkitMultiselectMenuItemProps>;
|
|
13
|
+
isLoading?: boolean;
|
|
14
|
+
size?: 'md' | 'lg';
|
|
15
|
+
} & BitkitSelectMenuCreateItemProps & BitkitSelectMenuSearchProps & BitkitSelectMenuEmptyStateProps;
|
|
16
|
+
declare const BitkitMultiselectMenu: import('react').ForwardRefExoticComponent<BitkitMultiselectMenuProps & import('react').RefAttributes<HTMLDivElement>>;
|
|
17
|
+
export default BitkitMultiselectMenu;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import IconCheck from "../../icons/IconCheck.js";
|
|
2
|
+
import { SelectMenuShell } from "../BitkitSelectMenu/SelectMenuShell.js";
|
|
3
|
+
import { Box } from "@chakra-ui/react/box";
|
|
4
|
+
import { useSlotRecipe } from "@chakra-ui/react/styled-system";
|
|
5
|
+
import { Text } from "@chakra-ui/react/text";
|
|
6
|
+
import { forwardRef } from "react";
|
|
7
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
8
|
+
import { Spinner } from "@chakra-ui/react/spinner";
|
|
9
|
+
import { Select } from "@chakra-ui/react/select";
|
|
10
|
+
//#region lib/components/BitkitMultiselectMenu/BitkitMultiselectMenu.tsx
|
|
11
|
+
var BitkitMultiselectMenu = forwardRef((props, ref) => {
|
|
12
|
+
const { collection, size, ...shellProps } = props;
|
|
13
|
+
const styles = useSlotRecipe({ key: "select" })({ size });
|
|
14
|
+
return /* @__PURE__ */ jsx(SelectMenuShell, {
|
|
15
|
+
NS: Select,
|
|
16
|
+
collection,
|
|
17
|
+
contentRef: ref,
|
|
18
|
+
iconSize: size === "md" ? "16" : "24",
|
|
19
|
+
renderItem: (item) => /* @__PURE__ */ jsx(MultiselectMenuItem, {
|
|
20
|
+
item,
|
|
21
|
+
styles
|
|
22
|
+
}, item.value),
|
|
23
|
+
size,
|
|
24
|
+
styles,
|
|
25
|
+
...shellProps
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
BitkitMultiselectMenu.displayName = "BitkitMultiselectMenu";
|
|
29
|
+
var MultiselectMenuItem = ({ item, styles }) => {
|
|
30
|
+
if (item.loading) return /* @__PURE__ */ jsxs(Box, {
|
|
31
|
+
css: styles.item,
|
|
32
|
+
children: [/* @__PURE__ */ jsx(Spinner, {
|
|
33
|
+
variant: "purple",
|
|
34
|
+
css: styles.itemLoading
|
|
35
|
+
}), /* @__PURE__ */ jsx(Text, {
|
|
36
|
+
css: styles.itemLoadingLabel,
|
|
37
|
+
children: "Loading..."
|
|
38
|
+
})]
|
|
39
|
+
});
|
|
40
|
+
return /* @__PURE__ */ jsxs(Select.Item, {
|
|
41
|
+
css: styles.item,
|
|
42
|
+
item,
|
|
43
|
+
children: [/* @__PURE__ */ jsx(Box, {
|
|
44
|
+
css: styles.checkbox,
|
|
45
|
+
"data-slot": "checkbox",
|
|
46
|
+
children: /* @__PURE__ */ jsx(IconCheck, {
|
|
47
|
+
size: "16",
|
|
48
|
+
css: styles.checkmark,
|
|
49
|
+
"data-slot": "checkmark"
|
|
50
|
+
})
|
|
51
|
+
}), /* @__PURE__ */ jsxs(Box, {
|
|
52
|
+
css: styles.itemContent,
|
|
53
|
+
children: [/* @__PURE__ */ jsx(Text, {
|
|
54
|
+
css: styles.itemLabel,
|
|
55
|
+
children: item.label
|
|
56
|
+
}), item.helperText && /* @__PURE__ */ jsx(Text, {
|
|
57
|
+
css: styles.itemHelperText,
|
|
58
|
+
children: item.helperText
|
|
59
|
+
})]
|
|
60
|
+
})]
|
|
61
|
+
});
|
|
62
|
+
};
|
|
63
|
+
//#endregion
|
|
64
|
+
export { BitkitMultiselectMenu as default };
|
|
65
|
+
|
|
66
|
+
//# sourceMappingURL=BitkitMultiselectMenu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BitkitMultiselectMenu.js","names":[],"sources":["../../../lib/components/BitkitMultiselectMenu/BitkitMultiselectMenu.tsx"],"sourcesContent":["import { Box } from '@chakra-ui/react/box';\nimport { type ListCollection } from '@chakra-ui/react/collection';\nimport { Select } from '@chakra-ui/react/select';\nimport { Spinner } from '@chakra-ui/react/spinner';\nimport { type SystemStyleObject, useSlotRecipe } from '@chakra-ui/react/styled-system';\nimport { Text } from '@chakra-ui/react/text';\nimport { forwardRef } from 'react';\n\nimport { IconCheck } from '../../icons';\nimport {\n type BitkitSelectMenuCreateItemProps,\n type BitkitSelectMenuEmptyStateProps,\n type BitkitSelectMenuSearchProps,\n} from '../BitkitSelectMenu/BitkitSelectMenu';\nimport { SelectMenuShell } from '../BitkitSelectMenu/SelectMenuShell';\n\nexport type BitkitMultiselectMenuItemProps = {\n value: string;\n label: string;\n group?: string;\n helperText?: string;\n disabled?: boolean;\n loading?: boolean;\n};\n\nexport type BitkitMultiselectMenuProps = {\n collection: ListCollection<BitkitMultiselectMenuItemProps>;\n isLoading?: boolean;\n size?: 'md' | 'lg';\n} & BitkitSelectMenuCreateItemProps &\n BitkitSelectMenuSearchProps &\n BitkitSelectMenuEmptyStateProps;\n\nconst BitkitMultiselectMenu = forwardRef<HTMLDivElement, BitkitMultiselectMenuProps>((props, ref) => {\n const { collection, size, ...shellProps } = props;\n const recipe = useSlotRecipe({ key: 'select' });\n const styles = recipe({ size });\n const iconSize = size === 'md' ? '16' : '24';\n\n return (\n <SelectMenuShell\n NS={Select}\n collection={collection}\n contentRef={ref}\n iconSize={iconSize}\n renderItem={(item) => <MultiselectMenuItem key={item.value} item={item} styles={styles} />}\n size={size}\n styles={styles}\n {...shellProps}\n />\n );\n});\n\nBitkitMultiselectMenu.displayName = 'BitkitMultiselectMenu';\n\ntype MultiselectMenuItemRenderProps = {\n item: BitkitMultiselectMenuItemProps;\n styles: Record<string, SystemStyleObject>;\n};\n\nconst MultiselectMenuItem = ({ item, styles }: MultiselectMenuItemRenderProps) => {\n if (item.loading) {\n // Rendered as a plain Box, not Select.Item — Zag's state machine won't track it\n // as an option, so keyboard nav skips it and it can't be selected.\n return (\n <Box css={styles.item}>\n <Spinner variant=\"purple\" css={styles.itemLoading} />\n <Text css={styles.itemLoadingLabel}>Loading...</Text>\n </Box>\n );\n }\n\n return (\n <Select.Item css={styles.item} item={item}>\n <Box css={styles.checkbox} data-slot=\"checkbox\">\n <IconCheck size=\"16\" css={styles.checkmark} data-slot=\"checkmark\" />\n </Box>\n <Box css={styles.itemContent}>\n <Text css={styles.itemLabel}>{item.label}</Text>\n {item.helperText && <Text css={styles.itemHelperText}>{item.helperText}</Text>}\n </Box>\n </Select.Item>\n );\n};\n\nexport default BitkitMultiselectMenu;\n"],"mappings":";;;;;;;;;;AAiCA,IAAM,wBAAwB,YAAwD,OAAO,QAAQ;CACnG,MAAM,EAAE,YAAY,MAAM,GAAG,eAAe;CAE5C,MAAM,SADS,cAAc,EAAE,KAAK,UAAU,CAAC,CACzB,EAAE,MAAM,CAAC;AAG/B,QACE,oBAAC,iBAAD;EACE,IAAI;EACQ;EACZ,YAAY;EACF,UAPG,SAAS,OAAO,OAAO;EAQpC,aAAa,SAAS,oBAAC,qBAAD;GAA4C;GAAc;GAAU,EAA1C,KAAK,MAAqC;EACpF;EACE;EACR,GAAI;EACJ,CAAA;EAEJ;AAEF,sBAAsB,cAAc;AAOpC,IAAM,uBAAuB,EAAE,MAAM,aAA6C;AAChF,KAAI,KAAK,QAGP,QACE,qBAAC,KAAD;EAAK,KAAK,OAAO;YAAjB,CACE,oBAAC,SAAD;GAAS,SAAQ;GAAS,KAAK,OAAO;GAAe,CAAA,EACrD,oBAAC,MAAD;GAAM,KAAK,OAAO;aAAkB;GAAiB,CAAA,CACjD;;AAIV,QACE,qBAAC,OAAO,MAAR;EAAa,KAAK,OAAO;EAAY;YAArC,CACE,oBAAC,KAAD;GAAK,KAAK,OAAO;GAAU,aAAU;aACnC,oBAAC,WAAD;IAAW,MAAK;IAAK,KAAK,OAAO;IAAW,aAAU;IAAc,CAAA;GAChE,CAAA,EACN,qBAAC,KAAD;GAAK,KAAK,OAAO;aAAjB,CACE,oBAAC,MAAD;IAAM,KAAK,OAAO;cAAY,KAAK;IAAa,CAAA,EAC/C,KAAK,cAAc,oBAAC,MAAD;IAAM,KAAK,OAAO;cAAiB,KAAK;IAAkB,CAAA,CAC1E;KACM"}
|
|
@@ -48,7 +48,7 @@ var BitkitNativeSelect = forwardRef((props, ref) => {
|
|
|
48
48
|
statusIcon,
|
|
49
49
|
/* @__PURE__ */ jsx(NativeSelect.Indicator, {
|
|
50
50
|
asChild: true,
|
|
51
|
-
children: /* @__PURE__ */ jsx(AssetSelectChevron, {})
|
|
51
|
+
children: /* @__PURE__ */ jsx(AssetSelectChevron, { pointerEvents: "none" })
|
|
52
52
|
})
|
|
53
53
|
]
|
|
54
54
|
})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BitkitNativeSelect.js","names":[],"sources":["../../../lib/components/BitkitNativeSelect/BitkitNativeSelect.tsx"],"sourcesContent":["import { NativeSelect, type NativeSelectRootProps } from '@chakra-ui/react/native-select';\nimport { useSlotRecipe } from '@chakra-ui/react/styled-system';\nimport { splitProps } from '@zag-js/utils';\nimport { type ChangeEventHandler, forwardRef, type ReactNode } from 'react';\n\nimport { IconErrorCircleFilled, IconWarningYellow } from '../../icons';\nimport AssetSelectChevron from '../../utilities/AssetSelectChevron.tsx';\nimport BitkitField, { type BitkitFieldProps } from '../BitkitField/BitkitField.tsx';\n\nconst FIELD_PROPS = ['defaultValue', 'name', 'onChange', 'placeholder', 'value'] as const;\n\nexport interface BitkitNativeSelectProps extends Omit<\n BitkitFieldProps,\n 'children' | 'disabled' | 'invalid' | 'onChange' | 'readOnly'\n> {\n children: ReactNode;\n defaultValue?: string;\n name?: string;\n onChange?: ChangeEventHandler<HTMLSelectElement>;\n placeholder?: string;\n selectProps?: NativeSelectRootProps;\n size?: 'md' | 'lg';\n state?: 'disabled' | 'error' | 'readOnly' | 'warning';\n value?: string;\n}\n\nconst BitkitNativeSelect = forwardRef<HTMLSelectElement, BitkitNativeSelectProps>(\n (props: BitkitNativeSelectProps, ref) => {\n const { children, selectProps, size = 'md', state, ...rest } = props;\n const [nativeFieldProps, bitkitFieldProps] = splitProps(rest, [...FIELD_PROPS]);\n\n const recipe = useSlotRecipe({ key: 'nativeSelect' });\n const styles = recipe();\n\n const hasWarning = state === 'warning' || !!bitkitFieldProps.warningText;\n const isInvalid = state === 'error' || !!bitkitFieldProps.errorText;\n\n let statusIcon = undefined;\n if (isInvalid) {\n statusIcon = (\n <IconErrorCircleFilled size={size === 'lg' ? '24' : '16'} css={styles.statusIcon} color=\"icon/negative\" />\n );\n } else if (hasWarning) {\n statusIcon = (\n <IconWarningYellow size={size === 'lg' ? '24' : '16'} css={styles.statusIcon} color=\"icon/warning\" />\n );\n }\n\n return (\n <BitkitField state={state} {...bitkitFieldProps}>\n <NativeSelect.Root size={size} {...selectProps} className=\"group\">\n <NativeSelect.Field ref={ref} {...nativeFieldProps}>\n {children}\n </NativeSelect.Field>\n {statusIcon}\n <NativeSelect.Indicator asChild>\n <AssetSelectChevron />\n </NativeSelect.Indicator>\n </NativeSelect.Root>\n </BitkitField>\n );\n },\n);\n\nBitkitNativeSelect.displayName = 'BitkitNativeSelect';\n\nexport default BitkitNativeSelect;\n"],"mappings":";;;;;;;;;;AASA,IAAM,cAAc;CAAC;CAAgB;CAAQ;CAAY;CAAe;CAAQ;AAiBhF,IAAM,qBAAqB,YACxB,OAAgC,QAAQ;CACvC,MAAM,EAAE,UAAU,aAAa,OAAO,MAAM,OAAO,GAAG,SAAS;CAC/D,MAAM,CAAC,kBAAkB,oBAAoB,WAAW,MAAM,CAAC,GAAG,YAAY,CAAC;CAG/E,MAAM,SADS,cAAc,EAAE,KAAK,gBAAgB,CAAC,EAC9B;CAEvB,MAAM,aAAa,UAAU,aAAa,CAAC,CAAC,iBAAiB;CAC7D,MAAM,YAAY,UAAU,WAAW,CAAC,CAAC,iBAAiB;CAE1D,IAAI,aAAa,KAAA;AACjB,KAAI,UACF,cACE,oBAAC,uBAAD;EAAuB,MAAM,SAAS,OAAO,OAAO;EAAM,KAAK,OAAO;EAAY,OAAM;EAAkB,CAAA;UAEnG,WACT,cACE,oBAAC,mBAAD;EAAmB,MAAM,SAAS,OAAO,OAAO;EAAM,KAAK,OAAO;EAAY,OAAM;EAAiB,CAAA;AAIzG,QACE,oBAAC,aAAD;EAAoB;EAAO,GAAI;YAC7B,qBAAC,aAAa,MAAd;GAAyB;GAAM,GAAI;GAAa,WAAU;aAA1D;IACE,oBAAC,aAAa,OAAd;KAAyB;KAAK,GAAI;KAC/B;KACkB,CAAA;IACpB;IACD,oBAAC,aAAa,WAAd;KAAwB,SAAA;eACtB,oBAAC,oBAAD,
|
|
1
|
+
{"version":3,"file":"BitkitNativeSelect.js","names":[],"sources":["../../../lib/components/BitkitNativeSelect/BitkitNativeSelect.tsx"],"sourcesContent":["import { NativeSelect, type NativeSelectRootProps } from '@chakra-ui/react/native-select';\nimport { useSlotRecipe } from '@chakra-ui/react/styled-system';\nimport { splitProps } from '@zag-js/utils';\nimport { type ChangeEventHandler, forwardRef, type ReactNode } from 'react';\n\nimport { IconErrorCircleFilled, IconWarningYellow } from '../../icons';\nimport AssetSelectChevron from '../../utilities/AssetSelectChevron.tsx';\nimport BitkitField, { type BitkitFieldProps } from '../BitkitField/BitkitField.tsx';\n\nconst FIELD_PROPS = ['defaultValue', 'name', 'onChange', 'placeholder', 'value'] as const;\n\nexport interface BitkitNativeSelectProps extends Omit<\n BitkitFieldProps,\n 'children' | 'disabled' | 'invalid' | 'onChange' | 'readOnly'\n> {\n children: ReactNode;\n defaultValue?: string;\n name?: string;\n onChange?: ChangeEventHandler<HTMLSelectElement>;\n placeholder?: string;\n selectProps?: NativeSelectRootProps;\n size?: 'md' | 'lg';\n state?: 'disabled' | 'error' | 'readOnly' | 'warning';\n value?: string;\n}\n\nconst BitkitNativeSelect = forwardRef<HTMLSelectElement, BitkitNativeSelectProps>(\n (props: BitkitNativeSelectProps, ref) => {\n const { children, selectProps, size = 'md', state, ...rest } = props;\n const [nativeFieldProps, bitkitFieldProps] = splitProps(rest, [...FIELD_PROPS]);\n\n const recipe = useSlotRecipe({ key: 'nativeSelect' });\n const styles = recipe();\n\n const hasWarning = state === 'warning' || !!bitkitFieldProps.warningText;\n const isInvalid = state === 'error' || !!bitkitFieldProps.errorText;\n\n let statusIcon = undefined;\n if (isInvalid) {\n statusIcon = (\n <IconErrorCircleFilled size={size === 'lg' ? '24' : '16'} css={styles.statusIcon} color=\"icon/negative\" />\n );\n } else if (hasWarning) {\n statusIcon = (\n <IconWarningYellow size={size === 'lg' ? '24' : '16'} css={styles.statusIcon} color=\"icon/warning\" />\n );\n }\n\n return (\n <BitkitField state={state} {...bitkitFieldProps}>\n <NativeSelect.Root size={size} {...selectProps} className=\"group\">\n <NativeSelect.Field ref={ref} {...nativeFieldProps}>\n {children}\n </NativeSelect.Field>\n {statusIcon}\n <NativeSelect.Indicator asChild>\n <AssetSelectChevron pointerEvents=\"none\" />\n </NativeSelect.Indicator>\n </NativeSelect.Root>\n </BitkitField>\n );\n },\n);\n\nBitkitNativeSelect.displayName = 'BitkitNativeSelect';\n\nexport default BitkitNativeSelect;\n"],"mappings":";;;;;;;;;;AASA,IAAM,cAAc;CAAC;CAAgB;CAAQ;CAAY;CAAe;CAAQ;AAiBhF,IAAM,qBAAqB,YACxB,OAAgC,QAAQ;CACvC,MAAM,EAAE,UAAU,aAAa,OAAO,MAAM,OAAO,GAAG,SAAS;CAC/D,MAAM,CAAC,kBAAkB,oBAAoB,WAAW,MAAM,CAAC,GAAG,YAAY,CAAC;CAG/E,MAAM,SADS,cAAc,EAAE,KAAK,gBAAgB,CAAC,EAC9B;CAEvB,MAAM,aAAa,UAAU,aAAa,CAAC,CAAC,iBAAiB;CAC7D,MAAM,YAAY,UAAU,WAAW,CAAC,CAAC,iBAAiB;CAE1D,IAAI,aAAa,KAAA;AACjB,KAAI,UACF,cACE,oBAAC,uBAAD;EAAuB,MAAM,SAAS,OAAO,OAAO;EAAM,KAAK,OAAO;EAAY,OAAM;EAAkB,CAAA;UAEnG,WACT,cACE,oBAAC,mBAAD;EAAmB,MAAM,SAAS,OAAO,OAAO;EAAM,KAAK,OAAO;EAAY,OAAM;EAAiB,CAAA;AAIzG,QACE,oBAAC,aAAD;EAAoB;EAAO,GAAI;YAC7B,qBAAC,aAAa,MAAd;GAAyB;GAAM,GAAI;GAAa,WAAU;aAA1D;IACE,oBAAC,aAAa,OAAd;KAAyB;KAAK,GAAI;KAC/B;KACkB,CAAA;IACpB;IACD,oBAAC,aAAa,WAAd;KAAwB,SAAA;eACtB,oBAAC,oBAAD,EAAoB,eAAc,QAAS,CAAA;KACpB,CAAA;IACP;;EACR,CAAA;EAGnB;AAED,mBAAmB,cAAc"}
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import { SelectRootProps, SelectTriggerProps } from '@chakra-ui/react/select';
|
|
2
2
|
import { BitkitFieldProps } from '../BitkitField/BitkitField.tsx';
|
|
3
|
-
import {
|
|
3
|
+
import { BitkitSelectMenuCreateItemProps, BitkitSelectMenuEmptyStateProps, BitkitSelectMenuItemProps, BitkitSelectMenuSearchProps } from '../BitkitSelectMenu/BitkitSelectMenu.tsx';
|
|
4
4
|
export type BitkitSelectTriggerProps = SelectTriggerProps;
|
|
5
5
|
export type BitkitSelectProps = Omit<BitkitFieldProps, 'children' | 'state'> & {
|
|
6
|
-
contentProps?: BitkitSelectContentProps;
|
|
7
6
|
defaultValue?: string;
|
|
8
7
|
isLoading?: boolean;
|
|
9
8
|
items: Array<BitkitSelectMenuItemProps>;
|
|
@@ -14,6 +13,6 @@ export type BitkitSelectProps = Omit<BitkitFieldProps, 'children' | 'state'> & {
|
|
|
14
13
|
state?: 'disabled' | 'error' | 'readOnly' | 'warning';
|
|
15
14
|
triggerProps?: BitkitSelectTriggerProps;
|
|
16
15
|
value?: string;
|
|
17
|
-
} & BitkitSelectMenuCreateItemProps & BitkitSelectMenuSearchProps;
|
|
16
|
+
} & BitkitSelectMenuCreateItemProps & BitkitSelectMenuSearchProps & BitkitSelectMenuEmptyStateProps;
|
|
18
17
|
declare const BitkitSelect: import('react').ForwardRefExoticComponent<BitkitSelectProps & import('react').RefAttributes<HTMLDivElement>>;
|
|
19
18
|
export default BitkitSelect;
|
|
@@ -26,11 +26,13 @@ var SelectValue = ({ placeholder, state, size }) => {
|
|
|
26
26
|
}) : /* @__PURE__ */ jsx(Select.ValueText, { placeholder: placeholder ?? (state === "readOnly" ? "(not selected)" : "Select an option") });
|
|
27
27
|
};
|
|
28
28
|
var BitkitSelect = forwardRef((props, ref) => {
|
|
29
|
-
const {
|
|
29
|
+
const { createItemLabel, defaultValue, emptyHelperText, emptyLabel, hasSearch, isLoading, items, onCreateItem, onSearchChange, onValueChange, searchValue, placeholder, selectProps, size = "md", state, triggerProps, value, ...fieldProps } = props;
|
|
30
30
|
const collection = createListCollection({
|
|
31
31
|
items,
|
|
32
|
-
groupBy: (item) => item.group || ""
|
|
32
|
+
groupBy: (item) => item.group || "",
|
|
33
|
+
isItemDisabled: (item) => !!item.disabled
|
|
33
34
|
});
|
|
35
|
+
const isInvalid = state === "error" || !!fieldProps.errorText;
|
|
34
36
|
return /* @__PURE__ */ jsx(BitkitField, {
|
|
35
37
|
ref,
|
|
36
38
|
state,
|
|
@@ -40,7 +42,11 @@ var BitkitSelect = forwardRef((props, ref) => {
|
|
|
40
42
|
size,
|
|
41
43
|
...selectProps,
|
|
42
44
|
defaultValue: defaultValue ? [defaultValue] : void 0,
|
|
45
|
+
disabled: state === "disabled",
|
|
46
|
+
invalid: isInvalid,
|
|
43
47
|
onValueChange: (newVal) => onValueChange?.(newVal.value[0]),
|
|
48
|
+
readOnly: state === "readOnly",
|
|
49
|
+
scrollToIndexFn: ({ getElement }) => getElement()?.scrollIntoView({ block: "nearest" }),
|
|
44
50
|
value: value ? [value] : void 0,
|
|
45
51
|
children: [
|
|
46
52
|
/* @__PURE__ */ jsx(Select.HiddenSelect, {}),
|
|
@@ -67,15 +73,15 @@ var BitkitSelect = forwardRef((props, ref) => {
|
|
|
67
73
|
}),
|
|
68
74
|
/* @__PURE__ */ jsx(Portal, { children: /* @__PURE__ */ jsx(Select.Positioner, { children: /* @__PURE__ */ jsx(BitkitSelectMenu, {
|
|
69
75
|
collection,
|
|
70
|
-
createItemHref,
|
|
71
76
|
createItemLabel,
|
|
72
|
-
|
|
73
|
-
|
|
77
|
+
emptyHelperText,
|
|
78
|
+
emptyLabel,
|
|
74
79
|
isLoading,
|
|
75
80
|
onCreateItem,
|
|
76
81
|
...hasSearch ? {
|
|
77
82
|
hasSearch: true,
|
|
78
|
-
onSearchChange
|
|
83
|
+
onSearchChange,
|
|
84
|
+
searchValue
|
|
79
85
|
} : { hasSearch: false },
|
|
80
86
|
size
|
|
81
87
|
}) }) })
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BitkitSelect.js","names":[],"sources":["../../../lib/components/BitkitSelect/BitkitSelect.tsx"],"sourcesContent":["import { Box } from '@chakra-ui/react/box';\nimport { createListCollection } from '@chakra-ui/react/collection';\nimport { Portal } from '@chakra-ui/react/portal';\nimport { Select, type SelectRootProps, type SelectTriggerProps, useSelectContext } from '@chakra-ui/react/select';\nimport { forwardRef } from 'react';\n\nimport { IconErrorCircleFilled, IconWarningYellow } from '../../icons';\nimport AssetSelectChevron from '../../utilities/AssetSelectChevron.tsx';\nimport BitkitField, { type BitkitFieldProps } from '../BitkitField/BitkitField.tsx';\nimport BitkitSelectMenu, {\n type
|
|
1
|
+
{"version":3,"file":"BitkitSelect.js","names":[],"sources":["../../../lib/components/BitkitSelect/BitkitSelect.tsx"],"sourcesContent":["import { Box } from '@chakra-ui/react/box';\nimport { createListCollection } from '@chakra-ui/react/collection';\nimport { Portal } from '@chakra-ui/react/portal';\nimport { Select, type SelectRootProps, type SelectTriggerProps, useSelectContext } from '@chakra-ui/react/select';\nimport { forwardRef } from 'react';\n\nimport { IconErrorCircleFilled, IconWarningYellow } from '../../icons';\nimport AssetSelectChevron from '../../utilities/AssetSelectChevron.tsx';\nimport BitkitField, { type BitkitFieldProps } from '../BitkitField/BitkitField.tsx';\nimport BitkitSelectMenu, {\n type BitkitSelectMenuCreateItemProps,\n type BitkitSelectMenuEmptyStateProps,\n type BitkitSelectMenuItemProps,\n type BitkitSelectMenuSearchProps,\n} from '../BitkitSelectMenu/BitkitSelectMenu.tsx';\n\nexport type BitkitSelectTriggerProps = SelectTriggerProps;\n\nexport type BitkitSelectProps = Omit<BitkitFieldProps, 'children' | 'state'> & {\n defaultValue?: string;\n isLoading?: boolean;\n items: Array<BitkitSelectMenuItemProps>;\n onValueChange?: (newVal: string) => void;\n placeholder?: string;\n selectProps?: Omit<SelectRootProps, 'collection' | 'defaultValue' | 'onValueChange' | 'value'>;\n size?: 'md' | 'lg';\n state?: 'disabled' | 'error' | 'readOnly' | 'warning';\n triggerProps?: BitkitSelectTriggerProps;\n value?: string;\n} & BitkitSelectMenuCreateItemProps &\n BitkitSelectMenuSearchProps &\n BitkitSelectMenuEmptyStateProps;\n\ntype SelectValueProps = {\n placeholder?: string;\n size: BitkitSelectProps['size'];\n state?: BitkitSelectProps['state'];\n};\n\nconst SelectValue = ({ placeholder, state, size }: SelectValueProps) => {\n const select = useSelectContext();\n const items = select.selectedItems as Array<BitkitSelectMenuItemProps>;\n\n const Icon = items[0]?.icon;\n const label = items[0]?.label;\n\n const iconSize = size === 'md' ? '16' : '24';\n\n return items[0] ? (\n <Select.ValueText placeholder={placeholder || state === 'readOnly' ? '(not selected)' : 'Select an option'}>\n <Box display=\"flex\" alignItems=\"center\" gap=\"8\">\n {Icon && <Icon size={iconSize} />}\n {label}\n </Box>\n </Select.ValueText>\n ) : (\n <Select.ValueText placeholder={placeholder ?? (state === 'readOnly' ? '(not selected)' : 'Select an option')} />\n );\n};\n\nconst BitkitSelect = forwardRef<HTMLDivElement, BitkitSelectProps>((props: BitkitSelectProps, ref) => {\n const {\n createItemLabel,\n defaultValue,\n emptyHelperText,\n emptyLabel,\n hasSearch,\n isLoading,\n items,\n onCreateItem,\n onSearchChange,\n onValueChange,\n searchValue,\n placeholder,\n selectProps,\n size = 'md',\n state,\n triggerProps,\n value,\n ...fieldProps\n } = props;\n\n const collection = createListCollection({\n items,\n groupBy: (item) => item.group || '',\n isItemDisabled: (item) => !!item.disabled,\n });\n\n const isInvalid = state === 'error' || !!fieldProps.errorText;\n\n return (\n <BitkitField ref={ref} state={state} {...fieldProps}>\n <Select.Root\n collection={collection}\n size={size}\n {...selectProps}\n defaultValue={defaultValue ? [defaultValue] : undefined}\n disabled={state === 'disabled'}\n invalid={isInvalid}\n onValueChange={(newVal) => onValueChange?.(newVal.value[0])}\n readOnly={state === 'readOnly'}\n // Bypass Zag's isScrollable(contentEl) gate — our Content is overflow:hidden flex\n // column, so the real scroll container is itemList. See BitkitMultiselect for why.\n scrollToIndexFn={({ getElement }) => getElement()?.scrollIntoView({ block: 'nearest' })}\n value={value ? [value] : undefined}\n >\n <Select.HiddenSelect />\n <Select.Control className=\"group\">\n <Select.Trigger {...triggerProps}>\n <SelectValue placeholder={placeholder} size={size} state={state} />\n </Select.Trigger>\n <Select.IndicatorGroup>\n {state === 'error' && (\n <Select.Indicator>\n <IconErrorCircleFilled size={size === 'lg' ? '24' : '16'} color=\"icon/negative\" />\n </Select.Indicator>\n )}\n {state === 'warning' && (\n <Select.Indicator>\n <IconWarningYellow size={size === 'lg' ? '24' : '16'} />\n </Select.Indicator>\n )}\n <Select.Indicator asChild>\n <AssetSelectChevron />\n </Select.Indicator>\n </Select.IndicatorGroup>\n </Select.Control>\n <Portal>\n <Select.Positioner>\n <BitkitSelectMenu\n collection={collection}\n createItemLabel={createItemLabel}\n emptyHelperText={emptyHelperText}\n emptyLabel={emptyLabel}\n isLoading={isLoading}\n onCreateItem={onCreateItem}\n {...(hasSearch\n ? { hasSearch: true as const, onSearchChange, searchValue }\n : { hasSearch: false as const })}\n size={size}\n />\n </Select.Positioner>\n </Portal>\n </Select.Root>\n </BitkitField>\n );\n});\n\nBitkitSelect.displayName = 'BitkitSelect';\n\nexport default BitkitSelect;\n"],"mappings":";;;;;;;;;;;;AAuCA,IAAM,eAAe,EAAE,aAAa,OAAO,WAA6B;CAEtE,MAAM,QADS,kBAAkB,CACZ;CAErB,MAAM,OAAO,MAAM,IAAI;CACvB,MAAM,QAAQ,MAAM,IAAI;CAExB,MAAM,WAAW,SAAS,OAAO,OAAO;AAExC,QAAO,MAAM,KACX,oBAAC,OAAO,WAAR;EAAkB,aAAa,eAAe,UAAU,aAAa,mBAAmB;YACtF,qBAAC,KAAD;GAAK,SAAQ;GAAO,YAAW;GAAS,KAAI;aAA5C,CACG,QAAQ,oBAAC,MAAD,EAAM,MAAM,UAAY,CAAA,EAChC,MACG;;EACW,CAAA,GAEnB,oBAAC,OAAO,WAAR,EAAkB,aAAa,gBAAgB,UAAU,aAAa,mBAAmB,qBAAuB,CAAA;;AAIpH,IAAM,eAAe,YAA+C,OAA0B,QAAQ;CACpG,MAAM,EACJ,iBACA,cACA,iBACA,YACA,WACA,WACA,OACA,cACA,gBACA,eACA,aACA,aACA,aACA,OAAO,MACP,OACA,cACA,OACA,GAAG,eACD;CAEJ,MAAM,aAAa,qBAAqB;EACtC;EACA,UAAU,SAAS,KAAK,SAAS;EACjC,iBAAiB,SAAS,CAAC,CAAC,KAAK;EAClC,CAAC;CAEF,MAAM,YAAY,UAAU,WAAW,CAAC,CAAC,WAAW;AAEpD,QACE,oBAAC,aAAD;EAAkB;EAAY;EAAO,GAAI;YACvC,qBAAC,OAAO,MAAR;GACc;GACN;GACN,GAAI;GACJ,cAAc,eAAe,CAAC,aAAa,GAAG,KAAA;GAC9C,UAAU,UAAU;GACpB,SAAS;GACT,gBAAgB,WAAW,gBAAgB,OAAO,MAAM,GAAG;GAC3D,UAAU,UAAU;GAGpB,kBAAkB,EAAE,iBAAiB,YAAY,EAAE,eAAe,EAAE,OAAO,WAAW,CAAC;GACvF,OAAO,QAAQ,CAAC,MAAM,GAAG,KAAA;aAZ3B;IAcE,oBAAC,OAAO,cAAR,EAAuB,CAAA;IACvB,qBAAC,OAAO,SAAR;KAAgB,WAAU;eAA1B,CACE,oBAAC,OAAO,SAAR;MAAgB,GAAI;gBAClB,oBAAC,aAAD;OAA0B;OAAmB;OAAa;OAAS,CAAA;MACpD,CAAA,EACjB,qBAAC,OAAO,gBAAR,EAAA,UAAA;MACG,UAAU,WACT,oBAAC,OAAO,WAAR,EAAA,UACE,oBAAC,uBAAD;OAAuB,MAAM,SAAS,OAAO,OAAO;OAAM,OAAM;OAAkB,CAAA,EACjE,CAAA;MAEpB,UAAU,aACT,oBAAC,OAAO,WAAR,EAAA,UACE,oBAAC,mBAAD,EAAmB,MAAM,SAAS,OAAO,OAAO,MAAQ,CAAA,EACvC,CAAA;MAErB,oBAAC,OAAO,WAAR;OAAkB,SAAA;iBAChB,oBAAC,oBAAD,EAAsB,CAAA;OACL,CAAA;MACG,EAAA,CAAA,CACT;;IACjB,oBAAC,QAAD,EAAA,UACE,oBAAC,OAAO,YAAR,EAAA,UACE,oBAAC,kBAAD;KACc;KACK;KACA;KACL;KACD;KACG;KACd,GAAK,YACD;MAAE,WAAW;MAAe;MAAgB;MAAa,GACzD,EAAE,WAAW,OAAgB;KAC3B;KACN,CAAA,EACgB,CAAA,EACb,CAAA;IACG;;EACF,CAAA;EAEhB;AAEF,aAAa,cAAc"}
|