tabbable-demo

PreviousNext
Docs
plateexample

Preview

Loading preview…
registry/examples/tabbable-demo.tsx
'use client';

import * as React from 'react';

import type { PlateElementProps } from 'platejs/react';

import { TabbablePlugin } from '@platejs/tabbable/react';
import {
  Plate,
  PlateElement,
  useFocused,
  usePlateEditor,
  useSelected,
} from 'platejs/react';

import { cn } from '@/lib/utils';
import { EditorKit } from '@/registry/components/editor/editor-kit';
import { tabbableValue } from '@/registry/examples/values/tabbable-value';
import { Editor, EditorContainer } from '@/registry/ui/editor';

export default function TabbableDemo() {
  const editor = usePlateEditor({
    plugins: [
      ...EditorKit,
      TabbablePlugin.configure({
        node: { component: TabbableElement, isElement: true, isVoid: true },
      }),
    ],
    value: tabbableValue,
  });

  return (
    <Plate editor={editor}>
      <EditorContainer variant="demo">
        <Editor />
      </EditorContainer>
    </Plate>
  );
}

export function TabbableElement({ children, ...props }: PlateElementProps) {
  const selected = useSelected();
  const focused = useFocused();

  return (
    <PlateElement {...props}>
      <div
        className={cn(
          'mb-2 p-2',
          selected && focused
            ? 'border-2 border-blue-500'
            : 'border border-gray-200'
        )}
        contentEditable={false}
      >
        <p>This is a void element.</p>
        <button type="button">Button 1</button>{' '}
        <button type="button">Button 2</button>
      </div>
      {children}
    </PlateElement>
  );
}

Installation

npx shadcn@latest add @plate/tabbable-demo

Usage

import { TabbableDemo } from "@/components/tabbable-demo"
<TabbableDemo />