{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "multi-select-docs",
  "title": "Multi Select",
  "description": "Documentation for Multi Select",
  "files": [
    {
      "path": "../../content/docs/(plugins)/(functionality)/multi-select.mdx",
      "content": "---\ntitle: Multi Select\ndocs:\n  - route: /docs/components/tag-node\n  - route: /docs/components/select-editor\n---\n\n<ComponentPreview name=\"select-editor-demo\" />\n\n<PackageInfo>\n\n## Features\n\nUnlike traditional input-based multi-selects, this component is built on top of Plate editor, providing:\n\n- Full history support (undo/redo)\n- Native cursor navigation between and within tags\n- Select one to many tags\n- Copy/paste tags\n- Drag and drop to reorder tags\n- Read-only mode\n- Duplicate tags prevention\n- Create new tags with case insensitive matching\n- Search text cleanup and whitespace trimming\n- Fuzzy search powered by [cmdk](https://github.com/pacocoursey/cmdk)\n\n</PackageInfo>\n\n## Manual Usage\n\n<Steps>\n\n### Installation\n\n```bash\nnpm install @platejs/tag\n```\n\n### Add Plugins\n\n```tsx\nimport { MultiSelectPlugin } from '@platejs/tag/react';\nimport { createPlateEditor } from 'platejs/react';\n\nconst editor = createPlateEditor({\n  plugins: [\n    // ...otherPlugins,\n    MultiSelectPlugin, // Multi-select editor with tag functionality\n  ],\n});\n```\n\n### Configure Plugins\n\n```tsx\nimport { MultiSelectPlugin } from '@platejs/tag/react';\nimport { createPlateEditor } from 'platejs/react';\nimport { TagElement } from '@/components/ui/tag-node';\n\nconst editor = createPlateEditor({\n  plugins: [\n    // ...otherPlugins,\n    MultiSelectPlugin.withComponent(TagElement),\n  ],\n});\n```\n\n- `MultiSelectPlugin`: Extends TagPlugin and constrains the editor to only contain tag elements\n- `withComponent`: Assigns [`TagElement`](/docs/components/tag-node) to render tag components\n\n### Add SelectEditor\n\n<ComponentInstallation name=\"select-editor\" inline />\n\n### Basic Example\n\n```tsx\nimport { MultiSelectPlugin } from '@platejs/tag/react';\nimport { TagElement } from '@/components/ui/tag-node';\nimport {\n  SelectEditor,\n  SelectEditorContent,\n  SelectEditorInput,\n  SelectEditorCombobox,\n  type SelectItem,\n} from '@/components/ui/select-editor';\n\n// Define your items\nconst ITEMS: SelectItem[] = [\n  { value: 'React' },\n  { value: 'TypeScript' },\n  { value: 'JavaScript' },\n];\n\nexport default function MySelectEditor() {\n  const [value, setValue] = React.useState<SelectItem[]>([ITEMS[0]]);\n\n  return (\n    <SelectEditor\n      value={value}\n      onValueChange={setValue}\n      items={ITEMS}\n    >\n      <SelectEditorContent>\n        <SelectEditorInput placeholder=\"Select items...\" />\n        <SelectEditorCombobox />\n      </SelectEditorContent>\n    </SelectEditor>\n  );\n}\n```\n\n### Form Example\n\n<ComponentSource name=\"select-editor-demo\" />\n\n</Steps>\n\n## Plugins\n\n### TagPlugin\n\nInline void element plugin for individual tag functionality.\n\n### MultiSelectPlugin\n\nExtension of `TagPlugin` that constrains the editor to only contain tag elements, enabling multi-select behavior with automatic text cleanup and duplicate prevention.\n\n## API\n\n### tf.insert.tag\n\nInserts new multi-select element at current selection.\n\n<API name=\"tf.insert.tag\">\n<APIParameters>\n  <APIItem name=\"props\" type=\"TTagProps\">\n    Properties for multi-select element.\n  </APIItem>\n</APIParameters>\n\n<APIOptions type=\"TTagProps\">\n  <APIItem name=\"value\" type=\"string\">\n    Unique value of multi-select element.\n  </APIItem>\n</APIOptions>\n</API>\n\n### getSelectedItems\n\nGets all tag items in the editor.\n\n<API name=\"getSelectedItems\">\n<APIReturns type=\"TTagProps[]\">\n  Array of tag items in editor.\n</APIReturns>\n</API>\n\n### isEqualTags\n\nUtility function to compare two sets of tags for equality, ignoring order.\n\n<API name=\"isEqualTags\">\n<APIParameters>\n  <APIItem name=\"newTags\" type=\"TTagProps[]\" optional>\n    New tags to compare against current editor tags.\n  </APIItem>\n</APIParameters>\n\n<APIReturns type=\"boolean\">\n  Whether both sets contain same values.\n</APIReturns>\n</API>\n\n## Hooks\n\n### useSelectedItems\n\nHook to get the currently selected tag items in the editor.\n\n<API name=\"useSelectedItems\">\n<APIReturns type=\"TTagProps[]\">\n  Array of selected tag items with values and properties.\n</APIReturns>\n</API>\n\n### useSelectableItems\n\nHook to get the available items that can be selected, filtered by search and excluding already selected items.\n\n<API name=\"useSelectableItems\">\n<APIOptions type=\"options\">\n  <APIItem name=\"allowNew\" type=\"boolean\" optional>\n    Whether to allow creating new items.\n    - **Default:** `true`\n  </APIItem>\n  <APIItem name=\"filter\" type=\"(value: string, search: string) => boolean\" optional>\n    Custom filter function for items.\n  </APIItem>\n  <APIItem name=\"items\" type=\"T[]\" optional>\n    Array of available items.\n  </APIItem>\n  <APIItem name=\"newItemFilter\" type=\"(search: string) => boolean\" optional>\n    Filter function for new items.\n  </APIItem>\n  <APIItem name=\"newItemPosition\" type=\"'end' | 'start'\" optional>\n    Position of new items in list.\n    - **Default:** `'end'`\n  </APIItem>\n</APIOptions>\n\n<APIReturns type=\"T[]\">\n  Filtered array of selectable items.\n</APIReturns>\n</API>\n\n### useSelectEditorCombobox\n\nHook to handle combobox behavior in the editor, including text cleanup and item selection.\n\n<API name=\"useSelectEditorCombobox\">\n<APIOptions type=\"options\">\n  <APIItem name=\"open\" type=\"boolean\">\n    Whether combobox is open.\n  </APIItem>\n  <APIItem name=\"selectFirstItem\" type=\"() => void\">\n    Function to select first combobox item.\n  </APIItem>\n  <APIItem name=\"onValueChange\" type=\"(items: TTagProps[]) => void\" optional>\n    Callback when selected items change.\n  </APIItem>\n</APIOptions>\n</API>\n\n## Types\n\n### TTagElement\n\n```ts\ntype TTagElement = TElement & {\n  value: string;\n  [key: string]: unknown;\n};\n```\n\n### TTagProps\n\n```ts\ntype TTagProps = {\n  value: string;\n  [key: string]: unknown;\n};\n```",
      "type": "registry:file",
      "target": "content/docs/plate/(plugins)/(functionality)/multi-select.mdx"
    }
  ],
  "type": "registry:file"
}