@pk-design/react-tailwind 1.7.2 → 1.8.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/dist/cjs/components/Button/Button.js +46 -28
- package/dist/cjs/components/Button/Button.js.map +1 -1
- package/dist/cjs/components/Checkbox/Checkbox.js +10 -4
- package/dist/cjs/components/Checkbox/Checkbox.js.map +1 -1
- package/dist/cjs/components/CheckboxGroup/CheckboxGroup.js +19 -13
- package/dist/cjs/components/CheckboxGroup/CheckboxGroup.js.map +1 -1
- package/dist/cjs/components/DataList/DataList.js +2 -2
- package/dist/cjs/components/DataList/DataList.js.map +1 -1
- package/dist/cjs/components/DataTable/DataTable.js +72 -40
- package/dist/cjs/components/DataTable/DataTable.js.map +1 -1
- package/dist/cjs/components/DataTable/DataTable.utils.js +2 -1
- package/dist/cjs/components/DataTable/DataTable.utils.js.map +1 -1
- package/dist/cjs/components/Input/Input.js +11 -8
- package/dist/cjs/components/Input/Input.js.map +1 -1
- package/dist/cjs/components/Pagination/Pagination.js +27 -15
- package/dist/cjs/components/Pagination/Pagination.js.map +1 -1
- package/dist/cjs/components/Radio/Radio.js +9 -5
- package/dist/cjs/components/Radio/Radio.js.map +1 -1
- package/dist/cjs/components/RadioGroup/RadioGroup.js +8 -3
- package/dist/cjs/components/RadioGroup/RadioGroup.js.map +1 -1
- package/dist/cjs/components/SelectBox/SelectBox.js +24 -25
- package/dist/cjs/components/SelectBox/SelectBox.js.map +1 -1
- package/dist/cjs/components/Textarea/Textarea.js +8 -5
- package/dist/cjs/components/Textarea/Textarea.js.map +1 -1
- package/dist/es/components/Button/Button.js +46 -28
- package/dist/es/components/Button/Button.js.map +1 -1
- package/dist/es/components/Checkbox/Checkbox.js +10 -4
- package/dist/es/components/Checkbox/Checkbox.js.map +1 -1
- package/dist/es/components/CheckboxGroup/CheckboxGroup.js +20 -14
- package/dist/es/components/CheckboxGroup/CheckboxGroup.js.map +1 -1
- package/dist/es/components/DataList/DataList.js +2 -2
- package/dist/es/components/DataList/DataList.js.map +1 -1
- package/dist/es/components/DataTable/DataTable.js +74 -42
- package/dist/es/components/DataTable/DataTable.js.map +1 -1
- package/dist/es/components/DataTable/DataTable.utils.js +2 -1
- package/dist/es/components/DataTable/DataTable.utils.js.map +1 -1
- package/dist/es/components/Input/Input.js +12 -9
- package/dist/es/components/Input/Input.js.map +1 -1
- package/dist/es/components/Pagination/Pagination.js +27 -15
- package/dist/es/components/Pagination/Pagination.js.map +1 -1
- package/dist/es/components/Radio/Radio.js +9 -5
- package/dist/es/components/Radio/Radio.js.map +1 -1
- package/dist/es/components/RadioGroup/RadioGroup.js +9 -4
- package/dist/es/components/RadioGroup/RadioGroup.js.map +1 -1
- package/dist/es/components/SelectBox/SelectBox.js +24 -25
- package/dist/es/components/SelectBox/SelectBox.js.map +1 -1
- package/dist/es/components/Textarea/Textarea.js +9 -6
- package/dist/es/components/Textarea/Textarea.js.map +1 -1
- package/dist/react-tailwind.cjs.js +264 -177
- package/dist/react-tailwind.cjs.js.map +1 -1
- package/dist/react-tailwind.es.js +264 -177
- package/dist/react-tailwind.es.js.map +1 -1
- package/dist/types/components/Button/Button.types.d.ts +5 -0
- package/dist/types/components/CheckboxGroup/CheckboxGroup.types.d.ts +9 -1
- package/dist/types/components/DataList/DataList.d.ts +1 -1
- package/dist/types/components/DataList/DataList.types.d.ts +8 -0
- package/dist/types/components/DataTable/DataTable.d.ts +1 -1
- package/dist/types/components/DataTable/DataTable.types.d.ts +46 -0
- package/dist/types/components/Pagination/Pagination.types.d.ts +21 -24
- package/dist/types/components/RadioGroup/RadioGroup.types.d.ts +8 -0
- package/package.json +1 -1
|
@@ -18,6 +18,8 @@ import SvgCirclePlus from '../Icons/CirclePlus.svg.js';
|
|
|
18
18
|
import { buildInputClass } from '../Input/Input.js';
|
|
19
19
|
import { BodyText } from '../BodyText/BodyText.js';
|
|
20
20
|
|
|
21
|
+
const NOOP = () => { };
|
|
22
|
+
const EMPTY_ARRAY = [];
|
|
21
23
|
const sizeClasses = {
|
|
22
24
|
sm: {
|
|
23
25
|
input: 'px-2.5 py-1.5 text-xs leading-5 min-h-[32px]',
|
|
@@ -39,7 +41,7 @@ const sizeClasses = {
|
|
|
39
41
|
},
|
|
40
42
|
};
|
|
41
43
|
const SelectBox = forwardRef((props, forwardedRef) => {
|
|
42
|
-
const { labelKey = 'label', valueKey = 'value', name, id = name, options =
|
|
44
|
+
const { labelKey = 'label', valueKey = 'value', name, id = name, options = EMPTY_ARRAY, groups, selected, size = 'md', label = null, labelWrapperClass = '', labelClass = '', labelHint = null, disabled = false, containerClass = '', onChange = NOOP, placeholder, dropdownContainerClass = 'z-20', multiple = false, maxSelection, showSelectAll = false, immediate = true, showErrorMessage = true, error = null, helperText, leftGroup, renderOption, async = false, searchable = true, required = false, allowAdd = false, addNewText = 'Create', onAdd = NOOP, allowClear = false, allowFreeText = false, modalDropdown = false, noOptionsText = 'No options available', } = props;
|
|
43
45
|
if (props.asBottomSheet || props.mobileMode === 'sheet') {
|
|
44
46
|
return jsx(MobilePicker, { ...props });
|
|
45
47
|
}
|
|
@@ -57,7 +59,7 @@ const SelectBox = forwardRef((props, forwardedRef) => {
|
|
|
57
59
|
const shouldShowTypeToSearch = async && !query && !optionsLoading && allOptions.length === 0;
|
|
58
60
|
const currentSize = sizeClasses[size] || sizeClasses.md;
|
|
59
61
|
const baseInputClass = useMemo(() => buildInputClass('', { disabled, hasError, size }), [disabled, hasError, size]);
|
|
60
|
-
const chevronIconClass = buildClassName(currentSize.icon, 'stroke-gray-500 group-data-[hover]:stroke-gray-800', 'dark:stroke-gray-300 dark:group-data-[hover]:stroke-gray-100', disabled && 'dark:stroke-gray-600 stroke-gray-400');
|
|
62
|
+
const chevronIconClass = useMemo(() => buildClassName(currentSize.icon, 'stroke-gray-500 group-data-[hover]:stroke-gray-800', 'dark:stroke-gray-300 dark:group-data-[hover]:stroke-gray-100', disabled && 'dark:stroke-gray-600 stroke-gray-400'), [currentSize.icon, disabled]);
|
|
61
63
|
const inputRef = useRef(null);
|
|
62
64
|
const containerRef = useRef(null);
|
|
63
65
|
useImperativeHandle(forwardedRef, () => inputRef.current, [inputRef]);
|
|
@@ -133,7 +135,7 @@ const SelectBox = forwardRef((props, forwardedRef) => {
|
|
|
133
135
|
maxSelection,
|
|
134
136
|
onChange,
|
|
135
137
|
]);
|
|
136
|
-
const removeSelection = (idx) => {
|
|
138
|
+
const removeSelection = useCallback((idx) => {
|
|
137
139
|
var _a;
|
|
138
140
|
if (!isArray(selected))
|
|
139
141
|
return;
|
|
@@ -141,7 +143,7 @@ const SelectBox = forwardRef((props, forwardedRef) => {
|
|
|
141
143
|
next.splice(idx, 1);
|
|
142
144
|
onChange(next);
|
|
143
145
|
(_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.focus();
|
|
144
|
-
};
|
|
146
|
+
}, [selected, onChange]);
|
|
145
147
|
const handleOnChangeInternal = useCallback((value) => {
|
|
146
148
|
if (value === null) {
|
|
147
149
|
onChange(multiple ? [] : null);
|
|
@@ -185,9 +187,7 @@ const SelectBox = forwardRef((props, forwardedRef) => {
|
|
|
185
187
|
}
|
|
186
188
|
}, [onAdd, handleOnChangeInternal]);
|
|
187
189
|
const onSearchRef = useRef(props.onSearch);
|
|
188
|
-
|
|
189
|
-
onSearchRef.current = props.onSearch;
|
|
190
|
-
}, [props.onSearch]);
|
|
190
|
+
onSearchRef.current = props.onSearch;
|
|
191
191
|
const handleSearch = useCallback(async (searchString) => {
|
|
192
192
|
var _a;
|
|
193
193
|
try {
|
|
@@ -219,19 +219,27 @@ const SelectBox = forwardRef((props, forwardedRef) => {
|
|
|
219
219
|
return selected !== null && selected !== void 0 ? selected : null;
|
|
220
220
|
}
|
|
221
221
|
}, [multiple, selected]);
|
|
222
|
+
const selectedValueSet = useMemo(() => {
|
|
223
|
+
if (!normalizedSelected)
|
|
224
|
+
return new Set();
|
|
225
|
+
if (Array.isArray(normalizedSelected)) {
|
|
226
|
+
return new Set(normalizedSelected.map((s) => getValue(s)));
|
|
227
|
+
}
|
|
228
|
+
return new Set([getValue(normalizedSelected)]);
|
|
229
|
+
}, [normalizedSelected, getValue]);
|
|
222
230
|
const isAllSelected = useMemo(() => {
|
|
223
231
|
if (!multiple || !Array.isArray(normalizedSelected) || !allOptions.length)
|
|
224
232
|
return false;
|
|
225
233
|
return allOptions.length === normalizedSelected.length;
|
|
226
234
|
}, [multiple, normalizedSelected, allOptions]);
|
|
227
|
-
const handleToggleSelectAll = () => {
|
|
235
|
+
const handleToggleSelectAll = useCallback(() => {
|
|
228
236
|
if (isAllSelected) {
|
|
229
237
|
onChange([]);
|
|
230
238
|
}
|
|
231
239
|
else {
|
|
232
240
|
onChange(allOptions);
|
|
233
241
|
}
|
|
234
|
-
};
|
|
242
|
+
}, [isAllSelected, onChange, allOptions]);
|
|
235
243
|
const hasLeftGroup = leftGroup != null && leftGroup !== undefined;
|
|
236
244
|
const hasFreeTextOption = Boolean(allowFreeText &&
|
|
237
245
|
query.trim() &&
|
|
@@ -240,6 +248,11 @@ const SelectBox = forwardRef((props, forwardedRef) => {
|
|
|
240
248
|
const hasGroupOptions = Boolean(filteredGroups && filteredGroups.length > 0);
|
|
241
249
|
const hasFlatOptions = filteredOptions.length > 0;
|
|
242
250
|
const hasAnyOptionsToDisplay = hasFlatOptions || hasGroupOptions || hasFreeTextOption || hasAddOption;
|
|
251
|
+
const renderOptionItem = (option) => {
|
|
252
|
+
const optVal = getValue(option);
|
|
253
|
+
const isOptSelected = selectedValueSet.has(optVal);
|
|
254
|
+
return (jsx(ComboboxOption, { disabled: option.disabled, value: option, className: "group rounded-lg py-1.5 px-3 select-none data-[focus]:bg-gray-100 dark:data-[focus]:bg-white/10 data-disabled:opacity-50 cursor-pointer data-disabled:pointer-events-none", children: renderOption ? (renderOption(option, Boolean(isOptSelected))) : (jsxs("div", { className: "flex items-center justify-between gap-2 text-gray-900 dark:text-white group-data-[selected]:text-blue-600", children: [jsx("span", { className: "text-sm/6", children: getDisplayValue(option) }), jsx(SvgCheck, { className: "invisible size-5 dark:stroke-gray-300 group-data-[selected]:visible" })] })) }, optVal));
|
|
255
|
+
};
|
|
243
256
|
return (jsxs("div", { className: buildClassName('group space-y-2', hasError && 'has-error', containerClass), ref: containerRef, children: [label && (jsxs("div", { className: buildClassName('flex items-center justify-between', labelWrapperClass), children: [jsx(Label, { className: labelClass, htmlFor: id, "aria-required": required, children: label }), labelHint && jsx(TextContent, { xsmall: true, children: labelHint })] })), jsxs(Combobox, { multiple: multiple, immediate: immediate, name: name, value: normalizedSelected, onChange: comboboxOnChangeWrapper, onClose: () => setQuery(''), disabled: disabled, by: (a, b) => (a && b ? getValue(a) === getValue(b) : a === b), children: [multiple ? (jsxs("div", { className: buildClassName(baseInputClass, 'flex flex-wrap gap-2 peer relative', hasLeftGroup ? (size === 'lg' ? 'ps-12' : size === 'sm' ? 'ps-8' : 'ps-10') : ''), ref: forwardedRef, children: [hasLeftGroup && (jsx("span", { className: buildClassName('absolute left-0 top-0 h-full flex items-center justify-center text-gray-400 dark:text-gray-500', currentSize.group), children: leftGroup })), isArray(normalizedSelected) &&
|
|
244
257
|
(normalizedSelected === null || normalizedSelected === void 0 ? void 0 : normalizedSelected.length) > 0 &&
|
|
245
258
|
normalizedSelected.map((option, idx) => (jsx(Badge, { theme: "secondary", size: currentSize.badgeSize, removable: !disabled, onRemove: () => removeSelection(idx), children: getDisplayValue(option) }, `${getValue(option)}-${idx}`))), jsx(ComboboxInput, { className: "outline-none flex-1 dark:placeholder-gray-400 placeholder-gray-400 bg-transparent", "aria-label": name, value: query, autoComplete: "off", placeholder: (normalizedSelected === null || normalizedSelected === void 0 ? void 0 : normalizedSelected.length) ? '' : placeholder, onChange: (e) => {
|
|
@@ -283,23 +296,9 @@ const SelectBox = forwardRef((props, forwardedRef) => {
|
|
|
283
296
|
}, className: buildClassName(baseInputClass, hasLeftGroup ? (size === 'lg' ? 'ps-12' : size === 'sm' ? 'ps-8' : 'ps-10') : ''), disabled: disabled, id: id, readOnly: !searchable, ref: inputRef, "data-testid": "combobox-input" }), allowClear && !isEmpty(normalizedSelected) && (jsx(Button, { size: "xs", iconOnly: true, "aria-label": "Clear selection", theme: "secondary", variant: "plain", className: "group absolute inset-y-0 right-8 h-6 top-2", onClick: () => handleOnChangeInternal(multiple ? [] : null), disabled: disabled, "data-testid": "combobox-clear-button", noOutlineOnFocus: true, children: jsx(SvgX, { className: "size-4 stroke-gray-500 dark:stroke-gray-300" }) })), jsx(ComboboxButton, { className: "group absolute inset-y-0 right-0 px-2.5 flex items-center justify-center", "data-testid": "combobox-button", children: jsx(SvgChevronDown, { className: chevronIconClass }) })] })), jsxs(ComboboxOptions, { anchor: { to: 'bottom', gap: 5 }, as: "div", modal: modalDropdown, className: buildClassName('w-[var(--input-width)] rounded-lg border border-[var(--ui-border)] bg-white dark:bg-gray-800 p-1 shadow-lg max-h-80 overflow-y-auto z-50 [--anchor-gap:var(--spacing-1)]', '[--anchor-max-height:20rem]', 'origin-top border transition duration-200 ease-[cubic-bezier(0.4, 0.0, 0.2, 1)] data-[closed]:translate-y-[-15%] data-[closed]:opacity-0', dropdownContainerClass), transition: true, "data-testid": "combobox-options", children: [multiple && showSelectAll && allOptions.length > 0 && (jsxs("div", { className: "pb-1 mb-1 border-b border-[var(--ui-border-muted)] px-3 pt-1 flex items-center justify-between", children: [jsx("button", { type: "button", onClick: handleToggleSelectAll, className: "text-xs font-semibold text-blue-600 dark:text-blue-400 hover:underline cursor-pointer", children: isAllSelected ? 'Deselect All' : 'Select All' }), jsxs("span", { className: "text-[11px] font-medium text-gray-400", children: [Array.isArray(normalizedSelected) ? normalizedSelected.length : 0, " of", ' ', allOptions.length] })] })), optionsLoading ? (jsx(BodyText, { "data-testid": "options-loading", className: "flex items-center justify-center py-2 px-3 select-none", children: jsx(Loader, { size: "sm" }) })) : shouldShowTypeToSearch ? (jsx(BodyText, { className: "flex items-center justify-between py-2 px-3 select-none", children: "Type to search..." })) : (jsxs("div", { children: [allowFreeText &&
|
|
284
297
|
query.trim() &&
|
|
285
298
|
!allOptions.some((opt) => { var _a; return ((_a = getDisplayValue(opt)) === null || _a === void 0 ? void 0 : _a.toLowerCase()) === query.trim().toLowerCase(); }) && (jsx(ComboboxOption, { value: createFreeTextOption(query.trim()), className: "group flex items-center gap-2 rounded-lg py-1.5 px-3 select-none text-sm data-[focus]:bg-blue-50 dark:data-[focus]:bg-blue-950/40 text-blue-600 dark:text-blue-400 font-medium cursor-pointer w-full", "data-testid": "freetext-option", children: jsxs("span", { children: ["Use \"", query.trim(), "\""] }) }, `freetext-${query.trim()}`)), filteredGroups
|
|
286
|
-
? filteredGroups.map((grp, gIdx) => (jsxs("div", { children: [jsx("div", { className: "text-[11px] font-bold uppercase tracking-wider text-gray-400 dark:text-gray-500 px-3 py-1 select-none", children: grp.group }), grp.options.map(
|
|
287
|
-
const optVal = getValue(option);
|
|
288
|
-
const isOptSelected = multiple
|
|
289
|
-
? isArray(normalizedSelected) &&
|
|
290
|
-
normalizedSelected.some((s) => getValue(s) === optVal)
|
|
291
|
-
: normalizedSelected && getValue(normalizedSelected) === optVal;
|
|
292
|
-
return (jsx(ComboboxOption, { disabled: option.disabled, value: option, className: "group rounded-lg py-1.5 px-3 select-none data-[focus]:bg-gray-100 dark:data-[focus]:bg-white/10 data-disabled:opacity-50 cursor-pointer data-disabled:pointer-events-none", children: renderOption ? (renderOption(option, Boolean(isOptSelected))) : (jsxs("div", { className: "flex items-center justify-between gap-2 text-gray-900 dark:text-white group-data-[selected]:text-blue-600", children: [jsx("span", { className: "text-sm/6", children: getDisplayValue(option) }), jsx(SvgCheck, { className: "invisible size-5 dark:stroke-gray-300 group-data-[selected]:visible" })] })) }, optVal));
|
|
293
|
-
})] }, gIdx)))
|
|
299
|
+
? filteredGroups.map((grp, gIdx) => (jsxs("div", { children: [jsx("div", { className: "text-[11px] font-bold uppercase tracking-wider text-gray-400 dark:text-gray-500 px-3 py-1 select-none", children: grp.group }), grp.options.map(renderOptionItem)] }, gIdx)))
|
|
294
300
|
: /* Render Standard Flat Options */
|
|
295
|
-
filteredOptions.map((
|
|
296
|
-
const optVal = getValue(option);
|
|
297
|
-
const isOptSelected = multiple
|
|
298
|
-
? isArray(normalizedSelected) &&
|
|
299
|
-
normalizedSelected.some((s) => getValue(s) === optVal)
|
|
300
|
-
: normalizedSelected && getValue(normalizedSelected) === optVal;
|
|
301
|
-
return (jsx(ComboboxOption, { disabled: option.disabled, value: option, className: "group rounded-lg py-1.5 px-3 select-none data-[focus]:bg-gray-100 dark:data-[focus]:bg-white/10 data-disabled:opacity-50 cursor-pointer data-disabled:pointer-events-none", children: renderOption ? (renderOption(option, Boolean(isOptSelected))) : (jsxs("div", { className: "flex items-center justify-between gap-2 text-gray-900 dark:text-white group-data-[selected]:text-blue-600", children: [jsx("span", { className: "text-sm/6", children: getDisplayValue(option) }), jsx(SvgCheck, { className: "invisible size-5 dark:stroke-gray-300 group-data-[selected]:visible" })] })) }, optVal));
|
|
302
|
-
}), !hasAnyOptionsToDisplay && Boolean(noOptionsText) && (jsxs("div", { "data-testid": "no-result-found", className: "flex items-center gap-2 py-1.5 px-3 select-none", children: [jsx(TextContent, { muted: true, small: true, children: noOptionsText }), Boolean(query.trim()) && (jsxs(TextContent, { strong: true, small: true, children: ["\"", query.trim(), "\""] }))] })), !allowFreeText && allowAdd && Boolean(query.trim()) && (jsx(ComboboxOption, { value: query, className: "group rounded-lg py-1.5 px-3 cursor-pointer text-gray-700 dark:text-gray-300 data-[focus]:bg-gray-100 dark:data-[focus]:bg-gray-700", onClick: () => void handleAddAndSelect(query), children: jsxs("div", { className: "flex items-center gap-2", children: [jsx(SvgCirclePlus, { className: "size-4.5" }), jsxs(TextContent, { children: [addNewText, " \"", query, "\""] })] }) }, `add-${query.trim()}`))] }))] })] }), showErrorMessage && error && (jsx("div", { className: "mt-1", children: jsx(TextContent, { error: true, small: true, children: error }) })), !error && helperText && (jsx("div", { className: "mt-1", children: jsx(TextContent, { muted: true, small: true, children: helperText }) }))] }));
|
|
301
|
+
filteredOptions.map(renderOptionItem), !hasAnyOptionsToDisplay && Boolean(noOptionsText) && (jsxs("div", { "data-testid": "no-result-found", className: "flex items-center gap-2 py-1.5 px-3 select-none", children: [jsx(TextContent, { muted: true, small: true, children: noOptionsText }), Boolean(query.trim()) && (jsxs(TextContent, { strong: true, small: true, children: ["\"", query.trim(), "\""] }))] })), !allowFreeText && allowAdd && Boolean(query.trim()) && (jsx(ComboboxOption, { value: query, className: "group rounded-lg py-1.5 px-3 cursor-pointer text-gray-700 dark:text-gray-300 data-[focus]:bg-gray-100 dark:data-[focus]:bg-gray-700", onClick: () => void handleAddAndSelect(query), children: jsxs("div", { className: "flex items-center gap-2", children: [jsx(SvgCirclePlus, { className: "size-4.5" }), jsxs(TextContent, { children: [addNewText, " \"", query, "\""] })] }) }, `add-${query.trim()}`))] }))] })] }), showErrorMessage && error && (jsx("div", { className: "mt-1", children: jsx(TextContent, { error: true, small: true, children: error }) })), !error && helperText && (jsx("div", { className: "mt-1", children: jsx(TextContent, { muted: true, small: true, children: helperText }) }))] }));
|
|
303
302
|
});
|
|
304
303
|
SelectBox.displayName = 'SelectBox';
|
|
305
304
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectBox.js","sources":["../../../../../src/components/SelectBox/SelectBox.tsx"],"sourcesContent":["import {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react'\nimport {\n Combobox,\n ComboboxButton,\n ComboboxInput,\n ComboboxOption,\n ComboboxOptions,\n} from '@headlessui/react'\n\nimport { Label } from '../Label'\nimport { Badge } from '../Badge'\nimport { Loader } from '../Loader'\nimport { TextContent } from '../TextContent'\nimport { Button } from '../Button'\nimport { MobilePicker } from '../MobilePicker'\n\nimport { isArray } from '../../utils/is-array'\nimport { buildClassName } from '../../utils/build-classname'\nimport { isEmpty } from '../../utils/is-empty'\nimport { useDebounce } from '../../hooks/use-debounce'\n\nimport CheckIcon from '../Icons/Check.svg'\nimport ChevronDownIcon from '../Icons/ChevronDown.svg'\nimport XIcon from '../Icons/X.svg'\nimport CirclePlusIcon from '../Icons/CirclePlus.svg'\nimport type { BaseOption, SelectBoxProps, SelectBoxSize } from './SelectBox.types'\nimport { buildInputClass } from '../Input'\nimport { BodyText } from '../BodyText'\n\nconst sizeClasses: Record<\n SelectBoxSize,\n { input: string; group: string; icon: string; badgeSize: 'sm' | 'md' }\n> = {\n sm: {\n input: 'px-2.5 py-1.5 text-xs leading-5 min-h-[32px]',\n group: 'w-8 text-xs',\n icon: 'size-3.5',\n badgeSize: 'sm',\n },\n md: {\n input: 'px-3.5 py-2 text-sm leading-6 min-h-[38px]',\n group: 'w-10 text-sm',\n icon: 'size-4',\n badgeSize: 'md',\n },\n lg: {\n input: 'px-4 py-2.5 text-base leading-7 min-h-[46px]',\n group: 'w-12 text-base',\n icon: 'size-5',\n badgeSize: 'md',\n },\n}\n\nexport const SelectBox = forwardRef(\n <T extends BaseOption | string = BaseOption>(\n props: SelectBoxProps<T>,\n forwardedRef: React.Ref<HTMLInputElement | HTMLDivElement | null>,\n ) => {\n const {\n labelKey = 'label',\n valueKey = 'value',\n name,\n id = name,\n options = [],\n groups,\n selected,\n size = 'md',\n label = null,\n labelWrapperClass = '',\n labelClass = '',\n labelHint = null,\n disabled = false,\n containerClass = '',\n onChange = () => {},\n placeholder,\n dropdownContainerClass = 'z-20',\n multiple = false,\n maxSelection,\n showSelectAll = false,\n immediate = true,\n showErrorMessage = true,\n error = null,\n helperText,\n leftGroup,\n renderOption,\n async = false,\n searchable = true,\n required = false,\n allowAdd = false,\n addNewText = 'Create',\n onAdd = () => {},\n allowClear = false,\n allowFreeText = false,\n modalDropdown = false,\n noOptionsText = 'No options available',\n } = props\n\n if (props.asBottomSheet || props.mobileMode === 'sheet') {\n return <MobilePicker {...(props as any)} />\n }\n\n const hasError = Boolean(error)\n const [query, setQuery] = useState('')\n const debouncedQuery = useDebounce(query, 500)\n const [optionsLoading, setOptionsLoading] = useState(false)\n\n // Normalize options from options prop or groups prop\n const allOptions = useMemo(() => {\n if (groups?.length) {\n return groups.flatMap((g) => g.options)\n }\n return options\n }, [groups, options])\n\n const shouldShowTypeToSearch = async && !query && !optionsLoading && allOptions.length === 0\n const currentSize = sizeClasses[size] || sizeClasses.md\n\n const baseInputClass = useMemo(\n () => buildInputClass('', { disabled, hasError, size }),\n [disabled, hasError, size],\n )\n\n const chevronIconClass = buildClassName(\n currentSize.icon,\n 'stroke-gray-500 group-data-[hover]:stroke-gray-800',\n 'dark:stroke-gray-300 dark:group-data-[hover]:stroke-gray-100',\n disabled && 'dark:stroke-gray-600 stroke-gray-400',\n )\n\n const inputRef = useRef<HTMLInputElement>(null)\n const containerRef = useRef<HTMLDivElement>(null)\n\n useImperativeHandle(forwardedRef, () => inputRef.current!, [inputRef])\n\n const filteredOptions = useMemo(() => {\n if (query === '' || async) return allOptions\n return allOptions.filter((opt) => {\n const lbl = typeof opt === 'string' ? opt : (opt as BaseOption)[labelKey]\n return lbl?.toLowerCase().includes(query.toLowerCase())\n })\n }, [allOptions, query, async, labelKey])\n\n const filteredGroups = useMemo(() => {\n if (!groups?.length) return null\n if (query === '' || async) return groups\n\n return groups\n .map((g) => ({\n ...g,\n options: g.options.filter((opt) => {\n const lbl = typeof opt === 'string' ? opt : (opt as BaseOption)[labelKey]\n return lbl?.toLowerCase().includes(query.toLowerCase())\n }),\n }))\n .filter((g) => g.options.length > 0)\n }, [groups, query, async, labelKey])\n\n const getDisplayValue = useCallback(\n (opt: T) => {\n return typeof opt === 'string' ? opt : opt[labelKey]\n },\n [labelKey],\n )\n\n const getValue = useCallback(\n (opt: T) => {\n return typeof opt === 'string' ? opt : opt[valueKey]\n },\n [valueKey],\n )\n\n const createFreeTextOption = useCallback(\n (text: string): T => {\n const sample = allOptions[0] || (Array.isArray(selected) ? selected[0] : selected)\n if (\n typeof sample === 'string' ||\n (!sample && typeof labelKey === 'string' && labelKey === 'label')\n ) {\n return text as unknown as T\n }\n return {\n [labelKey]: text,\n [valueKey]: text,\n } as unknown as T\n },\n [allOptions, selected, labelKey, valueKey],\n )\n\n const handleFreeTextCommit = useCallback(\n (queryText: string) => {\n const trimmed = queryText.trim()\n if (!trimmed) return\n\n const existing = allOptions.find((opt) => {\n const display = getDisplayValue(opt)\n return display?.toLowerCase() === trimmed.toLowerCase()\n })\n\n const valueToCommit = existing || createFreeTextOption(trimmed)\n\n if (multiple) {\n const current = isArray(selected) ? selected : []\n const alreadySelected = current.some(\n (item) => getDisplayValue(item)?.toLowerCase() === trimmed.toLowerCase(),\n )\n if (!alreadySelected) {\n if (maxSelection && current.length >= maxSelection) return\n onChange([...current, valueToCommit] as unknown as T[])\n }\n setQuery('')\n } else {\n onChange(valueToCommit)\n setQuery('')\n }\n },\n [\n allOptions,\n getDisplayValue,\n createFreeTextOption,\n multiple,\n selected,\n maxSelection,\n onChange,\n ],\n )\n\n const removeSelection = (idx: number) => {\n if (!isArray(selected)) return\n const next = [...selected]\n next.splice(idx, 1)\n onChange(next)\n inputRef.current?.focus()\n }\n\n const handleOnChangeInternal = useCallback(\n (value: T | T[] | null) => {\n if (value === null) {\n onChange(multiple ? ([] as T[]) : null)\n setQuery('')\n return\n }\n\n if (multiple && Array.isArray(value) && maxSelection && value.length > maxSelection) {\n return\n }\n\n onChange(value as T | T[])\n setQuery('')\n },\n [onChange, multiple, maxSelection],\n )\n\n const comboboxOnChangeWrapper = useCallback(\n (raw: unknown) => {\n if (raw === null || raw === undefined) {\n handleOnChangeInternal(null)\n return\n }\n\n if (Array.isArray(raw)) {\n const allNulls = raw.length > 0 && raw.every((v) => v === null)\n if (allNulls) {\n handleOnChangeInternal([] as unknown as T[])\n return\n }\n handleOnChangeInternal(raw as unknown as T[])\n return\n }\n\n handleOnChangeInternal(raw as unknown as T)\n },\n [handleOnChangeInternal],\n )\n\n const handleAddAndSelect = useCallback(\n async (valueToAdd: string) => {\n try {\n const result = await onAdd(valueToAdd)\n if (result) {\n handleOnChangeInternal(result as unknown as T)\n } else {\n handleOnChangeInternal(valueToAdd as unknown as T)\n }\n } catch (err) {\n console.error('onAdd handler error', err)\n }\n },\n [onAdd, handleOnChangeInternal],\n )\n\n const onSearchRef = useRef(props.onSearch)\n useEffect(() => {\n onSearchRef.current = props.onSearch\n }, [props.onSearch])\n\n const handleSearch = useCallback(async (searchString: string) => {\n try {\n setOptionsLoading(true)\n await onSearchRef.current?.(searchString)\n } catch (err) {\n console.error('Error loading options:', err)\n } finally {\n setOptionsLoading(false)\n }\n }, [])\n\n useEffect(() => {\n if (async && debouncedQuery) handleSearch(debouncedQuery)\n }, [debouncedQuery, async, handleSearch])\n\n const normalizedSelected = useMemo(() => {\n if (multiple) {\n if (Array.isArray(selected)) return selected\n if (selected !== null && selected !== undefined) return [selected as T]\n return [] as T[]\n } else {\n if (Array.isArray(selected)) return selected.length > 0 ? selected[0] : null\n return selected ?? null\n }\n }, [multiple, selected])\n\n const isAllSelected = useMemo(() => {\n if (!multiple || !Array.isArray(normalizedSelected) || !allOptions.length) return false\n return allOptions.length === normalizedSelected.length\n }, [multiple, normalizedSelected, allOptions])\n\n const handleToggleSelectAll = () => {\n if (isAllSelected) {\n onChange([] as unknown as T[])\n } else {\n onChange(allOptions as unknown as T[])\n }\n }\n\n const hasLeftGroup = leftGroup != null && leftGroup !== undefined\n\n const hasFreeTextOption = Boolean(\n allowFreeText &&\n query.trim() &&\n !allOptions.some(\n (opt) => getDisplayValue(opt)?.toLowerCase() === query.trim().toLowerCase(),\n ),\n )\n\n const hasAddOption = Boolean(!allowFreeText && allowAdd && query.trim())\n const hasGroupOptions = Boolean(filteredGroups && filteredGroups.length > 0)\n const hasFlatOptions = filteredOptions.length > 0\n\n const hasAnyOptionsToDisplay =\n hasFlatOptions || hasGroupOptions || hasFreeTextOption || hasAddOption\n\n return (\n <div\n className={buildClassName('group space-y-2', hasError && 'has-error', containerClass)}\n ref={containerRef}\n >\n {label && (\n <div className={buildClassName('flex items-center justify-between', labelWrapperClass)}>\n <Label className={labelClass} htmlFor={id} aria-required={required}>\n {label}\n </Label>\n {labelHint && <TextContent xsmall>{labelHint}</TextContent>}\n </div>\n )}\n\n <Combobox\n multiple={multiple}\n immediate={immediate}\n name={name}\n value={normalizedSelected as any}\n onChange={comboboxOnChangeWrapper as any}\n onClose={() => setQuery('')}\n disabled={disabled}\n by={(a: any, b: any) => (a && b ? getValue(a) === getValue(b) : a === b)}\n >\n {multiple ? (\n <div\n className={buildClassName(\n baseInputClass,\n 'flex flex-wrap gap-2 peer relative',\n hasLeftGroup ? (size === 'lg' ? 'ps-12' : size === 'sm' ? 'ps-8' : 'ps-10') : '',\n )}\n ref={forwardedRef as any}\n >\n {hasLeftGroup && (\n <span\n className={buildClassName(\n 'absolute left-0 top-0 h-full flex items-center justify-center text-gray-400 dark:text-gray-500',\n currentSize.group,\n )}\n >\n {leftGroup}\n </span>\n )}\n\n {isArray(normalizedSelected) &&\n normalizedSelected?.length > 0 &&\n normalizedSelected.map((option, idx) => (\n <Badge\n key={`${getValue(option)}-${idx}`}\n theme=\"secondary\"\n size={currentSize.badgeSize}\n removable={!disabled}\n onRemove={() => removeSelection(idx)}\n >\n {getDisplayValue(option)}\n </Badge>\n ))}\n\n <ComboboxInput\n className=\"outline-none flex-1 dark:placeholder-gray-400 placeholder-gray-400 bg-transparent\"\n aria-label={name}\n value={query}\n autoComplete=\"off\"\n placeholder={normalizedSelected?.length ? '' : placeholder}\n onChange={(e) => {\n const val = e.target.value\n if (allowFreeText && multiple && val.includes(',')) {\n const parts = val.split(',')\n parts.forEach((p) => {\n if (p.trim()) handleFreeTextCommit(p.trim())\n })\n setQuery('')\n } else {\n setQuery(val)\n }\n }}\n id={id}\n ref={inputRef}\n onKeyDown={(e) => {\n if (allowFreeText && (e.key === 'Enter' || e.key === ',') && query.trim()) {\n e.preventDefault()\n handleFreeTextCommit(query.replace(/,/g, ''))\n } else if (multiple && e.key === 'Backspace' && !query) {\n if (Array.isArray(normalizedSelected) && normalizedSelected.length > 0) {\n removeSelection(normalizedSelected.length - 1)\n }\n }\n }}\n onBlur={() => {\n if (allowFreeText && query.trim()) {\n handleFreeTextCommit(query.replace(/,/g, ''))\n }\n }}\n data-testid=\"combobox-input\"\n />\n\n <ComboboxButton\n className=\"group absolute inset-y-0 right-0 px-2.5 flex items-center justify-center\"\n data-testid=\"combobox-button\"\n >\n <ChevronDownIcon className={chevronIconClass} />\n </ComboboxButton>\n </div>\n ) : (\n <div className=\"relative\" ref={forwardedRef as any}>\n {hasLeftGroup && (\n <span\n className={buildClassName(\n 'absolute left-0 top-0 h-full flex items-center justify-center text-gray-400 dark:text-gray-500 z-10',\n currentSize.group,\n )}\n >\n {leftGroup}\n </span>\n )}\n\n <ComboboxInput\n aria-label={name}\n displayValue={(option: any) => (option ? getDisplayValue(option) : null)}\n autoComplete=\"off\"\n placeholder={placeholder}\n onChange={(event) => setQuery(event.target.value)}\n onKeyDown={(e) => {\n if (allowFreeText && e.key === 'Enter' && query.trim()) {\n e.preventDefault()\n handleFreeTextCommit(query)\n }\n }}\n onBlur={() => {\n if (allowFreeText && query.trim()) {\n handleFreeTextCommit(query)\n }\n }}\n onFocus={() => {\n setQuery('')\n }}\n className={buildClassName(\n baseInputClass,\n hasLeftGroup ? (size === 'lg' ? 'ps-12' : size === 'sm' ? 'ps-8' : 'ps-10') : '',\n )}\n disabled={disabled}\n id={id}\n readOnly={!searchable}\n ref={inputRef}\n data-testid=\"combobox-input\"\n />\n\n {allowClear && !isEmpty(normalizedSelected) && (\n <Button\n size=\"xs\"\n iconOnly\n aria-label=\"Clear selection\"\n theme=\"secondary\"\n variant=\"plain\"\n className=\"group absolute inset-y-0 right-8 h-6 top-2\"\n onClick={() => handleOnChangeInternal(multiple ? ([] as T[]) : null)}\n disabled={disabled}\n data-testid=\"combobox-clear-button\"\n noOutlineOnFocus\n >\n <XIcon className=\"size-4 stroke-gray-500 dark:stroke-gray-300\" />\n </Button>\n )}\n\n <ComboboxButton\n className=\"group absolute inset-y-0 right-0 px-2.5 flex items-center justify-center\"\n data-testid=\"combobox-button\"\n >\n <ChevronDownIcon className={chevronIconClass} />\n </ComboboxButton>\n </div>\n )}\n\n <ComboboxOptions\n anchor={{ to: 'bottom', gap: 5 }}\n as=\"div\"\n modal={modalDropdown}\n className={buildClassName(\n 'w-[var(--input-width)] rounded-lg border border-[var(--ui-border)] bg-white dark:bg-gray-800 p-1 shadow-lg max-h-80 overflow-y-auto z-50 [--anchor-gap:var(--spacing-1)]',\n '[--anchor-max-height:20rem]',\n 'origin-top border transition duration-200 ease-[cubic-bezier(0.4, 0.0, 0.2, 1)] data-[closed]:translate-y-[-15%] data-[closed]:opacity-0',\n dropdownContainerClass,\n )}\n transition\n data-testid=\"combobox-options\"\n >\n {/* Multi-Select \"Select All\" Action Bar */}\n {multiple && showSelectAll && allOptions.length > 0 && (\n <div className=\"pb-1 mb-1 border-b border-[var(--ui-border-muted)] px-3 pt-1 flex items-center justify-between\">\n <button\n type=\"button\"\n onClick={handleToggleSelectAll}\n className=\"text-xs font-semibold text-blue-600 dark:text-blue-400 hover:underline cursor-pointer\"\n >\n {isAllSelected ? 'Deselect All' : 'Select All'}\n </button>\n <span className=\"text-[11px] font-medium text-gray-400\">\n {Array.isArray(normalizedSelected) ? normalizedSelected.length : 0} of{' '}\n {allOptions.length}\n </span>\n </div>\n )}\n\n {optionsLoading ? (\n <BodyText\n data-testid=\"options-loading\"\n className=\"flex items-center justify-center py-2 px-3 select-none\"\n >\n <Loader size=\"sm\" />\n </BodyText>\n ) : shouldShowTypeToSearch ? (\n <BodyText className=\"flex items-center justify-between py-2 px-3 select-none\">\n Type to search...\n </BodyText>\n ) : (\n <div>\n {/* Render Free-Text Option if query does not match an option exactly */}\n {allowFreeText &&\n query.trim() &&\n !allOptions.some(\n (opt) => getDisplayValue(opt)?.toLowerCase() === query.trim().toLowerCase(),\n ) && (\n <ComboboxOption\n key={`freetext-${query.trim()}`}\n value={createFreeTextOption(query.trim()) as any}\n className=\"group flex items-center gap-2 rounded-lg py-1.5 px-3 select-none text-sm data-[focus]:bg-blue-50 dark:data-[focus]:bg-blue-950/40 text-blue-600 dark:text-blue-400 font-medium cursor-pointer w-full\"\n data-testid=\"freetext-option\"\n >\n <span>Use \"{query.trim()}\"</span>\n </ComboboxOption>\n )}\n\n {/* Render Grouped Options */}\n {filteredGroups\n ? filteredGroups.map((grp, gIdx) => (\n <div key={gIdx}>\n <div className=\"text-[11px] font-bold uppercase tracking-wider text-gray-400 dark:text-gray-500 px-3 py-1 select-none\">\n {grp.group}\n </div>\n {grp.options.map((option) => {\n const optVal = getValue(option)\n const isOptSelected = multiple\n ? isArray(normalizedSelected) &&\n normalizedSelected.some((s) => getValue(s) === optVal)\n : normalizedSelected && getValue(normalizedSelected as T) === optVal\n\n return (\n <ComboboxOption\n key={optVal}\n disabled={(option as BaseOption).disabled}\n value={option}\n className=\"group rounded-lg py-1.5 px-3 select-none data-[focus]:bg-gray-100 dark:data-[focus]:bg-white/10 data-disabled:opacity-50 cursor-pointer data-disabled:pointer-events-none\"\n >\n {renderOption ? (\n renderOption(option, Boolean(isOptSelected))\n ) : (\n <div className=\"flex items-center justify-between gap-2 text-gray-900 dark:text-white group-data-[selected]:text-blue-600\">\n <span className=\"text-sm/6\">{getDisplayValue(option)}</span>\n <CheckIcon className=\"invisible size-5 dark:stroke-gray-300 group-data-[selected]:visible\" />\n </div>\n )}\n </ComboboxOption>\n )\n })}\n </div>\n ))\n : /* Render Standard Flat Options */\n filteredOptions.map((option) => {\n const optVal = getValue(option)\n const isOptSelected = multiple\n ? isArray(normalizedSelected) &&\n normalizedSelected.some((s) => getValue(s) === optVal)\n : normalizedSelected && getValue(normalizedSelected as T) === optVal\n\n return (\n <ComboboxOption\n key={optVal}\n disabled={(option as BaseOption).disabled}\n value={option}\n className=\"group rounded-lg py-1.5 px-3 select-none data-[focus]:bg-gray-100 dark:data-[focus]:bg-white/10 data-disabled:opacity-50 cursor-pointer data-disabled:pointer-events-none\"\n >\n {renderOption ? (\n renderOption(option, Boolean(isOptSelected))\n ) : (\n <div className=\"flex items-center justify-between gap-2 text-gray-900 dark:text-white group-data-[selected]:text-blue-600\">\n <span className=\"text-sm/6\">{getDisplayValue(option)}</span>\n <CheckIcon className=\"invisible size-5 dark:stroke-gray-300 group-data-[selected]:visible\" />\n </div>\n )}\n </ComboboxOption>\n )\n })}\n\n {!hasAnyOptionsToDisplay && Boolean(noOptionsText) && (\n <div\n data-testid=\"no-result-found\"\n className=\"flex items-center gap-2 py-1.5 px-3 select-none\"\n >\n <TextContent muted small>\n {noOptionsText}\n </TextContent>\n {Boolean(query.trim()) && (\n <TextContent strong small>\n \"{query.trim()}\"\n </TextContent>\n )}\n </div>\n )}\n\n {/* Creatable option (allowAdd) - suppressed when allowFreeText is true */}\n {!allowFreeText && allowAdd && Boolean(query.trim()) && (\n <ComboboxOption\n key={`add-${query.trim()}`}\n value={query}\n className=\"group rounded-lg py-1.5 px-3 cursor-pointer text-gray-700 dark:text-gray-300 data-[focus]:bg-gray-100 dark:data-[focus]:bg-gray-700\"\n onClick={() => void handleAddAndSelect(query)}\n >\n <div className=\"flex items-center gap-2\">\n <CirclePlusIcon className=\"size-4.5\" />\n <TextContent>\n {addNewText} \"{query}\"\n </TextContent>\n </div>\n </ComboboxOption>\n )}\n </div>\n )}\n </ComboboxOptions>\n </Combobox>\n\n {showErrorMessage && error && (\n <div className=\"mt-1\">\n <TextContent error small>\n {error}\n </TextContent>\n </div>\n )}\n\n {!error && helperText && (\n <div className=\"mt-1\">\n <TextContent muted small>\n {helperText}\n </TextContent>\n </div>\n )}\n </div>\n )\n },\n)\n\nSelectBox.displayName = 'SelectBox'\n"],"names":["_jsx","_jsxs","ChevronDownIcon","XIcon","CheckIcon","CirclePlusIcon"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SelectBox.js","sources":["../../../../../src/components/SelectBox/SelectBox.tsx"],"sourcesContent":["import {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react'\nimport {\n Combobox,\n ComboboxButton,\n ComboboxInput,\n ComboboxOption,\n ComboboxOptions,\n} from '@headlessui/react'\n\nimport { Label } from '../Label'\nimport { Badge } from '../Badge'\nimport { Loader } from '../Loader'\nimport { TextContent } from '../TextContent'\nimport { Button } from '../Button'\nimport { MobilePicker } from '../MobilePicker'\n\nimport { isArray } from '../../utils/is-array'\nimport { buildClassName } from '../../utils/build-classname'\nimport { isEmpty } from '../../utils/is-empty'\nimport { useDebounce } from '../../hooks/use-debounce'\n\nimport CheckIcon from '../Icons/Check.svg'\nimport ChevronDownIcon from '../Icons/ChevronDown.svg'\nimport XIcon from '../Icons/X.svg'\nimport CirclePlusIcon from '../Icons/CirclePlus.svg'\nimport type { BaseOption, SelectBoxProps, SelectBoxSize } from './SelectBox.types'\nimport { buildInputClass } from '../Input'\nimport { BodyText } from '../BodyText'\n\nconst NOOP = () => {}\nconst EMPTY_ARRAY: any[] = []\n\nconst sizeClasses: Record<\n SelectBoxSize,\n { input: string; group: string; icon: string; badgeSize: 'sm' | 'md' }\n> = {\n sm: {\n input: 'px-2.5 py-1.5 text-xs leading-5 min-h-[32px]',\n group: 'w-8 text-xs',\n icon: 'size-3.5',\n badgeSize: 'sm',\n },\n md: {\n input: 'px-3.5 py-2 text-sm leading-6 min-h-[38px]',\n group: 'w-10 text-sm',\n icon: 'size-4',\n badgeSize: 'md',\n },\n lg: {\n input: 'px-4 py-2.5 text-base leading-7 min-h-[46px]',\n group: 'w-12 text-base',\n icon: 'size-5',\n badgeSize: 'md',\n },\n}\n\nexport const SelectBox = forwardRef(\n <T extends BaseOption | string = BaseOption>(\n props: SelectBoxProps<T>,\n forwardedRef: React.Ref<HTMLInputElement | HTMLDivElement | null>,\n ) => {\n const {\n labelKey = 'label',\n valueKey = 'value',\n name,\n id = name,\n options = EMPTY_ARRAY,\n groups,\n selected,\n size = 'md',\n label = null,\n labelWrapperClass = '',\n labelClass = '',\n labelHint = null,\n disabled = false,\n containerClass = '',\n onChange = NOOP,\n placeholder,\n dropdownContainerClass = 'z-20',\n multiple = false,\n maxSelection,\n showSelectAll = false,\n immediate = true,\n showErrorMessage = true,\n error = null,\n helperText,\n leftGroup,\n renderOption,\n async = false,\n searchable = true,\n required = false,\n allowAdd = false,\n addNewText = 'Create',\n onAdd = NOOP,\n allowClear = false,\n allowFreeText = false,\n modalDropdown = false,\n noOptionsText = 'No options available',\n } = props\n\n if (props.asBottomSheet || props.mobileMode === 'sheet') {\n return <MobilePicker {...(props as any)} />\n }\n\n const hasError = Boolean(error)\n const [query, setQuery] = useState('')\n const debouncedQuery = useDebounce(query, 500)\n const [optionsLoading, setOptionsLoading] = useState(false)\n\n // Normalize options from options prop or groups prop\n const allOptions = useMemo(() => {\n if (groups?.length) {\n return groups.flatMap((g) => g.options)\n }\n return options\n }, [groups, options])\n\n const shouldShowTypeToSearch = async && !query && !optionsLoading && allOptions.length === 0\n const currentSize = sizeClasses[size] || sizeClasses.md\n\n const baseInputClass = useMemo(\n () => buildInputClass('', { disabled, hasError, size }),\n [disabled, hasError, size],\n )\n\n const chevronIconClass = useMemo(\n () =>\n buildClassName(\n currentSize.icon,\n 'stroke-gray-500 group-data-[hover]:stroke-gray-800',\n 'dark:stroke-gray-300 dark:group-data-[hover]:stroke-gray-100',\n disabled && 'dark:stroke-gray-600 stroke-gray-400',\n ),\n [currentSize.icon, disabled],\n )\n\n const inputRef = useRef<HTMLInputElement>(null)\n const containerRef = useRef<HTMLDivElement>(null)\n\n useImperativeHandle(forwardedRef, () => inputRef.current!, [inputRef])\n\n const filteredOptions = useMemo(() => {\n if (query === '' || async) return allOptions\n return allOptions.filter((opt) => {\n const lbl = typeof opt === 'string' ? opt : (opt as BaseOption)[labelKey]\n return lbl?.toLowerCase().includes(query.toLowerCase())\n })\n }, [allOptions, query, async, labelKey])\n\n const filteredGroups = useMemo(() => {\n if (!groups?.length) return null\n if (query === '' || async) return groups\n\n return groups\n .map((g) => ({\n ...g,\n options: g.options.filter((opt) => {\n const lbl = typeof opt === 'string' ? opt : (opt as BaseOption)[labelKey]\n return lbl?.toLowerCase().includes(query.toLowerCase())\n }),\n }))\n .filter((g) => g.options.length > 0)\n }, [groups, query, async, labelKey])\n\n const getDisplayValue = useCallback(\n (opt: T) => {\n return typeof opt === 'string' ? opt : opt[labelKey]\n },\n [labelKey],\n )\n\n const getValue = useCallback(\n (opt: T) => {\n return typeof opt === 'string' ? opt : opt[valueKey]\n },\n [valueKey],\n )\n\n const createFreeTextOption = useCallback(\n (text: string): T => {\n const sample = allOptions[0] || (Array.isArray(selected) ? selected[0] : selected)\n if (\n typeof sample === 'string' ||\n (!sample && typeof labelKey === 'string' && labelKey === 'label')\n ) {\n return text as unknown as T\n }\n return {\n [labelKey]: text,\n [valueKey]: text,\n } as unknown as T\n },\n [allOptions, selected, labelKey, valueKey],\n )\n\n const handleFreeTextCommit = useCallback(\n (queryText: string) => {\n const trimmed = queryText.trim()\n if (!trimmed) return\n\n const existing = allOptions.find((opt) => {\n const display = getDisplayValue(opt)\n return display?.toLowerCase() === trimmed.toLowerCase()\n })\n\n const valueToCommit = existing || createFreeTextOption(trimmed)\n\n if (multiple) {\n const current = isArray(selected) ? selected : []\n const alreadySelected = current.some(\n (item) => getDisplayValue(item)?.toLowerCase() === trimmed.toLowerCase(),\n )\n if (!alreadySelected) {\n if (maxSelection && current.length >= maxSelection) return\n onChange([...current, valueToCommit] as unknown as T[])\n }\n setQuery('')\n } else {\n onChange(valueToCommit)\n setQuery('')\n }\n },\n [\n allOptions,\n getDisplayValue,\n createFreeTextOption,\n multiple,\n selected,\n maxSelection,\n onChange,\n ],\n )\n\n const removeSelection = useCallback(\n (idx: number) => {\n if (!isArray(selected)) return\n const next = [...selected]\n next.splice(idx, 1)\n onChange(next)\n inputRef.current?.focus()\n },\n [selected, onChange],\n )\n\n const handleOnChangeInternal = useCallback(\n (value: T | T[] | null) => {\n if (value === null) {\n onChange(multiple ? ([] as T[]) : null)\n setQuery('')\n return\n }\n\n if (multiple && Array.isArray(value) && maxSelection && value.length > maxSelection) {\n return\n }\n\n onChange(value as T | T[])\n setQuery('')\n },\n [onChange, multiple, maxSelection],\n )\n\n const comboboxOnChangeWrapper = useCallback(\n (raw: unknown) => {\n if (raw === null || raw === undefined) {\n handleOnChangeInternal(null)\n return\n }\n\n if (Array.isArray(raw)) {\n const allNulls = raw.length > 0 && raw.every((v) => v === null)\n if (allNulls) {\n handleOnChangeInternal([] as unknown as T[])\n return\n }\n handleOnChangeInternal(raw as unknown as T[])\n return\n }\n\n handleOnChangeInternal(raw as unknown as T)\n },\n [handleOnChangeInternal],\n )\n\n const handleAddAndSelect = useCallback(\n async (valueToAdd: string) => {\n try {\n const result = await onAdd(valueToAdd)\n if (result) {\n handleOnChangeInternal(result as unknown as T)\n } else {\n handleOnChangeInternal(valueToAdd as unknown as T)\n }\n } catch (err) {\n console.error('onAdd handler error', err)\n }\n },\n [onAdd, handleOnChangeInternal],\n )\n\n const onSearchRef = useRef(props.onSearch)\n onSearchRef.current = props.onSearch\n\n const handleSearch = useCallback(async (searchString: string) => {\n try {\n setOptionsLoading(true)\n await onSearchRef.current?.(searchString)\n } catch (err) {\n console.error('Error loading options:', err)\n } finally {\n setOptionsLoading(false)\n }\n }, [])\n\n useEffect(() => {\n if (async && debouncedQuery) handleSearch(debouncedQuery)\n }, [debouncedQuery, async, handleSearch])\n\n const normalizedSelected = useMemo(() => {\n if (multiple) {\n if (Array.isArray(selected)) return selected\n if (selected !== null && selected !== undefined) return [selected as T]\n return [] as T[]\n } else {\n if (Array.isArray(selected)) return selected.length > 0 ? selected[0] : null\n return selected ?? null\n }\n }, [multiple, selected])\n\n const selectedValueSet = useMemo(() => {\n if (!normalizedSelected) return new Set<any>()\n if (Array.isArray(normalizedSelected)) {\n return new Set(normalizedSelected.map((s) => getValue(s)))\n }\n return new Set([getValue(normalizedSelected as T)])\n }, [normalizedSelected, getValue])\n\n const isAllSelected = useMemo(() => {\n if (!multiple || !Array.isArray(normalizedSelected) || !allOptions.length) return false\n return allOptions.length === normalizedSelected.length\n }, [multiple, normalizedSelected, allOptions])\n\n const handleToggleSelectAll = useCallback(() => {\n if (isAllSelected) {\n onChange([] as unknown as T[])\n } else {\n onChange(allOptions as unknown as T[])\n }\n }, [isAllSelected, onChange, allOptions])\n\n const hasLeftGroup = leftGroup != null && leftGroup !== undefined\n\n const hasFreeTextOption = Boolean(\n allowFreeText &&\n query.trim() &&\n !allOptions.some(\n (opt) => getDisplayValue(opt)?.toLowerCase() === query.trim().toLowerCase(),\n ),\n )\n\n const hasAddOption = Boolean(!allowFreeText && allowAdd && query.trim())\n const hasGroupOptions = Boolean(filteredGroups && filteredGroups.length > 0)\n const hasFlatOptions = filteredOptions.length > 0\n\n const hasAnyOptionsToDisplay =\n hasFlatOptions || hasGroupOptions || hasFreeTextOption || hasAddOption\n\n const renderOptionItem = (option: T) => {\n const optVal = getValue(option)\n const isOptSelected = selectedValueSet.has(optVal)\n\n return (\n <ComboboxOption\n key={optVal}\n disabled={(option as BaseOption).disabled}\n value={option}\n className=\"group rounded-lg py-1.5 px-3 select-none data-[focus]:bg-gray-100 dark:data-[focus]:bg-white/10 data-disabled:opacity-50 cursor-pointer data-disabled:pointer-events-none\"\n >\n {renderOption ? (\n renderOption(option, Boolean(isOptSelected))\n ) : (\n <div className=\"flex items-center justify-between gap-2 text-gray-900 dark:text-white group-data-[selected]:text-blue-600\">\n <span className=\"text-sm/6\">{getDisplayValue(option)}</span>\n <CheckIcon className=\"invisible size-5 dark:stroke-gray-300 group-data-[selected]:visible\" />\n </div>\n )}\n </ComboboxOption>\n )\n }\n\n return (\n <div\n className={buildClassName('group space-y-2', hasError && 'has-error', containerClass)}\n ref={containerRef}\n >\n {label && (\n <div className={buildClassName('flex items-center justify-between', labelWrapperClass)}>\n <Label className={labelClass} htmlFor={id} aria-required={required}>\n {label}\n </Label>\n {labelHint && <TextContent xsmall>{labelHint}</TextContent>}\n </div>\n )}\n\n <Combobox\n multiple={multiple}\n immediate={immediate}\n name={name}\n value={normalizedSelected as any}\n onChange={comboboxOnChangeWrapper as any}\n onClose={() => setQuery('')}\n disabled={disabled}\n by={(a: any, b: any) => (a && b ? getValue(a) === getValue(b) : a === b)}\n >\n {multiple ? (\n <div\n className={buildClassName(\n baseInputClass,\n 'flex flex-wrap gap-2 peer relative',\n hasLeftGroup ? (size === 'lg' ? 'ps-12' : size === 'sm' ? 'ps-8' : 'ps-10') : '',\n )}\n ref={forwardedRef as any}\n >\n {hasLeftGroup && (\n <span\n className={buildClassName(\n 'absolute left-0 top-0 h-full flex items-center justify-center text-gray-400 dark:text-gray-500',\n currentSize.group,\n )}\n >\n {leftGroup}\n </span>\n )}\n\n {isArray(normalizedSelected) &&\n normalizedSelected?.length > 0 &&\n normalizedSelected.map((option, idx) => (\n <Badge\n key={`${getValue(option)}-${idx}`}\n theme=\"secondary\"\n size={currentSize.badgeSize}\n removable={!disabled}\n onRemove={() => removeSelection(idx)}\n >\n {getDisplayValue(option)}\n </Badge>\n ))}\n\n <ComboboxInput\n className=\"outline-none flex-1 dark:placeholder-gray-400 placeholder-gray-400 bg-transparent\"\n aria-label={name}\n value={query}\n autoComplete=\"off\"\n placeholder={normalizedSelected?.length ? '' : placeholder}\n onChange={(e) => {\n const val = e.target.value\n if (allowFreeText && multiple && val.includes(',')) {\n const parts = val.split(',')\n parts.forEach((p) => {\n if (p.trim()) handleFreeTextCommit(p.trim())\n })\n setQuery('')\n } else {\n setQuery(val)\n }\n }}\n id={id}\n ref={inputRef}\n onKeyDown={(e) => {\n if (allowFreeText && (e.key === 'Enter' || e.key === ',') && query.trim()) {\n e.preventDefault()\n handleFreeTextCommit(query.replace(/,/g, ''))\n } else if (multiple && e.key === 'Backspace' && !query) {\n if (Array.isArray(normalizedSelected) && normalizedSelected.length > 0) {\n removeSelection(normalizedSelected.length - 1)\n }\n }\n }}\n onBlur={() => {\n if (allowFreeText && query.trim()) {\n handleFreeTextCommit(query.replace(/,/g, ''))\n }\n }}\n data-testid=\"combobox-input\"\n />\n\n <ComboboxButton\n className=\"group absolute inset-y-0 right-0 px-2.5 flex items-center justify-center\"\n data-testid=\"combobox-button\"\n >\n <ChevronDownIcon className={chevronIconClass} />\n </ComboboxButton>\n </div>\n ) : (\n <div className=\"relative\" ref={forwardedRef as any}>\n {hasLeftGroup && (\n <span\n className={buildClassName(\n 'absolute left-0 top-0 h-full flex items-center justify-center text-gray-400 dark:text-gray-500 z-10',\n currentSize.group,\n )}\n >\n {leftGroup}\n </span>\n )}\n\n <ComboboxInput\n aria-label={name}\n displayValue={(option: any) => (option ? getDisplayValue(option) : null)}\n autoComplete=\"off\"\n placeholder={placeholder}\n onChange={(event) => setQuery(event.target.value)}\n onKeyDown={(e) => {\n if (allowFreeText && e.key === 'Enter' && query.trim()) {\n e.preventDefault()\n handleFreeTextCommit(query)\n }\n }}\n onBlur={() => {\n if (allowFreeText && query.trim()) {\n handleFreeTextCommit(query)\n }\n }}\n onFocus={() => {\n setQuery('')\n }}\n className={buildClassName(\n baseInputClass,\n hasLeftGroup ? (size === 'lg' ? 'ps-12' : size === 'sm' ? 'ps-8' : 'ps-10') : '',\n )}\n disabled={disabled}\n id={id}\n readOnly={!searchable}\n ref={inputRef}\n data-testid=\"combobox-input\"\n />\n\n {allowClear && !isEmpty(normalizedSelected) && (\n <Button\n size=\"xs\"\n iconOnly\n aria-label=\"Clear selection\"\n theme=\"secondary\"\n variant=\"plain\"\n className=\"group absolute inset-y-0 right-8 h-6 top-2\"\n onClick={() => handleOnChangeInternal(multiple ? ([] as T[]) : null)}\n disabled={disabled}\n data-testid=\"combobox-clear-button\"\n noOutlineOnFocus\n >\n <XIcon className=\"size-4 stroke-gray-500 dark:stroke-gray-300\" />\n </Button>\n )}\n\n <ComboboxButton\n className=\"group absolute inset-y-0 right-0 px-2.5 flex items-center justify-center\"\n data-testid=\"combobox-button\"\n >\n <ChevronDownIcon className={chevronIconClass} />\n </ComboboxButton>\n </div>\n )}\n\n <ComboboxOptions\n anchor={{ to: 'bottom', gap: 5 }}\n as=\"div\"\n modal={modalDropdown}\n className={buildClassName(\n 'w-[var(--input-width)] rounded-lg border border-[var(--ui-border)] bg-white dark:bg-gray-800 p-1 shadow-lg max-h-80 overflow-y-auto z-50 [--anchor-gap:var(--spacing-1)]',\n '[--anchor-max-height:20rem]',\n 'origin-top border transition duration-200 ease-[cubic-bezier(0.4, 0.0, 0.2, 1)] data-[closed]:translate-y-[-15%] data-[closed]:opacity-0',\n dropdownContainerClass,\n )}\n transition\n data-testid=\"combobox-options\"\n >\n {/* Multi-Select \"Select All\" Action Bar */}\n {multiple && showSelectAll && allOptions.length > 0 && (\n <div className=\"pb-1 mb-1 border-b border-[var(--ui-border-muted)] px-3 pt-1 flex items-center justify-between\">\n <button\n type=\"button\"\n onClick={handleToggleSelectAll}\n className=\"text-xs font-semibold text-blue-600 dark:text-blue-400 hover:underline cursor-pointer\"\n >\n {isAllSelected ? 'Deselect All' : 'Select All'}\n </button>\n <span className=\"text-[11px] font-medium text-gray-400\">\n {Array.isArray(normalizedSelected) ? normalizedSelected.length : 0} of{' '}\n {allOptions.length}\n </span>\n </div>\n )}\n\n {optionsLoading ? (\n <BodyText\n data-testid=\"options-loading\"\n className=\"flex items-center justify-center py-2 px-3 select-none\"\n >\n <Loader size=\"sm\" />\n </BodyText>\n ) : shouldShowTypeToSearch ? (\n <BodyText className=\"flex items-center justify-between py-2 px-3 select-none\">\n Type to search...\n </BodyText>\n ) : (\n <div>\n {/* Render Free-Text Option if query does not match an option exactly */}\n {allowFreeText &&\n query.trim() &&\n !allOptions.some(\n (opt) => getDisplayValue(opt)?.toLowerCase() === query.trim().toLowerCase(),\n ) && (\n <ComboboxOption\n key={`freetext-${query.trim()}`}\n value={createFreeTextOption(query.trim()) as any}\n className=\"group flex items-center gap-2 rounded-lg py-1.5 px-3 select-none text-sm data-[focus]:bg-blue-50 dark:data-[focus]:bg-blue-950/40 text-blue-600 dark:text-blue-400 font-medium cursor-pointer w-full\"\n data-testid=\"freetext-option\"\n >\n <span>Use \"{query.trim()}\"</span>\n </ComboboxOption>\n )}\n\n {/* Render Grouped Options */}\n {filteredGroups\n ? filteredGroups.map((grp, gIdx) => (\n <div key={gIdx}>\n <div className=\"text-[11px] font-bold uppercase tracking-wider text-gray-400 dark:text-gray-500 px-3 py-1 select-none\">\n {grp.group}\n </div>\n {grp.options.map(renderOptionItem)}\n </div>\n ))\n : /* Render Standard Flat Options */\n filteredOptions.map(renderOptionItem)}\n\n {!hasAnyOptionsToDisplay && Boolean(noOptionsText) && (\n <div\n data-testid=\"no-result-found\"\n className=\"flex items-center gap-2 py-1.5 px-3 select-none\"\n >\n <TextContent muted small>\n {noOptionsText}\n </TextContent>\n {Boolean(query.trim()) && (\n <TextContent strong small>\n \"{query.trim()}\"\n </TextContent>\n )}\n </div>\n )}\n\n {/* Creatable option (allowAdd) - suppressed when allowFreeText is true */}\n {!allowFreeText && allowAdd && Boolean(query.trim()) && (\n <ComboboxOption\n key={`add-${query.trim()}`}\n value={query}\n className=\"group rounded-lg py-1.5 px-3 cursor-pointer text-gray-700 dark:text-gray-300 data-[focus]:bg-gray-100 dark:data-[focus]:bg-gray-700\"\n onClick={() => void handleAddAndSelect(query)}\n >\n <div className=\"flex items-center gap-2\">\n <CirclePlusIcon className=\"size-4.5\" />\n <TextContent>\n {addNewText} \"{query}\"\n </TextContent>\n </div>\n </ComboboxOption>\n )}\n </div>\n )}\n </ComboboxOptions>\n </Combobox>\n\n {showErrorMessage && error && (\n <div className=\"mt-1\">\n <TextContent error small>\n {error}\n </TextContent>\n </div>\n )}\n\n {!error && helperText && (\n <div className=\"mt-1\">\n <TextContent muted small>\n {helperText}\n </TextContent>\n </div>\n )}\n </div>\n )\n },\n)\n\nSelectBox.displayName = 'SelectBox'\n"],"names":["_jsx","_jsxs","CheckIcon","ChevronDownIcon","XIcon","CirclePlusIcon"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
-
import { forwardRef, useRef, useImperativeHandle, useState, useEffect } from 'react';
|
|
2
|
+
import { forwardRef, useRef, useImperativeHandle, useState, useEffect, useCallback } from 'react';
|
|
3
3
|
import { Label } from '../Label/Label.js';
|
|
4
4
|
import { isEmpty } from '../../utils/is-empty.js';
|
|
5
5
|
import { buildClassName } from '../../utils/build-classname.js';
|
|
@@ -26,7 +26,7 @@ const resizeClasses = {
|
|
|
26
26
|
both: 'resize',
|
|
27
27
|
};
|
|
28
28
|
const Textarea = forwardRef((props, ref) => {
|
|
29
|
-
const { name, id = name, label = null, labelHint = null, className = '', labelClass = '', labelWrapperClass = '', containerClass = '', error, showErrorMessage = true, rightGroup = null, leftGroup = null, size = 'md', autoSize = false, showCount = false, helperText, resize = 'vertical', value, defaultValue, onChange, maxLength, ...inputProps } = props;
|
|
29
|
+
const { name, id = name, label = null, labelHint = null, className = '', labelClass = '', labelWrapperClass = '', containerClass = '', error, showErrorMessage = true, rightGroup = null, leftGroup = null, size = 'md', autoSize = false, showCount = false, helperText, resize = 'vertical', value, defaultValue, onChange, maxLength, required, 'aria-describedby': ariaDescribedBy, ...inputProps } = props;
|
|
30
30
|
const innerRef = useRef(null);
|
|
31
31
|
useImperativeHandle(ref, () => innerRef.current);
|
|
32
32
|
const [uncontrolledValue, setUncontrolledValue] = useState(String(defaultValue !== null && defaultValue !== void 0 ? defaultValue : ''));
|
|
@@ -40,19 +40,22 @@ const Textarea = forwardRef((props, ref) => {
|
|
|
40
40
|
innerRef.current.style.height = `${innerRef.current.scrollHeight}px`;
|
|
41
41
|
}
|
|
42
42
|
}, [autoSize, currentVal]);
|
|
43
|
-
const handleTextareaChange = (e) => {
|
|
43
|
+
const handleTextareaChange = useCallback((e) => {
|
|
44
44
|
if (!isControlled) {
|
|
45
45
|
setUncontrolledValue(e.target.value);
|
|
46
46
|
}
|
|
47
47
|
onChange === null || onChange === void 0 ? void 0 : onChange(e);
|
|
48
|
-
};
|
|
48
|
+
}, [isControlled, onChange]);
|
|
49
49
|
const hasError = !isEmpty(error);
|
|
50
50
|
const hasRightGroup = rightGroup != null && rightGroup !== undefined;
|
|
51
51
|
const hasLeftGroup = leftGroup != null && leftGroup !== undefined;
|
|
52
52
|
const currentSize = sizeClasses[size] || sizeClasses.md;
|
|
53
|
-
|
|
53
|
+
const errorId = id && hasError && showErrorMessage ? `${id}-error` : undefined;
|
|
54
|
+
const helperId = id && helperText && !hasError ? `${id}-helper` : undefined;
|
|
55
|
+
const describedBy = [ariaDescribedBy, errorId, helperId].filter(Boolean).join(' ') || undefined;
|
|
56
|
+
return (jsxs("div", { className: buildClassName('group', hasError && 'has-error', containerClass), children: [label && (jsxs("div", { className: buildClassName('flex items-center justify-between mb-1.5', labelWrapperClass), children: [jsx(Label, { className: labelClass, htmlFor: id, "aria-required": required, children: label }), labelHint && jsx(TextContent, { xsmall: true, children: labelHint })] })), jsxs("div", { className: "relative", children: [hasLeftGroup && (jsx("span", { className: "absolute top-2.5 left-3 flex items-center justify-center text-gray-400 dark:text-gray-500", children: leftGroup })), jsx("textarea", { ref: innerRef, autoComplete: "off", ...inputProps, value: value, defaultValue: defaultValue, onChange: handleTextareaChange, maxLength: maxLength, name: name, id: id, required: required, "aria-invalid": hasError ? true : undefined, "aria-describedby": describedBy, className: buildClassName('transition-all duration-150', 'block w-full rounded-lg bg-white', currentSize.textarea, autoSize ? 'resize-none overflow-hidden' : resizeClasses[resize], 'text-gray-900 outline outline-1 -outline-offset-1', hasError
|
|
54
57
|
? '!outline-red-500 !ring-1 !ring-red-500/50 dark:!outline-red-500'
|
|
55
|
-
: 'outline-[var(--ui-border)]', 'focus:outline-[var(--ui-focus-ring)] focus:outline-2 focus:-outline-offset-2', 'dark:bg-gray-700 dark:placeholder-gray-400 placeholder:text-gray-400 dark:text-white', 'disabled:pointer-events-none disabled:bg-gray-100 disabled:outline-[var(--ui-border-muted)]', 'dark:disabled:bg-gray-800 dark:disabled:text-gray-600 dark:disabled:placeholder-gray-600 dark:disabled:outline-[var(--ui-border-muted)]', hasRightGroup ? 'pe-10' : '', hasLeftGroup ? 'ps-10' : '', className) }), hasRightGroup && (jsx("span", { className: "absolute end-3 top-2.5 flex items-center justify-center text-gray-400 dark:text-gray-500", children: rightGroup }))] }), (showErrorMessage && error) || helperText || showCount ? (jsxs("div", { className: "mt-1.5 flex items-center justify-between gap-2 text-xs", children: [jsx("div", { className: "min-w-0 flex-1", children: showErrorMessage && error ? (jsx(TextContent, { error: true, small: true, children: error })) : helperText ? (jsx(TextContent, { muted: true, small: true, children: helperText })) : null }), showCount && (jsxs("span", { className: buildClassName('text-[11px] font-medium shrink-0 ml-auto', maxLength && charLength >= maxLength
|
|
58
|
+
: 'outline-[var(--ui-border)]', 'focus:outline-[var(--ui-focus-ring)] focus:outline-2 focus:-outline-offset-2', 'dark:bg-gray-700 dark:placeholder-gray-400 placeholder:text-gray-400 dark:text-white', 'disabled:pointer-events-none disabled:bg-gray-100 disabled:outline-[var(--ui-border-muted)]', 'dark:disabled:bg-gray-800 dark:disabled:text-gray-600 dark:disabled:placeholder-gray-600 dark:disabled:outline-[var(--ui-border-muted)]', hasRightGroup ? 'pe-10' : '', hasLeftGroup ? 'ps-10' : '', className) }), hasRightGroup && (jsx("span", { className: "absolute end-3 top-2.5 flex items-center justify-center text-gray-400 dark:text-gray-500", children: rightGroup }))] }), (showErrorMessage && error) || helperText || showCount ? (jsxs("div", { className: "mt-1.5 flex items-center justify-between gap-2 text-xs", children: [jsx("div", { className: "min-w-0 flex-1", children: showErrorMessage && error ? (jsx(TextContent, { error: true, small: true, id: errorId, children: error })) : helperText ? (jsx(TextContent, { muted: true, small: true, id: helperId, children: helperText })) : null }), showCount && (jsxs("span", { className: buildClassName('text-[11px] font-medium shrink-0 ml-auto', maxLength && charLength >= maxLength
|
|
56
59
|
? 'text-red-500 font-semibold'
|
|
57
60
|
: 'text-gray-400 dark:text-gray-500'), children: [charLength, maxLength ? ` / ${maxLength}` : ''] }))] })) : null] }));
|
|
58
61
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Textarea.js","sources":["../../../../../src/components/Textarea/Textarea.tsx"],"sourcesContent":["import {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n type ChangeEvent,\n} from 'react'\nimport { Label } from '../Label'\nimport { isEmpty } from '../../utils/is-empty'\nimport { buildClassName } from '../../utils/build-classname'\nimport { TextContent } from '../TextContent'\nimport type { TextareaProps, TextareaResize, TextareaSize } from './Textarea.types'\n\nconst sizeClasses: Record<TextareaSize, { textarea: string; text: string }> = {\n sm: {\n textarea: 'px-2.5 py-1.5 text-xs leading-5 min-h-[60px]',\n text: 'text-xs',\n },\n md: {\n textarea: 'px-3.5 py-2 text-sm leading-6 min-h-[80px]',\n text: 'text-sm',\n },\n lg: {\n textarea: 'px-4 py-2.5 text-base leading-7 min-h-[100px]',\n text: 'text-base',\n },\n}\n\nconst resizeClasses: Record<TextareaResize, string> = {\n none: 'resize-none',\n vertical: 'resize-y',\n horizontal: 'resize-x',\n both: 'resize',\n}\n\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>((props, ref) => {\n const {\n name,\n id = name,\n label = null,\n labelHint = null,\n className = '',\n labelClass = '',\n labelWrapperClass = '',\n containerClass = '',\n error,\n showErrorMessage = true,\n rightGroup = null,\n leftGroup = null,\n size = 'md',\n autoSize = false,\n showCount = false,\n helperText,\n resize = 'vertical',\n value,\n defaultValue,\n onChange,\n maxLength,\n ...inputProps\n } = props\n\n const innerRef = useRef<HTMLTextAreaElement>(null)\n useImperativeHandle(ref, () => innerRef.current as HTMLTextAreaElement)\n\n const [uncontrolledValue, setUncontrolledValue] = useState<string>(String(defaultValue ?? ''))\n\n const isControlled = value !== undefined\n const currentVal = isControlled ? String(value ?? '') : uncontrolledValue\n const charLength = currentVal.length\n\n // Handle Auto-Resize behavior\n useEffect(() => {\n if (autoSize && innerRef.current) {\n innerRef.current.style.height = 'auto'\n innerRef.current.style.height = `${innerRef.current.scrollHeight}px`\n }\n }, [autoSize, currentVal])\n\n const handleTextareaChange = (e: ChangeEvent<HTMLTextAreaElement>) => {\n if (!isControlled) {\n setUncontrolledValue(e.target.value)\n }\n onChange?.(e)\n }\n\n const hasError = !isEmpty(error)\n const hasRightGroup = rightGroup != null && rightGroup !== undefined\n const hasLeftGroup = leftGroup != null && leftGroup !== undefined\n const currentSize = sizeClasses[size] || sizeClasses.md\n\n return (\n <div className={buildClassName('group', hasError && 'has-error', containerClass)}>\n {label && (\n <div\n className={buildClassName('flex items-center justify-between mb-1.5', labelWrapperClass)}\n >\n <Label className={labelClass} htmlFor={id}>\n {label}\n </Label>\n {labelHint && <TextContent xsmall>{labelHint}</TextContent>}\n </div>\n )}\n <div className=\"relative\">\n {hasLeftGroup && (\n <span className=\"absolute top-2.5 left-3 flex items-center justify-center text-gray-400 dark:text-gray-500\">\n {leftGroup}\n </span>\n )}\n <textarea\n ref={innerRef}\n autoComplete=\"off\"\n {...inputProps}\n value={value}\n defaultValue={defaultValue}\n onChange={handleTextareaChange}\n maxLength={maxLength}\n name={name}\n id={id}\n className={buildClassName(\n 'transition-all duration-150',\n 'block w-full rounded-lg bg-white',\n currentSize.textarea,\n autoSize ? 'resize-none overflow-hidden' : resizeClasses[resize],\n 'text-gray-900 outline outline-1 -outline-offset-1',\n hasError\n ? '!outline-red-500 !ring-1 !ring-red-500/50 dark:!outline-red-500'\n : 'outline-[var(--ui-border)]',\n 'focus:outline-[var(--ui-focus-ring)] focus:outline-2 focus:-outline-offset-2',\n 'dark:bg-gray-700 dark:placeholder-gray-400 placeholder:text-gray-400 dark:text-white',\n 'disabled:pointer-events-none disabled:bg-gray-100 disabled:outline-[var(--ui-border-muted)]',\n 'dark:disabled:bg-gray-800 dark:disabled:text-gray-600 dark:disabled:placeholder-gray-600 dark:disabled:outline-[var(--ui-border-muted)]',\n hasRightGroup ? 'pe-10' : '',\n hasLeftGroup ? 'ps-10' : '',\n className,\n )}\n />\n {hasRightGroup && (\n <span className=\"absolute end-3 top-2.5 flex items-center justify-center text-gray-400 dark:text-gray-500\">\n {rightGroup}\n </span>\n )}\n </div>\n\n {/* Footer Row: Error / Helper Text & Live Character Count */}\n {(showErrorMessage && error) || helperText || showCount ? (\n <div className=\"mt-1.5 flex items-center justify-between gap-2 text-xs\">\n <div className=\"min-w-0 flex-1\">\n {showErrorMessage && error ? (\n <TextContent error small>\n {error}\n </TextContent>\n ) : helperText ? (\n <TextContent muted small>\n {helperText}\n </TextContent>\n ) : null}\n </div>\n\n {showCount && (\n <span\n className={buildClassName(\n 'text-[11px] font-medium shrink-0 ml-auto',\n maxLength && charLength >= maxLength\n ? 'text-red-500 font-semibold'\n : 'text-gray-400 dark:text-gray-500',\n )}\n >\n {charLength}\n {maxLength ? ` / ${maxLength}` : ''}\n </span>\n )}\n </div>\n ) : null}\n </div>\n )\n})\n\nTextarea.displayName = 'Textarea'\n"],"names":["_jsxs","_jsx"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Textarea.js","sources":["../../../../../src/components/Textarea/Textarea.tsx"],"sourcesContent":["import {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n type ChangeEvent,\n} from 'react'\nimport { Label } from '../Label'\nimport { isEmpty } from '../../utils/is-empty'\nimport { buildClassName } from '../../utils/build-classname'\nimport { TextContent } from '../TextContent'\nimport type { TextareaProps, TextareaResize, TextareaSize } from './Textarea.types'\n\nconst sizeClasses: Record<TextareaSize, { textarea: string; text: string }> = {\n sm: {\n textarea: 'px-2.5 py-1.5 text-xs leading-5 min-h-[60px]',\n text: 'text-xs',\n },\n md: {\n textarea: 'px-3.5 py-2 text-sm leading-6 min-h-[80px]',\n text: 'text-sm',\n },\n lg: {\n textarea: 'px-4 py-2.5 text-base leading-7 min-h-[100px]',\n text: 'text-base',\n },\n}\n\nconst resizeClasses: Record<TextareaResize, string> = {\n none: 'resize-none',\n vertical: 'resize-y',\n horizontal: 'resize-x',\n both: 'resize',\n}\n\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>((props, ref) => {\n const {\n name,\n id = name,\n label = null,\n labelHint = null,\n className = '',\n labelClass = '',\n labelWrapperClass = '',\n containerClass = '',\n error,\n showErrorMessage = true,\n rightGroup = null,\n leftGroup = null,\n size = 'md',\n autoSize = false,\n showCount = false,\n helperText,\n resize = 'vertical',\n value,\n defaultValue,\n onChange,\n maxLength,\n required,\n 'aria-describedby': ariaDescribedBy,\n ...inputProps\n } = props\n\n const innerRef = useRef<HTMLTextAreaElement>(null)\n useImperativeHandle(ref, () => innerRef.current as HTMLTextAreaElement)\n\n const [uncontrolledValue, setUncontrolledValue] = useState<string>(String(defaultValue ?? ''))\n\n const isControlled = value !== undefined\n const currentVal = isControlled ? String(value ?? '') : uncontrolledValue\n const charLength = currentVal.length\n\n // Handle Auto-Resize behavior\n useEffect(() => {\n if (autoSize && innerRef.current) {\n innerRef.current.style.height = 'auto'\n innerRef.current.style.height = `${innerRef.current.scrollHeight}px`\n }\n }, [autoSize, currentVal])\n\n const handleTextareaChange = useCallback(\n (e: ChangeEvent<HTMLTextAreaElement>) => {\n if (!isControlled) {\n setUncontrolledValue(e.target.value)\n }\n onChange?.(e)\n },\n [isControlled, onChange],\n )\n\n const hasError = !isEmpty(error)\n const hasRightGroup = rightGroup != null && rightGroup !== undefined\n const hasLeftGroup = leftGroup != null && leftGroup !== undefined\n const currentSize = sizeClasses[size] || sizeClasses.md\n\n const errorId = id && hasError && showErrorMessage ? `${id}-error` : undefined\n const helperId = id && helperText && !hasError ? `${id}-helper` : undefined\n const describedBy = [ariaDescribedBy, errorId, helperId].filter(Boolean).join(' ') || undefined\n\n return (\n <div className={buildClassName('group', hasError && 'has-error', containerClass)}>\n {label && (\n <div\n className={buildClassName('flex items-center justify-between mb-1.5', labelWrapperClass)}\n >\n <Label className={labelClass} htmlFor={id} aria-required={required}>\n {label}\n </Label>\n {labelHint && <TextContent xsmall>{labelHint}</TextContent>}\n </div>\n )}\n <div className=\"relative\">\n {hasLeftGroup && (\n <span className=\"absolute top-2.5 left-3 flex items-center justify-center text-gray-400 dark:text-gray-500\">\n {leftGroup}\n </span>\n )}\n <textarea\n ref={innerRef}\n autoComplete=\"off\"\n {...inputProps}\n value={value}\n defaultValue={defaultValue}\n onChange={handleTextareaChange}\n maxLength={maxLength}\n name={name}\n id={id}\n required={required}\n aria-invalid={hasError ? true : undefined}\n aria-describedby={describedBy}\n className={buildClassName(\n 'transition-all duration-150',\n 'block w-full rounded-lg bg-white',\n currentSize.textarea,\n autoSize ? 'resize-none overflow-hidden' : resizeClasses[resize],\n 'text-gray-900 outline outline-1 -outline-offset-1',\n hasError\n ? '!outline-red-500 !ring-1 !ring-red-500/50 dark:!outline-red-500'\n : 'outline-[var(--ui-border)]',\n 'focus:outline-[var(--ui-focus-ring)] focus:outline-2 focus:-outline-offset-2',\n 'dark:bg-gray-700 dark:placeholder-gray-400 placeholder:text-gray-400 dark:text-white',\n 'disabled:pointer-events-none disabled:bg-gray-100 disabled:outline-[var(--ui-border-muted)]',\n 'dark:disabled:bg-gray-800 dark:disabled:text-gray-600 dark:disabled:placeholder-gray-600 dark:disabled:outline-[var(--ui-border-muted)]',\n hasRightGroup ? 'pe-10' : '',\n hasLeftGroup ? 'ps-10' : '',\n className,\n )}\n />\n {hasRightGroup && (\n <span className=\"absolute end-3 top-2.5 flex items-center justify-center text-gray-400 dark:text-gray-500\">\n {rightGroup}\n </span>\n )}\n </div>\n\n {/* Footer Row: Error / Helper Text & Live Character Count */}\n {(showErrorMessage && error) || helperText || showCount ? (\n <div className=\"mt-1.5 flex items-center justify-between gap-2 text-xs\">\n <div className=\"min-w-0 flex-1\">\n {showErrorMessage && error ? (\n <TextContent error small id={errorId}>\n {error}\n </TextContent>\n ) : helperText ? (\n <TextContent muted small id={helperId}>\n {helperText}\n </TextContent>\n ) : null}\n </div>\n\n {showCount && (\n <span\n className={buildClassName(\n 'text-[11px] font-medium shrink-0 ml-auto',\n maxLength && charLength >= maxLength\n ? 'text-red-500 font-semibold'\n : 'text-gray-400 dark:text-gray-500',\n )}\n >\n {charLength}\n {maxLength ? ` / ${maxLength}` : ''}\n </span>\n )}\n </div>\n ) : null}\n </div>\n )\n})\n\nTextarea.displayName = 'Textarea'\n"],"names":["_jsxs","_jsx"],"mappings":"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"}
|