Compose node-selection highlighting and drag selection with `NodeSelectionHighlight` and `NodeSelectionDrag` from `platejs/react`. Link their API and demo from the Editor registry page.
Keep comment popovers anchored to their text, clear abandoned draft marks without moving the live selection or caret, and keep the floating toolbar available after resolving a comment.
Use flat input rows with an edge-to-edge separator.
Hide block and cell drag handles during table cell selection. Keep row drag handles for selections within one row, and hide them across rows.
Hide native text highlight while selecting multiple table cells.
Keep the text cursor while resize handles are ignored during cell-selection drags.
Plate UI
Select schema-defined blocksSelect custom Plate block content from its schema and let tables render their own selection geometry.
Install Base UI source with `base-nova` by default. Explicit Radix styles select the matching interaction adapters.
Install Nova, Vega, Maia, Lyra, Mira, Luma, Sera, or Rhea code styles without duplicating the complete editor registry.
Compose popovers, dropdowns, and context menus through the selected provider without provider-specific trigger, focus, delay, or value props in consumer code.
Install the classic editor graph with Base or Radix through the same semantic item ids.
Install the docs block with Base or Radix without fixed Radix primitive packages.
Create a fresh Next project with a complete dependency graph, collision-free inline-suggestion imports, and current copied-source types.
Preserve one selection highlight while changing font size
Paint the block-selection marquee during gutter drags
Fix Plate-to-HTML rendering for values with element IDs
Plate UI
Fix tag link installationResolve links without a website-only locale utility.
Install the authored editor kit without generated TypeScript or schema snapshots. Generate exact contracts from the application's customized plugin module and enforce `plate generate --check <entry>` in CI.
- Delete unused plugins.generated.ts and plugins.schema.json files. If the app needs exact contracts, install @platejs/cli, regenerate from its local plugin module, and enforce plate generate --check <entry> in CI.
Keep editor focus and the floating toolbar visible while toolbar menus handle pointer input.
Preserve the active editor value while focus moves into a control, and reopen inline equations only after selection returns.
Give each browser object URL one source lifetime and revoke it when that source is replaced or unmounted.
Render the selected-cell drag handle at its cell owner and keep fake-stream cancellation inside its transport.
Use named React Compiler components without manual memo wrappers or display-name assignments.
The copied editor renders a Pointer Events marquee while exact one-or-many membership stays in editor selection. No selection plugin, area abstraction, or selection package is required.
Activate block drag behavior only during pointer and drag interactions while preserving the stable block DOM.
Show nested property values as JSON in version history updates.
Use native, keyboard-accessible controls for split toolbars, media upload, and image preview actions.
Restrict embedded content with explicit sandbox and referrer policies.
Accept anchored removal suggestions without crashing the editor.
Store dates under one `value` and persisted associations under `ref`.
Use flat lowercase drawing fields and store equation source under `latex`.
Apply the v55 migration, field ownership, and numeric-domain contracts.
Keep controlled tags and decorated text stable during typing and undo.
Keep UploadThing server routing in `uploadthing` and colocate client upload state in `media-placeholder`.
- Keep custom upload state in your media placeholder component; `uploadthing` installs only the server router.
Keep single-consumer subscription and picker state inside their owning component families.
Keep DOCX file import and export in the DOCX example while default editors retain DOCX paste support.
Keep reusable editor composition migration-free and teach named lineage only in the dedicated migration example.
- Define your named schema and migration chain in the application persistence owner; `editor-plugins` exports only `EditorKit`.
Bind the copied editor to a named schema and run its v53-to-v54 document migration before rendering.
Plate UI
Localize editor UI policyInstall self-contained families with product copy, limits, styling, endpoints, and interaction policy in copied source; `table` composes renderer layout and pointer behavior directly.
Use one semantic Heading, boundary-only list numbering, semantic Table fields, intrinsic Media dimensions, and the generated v54 editor contract.
Install copied editor features from one flat editor namespace
- Move copied Plate imports from @/components/ui and @/components/editor/plugins to @/components/editor.
- Install feature items without -kit or -base-kit suffixes; FooKit remains the exported plugin tuple.
- Import feature-owned renderers and family-only components from the owning feature file, such as @/components/editor/footnote and @plate/footnote.
- Use semantic renderer item names such as blockquote and media-image instead of *-node; install static renderers from their matching *-static items.
Keep interaction state and behavior inside direct React 19 component families.
- Rename the FloatingToolbar state prop to options.
Install the exact app-local descriptors owned by their copied UI families.
Compose DOCX renderers through target plugins. Install `DocxIOPlugin` explicitly in the live editor when using its scoped import or export API.
Reuse the primary editor composition directly, compose Copilot only in its demo, and install `ElementIdPlugin` only when persisted IDs are required.
- Import the primary editor composition directly outside the Copilot demo. Append CopilotKit only in copilot-demo.
- Install ElementIdPlugin explicitly when persisted element IDs or Markdown withBlockId are required.
- Install CodeDrawingPlugin or ExcalidrawPlugin explicitly in editors that use those specialized nodes.
- Remove schema: EditorSchema from copied editor setup. Add an application-owned schema id and version only for persisted schema lineage, migrations, history serialization, or collaboration.
Keep code drawing and Excalidraw explicit in the demos that use them.
Derive schema identity from the installed plugin composition instead of publishing application lineage from copied registry code.
Correlate comments and table-cell edits with request-local refs instead of persisted element IDs.
Fix heading renderer prop types across H1-H6 components.
Install every required package and copied registry file without redundant declarations.
Build live TOC navigation and DOCX-local bookmarks from runtime node keys.
Install persisted element IDs explicitly as editor product policy.
Infer copied renderer props from their plugin descriptors.
Apply font marks to text and keep selection highlighting aligned after changing font size.
Use the typed keyboard plugin command while preserving one atomic selection update.
Restore editor focus when the table menu closes.
Fix mouse-drag block selection
Close the inline equation editor at an arrow-key boundary.
Apply formatting without losing the active text selection.
Keep direct block drag and drop stable
Keep typing responsive while comments and suggestions are enabled.
Infer node component props from plugin descriptors
Use one table cell plugin and component for data and header cells.
- Use TableCellElement for data and header cells. Header nodes use type: 'tableCell' with header: true.
Read final element types and property keys from installed schema handles.
Read the stored AI preview when insert or replace commands run, so custom commands pass only formatting options.
Configure feature renderers explicitly while installing each plugin name once.
Read cursor geometry and schema-configured node ids from their package owners.
Let resize handles derive read-only state from the editor.
Use the DnD block selection-and-focus controller after row drops.
Render without installing the code drawing plugin twice.
Seed editor-local plugin stores with `initialState`.
Read, update, and subscribe to plugin state through the typed store API.
Configure and update plugin store state through the same API used by copied registry code.
Use one script mark for subscript and superscript
- For persisted v53 script marks, add migratePlateV54 to the app's defineDocumentMigrations chain.
Bind static components without React plugin imports
Run two independent local Yjs peers with connection, schema, history, and remote cursor controls.
Configure Markdown parsing without installing a renderer-specific Footnote preset.
Compose the shared Markdown parser with the matching live or static Footnote renderers exactly once.
Install only the presets their copied source composes, without unrelated static/base counterparts.
Preserve Indent support while reserving Tab and Shift+Tab navigation for tabbable elements.
Configure text color palettes, optionally control recent colors, and navigate color grids with the keyboard.
Keep suggestion and trailing-block capabilities independently composable
Use installed feature plugins instead of raw type dispatch in toolbar controls.
Style placeholders and drop cursors in the copied editor component while Plite supplies their structural DOM behavior.
Use the installed List plugin for list-aware block dragging
Compose editor variants with explicit plugin arrays
Render direct media caption children, keep an empty caption hidden until asset focus, and separate asset selection from caption editing.
- Remove CaptionPlugin from media kits and render each media element's direct children as its caption; use [{ text: '' }] when the caption is absent.
- For persisted v53 media captions, add migratePlateV54 to the app's defineDocumentMigrations chain.
Plate UI
Use scoped media insert APIsUse plugin-scoped media insertion in copied editor transforms.
Keep plugin configuration terminal
Plate UI
Use typed plugin portalsUse the installed plugin's typed editor APIs with Plate v54.
Wire list toolbar controls to ListPlugin
Plate UI
Fix date picker interactionOpen the date picker reliably inside Plite editors.
Insert code blocks, drawings, Excalidraw canvases, tables, and dropped media through their installed commands with explicit relational or path placement.
Fix preserved-space wrapping so inserted space runs stay inside editable and static editor widths.
Plate UILatest
PR 5013 · Fix shadcn editor kit install pathsInstall editor kit files through the configured components alias so relative `./plugins/*` imports resolve after shadcn CLI adds.
Show the selected language label in read-only and static rendering. Set `showLanguageLabel={false}` on the component to hide it.
Fix column drag and drop by attaching the DnD drop target ref to the rendered column element so horizontal drop lines can resolve a valid target.