List
plate/block-listFreeComponent
List components.
Live preview
live · rendered by the registry
Rendered by plate on their own page — this is the component running, not a screenshot of it.Install it
npx shadcn@latest add https://platejs.org/r/block-list.jsonSource
1'use client';23import React from 'react';45import type { TListElement } from 'platejs';67import { isOrderedList } from '@platejs/list';8import {9 useTodoListElement,10 useTodoListElementState,11} from '@platejs/list/react';12import {13 type PlateElementProps,14 type RenderNodeWrapper,15 useReadOnly,16} from 'platejs/react';1718import { Checkbox } from '@/components/ui/checkbox';19import { cn } from '@/lib/utils';2021const config: Record<22 string,23 {24 Li: React.FC<PlateElementProps & { lineBreakBadge?: React.ReactNode }>;25 Marker: React.FC<PlateElementProps>;26 }27> = {28 todo: {29 Li: TodoLi,30 Marker: TodoMarker,31 },32};3334export const BlockList: RenderNodeWrapper = (props) => {35 if (!props.element.listStyleType) return;36 if (!isOrderedList(props.element)) return;3738 return (props) => <List {...props} />;39};4041function List(props: PlateElementProps & { lineBreakBadge?: React.ReactNode }) {42 const { listStart, listStyleType } = props.element as TListElement;43 const { Li, Marker } = config[listStyleType] ?? {};44 const List = isOrderedList(props.element) ? 'ol' : 'ul';4546 return (47 <List48 className="relative m-0 p-0"49 style={{ listStyleType }}50 start={listStart}51 >52 {Marker && <Marker {...props} />}53 {Li ? (54 <Li {...props} />55 ) : (56 <li>57 {props.children}58 {props.lineBreakBadge}59 </li>60 )}61 </List>62 );63}6465function TodoMarker(props: PlateElementProps) {66 const state = useTodoListElementState({ element: props.element });67 const { checkboxProps } = useTodoListElement(state);68 const readOnly = useReadOnly();6970 return (71 <div contentEditable={false}>72 <Checkbox73 className={cn(74 '-left-6 absolute top-1',75 readOnly && 'pointer-events-none'76 )}77 {...checkboxProps}78 />79 </div>80 );81}8283function TodoLi(84 props: PlateElementProps & { lineBreakBadge?: React.ReactNode }85) {86 return (87 <li88 className={cn(89 'list-none',90 (props.element.checked as boolean) &&91 'text-muted-foreground line-through'92 )}93 >94 {props.children}95 {props.lineBreakBadge}96 </li>97 );98}
What it pulls in
npm packages
Other registry items
Files it writes
More from plate
All 324 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| ai-kitai-kit | plate | Components | Free | 1 dep | |
| AI Menuai-menu | plate | Components | Free | 5 deps · 2 files | |
| AI Leafai-node | plate | Components | Free | no deps | |
| AI Toolbar Buttonai-toolbar-button | plate | Components | Free | 1 dep | |
| align-base-kitalign-base-kit | plate | Components | Free | 1 dep | |
| align-kitalign-kit | plate | Components | Free | 1 dep | |
| Align Toolbar Buttonalign-toolbar-button | plate | Components | Free | 1 dep | |
| autoformat-classic-kitautoformat-classic-kit | plate | Components | Free | 2 deps |
