{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "list-classic-docs",
  "title": "List Classic",
  "description": "Documentation for List Classic",
  "files": [
    {
      "path": "../../content/docs/(plugins)/(elements)/list-classic.mdx",
      "content": "---\ntitle: List Classic\ndocs:\n  - route: /docs/components/list-classic-node\n    title: List Nodes\n  - route: /docs/components/list-classic-toolbar-button\n    title: List Toolbar Button\n---\n\n<ComponentPreview name=\"list-classic-demo\" />\n\n<Callout type=\"info\" title=\"Choose Your List Plugin\">\n  Plate offers two approaches for implementing lists:\n\n  1. **This List Classic plugin** - Traditional HTML-spec lists with strict nesting rules:\n     - Follows standard HTML list structure (`ul`/`ol` > `li`)\n     - Maintains consistent list hierarchy\n     - Best for content that may be exported to HTML/markdown\n     - Highest complexity\n\n  2. The [**List plugin**](/docs/list) - Flexible indentation-based lists:\n     - More like Word/Google Docs behavior\n     - Any block can be indented to create list-like structures\n     - Used in the [AI editor](/editors#editor-ai)\n     - Supports nested todo lists\n     - Better for free-form content organization\n\n  Choose based on your needs:\n  - Use the **List Classic plugin** when you need standard HTML list compatibility\n  - Use the **List plugin** when you want more flexible indentation behavior\n\n</Callout>\n\n<PackageInfo>\n\n\n## Features\n\n- **HTML-compliant lists**:\n  - Standard `ul`/`ol` > `li` structure\n  - Proper nesting and hierarchy\n  - SEO-friendly markup\n  - Clean HTML/markdown export\n\n- **List types**:\n  - Unordered (bulleted) lists\n  - Ordered (numbered) lists\n  - Task lists with checkboxes\n  - Nested sublists\n\n- **Drag & drop**:\n  - Currently supports root-level list items only\n  - Sibling and nested items drag & drop not yet supported\n\n- **Shortcuts**:\n  - Register the shipped input rules to use markdown shortcuts (**`-`**, **`*`**, **`1.`**, **`[ ]`**) to create lists\n  - Tab/Shift+Tab for indentation control\n\n- **Limitations (use the [List plugin](/docs/list) for these features)**:\n  - Drag & drop only supports root-level lists\n  - List items cannot be aligned\n\nFor a more flexible, Word-like approach, see the [List plugin](/docs/list).\n\n</PackageInfo>\n\n## Kit Usage\n\n<Steps>\n\n### Installation\n\nThe fastest way to add list functionality is with the `ListKit` export from `list-classic-kit`, which includes pre-configured list plugins, the classic markdown entry rules, [Plate UI](/docs/installation/plate-ui) components, and keyboard shortcuts.\n\n<ComponentSource name=\"list-classic-kit\" />\n\n- [`BulletedListElement`](/docs/components/list-classic-node): Renders unordered list elements.\n- [`NumberedListElement`](/docs/components/list-classic-node): Renders ordered list elements.\n- [`TaskListElement`](/docs/components/list-classic-node): Renders task list elements with checkboxes.\n\n### Add Kit\n\nAdd the kit to your plugins:\n\n```tsx\nimport { createPlateEditor } from 'platejs/react';\nimport { ListKit } from '@/components/editor/plugins/list-classic-kit';\n\nconst editor = createPlateEditor({\n  plugins: [\n    // ...otherPlugins,\n    ...ListKit,\n  ],\n});\n```\n\n</Steps>\n\nThe shipped `ListKit` also wires the classic markdown entry rules for bulleted, ordered, and task lists. See [Plugin Input Rules](/docs/plugin-input-rules) for the runtime model.\n\n## Manual Usage\n\n<Steps>\n\n### Installation\n\n```bash\nnpm install @platejs/list-classic\n```\n\n### Add Plugins\n\nInclude the list plugins in your Plate plugins array when creating the editor.\n\n```tsx\nimport { ListPlugin, BulletedListPlugin, NumberedListPlugin, TaskListPlugin, ListItemPlugin } from '@platejs/list-classic/react';\nimport { createPlateEditor } from 'platejs/react';\n\nconst editor = createPlateEditor({\n  plugins: [\n    // ...otherPlugins,\n    ListPlugin,\n    BulletedListPlugin,\n    NumberedListPlugin,\n    TaskListPlugin,\n    ListItemPlugin,\n  ],\n});\n```\n\n### Configure Plugins\n\nConfigure the plugins with custom components and keyboard shortcuts.\n\n```tsx\nimport {\n  BulletedListRules,\n  OrderedListRules,\n  TaskListRules,\n} from '@platejs/list-classic';\nimport { ListPlugin, BulletedListPlugin, NumberedListPlugin, TaskListPlugin, ListItemPlugin } from '@platejs/list-classic/react';\nimport { createPlateEditor } from 'platejs/react';\nimport { BulletedListElement, NumberedListElement, TaskListElement } from '@/components/ui/list-classic-node';\n\nconst editor = createPlateEditor({\n  plugins: [\n    // ...otherPlugins,\n    ListPlugin.configure({\n      inputRules: [\n        BulletedListRules.markdown({ variant: '-' }),\n        BulletedListRules.markdown({ variant: '*' }),\n        OrderedListRules.markdown({ variant: '.' }),\n        OrderedListRules.markdown({ variant: ')' }),\n        TaskListRules.markdown({ checked: false }),\n        TaskListRules.markdown({ checked: true }),\n      ],\n    }),\n    BulletedListPlugin.configure({\n      node: { component: BulletedListElement },\n      shortcuts: { toggle: { keys: 'mod+alt+5' } },\n    }),\n    NumberedListPlugin.configure({\n      node: { component: NumberedListElement },\n      shortcuts: { toggle: { keys: 'mod+alt+6' } },\n    }),\n    TaskListPlugin.configure({\n      node: { component: TaskListElement },\n      shortcuts: { toggle: { keys: 'mod+alt+7' } },\n    }),\n    ListItemPlugin,\n  ],\n});\n```\n\n- `inputRules`: Registers the classic markdown entry rules for bulleted, ordered, and task lists.\n- `node.component`: Assigns [`BulletedListElement`](/docs/components/list-classic-node), [`NumberedListElement`](/docs/components/list-classic-node), and [`TaskListElement`](/docs/components/list-classic-node) to render list elements.\n- `shortcuts.toggle`: Defines keyboard [shortcuts](/docs/plugin-shortcuts) to toggle list types (`mod+alt+5` for bulleted, `mod+alt+6` for numbered, `mod+alt+7` for task lists).\n\n### Add Toolbar Button\n\nYou can add [`ListToolbarButton`](/docs/components/list-classic-toolbar-button) to your [Toolbar](/docs/toolbar) to create and manage lists.\n\n### Turn Into Toolbar Button\n\nWhen using the `ListPlugin`, use the [`turn-into-toolbar-classic-button`](/docs/components/turn-into-toolbar-classic-button) which includes all list types (bulleted, numbered, and task lists).\n\n### Insert Toolbar Button\n\nWhen using the `ListPlugin`, use the [`insert-toolbar-classic-button`](/docs/components/insert-toolbar-classic-button) which includes all list types (bulleted, numbered, and task lists).\n\n</Steps>\n\n## Plugins\n\n### `ListPlugin`\n\n<API name=\"ListPlugin\">\nContains the following element plugins:\n- `BulletedListPlugin`\n- `NumberedListPlugin`\n- `TaskListPlugin`\n- `ListItemPlugin`\n- `ListItemContentPlugin`\n\n<APIOptions type=\"object\">\n  <APIItem name=\"validLiChildrenTypes\" type=\"string[]\" optional>\n    Valid child node types for list items (besides `p` and `ul`).\n  </APIItem>\n  <APIItem name=\"enableResetOnShiftTab\" type=\"boolean\" optional>\n    Whether Shift+Tab should reset list indent level.\n  </APIItem>\n  <APIItem name=\"inheritCheckStateOnLineEndBreak\" type=\"boolean\" optional>\n    Whether to inherit the checked state of above node after insert break at the end. Only applies to task lists.\n    - **Default:** `false`\n  </APIItem>\n  <APIItem name=\"inheritCheckStateOnLineStartBreak\" type=\"boolean\" optional>\n    Whether to inherit the checked state of below node after insert break at the start. Only applies to task lists.\n    - **Default:** `false`\n  </APIItem>\n</APIOptions>\n</API>\n\n### `BulletedListPlugin`\n\nPlugin for unordered (bulleted) lists.\n\n### `NumberedListPlugin`\n\nPlugin for ordered (numbered) lists.\n\n### `TaskListPlugin`\n\nPlugin for task lists with checkboxes.\n\n### `ListItemPlugin`\n\nPlugin for list items.\n\n### `ListItemContentPlugin`\n\nPlugin for list item content.\n\n## Transforms\n\n### `tf.ul.toggle()`\n\nToggles a bulleted list (ul).\n\nExample Shortcut: `Mod+Alt+5`\n\n### `tf.ol.toggle()`\n\nToggles an ordered list (ol).\n\nExample Shortcut: `Mod+Alt+6`\n\n### `tf.taskList.toggle()`\n\nToggles a task list with checkboxes.\n\nExample Shortcut: `Mod+Alt+7`\n\n## API\n\n### `getHighestEmptyList`\n\nFinds the highest end list that can be deleted. The path of the list should be different from `diffListPath`. If the highest end list has 2 or more items, returns `liPath`. It traverses up the parent lists until:\n- The list has less than 2 items\n- Its path is not equal to `diffListPath`\n\n<API name=\"getHighestEmptyList\">\n<APIOptions type=\"object\">\n  <APIItem name=\"liPath\" type=\"Path\">\n    Path of list item.\n  </APIItem>\n  <APIItem name=\"diffListPath\" type=\"Path\" optional>\n    Path of different list.\n  </APIItem>\n</APIOptions>\n\n<APIReturns type=\"Path | undefined\">\n  Path of highest deletable end list.\n</APIReturns>\n</API>\n\n### `getListItemEntry`\n\nReturns the nearest `li` and `ul`/`ol` wrapping node entries for a given path (`default = selection`).\n\n<API name=\"getListItemEntry\">\n<APIOptions type=\"object\">\n  <APIItem name=\"at\" type=\"Location | null\" optional>\n    Location to get entries from.\n    - **Default:** `editor.selection`\n  </APIItem>\n</APIOptions>\n\n<APIReturns type=\"ElementEntry | undefined\">\n  Nearest `li` and `ul`/`ol` wrapping node entries.\n</APIReturns>\n</API>\n\n### `getListRoot`\n\nSearches upward for root list element.\n\n<API name=\"getListRoot\">\n<APIParameters>\n  <APIItem name=\"at\" type=\"Path | TRange | Point | null\" optional>\n    Location to start search from.\n    - **Default:** `editor.selection`\n  </APIItem>\n</APIParameters>\n\n<APIReturns type=\"ElementEntry | undefined\">\n  Root list element entry.\n</APIReturns>\n</API>\n\n### `getListTypes`\n\nGets array of supported list types.\n\n<API name=\"getListTypes\">\n<APIReturns type=\"string[]\">\n  Array of supported list types.\n</APIReturns>\n</API>\n\n### `moveListSiblingsAfterCursor`\n\nMoves list siblings after cursor to specified path.\n\n<API name=\"moveListSiblingsAfterCursor\">\n<APIOptions type=\"options\">\n  <APIItem name=\"at\" type=\"Path\">\n    Cursor position path.\n  </APIItem>\n  <APIItem name=\"to\" type=\"Path\">\n    Destination path.\n  </APIItem>\n</APIOptions>\n\n<APIReturns type=\"number\">\n  Number of siblings moved.\n</APIReturns>\n</API>\n\n### `removeFirstListItem`\n\nRemoves first list item if not nested and not first child.\n\n<API name=\"removeFirstListItem\">\n<APIOptions type=\"options\">\n  <APIItem name=\"list\" type=\"ElementEntry\">\n    List entry containing item.\n  </APIItem>\n  <APIItem name=\"listItem\" type=\"ElementEntry\">\n    List item to remove.\n  </APIItem>\n</APIOptions>\n\n<APIReturns type=\"boolean\">\n  Whether item was removed.\n</APIReturns>\n</API>\n\n### `removeListItem`\n\nRemoves list item and moves sublist to parent if any.\n\n<API name=\"removeListItem\">\n<APIOptions type=\"RemoveListItemOptions\">\n  <APIItem name=\"list\" type=\"ElementEntry\">\n    List entry containing item.\n  </APIItem>\n  <APIItem name=\"listItem\" type=\"ElementEntry\">\n    List item to remove.\n  </APIItem>\n  <APIItem name=\"reverse\" type=\"boolean\" optional>\n    Whether to reverse sublist items.\n    - **Default:** `true`\n  </APIItem>\n</APIOptions>\n\n<APIReturns type=\"boolean\">\n  Whether item was removed.\n</APIReturns>\n</API>\n\n### `someList`\n\nChecks if selection is inside list of specific type.\n\n<API name=\"someList\">\n<APIParameters>\n  <APIItem name=\"type\" type=\"string\">\n    List type to check.\n  </APIItem>\n</APIParameters>\n\n<APIReturns type=\"boolean\">\n  Whether selection is in specified list type.\n</APIReturns>\n</API>\n\n### `unindentListItems`\n\nDecreases indentation level of list items.\n\n<API name=\"unindentListItems\">\n<APIOptions type=\"UnindentListItemsOptions\">\n    Target path for unindenting.\n</APIOptions>\n</API>\n\n### `unwrapList`\n\nRemoves list formatting from selected items.\n\n<API name=\"unwrapList\">\n<APIOptions type=\"options\">\n  <APIItem name=\"at\" type=\"Path\" optional>\n    Target path for unwrapping.\n  </APIItem>\n</APIOptions>\n</API>\n\n## Hooks\n\n### `useListToolbarButton`\n\nA behavior hook for a list toolbar button.\n\n<API name=\"useListToolbarButton\">\n<APIState>\n  <APIItem name=\"pressed\" type=\"boolean\">\n    Button pressed state.\n  </APIItem>\n  <APIItem name=\"nodeType\" type=\"string\">\n    List node type.\n    - **Default:** `BulletedListPlugin.key`\n  </APIItem>\n</APIState>\n\n<APIReturns type=\"object\">\n  <APIItem name=\"props\" type=\"object\">\n    Props for toolbar button.\n  </APIItem>\n  <APISubList>\n    <APISubListItem parent=\"props\" name=\"pressed\" type=\"boolean\">\n      Button pressed state.\n    </APISubListItem>\n    <APISubListItem parent=\"props\" name=\"onClick\" type=\"function\">\n      Handler to toggle list and focus editor.\n    </APISubListItem>\n  </APISubList>\n</APIReturns>\n</API>\n\n### `useTodoListElementState`\n\nHook to manage task list item state.\n\n<API name=\"useTodoListElementState\">\n<APIState>\n  <APIItem name=\"element\" type=\"TTodoListItemElement\">\n    Task list item element.\n  </APIItem>\n</APIState>\n\n<APIReturns type=\"object\">\n  <APIItem name=\"checked\" type=\"boolean\">\n    Whether the task item is checked.\n  </APIItem>\n  <APIItem name=\"readOnly\" type=\"boolean\">\n    Whether the editor is in read-only mode.\n  </APIItem>\n  <APIItem name=\"onCheckedChange\" type=\"function\">\n    Handler to toggle the checked state.\n  </APIItem>\n</APIReturns>\n</API>\n\n### `useTodoListElement`\n\nHook to get props for task list item checkbox.\n\n<API name=\"useTodoListElement\">\n<APIState>\n  <APIItem name=\"checked\" type=\"boolean\">\n    Whether the task item is checked.\n  </APIItem>\n  <APIItem name=\"readOnly\" type=\"boolean\">\n    Whether the editor is in read-only mode.\n  </APIItem>\n  <APIItem name=\"onCheckedChange\" type=\"function\">\n    Handler to toggle the checked state.\n  </APIItem>\n</APIState>\n\n<APIReturns type=\"object\">\n  <APIItem name=\"checkboxProps\" type=\"object\">\n    Props to be spread on the checkbox component.\n  </APIItem>\n</APIReturns>\n</API>\n",
      "type": "registry:file",
      "target": "content/docs/plate/(plugins)/(elements)/list-classic.mdx"
    }
  ],
  "type": "registry:file"
}