@yamada-ui/autocomplete 1.6.9-dev-20241213204523 → 1.6.9-dev-20241213210300
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/autocomplete-create.js.map +1 -1
- package/dist/autocomplete-create.mjs +2 -2
- package/dist/autocomplete-empty.js.map +1 -1
- package/dist/autocomplete-empty.mjs +2 -2
- package/dist/autocomplete-option.js +44 -43
- package/dist/autocomplete-option.js.map +1 -1
- package/dist/autocomplete-option.mjs +2 -2
- package/dist/autocomplete.js +44 -43
- package/dist/autocomplete.js.map +1 -1
- package/dist/autocomplete.mjs +6 -6
- package/dist/{chunk-PWV7X7G6.mjs → chunk-3FXEJSLI.mjs} +4 -4
- package/dist/chunk-3FXEJSLI.mjs.map +1 -0
- package/dist/{chunk-IFH3PPSD.mjs → chunk-3KSLP2QT.mjs} +4 -4
- package/dist/{chunk-YPKDYYEV.mjs → chunk-KG6IO6XB.mjs} +2 -2
- package/dist/{chunk-RK5E5J5E.mjs → chunk-M5EWJFSX.mjs} +2 -2
- package/dist/{chunk-2LP57WVB.mjs → chunk-NPRQXPV7.mjs} +44 -43
- package/dist/chunk-NPRQXPV7.mjs.map +1 -0
- package/dist/{chunk-ZR77IT3O.mjs → chunk-Y5WDMYXH.mjs} +2 -2
- package/dist/{chunk-2CVB4NO5.mjs → chunk-Y7WZLESA.mjs} +4 -4
- package/dist/index.js +44 -43
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +7 -7
- package/dist/multi-autocomplete.js +44 -43
- package/dist/multi-autocomplete.js.map +1 -1
- package/dist/multi-autocomplete.mjs +6 -6
- package/dist/use-autocomplete-option.d.mts +3 -3
- package/dist/use-autocomplete-option.d.ts +3 -3
- package/dist/use-autocomplete-option.js +42 -41
- package/dist/use-autocomplete-option.js.map +1 -1
- package/dist/use-autocomplete-option.mjs +1 -1
- package/dist/use-autocomplete.js +44 -43
- package/dist/use-autocomplete.js.map +1 -1
- package/dist/use-autocomplete.mjs +3 -3
- package/package.json +13 -13
- package/dist/chunk-2LP57WVB.mjs.map +0 -1
- package/dist/chunk-PWV7X7G6.mjs.map +0 -1
- /package/dist/{chunk-IFH3PPSD.mjs.map → chunk-3KSLP2QT.mjs.map} +0 -0
- /package/dist/{chunk-YPKDYYEV.mjs.map → chunk-KG6IO6XB.mjs.map} +0 -0
- /package/dist/{chunk-RK5E5J5E.mjs.map → chunk-M5EWJFSX.mjs.map} +0 -0
- /package/dist/{chunk-ZR77IT3O.mjs.map → chunk-Y5WDMYXH.mjs.map} +0 -0
- /package/dist/{chunk-2CVB4NO5.mjs.map → chunk-Y7WZLESA.mjs.map} +0 -0
|
@@ -56,7 +56,7 @@ var useAutocompleteOption = (props) => {
|
|
|
56
56
|
inputRef,
|
|
57
57
|
omitSelectedValues,
|
|
58
58
|
setFocusedIndex,
|
|
59
|
-
value,
|
|
59
|
+
value: selectedValue,
|
|
60
60
|
optionProps,
|
|
61
61
|
onChange,
|
|
62
62
|
onClose,
|
|
@@ -64,43 +64,44 @@ var useAutocompleteOption = (props) => {
|
|
|
64
64
|
} = useAutocompleteContext();
|
|
65
65
|
const uuid = (0, import_react.useId)();
|
|
66
66
|
const itemRef = (0, import_react.useRef)(null);
|
|
67
|
-
|
|
68
|
-
id,
|
|
67
|
+
const {
|
|
68
|
+
id = uuid,
|
|
69
69
|
children,
|
|
70
70
|
closeOnSelect: customCloseOnSelect,
|
|
71
|
-
disabled,
|
|
72
|
-
focusable,
|
|
73
|
-
icon: customIcon,
|
|
74
71
|
isDisabled,
|
|
72
|
+
disabled = isDisabled,
|
|
75
73
|
isFocusable,
|
|
74
|
+
focusable = isFocusable,
|
|
75
|
+
icon: customIcon,
|
|
76
76
|
value: optionValue,
|
|
77
77
|
...computedProps
|
|
78
78
|
} = { ...optionProps, ...props };
|
|
79
|
-
disabled != null ? disabled : disabled = isDisabled;
|
|
80
|
-
focusable != null ? focusable : focusable = isFocusable;
|
|
81
79
|
const trulyDisabled = !!disabled && !focusable;
|
|
82
80
|
const { descendants, index, register } = useAutocompleteDescendant({
|
|
83
81
|
disabled: trulyDisabled
|
|
84
82
|
});
|
|
85
83
|
const values = descendants.values();
|
|
86
84
|
const frontValues = values.slice(0, index);
|
|
87
|
-
const
|
|
88
|
-
const
|
|
89
|
-
|
|
90
|
-
)
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
`${!isMulti ? "Autocomplete" : "MultiAutocomplete"}: Cannot infer the option value of complex children. Pass a \`value\` prop or use a plain string as children to <Option>.`
|
|
101
|
-
);
|
|
85
|
+
const multi = (0, import_utils2.isArray)(selectedValue);
|
|
86
|
+
const target = "target" in ((_b = (_a = itemRef.current) == null ? void 0 : _a.dataset) != null ? _b : {});
|
|
87
|
+
const focused = index === focusedIndex;
|
|
88
|
+
const value = (0, import_react.useMemo)(() => {
|
|
89
|
+
let value2 = optionValue;
|
|
90
|
+
if ((0, import_utils2.isUndefined)(optionValue)) {
|
|
91
|
+
if ((0, import_utils2.isString)(children) || (0, import_utils2.isNumber)(children)) {
|
|
92
|
+
value2 = children.toString();
|
|
93
|
+
} else {
|
|
94
|
+
console.warn(
|
|
95
|
+
`${!multi ? "Autocomplete" : "MultiAutocomplete"}: Cannot infer the option value of complex children. Pass a \`value\` prop or use a plain string as children to <Option>.`
|
|
96
|
+
);
|
|
97
|
+
}
|
|
102
98
|
}
|
|
103
|
-
|
|
99
|
+
return value2 != null ? value2 : "";
|
|
100
|
+
}, [children, multi, optionValue]);
|
|
101
|
+
const duplicated = frontValues.some(
|
|
102
|
+
({ node }) => node.dataset.value === value
|
|
103
|
+
);
|
|
104
|
+
const selected = !duplicated && (!multi ? value === selectedValue : selectedValue.includes(value));
|
|
104
105
|
const onClick = (0, import_react.useCallback)(
|
|
105
106
|
(ev) => {
|
|
106
107
|
ev.stopPropagation();
|
|
@@ -108,18 +109,18 @@ var useAutocompleteOption = (props) => {
|
|
|
108
109
|
if (inputRef.current) inputRef.current.focus();
|
|
109
110
|
return;
|
|
110
111
|
}
|
|
111
|
-
if (!
|
|
112
|
-
onChange(
|
|
112
|
+
if (!duplicated) setFocusedIndex(index);
|
|
113
|
+
onChange(value);
|
|
113
114
|
if (inputRef.current) inputRef.current.focus();
|
|
114
115
|
if (customCloseOnSelect != null ? customCloseOnSelect : closeOnSelect) onClose();
|
|
115
116
|
if (omitSelectedValues) onFocusNext(index);
|
|
116
117
|
},
|
|
117
118
|
[
|
|
118
|
-
|
|
119
|
+
duplicated,
|
|
119
120
|
onFocusNext,
|
|
120
121
|
omitSelectedValues,
|
|
121
122
|
disabled,
|
|
122
|
-
|
|
123
|
+
value,
|
|
123
124
|
setFocusedIndex,
|
|
124
125
|
index,
|
|
125
126
|
onChange,
|
|
@@ -131,7 +132,7 @@ var useAutocompleteOption = (props) => {
|
|
|
131
132
|
);
|
|
132
133
|
const getOptionProps = (0, import_react.useCallback)(
|
|
133
134
|
(props2 = {}, ref = null) => {
|
|
134
|
-
const isHidden = !
|
|
135
|
+
const isHidden = !target || omitSelectedValues && selected;
|
|
135
136
|
const style = {
|
|
136
137
|
border: "0px",
|
|
137
138
|
clip: "rect(0px, 0px, 0px, 0px)",
|
|
@@ -152,37 +153,37 @@ var useAutocompleteOption = (props) => {
|
|
|
152
153
|
style: isHidden ? style : void 0,
|
|
153
154
|
"aria-disabled": (0, import_utils2.ariaAttr)(disabled),
|
|
154
155
|
"aria-hidden": (0, import_utils2.ariaAttr)(isHidden),
|
|
155
|
-
"aria-selected":
|
|
156
|
+
"aria-selected": selected,
|
|
156
157
|
"data-disabled": (0, import_utils2.dataAttr)(disabled),
|
|
157
|
-
"data-duplicated": (0, import_utils2.dataAttr)(
|
|
158
|
-
"data-focus": (0, import_utils2.dataAttr)(
|
|
158
|
+
"data-duplicated": (0, import_utils2.dataAttr)(duplicated),
|
|
159
|
+
"data-focus": (0, import_utils2.dataAttr)(focused),
|
|
159
160
|
"data-target": (0, import_utils2.dataAttr)(true),
|
|
160
|
-
"data-value":
|
|
161
|
+
"data-value": value,
|
|
161
162
|
tabIndex: -1,
|
|
162
163
|
onClick: (0, import_utils2.handlerAll)(computedProps.onClick, props2.onClick, onClick)
|
|
163
164
|
};
|
|
164
165
|
},
|
|
165
166
|
[
|
|
166
167
|
id,
|
|
167
|
-
|
|
168
|
-
|
|
168
|
+
duplicated,
|
|
169
|
+
value,
|
|
169
170
|
computedProps,
|
|
170
171
|
disabled,
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
172
|
+
focused,
|
|
173
|
+
selected,
|
|
174
|
+
target,
|
|
174
175
|
omitSelectedValues,
|
|
175
176
|
onClick,
|
|
176
177
|
register
|
|
177
178
|
]
|
|
178
179
|
);
|
|
179
180
|
return {
|
|
181
|
+
target,
|
|
180
182
|
children,
|
|
181
183
|
customIcon,
|
|
182
|
-
|
|
183
|
-
isSelected,
|
|
184
|
-
isTarget,
|
|
184
|
+
focused,
|
|
185
185
|
omitSelectedValues,
|
|
186
|
+
selected,
|
|
186
187
|
getOptionProps
|
|
187
188
|
};
|
|
188
189
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/use-autocomplete-option.ts","../src/autocomplete-context.ts"],"sourcesContent":["import type { HTMLUIProps, PropGetter } from \"@yamada-ui/core\"\nimport type { CSSProperties, MouseEvent } from \"react\"\nimport {\n ariaAttr,\n dataAttr,\n handlerAll,\n isArray,\n isHTMLElement,\n isNumber,\n isString,\n isUndefined,\n mergeRefs,\n} from \"@yamada-ui/utils\"\nimport { useCallback, useId, useRef } from \"react\"\nimport {\n useAutocompleteContext,\n useAutocompleteDescendant,\n} from \"./autocomplete-context\"\n\nconst isTargetOption = (target: EventTarget | null): boolean =>\n isHTMLElement(target) && !!target.getAttribute(\"role\")?.startsWith(\"option\")\n\nexport interface UseAutocompleteOptionProps\n extends Omit<HTMLUIProps, \"children\" | \"value\"> {\n /**\n * The label of the autocomplete option.\n */\n children?: string\n /**\n * If `true`, the list element will be closed when selected.\n *\n * @default false\n */\n closeOnSelect?: boolean\n /**\n * If `true`, the autocomplete option will be disabled.\n *\n * @default false\n */\n disabled?: boolean\n /**\n * If `true`, the autocomplete option will be focusable.\n *\n * @default false\n */\n focusable?: boolean\n /**\n * If `true`, the autocomplete option will be disabled.\n *\n * @default false\n *\n * @deprecated Use `disabled` instead.\n */\n isDisabled?: boolean\n /**\n * If `true`, the autocomplete option will be focusable.\n *\n * @default false\n *\n * @deprecated Use `focusable` instead.\n */\n isFocusable?: boolean\n /**\n * The value of the autocomplete option.\n */\n value?: string\n}\n\nexport const useAutocompleteOption = (props: UseAutocompleteOptionProps) => {\n const {\n closeOnSelect,\n focusedIndex,\n inputRef,\n omitSelectedValues,\n setFocusedIndex,\n value,\n optionProps,\n onChange,\n onClose,\n onFocusNext,\n } = useAutocompleteContext()\n const uuid = useId()\n const itemRef = useRef<HTMLLIElement>(null)\n let {\n id,\n children,\n closeOnSelect: customCloseOnSelect,\n disabled,\n focusable,\n icon: customIcon,\n isDisabled,\n isFocusable,\n value: optionValue,\n ...computedProps\n } = { ...optionProps, ...props }\n disabled ??= isDisabled\n focusable ??= isFocusable\n const trulyDisabled = !!disabled && !focusable\n const { descendants, index, register } = useAutocompleteDescendant({\n disabled: trulyDisabled,\n })\n const values = descendants.values()\n const frontValues = values.slice(0, index)\n const isMulti = isArray(value)\n const isDuplicated = frontValues.some(\n ({ node }) => node.dataset.value === (optionValue ?? \"\"),\n )\n const isSelected =\n !isDuplicated &&\n (!isMulti\n ? (optionValue ?? \"\") === value\n : value.includes(optionValue ?? \"\"))\n const isTarget = \"target\" in (itemRef.current?.dataset ?? {})\n const isFocused = index === focusedIndex\n\n id ??= uuid\n\n if (isUndefined(optionValue)) {\n if (isString(children) || isNumber(children)) {\n optionValue = children.toString()\n } else {\n console.warn(\n `${\n !isMulti ? \"Autocomplete\" : \"MultiAutocomplete\"\n }: Cannot infer the option value of complex children. Pass a \\`value\\` prop or use a plain string as children to <Option>.`,\n )\n }\n }\n\n const onClick = useCallback(\n (ev: MouseEvent<HTMLDivElement>) => {\n ev.stopPropagation()\n\n if (disabled || !isTargetOption(ev.currentTarget)) {\n if (inputRef.current) inputRef.current.focus()\n\n return\n }\n\n if (!isDuplicated) setFocusedIndex(index)\n\n onChange(optionValue ?? \"\")\n\n if (inputRef.current) inputRef.current.focus()\n\n if (customCloseOnSelect ?? closeOnSelect) onClose()\n\n if (omitSelectedValues) onFocusNext(index)\n },\n [\n isDuplicated,\n onFocusNext,\n omitSelectedValues,\n disabled,\n optionValue,\n setFocusedIndex,\n index,\n onChange,\n customCloseOnSelect,\n closeOnSelect,\n onClose,\n inputRef,\n ],\n )\n\n const getOptionProps: PropGetter = useCallback(\n (props = {}, ref = null) => {\n const isHidden = !isTarget || (omitSelectedValues && isSelected)\n\n const style: CSSProperties = {\n border: \"0px\",\n clip: \"rect(0px, 0px, 0px, 0px)\",\n height: \"1px\",\n margin: \"-1px\",\n overflow: \"hidden\",\n padding: \"0px\",\n position: \"absolute\",\n whiteSpace: \"nowrap\",\n width: \"1px\",\n }\n\n return {\n ref: mergeRefs(itemRef, ref, register),\n role: \"option\",\n ...computedProps,\n ...props,\n id,\n style: isHidden ? style : undefined,\n \"aria-disabled\": ariaAttr(disabled),\n \"aria-hidden\": ariaAttr(isHidden),\n \"aria-selected\": isSelected,\n \"data-disabled\": dataAttr(disabled),\n \"data-duplicated\": dataAttr(isDuplicated),\n \"data-focus\": dataAttr(isFocused),\n \"data-target\": dataAttr(true),\n \"data-value\": optionValue ?? \"\",\n tabIndex: -1,\n onClick: handlerAll(computedProps.onClick, props.onClick, onClick),\n }\n },\n [\n id,\n isDuplicated,\n optionValue,\n computedProps,\n disabled,\n isFocused,\n isSelected,\n isTarget,\n omitSelectedValues,\n onClick,\n register,\n ],\n )\n\n return {\n children,\n customIcon,\n isFocused,\n isSelected,\n isTarget,\n omitSelectedValues,\n getOptionProps,\n }\n}\n\nexport type UseAutocompleteOptionReturn = ReturnType<\n typeof useAutocompleteOption\n>\n\nexport const useAutocompleteCreate = () => {\n const { isHit, onCreate } = useAutocompleteContext()\n\n const getCreateProps: PropGetter = useCallback(\n (props = {}, ref = null) => {\n const style: CSSProperties = {\n border: \"0px\",\n clip: \"rect(0px, 0px, 0px, 0px)\",\n height: \"1px\",\n margin: \"-1px\",\n overflow: \"hidden\",\n padding: \"0px\",\n position: \"absolute\",\n whiteSpace: \"nowrap\",\n width: \"1px\",\n }\n\n return {\n ref,\n role: \"option\",\n ...props,\n style: isHit ? style : undefined,\n \"aria-hidden\": ariaAttr(isHit),\n \"data-focus\": dataAttr(!isHit),\n tabIndex: -1,\n onClick: handlerAll(props.onClick, onCreate),\n }\n },\n [isHit, onCreate],\n )\n\n return { getCreateProps }\n}\n\nexport type UseAutocompleteCreateReturn = ReturnType<\n typeof useAutocompleteCreate\n>\n\nexport const useAutocompleteEmpty = () => {\n const { isEmpty, isHit } = useAutocompleteContext()\n\n const getEmptyProps: PropGetter = useCallback(\n (props = {}, ref = null) => {\n const isHidden = isHit && !isEmpty\n\n const style: CSSProperties = {\n border: \"0px\",\n clip: \"rect(0px, 0px, 0px, 0px)\",\n height: \"1px\",\n margin: \"-1px\",\n overflow: \"hidden\",\n padding: \"0px\",\n position: \"absolute\",\n whiteSpace: \"nowrap\",\n width: \"1px\",\n }\n\n return {\n ref,\n role: \"presentation\",\n ...props,\n style: isHidden ? style : undefined,\n \"aria-hidden\": ariaAttr(isHidden),\n tabIndex: -1,\n }\n },\n [isHit, isEmpty],\n )\n\n return { getEmptyProps }\n}\n\nexport type UseAutocompleteEmptyReturn = ReturnType<typeof useAutocompleteEmpty>\n","import type { CSSUIObject } from \"@yamada-ui/core\"\nimport type { Dispatch, DOMAttributes, RefObject, SetStateAction } from \"react\"\nimport type { UseAutocompleteProps } from \"./use-autocomplete\"\nimport { createDescendant } from \"@yamada-ui/use-descendant\"\nimport { createContext } from \"@yamada-ui/utils\"\n\nexport const {\n DescendantsContextProvider: AutocompleteDescendantsContextProvider,\n useDescendant: useAutocompleteDescendant,\n useDescendants: useAutocompleteDescendants,\n useDescendantsContext: useAutocompleteDescendantsContext,\n} = createDescendant()\n\ninterface AutocompleteContext\n extends Omit<\n UseAutocompleteProps,\n \"defaultValue\" | \"onChange\" | \"onCreate\" | \"value\"\n > {\n focusedIndex: number\n inputRef: RefObject<HTMLInputElement>\n inputValue: string\n isAllSelected: boolean\n isEmpty: boolean\n isHit: boolean\n isOpen: boolean\n label: string | string[] | undefined\n pickOptions: (value: string) => void\n rebirthOptions: (runFocus?: boolean) => void\n setFocusedIndex: Dispatch<SetStateAction<number>>\n styles: { [key: string]: CSSUIObject | undefined }\n value: string | string[]\n formControlProps: { [key: string]: any }\n inputProps: DOMAttributes<HTMLInputElement>\n onChange: (newValue: string, runRebirth?: boolean) => void\n onClose: () => void\n onCreate: () => void\n onFocusFirst: () => void\n onFocusLast: () => void\n onFocusNext: (index?: number) => void\n onFocusPrev: (index?: number) => void\n onOpen: () => void\n}\n\nexport const [AutocompleteProvider, useAutocompleteContext] =\n createContext<AutocompleteContext>({\n name: \"AutocompleteContext\",\n errorMessage: `useAutocompleteContext returned is 'undefined'. Seems you forgot to wrap the components in \"<Autocomplete />\" or \"<MultiAutocomplete />\"`,\n })\n"],"mappings":"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","names":["import_utils","props"]}
|
|
1
|
+
{"version":3,"sources":["../src/use-autocomplete-option.ts","../src/autocomplete-context.ts"],"sourcesContent":["import type { HTMLUIProps, PropGetter } from \"@yamada-ui/core\"\nimport type { CSSProperties, MouseEvent } from \"react\"\nimport {\n ariaAttr,\n dataAttr,\n handlerAll,\n isArray,\n isHTMLElement,\n isNumber,\n isString,\n isUndefined,\n mergeRefs,\n} from \"@yamada-ui/utils\"\nimport { useCallback, useId, useMemo, useRef } from \"react\"\nimport {\n useAutocompleteContext,\n useAutocompleteDescendant,\n} from \"./autocomplete-context\"\n\nconst isTargetOption = (target: EventTarget | null): boolean =>\n isHTMLElement(target) && !!target.getAttribute(\"role\")?.startsWith(\"option\")\n\nexport interface UseAutocompleteOptionProps\n extends Omit<HTMLUIProps, \"children\" | \"value\"> {\n /**\n * The label of the autocomplete option.\n */\n children?: string\n /**\n * If `true`, the list element will be closed when selected.\n *\n * @default false\n */\n closeOnSelect?: boolean\n /**\n * If `true`, the autocomplete option will be disabled.\n *\n * @default false\n */\n disabled?: boolean\n /**\n * If `true`, the autocomplete option will be focusable.\n *\n * @default false\n */\n focusable?: boolean\n /**\n * If `true`, the autocomplete option will be disabled.\n *\n * @default false\n *\n * @deprecated Use `disabled` instead.\n */\n isDisabled?: boolean\n /**\n * If `true`, the autocomplete option will be focusable.\n *\n * @default false\n *\n * @deprecated Use `focusable` instead.\n */\n isFocusable?: boolean\n /**\n * The value of the autocomplete option.\n */\n value?: string\n}\n\nexport const useAutocompleteOption = (props: UseAutocompleteOptionProps) => {\n const {\n closeOnSelect,\n focusedIndex,\n inputRef,\n omitSelectedValues,\n setFocusedIndex,\n value: selectedValue,\n optionProps,\n onChange,\n onClose,\n onFocusNext,\n } = useAutocompleteContext()\n const uuid = useId()\n const itemRef = useRef<HTMLLIElement>(null)\n const {\n id = uuid,\n children,\n closeOnSelect: customCloseOnSelect,\n isDisabled,\n disabled = isDisabled,\n isFocusable,\n focusable = isFocusable,\n icon: customIcon,\n value: optionValue,\n ...computedProps\n } = { ...optionProps, ...props }\n const trulyDisabled = !!disabled && !focusable\n const { descendants, index, register } = useAutocompleteDescendant({\n disabled: trulyDisabled,\n })\n const values = descendants.values()\n const frontValues = values.slice(0, index)\n const multi = isArray(selectedValue)\n const target = \"target\" in (itemRef.current?.dataset ?? {})\n const focused = index === focusedIndex\n\n const value = useMemo(() => {\n let value = optionValue\n\n if (isUndefined(optionValue)) {\n if (isString(children) || isNumber(children)) {\n value = children.toString()\n } else {\n console.warn(\n `${\n !multi ? \"Autocomplete\" : \"MultiAutocomplete\"\n }: Cannot infer the option value of complex children. Pass a \\`value\\` prop or use a plain string as children to <Option>.`,\n )\n }\n }\n\n return value ?? \"\"\n }, [children, multi, optionValue])\n\n const duplicated = frontValues.some(\n ({ node }) => node.dataset.value === value,\n )\n const selected =\n !duplicated &&\n (!multi ? value === selectedValue : selectedValue.includes(value))\n\n const onClick = useCallback(\n (ev: MouseEvent<HTMLDivElement>) => {\n ev.stopPropagation()\n\n if (disabled || !isTargetOption(ev.currentTarget)) {\n if (inputRef.current) inputRef.current.focus()\n\n return\n }\n\n if (!duplicated) setFocusedIndex(index)\n\n onChange(value)\n\n if (inputRef.current) inputRef.current.focus()\n\n if (customCloseOnSelect ?? closeOnSelect) onClose()\n\n if (omitSelectedValues) onFocusNext(index)\n },\n [\n duplicated,\n onFocusNext,\n omitSelectedValues,\n disabled,\n value,\n setFocusedIndex,\n index,\n onChange,\n customCloseOnSelect,\n closeOnSelect,\n onClose,\n inputRef,\n ],\n )\n\n const getOptionProps: PropGetter = useCallback(\n (props = {}, ref = null) => {\n const isHidden = !target || (omitSelectedValues && selected)\n\n const style: CSSProperties = {\n border: \"0px\",\n clip: \"rect(0px, 0px, 0px, 0px)\",\n height: \"1px\",\n margin: \"-1px\",\n overflow: \"hidden\",\n padding: \"0px\",\n position: \"absolute\",\n whiteSpace: \"nowrap\",\n width: \"1px\",\n }\n\n return {\n ref: mergeRefs(itemRef, ref, register),\n role: \"option\",\n ...computedProps,\n ...props,\n id,\n style: isHidden ? style : undefined,\n \"aria-disabled\": ariaAttr(disabled),\n \"aria-hidden\": ariaAttr(isHidden),\n \"aria-selected\": selected,\n \"data-disabled\": dataAttr(disabled),\n \"data-duplicated\": dataAttr(duplicated),\n \"data-focus\": dataAttr(focused),\n \"data-target\": dataAttr(true),\n \"data-value\": value,\n tabIndex: -1,\n onClick: handlerAll(computedProps.onClick, props.onClick, onClick),\n }\n },\n [\n id,\n duplicated,\n value,\n computedProps,\n disabled,\n focused,\n selected,\n target,\n omitSelectedValues,\n onClick,\n register,\n ],\n )\n\n return {\n target,\n children,\n customIcon,\n focused,\n omitSelectedValues,\n selected,\n getOptionProps,\n }\n}\n\nexport type UseAutocompleteOptionReturn = ReturnType<\n typeof useAutocompleteOption\n>\n\nexport const useAutocompleteCreate = () => {\n const { isHit, onCreate } = useAutocompleteContext()\n\n const getCreateProps: PropGetter = useCallback(\n (props = {}, ref = null) => {\n const style: CSSProperties = {\n border: \"0px\",\n clip: \"rect(0px, 0px, 0px, 0px)\",\n height: \"1px\",\n margin: \"-1px\",\n overflow: \"hidden\",\n padding: \"0px\",\n position: \"absolute\",\n whiteSpace: \"nowrap\",\n width: \"1px\",\n }\n\n return {\n ref,\n role: \"option\",\n ...props,\n style: isHit ? style : undefined,\n \"aria-hidden\": ariaAttr(isHit),\n \"data-focus\": dataAttr(!isHit),\n tabIndex: -1,\n onClick: handlerAll(props.onClick, onCreate),\n }\n },\n [isHit, onCreate],\n )\n\n return { getCreateProps }\n}\n\nexport type UseAutocompleteCreateReturn = ReturnType<\n typeof useAutocompleteCreate\n>\n\nexport const useAutocompleteEmpty = () => {\n const { isEmpty, isHit } = useAutocompleteContext()\n\n const getEmptyProps: PropGetter = useCallback(\n (props = {}, ref = null) => {\n const isHidden = isHit && !isEmpty\n\n const style: CSSProperties = {\n border: \"0px\",\n clip: \"rect(0px, 0px, 0px, 0px)\",\n height: \"1px\",\n margin: \"-1px\",\n overflow: \"hidden\",\n padding: \"0px\",\n position: \"absolute\",\n whiteSpace: \"nowrap\",\n width: \"1px\",\n }\n\n return {\n ref,\n role: \"presentation\",\n ...props,\n style: isHidden ? style : undefined,\n \"aria-hidden\": ariaAttr(isHidden),\n tabIndex: -1,\n }\n },\n [isHit, isEmpty],\n )\n\n return { getEmptyProps }\n}\n\nexport type UseAutocompleteEmptyReturn = ReturnType<typeof useAutocompleteEmpty>\n","import type { CSSUIObject } from \"@yamada-ui/core\"\nimport type { Dispatch, DOMAttributes, RefObject, SetStateAction } from \"react\"\nimport type { UseAutocompleteProps } from \"./use-autocomplete\"\nimport { createDescendant } from \"@yamada-ui/use-descendant\"\nimport { createContext } from \"@yamada-ui/utils\"\n\nexport const {\n DescendantsContextProvider: AutocompleteDescendantsContextProvider,\n useDescendant: useAutocompleteDescendant,\n useDescendants: useAutocompleteDescendants,\n useDescendantsContext: useAutocompleteDescendantsContext,\n} = createDescendant()\n\ninterface AutocompleteContext\n extends Omit<\n UseAutocompleteProps,\n \"defaultValue\" | \"onChange\" | \"onCreate\" | \"value\"\n > {\n focusedIndex: number\n inputRef: RefObject<HTMLInputElement>\n inputValue: string\n isAllSelected: boolean\n isEmpty: boolean\n isHit: boolean\n isOpen: boolean\n label: string | string[] | undefined\n pickOptions: (value: string) => void\n rebirthOptions: (runFocus?: boolean) => void\n setFocusedIndex: Dispatch<SetStateAction<number>>\n styles: { [key: string]: CSSUIObject | undefined }\n value: string | string[]\n formControlProps: { [key: string]: any }\n inputProps: DOMAttributes<HTMLInputElement>\n onChange: (newValue: string, runRebirth?: boolean) => void\n onClose: () => void\n onCreate: () => void\n onFocusFirst: () => void\n onFocusLast: () => void\n onFocusNext: (index?: number) => void\n onFocusPrev: (index?: number) => void\n onOpen: () => void\n}\n\nexport const [AutocompleteProvider, useAutocompleteContext] =\n createContext<AutocompleteContext>({\n name: \"AutocompleteContext\",\n errorMessage: `useAutocompleteContext returned is 'undefined'. Seems you forgot to wrap the components in \"<Autocomplete />\" or \"<MultiAutocomplete />\"`,\n })\n"],"mappings":"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","names":["import_utils","value","props"]}
|
package/dist/use-autocomplete.js
CHANGED
|
@@ -163,7 +163,7 @@ var useAutocompleteOption = (props) => {
|
|
|
163
163
|
inputRef,
|
|
164
164
|
omitSelectedValues,
|
|
165
165
|
setFocusedIndex,
|
|
166
|
-
value,
|
|
166
|
+
value: selectedValue,
|
|
167
167
|
optionProps,
|
|
168
168
|
onChange,
|
|
169
169
|
onClose,
|
|
@@ -171,43 +171,44 @@ var useAutocompleteOption = (props) => {
|
|
|
171
171
|
} = useAutocompleteContext();
|
|
172
172
|
const uuid = (0, import_react2.useId)();
|
|
173
173
|
const itemRef = (0, import_react2.useRef)(null);
|
|
174
|
-
|
|
175
|
-
id,
|
|
174
|
+
const {
|
|
175
|
+
id = uuid,
|
|
176
176
|
children,
|
|
177
177
|
closeOnSelect: customCloseOnSelect,
|
|
178
|
-
disabled,
|
|
179
|
-
focusable,
|
|
180
|
-
icon: customIcon,
|
|
181
178
|
isDisabled,
|
|
179
|
+
disabled = isDisabled,
|
|
182
180
|
isFocusable,
|
|
181
|
+
focusable = isFocusable,
|
|
182
|
+
icon: customIcon,
|
|
183
183
|
value: optionValue,
|
|
184
184
|
...computedProps
|
|
185
185
|
} = { ...optionProps, ...props };
|
|
186
|
-
disabled != null ? disabled : disabled = isDisabled;
|
|
187
|
-
focusable != null ? focusable : focusable = isFocusable;
|
|
188
186
|
const trulyDisabled = !!disabled && !focusable;
|
|
189
187
|
const { descendants, index, register } = useAutocompleteDescendant({
|
|
190
188
|
disabled: trulyDisabled
|
|
191
189
|
});
|
|
192
190
|
const values = descendants.values();
|
|
193
191
|
const frontValues = values.slice(0, index);
|
|
194
|
-
const
|
|
195
|
-
const
|
|
196
|
-
|
|
197
|
-
)
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
`${!isMulti ? "Autocomplete" : "MultiAutocomplete"}: Cannot infer the option value of complex children. Pass a \`value\` prop or use a plain string as children to <Option>.`
|
|
208
|
-
);
|
|
192
|
+
const multi = (0, import_utils3.isArray)(selectedValue);
|
|
193
|
+
const target = "target" in ((_b = (_a = itemRef.current) == null ? void 0 : _a.dataset) != null ? _b : {});
|
|
194
|
+
const focused = index === focusedIndex;
|
|
195
|
+
const value = (0, import_react2.useMemo)(() => {
|
|
196
|
+
let value2 = optionValue;
|
|
197
|
+
if ((0, import_utils3.isUndefined)(optionValue)) {
|
|
198
|
+
if ((0, import_utils3.isString)(children) || (0, import_utils3.isNumber)(children)) {
|
|
199
|
+
value2 = children.toString();
|
|
200
|
+
} else {
|
|
201
|
+
console.warn(
|
|
202
|
+
`${!multi ? "Autocomplete" : "MultiAutocomplete"}: Cannot infer the option value of complex children. Pass a \`value\` prop or use a plain string as children to <Option>.`
|
|
203
|
+
);
|
|
204
|
+
}
|
|
209
205
|
}
|
|
210
|
-
|
|
206
|
+
return value2 != null ? value2 : "";
|
|
207
|
+
}, [children, multi, optionValue]);
|
|
208
|
+
const duplicated = frontValues.some(
|
|
209
|
+
({ node }) => node.dataset.value === value
|
|
210
|
+
);
|
|
211
|
+
const selected = !duplicated && (!multi ? value === selectedValue : selectedValue.includes(value));
|
|
211
212
|
const onClick = (0, import_react2.useCallback)(
|
|
212
213
|
(ev) => {
|
|
213
214
|
ev.stopPropagation();
|
|
@@ -215,18 +216,18 @@ var useAutocompleteOption = (props) => {
|
|
|
215
216
|
if (inputRef.current) inputRef.current.focus();
|
|
216
217
|
return;
|
|
217
218
|
}
|
|
218
|
-
if (!
|
|
219
|
-
onChange(
|
|
219
|
+
if (!duplicated) setFocusedIndex(index);
|
|
220
|
+
onChange(value);
|
|
220
221
|
if (inputRef.current) inputRef.current.focus();
|
|
221
222
|
if (customCloseOnSelect != null ? customCloseOnSelect : closeOnSelect) onClose();
|
|
222
223
|
if (omitSelectedValues) onFocusNext(index);
|
|
223
224
|
},
|
|
224
225
|
[
|
|
225
|
-
|
|
226
|
+
duplicated,
|
|
226
227
|
onFocusNext,
|
|
227
228
|
omitSelectedValues,
|
|
228
229
|
disabled,
|
|
229
|
-
|
|
230
|
+
value,
|
|
230
231
|
setFocusedIndex,
|
|
231
232
|
index,
|
|
232
233
|
onChange,
|
|
@@ -238,7 +239,7 @@ var useAutocompleteOption = (props) => {
|
|
|
238
239
|
);
|
|
239
240
|
const getOptionProps = (0, import_react2.useCallback)(
|
|
240
241
|
(props2 = {}, ref = null) => {
|
|
241
|
-
const isHidden = !
|
|
242
|
+
const isHidden = !target || omitSelectedValues && selected;
|
|
242
243
|
const style = {
|
|
243
244
|
border: "0px",
|
|
244
245
|
clip: "rect(0px, 0px, 0px, 0px)",
|
|
@@ -259,37 +260,37 @@ var useAutocompleteOption = (props) => {
|
|
|
259
260
|
style: isHidden ? style : void 0,
|
|
260
261
|
"aria-disabled": (0, import_utils3.ariaAttr)(disabled),
|
|
261
262
|
"aria-hidden": (0, import_utils3.ariaAttr)(isHidden),
|
|
262
|
-
"aria-selected":
|
|
263
|
+
"aria-selected": selected,
|
|
263
264
|
"data-disabled": (0, import_utils3.dataAttr)(disabled),
|
|
264
|
-
"data-duplicated": (0, import_utils3.dataAttr)(
|
|
265
|
-
"data-focus": (0, import_utils3.dataAttr)(
|
|
265
|
+
"data-duplicated": (0, import_utils3.dataAttr)(duplicated),
|
|
266
|
+
"data-focus": (0, import_utils3.dataAttr)(focused),
|
|
266
267
|
"data-target": (0, import_utils3.dataAttr)(true),
|
|
267
|
-
"data-value":
|
|
268
|
+
"data-value": value,
|
|
268
269
|
tabIndex: -1,
|
|
269
270
|
onClick: (0, import_utils3.handlerAll)(computedProps.onClick, props2.onClick, onClick)
|
|
270
271
|
};
|
|
271
272
|
},
|
|
272
273
|
[
|
|
273
274
|
id,
|
|
274
|
-
|
|
275
|
-
|
|
275
|
+
duplicated,
|
|
276
|
+
value,
|
|
276
277
|
computedProps,
|
|
277
278
|
disabled,
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
279
|
+
focused,
|
|
280
|
+
selected,
|
|
281
|
+
target,
|
|
281
282
|
omitSelectedValues,
|
|
282
283
|
onClick,
|
|
283
284
|
register
|
|
284
285
|
]
|
|
285
286
|
);
|
|
286
287
|
return {
|
|
288
|
+
target,
|
|
287
289
|
children,
|
|
288
290
|
customIcon,
|
|
289
|
-
|
|
290
|
-
isSelected,
|
|
291
|
-
isTarget,
|
|
291
|
+
focused,
|
|
292
292
|
omitSelectedValues,
|
|
293
|
+
selected,
|
|
293
294
|
getOptionProps
|
|
294
295
|
};
|
|
295
296
|
};
|
|
@@ -299,7 +300,7 @@ var import_jsx_runtime2 = require("react/jsx-runtime");
|
|
|
299
300
|
var AutocompleteOption = (0, import_core2.forwardRef)(
|
|
300
301
|
({ className, icon, ...rest }, ref) => {
|
|
301
302
|
const { styles } = useAutocompleteContext();
|
|
302
|
-
const { children, customIcon,
|
|
303
|
+
const { children, customIcon, selected, getOptionProps } = useAutocompleteOption(rest);
|
|
303
304
|
icon != null ? icon : icon = customIcon;
|
|
304
305
|
const css = {
|
|
305
306
|
alignItems: "center",
|
|
@@ -321,7 +322,7 @@ var AutocompleteOption = (0, import_core2.forwardRef)(
|
|
|
321
322
|
__css: css,
|
|
322
323
|
...getOptionProps({}, ref),
|
|
323
324
|
children: [
|
|
324
|
-
icon !== null ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(AutocompleteItemIcon, { opacity:
|
|
325
|
+
icon !== null ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(AutocompleteItemIcon, { opacity: selected ? 1 : 0, children: icon || /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(AutocompleteCheckIcon, {}) }) : null,
|
|
325
326
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_core2.ui.span, { style: { flex: 1 }, "data-label": true, children })
|
|
326
327
|
]
|
|
327
328
|
}
|