diff --git a/apps/design-system/__registry__/index.tsx b/apps/design-system/__registry__/index.tsx index 9978c4286e3..8d55cc7b07a 100644 --- a/apps/design-system/__registry__/index.tsx +++ b/apps/design-system/__registry__/index.tsx @@ -1919,17 +1919,6 @@ export const Index: Record = { subcategory: "undefined", chunks: [] }, - "multi-select-combobox-creatable": { - name: "multi-select-combobox-creatable", - type: "components:example", - registryDependencies: undefined, - component: React.lazy(() => import("@/registry/default/example/multi-select-combobox-creatable")), - source: "", - files: ["registry/default/example/multi-select-combobox.tsx"], - category: "undefined", - subcategory: "undefined", - chunks: [] - }, "multi-select-deletable-badge": { name: "multi-select-deletable-badge", type: "components:example", diff --git a/apps/design-system/content/docs/fragments/multi-select.mdx b/apps/design-system/content/docs/fragments/multi-select.mdx index 1c3d40faf46..8425bb4a988 100644 --- a/apps/design-system/content/docs/fragments/multi-select.mdx +++ b/apps/design-system/content/docs/fragments/multi-select.mdx @@ -47,13 +47,6 @@ Use `MultiSelectorInput`to add a search input. -### Badge Combo Box with creatable selector - -creatable: `boolean` -`creatable` prop on the `MultiSelectorList` component can be used to add a new option if no items match - - - ### Badge Limit badgeLimit: `number` | `"wrap"`. diff --git a/apps/design-system/registry/default/example/multi-select-combobox-creatable.tsx b/apps/design-system/registry/default/example/multi-select-combobox-creatable.tsx deleted file mode 100644 index 5b8ddf96c71..00000000000 --- a/apps/design-system/registry/default/example/multi-select-combobox-creatable.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import { useState } from 'react' -import { - MultiSelector, - MultiSelectorContent, - MultiSelectorInput, - MultiSelectorItem, - MultiSelectorList, - MultiSelectorTrigger, -} from 'ui-patterns/multi-select' - -export default function MultiSelectDemo() { - const [selectedValues, setSelectedValues] = useState([]) - - return ( - - - - - - Mango - Date - Apple - Elderberrie - Fig - Grape - Banana - Kiwi - Strawberry - Cherry - - - - ) -} diff --git a/apps/design-system/registry/examples.ts b/apps/design-system/registry/examples.ts index a9f4de3e7c8..58d7c1dd508 100644 --- a/apps/design-system/registry/examples.ts +++ b/apps/design-system/registry/examples.ts @@ -1091,11 +1091,6 @@ export const examples: Registry = [ type: 'components:example', files: ['example/multi-select-combobox.tsx'], }, - { - name: 'multi-select-combobox-creatable', - type: 'components:example', - files: ['example/multi-select-combobox-creatable.tsx'], - }, { name: 'multi-select-deletable-badge', type: 'components:example', diff --git a/packages/ui-patterns/multi-select/multi-select.tsx b/packages/ui-patterns/multi-select/multi-select.tsx index 7ad9e7ebc2b..837d89399ca 100644 --- a/packages/ui-patterns/multi-select/multi-select.tsx +++ b/packages/ui-patterns/multi-select/multi-select.tsx @@ -1,12 +1,12 @@ 'use client' -import { Check, ChevronsUpDown, X as RemoveIcon } from 'lucide-react' import React, { useEffect } from 'react' +import { Check, ChevronsUpDown, X as RemoveIcon } from 'lucide-react' -import { VariantProps, cva } from 'class-variance-authority' import { SIZE_VARIANTS, SIZE_VARIANTS_DEFAULT } from 'ui/src/lib/constants' +import { VariantProps, cva } from 'class-variance-authority' -import { Badge, cn, useOnClickOutside } from 'ui' +import { cn, Badge, useOnClickOutside } from 'ui' import { Command, CommandEmpty, @@ -31,12 +31,6 @@ interface MultiSelectContextProps { const MultiSelectContext = React.createContext(null) -const commandItemClass = cn( - 'relative text-foreground-lighter text-left px-2 py-1.5 rounded', - 'hover:text-foreground hover:!bg-overlay-hover w-full flex items-center space-x-2', - 'peer-data-[value=true]:bg-overlay-hover peer-data-[value=true]:text-strong' -) - function useMultiSelect() { const context = React.useContext(MultiSelectContext) if (!context) { @@ -217,7 +211,6 @@ const MultiSelectorTrigger = React.forwardRef = React.useCallback( (event) => { setOpen(true) - setInputValue('') if (IS_INLINE_MODE) { event.stopPropagation() @@ -236,7 +229,6 @@ const MultiSelectorTrigger = React.forwardRef !isDeleteHovered && handleTriggerClick(e)} disabled={disabled} - type="button" role="combobox" className={cn( 'flex w-full min-w-[200px] min-h-[40px] items-center justify-between rounded-md border', @@ -265,8 +257,7 @@ const MultiSelectorTrigger = React.forwardRef setIsDeleteHovered(true)} onMouseLeave={() => setIsDeleteHovered(false)} - onClick={(e) => { - e.stopPropagation() + onClick={() => { toggleValue(value) setIsDeleteHovered(false) }} @@ -428,49 +419,21 @@ MultiSelector.Content = MultiSelectorContent const MultiSelectorList = React.forwardRef< React.ElementRef, - React.ComponentPropsWithoutRef & { - creatable?: boolean - } ->(({ className, children, creatable = false }, ref) => { - const { open, inputValue, setInputValue, toggleValue } = useMultiSelect() - - const options = (children as React.ReactNode[]) ?? [] - const availableOptions = options - .filter((x: any) => !!x.props.value) - .map((x: any) => x.props.value.toLowerCase()) - const isOptionExists = availableOptions.some((x) => x === inputValue.toLowerCase()) - + React.ComponentPropsWithoutRef +>(({ className, children }, ref) => { return ( {children} - {creatable && inputValue.length > 0 && !isOptionExists ? ( - { - open && toggleValue(inputValue) - setInputValue('') - }} - className={commandItemClass} - > - Create "{inputValue}" - - ) : creatable && options.length === 0 ? ( -
- Type to add a value -
- ) : ( - - No results found - - )} + + No results found +
) }) @@ -494,7 +457,15 @@ const MultiSelectorItem = React.forwardRef< open && toggleValue(value) setInputValue('') }} - className={cn(commandItemClass, className)} + className={cn( + 'relative', + 'text-foreground-lighter text-left', + 'px-2 py-1.5 rounded', + 'hover:text-foreground hover:!bg-overlay-hover', + 'w-full flex items-center space-x-2', + 'peer-data-[value=true]:bg-overlay-hover peer-data-[value=true]:text-strong', + className + )} {...props} >