{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "combobox-docs",
  "title": "Combobox",
  "description": "Documentation for Combobox",
  "files": [
    {
      "path": "../../content/docs/(plugins)/(functionality)/(combobox)/combobox.mdx",
      "content": "---\ntitle: Combobox\ndocs:\n  - route: /docs/components/inline-combobox\n    title: Inline Combobox\n---\n\n<Cards>\n\n<Card icon=\"mention\" title=\"Mention\" href=\"/docs/mention\">\nInsert mentions for users, pages, or any reference with `@`\n</Card>\n\n<Card icon=\"slash-command\" title=\"Slash Command\" href=\"/docs/slash-command\">\nQuick access to editor commands and blocks with `/`\n</Card>\n\n<Card icon=\"emoji\" title=\"Emoji\" href=\"/docs/emoji\">\nInsert emojis with autocomplete using `:`\n</Card>\n\n</Cards>\n\n<PackageInfo>\n\n## Features\n\n- Utilities for creating trigger-based combobox functionality\n- Configurable trigger characters and patterns\n- Keyboard navigation and selection handling\n\n</PackageInfo>\n\n## Create a Combobox Plugin\n\n<Steps>\n\n### Installation\n\n```bash\nnpm install @platejs/combobox\n```\n\n### Create Input Plugin\n\nFirst, create an input plugin that will be inserted when the trigger is activated:\n\n```tsx\nimport { createSlatePlugin } from 'platejs';\n\nconst TagInputPlugin = createSlatePlugin({\n  key: 'tag_input',\n  editOnly: true,\n  node: {\n    isElement: true,\n    isInline: true,\n    isVoid: true,\n  },\n});\n```\n\n### Create Main Plugin\n\nCreate your main plugin using `withTriggerCombobox`:\n\n```tsx\nimport { createTSlatePlugin, type PluginConfig } from 'platejs';\nimport { \n  type TriggerComboboxPluginOptions, \n  withTriggerCombobox \n} from '@platejs/combobox';\n\ntype TagConfig = PluginConfig<'tag', TriggerComboboxPluginOptions>;\n\nexport const TagPlugin = createTSlatePlugin<TagConfig>({\n  key: 'tag',\n  node: { isElement: true, isInline: true, isVoid: true },\n  options: {\n    trigger: '#',\n    triggerPreviousCharPattern: /^\\s?$/,\n    createComboboxInput: () => ({\n      children: [{ text: '' }],\n      type: 'tag_input',\n    }),\n  },\n  plugins: [TagInputPlugin],\n}).overrideEditor(withTriggerCombobox);\n```\n\n- `node.isElement`: Defines this as an element node (not text)\n- `node.isInline`: Makes the tag element inline (not block)\n- `node.isVoid`: Prevents editing inside the tag element\n- `options.trigger`: Character that triggers the combobox (in this case `#`)\n- `options.triggerPreviousCharPattern`: RegExp pattern that must match the character before the trigger. `/^\\s?$/` allows the trigger at the start of a line or after whitespace\n- `options.createComboboxInput`: Function that creates the input element node when the trigger is activated\n\n### Create Component\n\nCreate the input element component using `InlineCombobox`:\n\n```tsx\nimport { PlateElement, useFocused, useReadOnly, useSelected } from 'platejs/react';\nimport {\n  InlineCombobox,\n  InlineComboboxContent,\n  InlineComboboxEmpty,\n  InlineComboboxInput,\n  InlineComboboxItem,\n} from '@/components/ui/inline-combobox';\nimport { cn } from '@/lib/utils';\n\nconst tags = [\n  { id: 'frontend', name: 'Frontend', color: 'blue' },\n  { id: 'backend', name: 'Backend', color: 'green' },\n  { id: 'design', name: 'Design', color: 'purple' },\n  { id: 'urgent', name: 'Urgent', color: 'red' },\n];\n\nexport function TagInputElement({ element, ...props }) {\n  return (\n    <PlateElement as=\"span\" {...props}>\n      <InlineCombobox element={element} trigger=\"#\">\n        <InlineComboboxInput />\n        \n        <InlineComboboxContent>\n          <InlineComboboxEmpty>No tags found</InlineComboboxEmpty>\n          \n          {tags.map((tag) => (\n            <InlineComboboxItem\n              key={tag.id}\n              value={tag.name}\n              onClick={() => {\n                // Insert actual tag element\n                editor.tf.insertNodes({\n                  type: 'tag',\n                  tagId: tag.id,\n                  children: [{ text: tag.name }],\n                });\n              }}\n            >\n              <span \n                className={`w-3 h-3 rounded-full bg-${tag.color}-500 mr-2`}\n              />\n              #{tag.name}\n            </InlineComboboxItem>\n          ))}\n        </InlineComboboxContent>\n      </InlineCombobox>\n      \n      {props.children}\n    </PlateElement>\n  );\n}\n\nexport function TagElement({ element, ...props }) {\n  const selected = useSelected();\n  const focused = useFocused();\n  const readOnly = useReadOnly();\n\n  return (\n    <PlateElement\n      {...props}\n      className={cn(\n        'inline-block rounded-md bg-primary/10 px-1.5 py-0.5 align-baseline text-sm font-medium text-primary',\n        !readOnly && 'cursor-pointer',\n        selected && focused && 'ring-2 ring-ring'\n      )}\n      attributes={{\n        ...props.attributes,\n        contentEditable: false,\n        'data-slate-value': element.value,\n      }}\n    >\n      #{element.value}\n      {props.children}\n    </PlateElement>\n  );\n}\n```\n\n### Add to Editor\n\n```tsx\nimport { createPlateEditor } from 'platejs/react';\nimport { TagPlugin, TagInputPlugin } from './tag-plugin';\nimport { TagElement, TagInputElement } from './tag-components';\n\nconst editor = createPlateEditor({\n  plugins: [\n    // ...otherPlugins,\n    TagPlugin.configure({\n      options: {\n        triggerQuery: (editor) => {\n          // Disable in code blocks\n          return !editor.api.some({ match: { type: 'code_block' } });\n        },\n      },\n    }).withComponent(TagElement),\n    TagInputPlugin.withComponent(TagInputElement),\n  ],\n});\n```\n\n- `options.triggerQuery`: Optional function to conditionally enable/disable the trigger based on editor state\n\n</Steps>\n\n## Examples\n\n<ComponentPreview name=\"mention-demo\" />\n<ComponentPreview name=\"slash-command-demo\" />\n<ComponentPreview name=\"emoji-demo\" />\n\n## Options\n\n### TriggerComboboxPluginOptions\n\nConfiguration options for trigger-based combobox plugins.\n\n<API name=\"TriggerComboboxPluginOptions\">\n<APIOptions>\n  <APIItem name=\"createComboboxInput\" type=\"(trigger: string) => TElement\">\n    Function to create the input node when trigger is activated.\n  </APIItem>\n  <APIItem name=\"trigger\" type=\"RegExp | string[] | string\">\n    Character(s) that trigger the combobox. Can be:\n    - A single character (e.g. '@')\n    - An array of characters\n    - A regular expression\n  </APIItem>\n  <APIItem name=\"triggerPreviousCharPattern\" type=\"RegExp\" optional>\n    Pattern to match the character before trigger.\n    - **Example:** `/^\\s?$/` matches start of line or space\n  </APIItem>\n  <APIItem name=\"triggerQuery\" type=\"(editor: SlateEditor) => boolean\" optional>\n    Custom query function to control when trigger is active.\n  </APIItem>\n</APIOptions>\n</API>\n\n## Hooks\n\n### useComboboxInput\n\nHook for managing combobox input behavior and keyboard interactions.\n\n<API name=\"useComboboxInput\">\n<APIOptions>\n  <APIItem name=\"ref\" type=\"RefObject<HTMLElement>\">\n    Reference to the input element.\n  </APIItem>\n  <APIItem name=\"autoFocus\" type=\"boolean\" optional>\n    Auto focus the input when mounted.\n    - **Default:** `true`\n  </APIItem>\n  <APIItem name=\"cancelInputOnArrowLeftRight\" type=\"boolean\" optional>\n    Cancel on arrow keys.\n    - **Default:** `true`\n  </APIItem>\n  <APIItem name=\"cancelInputOnBackspace\" type=\"boolean\" optional>\n    Cancel on backspace at start.\n    - **Default:** `true`\n  </APIItem>\n  <APIItem name=\"cancelInputOnBlur\" type=\"boolean\" optional>\n    Cancel on blur.\n    - **Default:** `true`\n  </APIItem>\n  <APIItem name=\"cancelInputOnDeselect\" type=\"boolean\" optional>\n    Cancel when deselected.\n    - **Default:** `true`\n  </APIItem>\n  <APIItem name=\"cancelInputOnEscape\" type=\"boolean\" optional>\n    Cancel on escape key.\n    - **Default:** `true`\n  </APIItem>\n  <APIItem name=\"cursorState\" type=\"ComboboxInputCursorState\" optional>\n    Current cursor position state.\n  </APIItem>\n  <APIItem name=\"forwardUndoRedoToEditor\" type=\"boolean\" optional>\n    Forward undo/redo to editor.\n    - **Default:** `true`\n  </APIItem>\n  <APIItem name=\"onCancelInput\" type=\"(cause: CancelComboboxInputCause) => void\" optional>\n    Callback when input is cancelled.\n  </APIItem>\n</APIOptions>\n\n<APIReturns>\n  <APIItem name=\"cancelInput\" type=\"(cause?: CancelComboboxInputCause, focusEditor?: boolean) => void\">\n    Function to cancel the input.\n  </APIItem>\n  <APIItem name=\"props\" type=\"object\">\n    Props for the input element.\n  </APIItem>\n  <APIItem name=\"removeInput\" type=\"(focusEditor?: boolean) => void\">\n    Function to remove the input node.\n  </APIItem>\n</APIReturns>\n</API>\n\n### useHTMLInputCursorState\n\nHook for tracking cursor position in an HTML input element.\n\n<API name=\"useHTMLInputCursorState\">\n<APIParameters>\n  <APIItem name=\"ref\" type=\"RefObject<HTMLInputElement>\">\n    Reference to the input element to track.\n  </APIItem>\n</APIParameters>\n\n<APIReturns>\n  <APIItem name=\"atStart\" type=\"boolean\">\n    Whether cursor is at the start of input.\n  </APIItem>\n  <APIItem name=\"atEnd\" type=\"boolean\">\n    Whether cursor is at the end of input.\n  </APIItem>\n</APIReturns>\n</API>",
      "type": "registry:file",
      "target": "content/docs/plate/(plugins)/(functionality)/(combobox)/combobox.mdx"
    }
  ],
  "type": "registry:file"
}