๐Ÿ“ Sign Up | ๐Ÿ” Log In

โ† Root | โ†‘ Up

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ ๐Ÿ“„ shadcn/directory/udecode/plate/(plugins)/(functionality)/block-menu.cn โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘

title: ๅ—่œๅ• docs:

  • route: /docs/components/block-context-menu title: ๅ—ไธŠไธ‹ๆ–‡่œๅ•

  • route: https://pro.platejs.org/docs/components/block-menu title: ๅ—่œๅ•

  • route: https://pro.platejs.org/docs/components/block-context-menu title: ๅ—ไธŠไธ‹ๆ–‡่œๅ•


<ComponentPreview name="block-menu-demo" /> <PackageInfo>

ๅŠŸ่ƒฝ็‰นๆ€ง

  • ๅณ้”ฎ็‚นๅ‡ปๅ—ๅ…ƒ็ด ๅฏๆ‰“ๅผ€ไธŠไธ‹ๆ–‡่œๅ•
  • ๆ”ฏๆŒๅฏนๅ—ๅ…ƒ็ด ๆ‰ง่กŒๅคš็งๆ“ไฝœ๏ผš่ฝฌๆข็ฑปๅž‹ใ€ๅคๅˆถๆˆ–ๅˆ ้™ค็ญ‰
  • ๅฏ่‡ชๅฎšไน‰่œๅ•้กนๅ’Œๆ“ไฝœ่กŒไธบ
  • ๆ”ฏๆŒ้”ฎ็›˜ๅฏผ่ˆช
  • ไธŽๅ—้€‰ๆ‹ฉๅŠŸ่ƒฝ้›†ๆˆ
</PackageInfo>

ๅฅ—ไปถไฝฟ็”จ

<Steps>

ๅฎ‰่ฃ…

ๆœ€ๅฟซๆท็š„ๆ–นๅผๆ˜ฏไฝฟ็”จ BlockMenuKit๏ผŒๅฎƒๅŒ…ๅซ้ข„้…็ฝฎ็š„ BlockMenuPlugin ไปฅๅŠ BlockSelectionPlugin ๅ’Œๅฎƒไปฌ็š„ Plate UI ็ป„ไปถใ€‚

<ComponentSource name="block-menu-kit" />
  • BlockContextMenu: ๆธฒๆŸ“ไธŠไธ‹ๆ–‡่œๅ•็•Œ้ข

ๆทปๅŠ ๅฅ—ไปถ

import { createPlateEditor } from 'platejs/react';
import { BlockMenuKit } from '@/components/editor/plugins/block-menu-kit';

const editor = createPlateEditor({
  plugins: [
    // ...ๅ…ถไป–ๆ’ไปถ
    ...BlockMenuKit,
  ],
});
</Steps>

ๆ‰‹ๅŠจ้…็ฝฎ

<Steps>

ๅฎ‰่ฃ…ไพ่ต–

npm install @platejs/selection

ๆทปๅŠ ๆ’ไปถ

ๅ—่œๅ•ๅŠŸ่ƒฝ้œ€่ฆๅŒๆ—ถๅฎ‰่ฃ… BlockSelectionPlugin ๅ’Œ BlockMenuPlugin ๆ‰่ƒฝๆญฃๅธธๅทฅไฝœใ€‚

import { BlockSelectionPlugin, BlockMenuPlugin } from '@platejs/selection/react';
import { createPlateEditor } from 'platejs/react';

const editor = createPlateEditor({
  plugins: [
    // ...ๅ…ถไป–ๆ’ไปถ
    BlockSelectionPlugin.configure({
      options: {
        enableContextMenu: true,
      },
    }),
    BlockMenuPlugin,
  ],
});

้…็ฝฎๆ’ไปถ

้€š่ฟ‡ไธŠไธ‹ๆ–‡่œๅ•็ป„ไปถ้…็ฝฎๅ—่œๅ•๏ผš

import { BlockSelectionPlugin, BlockMenuPlugin } from '@platejs/selection/react';
import { createPlateEditor } from 'platejs/react';
import { BlockContextMenu } from '@/components/ui/block-context-menu';

const editor = createPlateEditor({
  plugins: [
    // ...ๅ…ถไป–ๆ’ไปถ
    BlockSelectionPlugin.configure({
      options: {
        enableContextMenu: true,
      },
    }),
    BlockMenuPlugin.configure({
      render: { aboveEditable: BlockContextMenu },
    }),
  ],
});
  • BlockSelectionPlugin.options.enableContextMenu: ๅฏ็”จไธŠไธ‹ๆ–‡่œๅ•ๅŠŸ่ƒฝ
  • BlockMenuPlugin.render.aboveEditable: ๆŒ‡ๅฎš BlockContextMenu ็ป„ไปถๆฅๆธฒๆŸ“ไธŠไธ‹ๆ–‡่œๅ•

ๆŽงๅˆถไธŠไธ‹ๆ–‡่œๅ•่กŒไธบ

้€š่ฟ‡ data-plate-open-context-menu ๅฑžๆ€งๅฏๆŽงๅˆถ็‰นๅฎšๅ…ƒ็ด ๆ˜ฏๅฆ่งฆๅ‘ไธŠไธ‹ๆ–‡่œๅ•๏ผš

<PlateElement data-plate-open-context-menu={false} {...props}>
  {children}
</PlateElement>

ๆญคๅฑžๆ€งๅธธ็”จไบŽ้˜ฒๆญขๅœจ <Editor /> ็ป„ไปถ็š„็ฉบ็™ฝๅŒบๅŸŸๅณ้”ฎๆ—ถๅผนๅ‡บ่œๅ•ใ€‚

</Steps>

Plate Plus ไธ“ไธš็‰ˆ

<ComponentPreviewPro name="block-menu-pro" />

ๆ’ไปถ็ณป็ปŸ

BlockMenuPlugin

็”จไบŽ็ฎก็†ๅ—่œๅ•็Šถๆ€ๅ’ŒไธŠไธ‹ๆ–‡่œๅ•ๅŠŸ่ƒฝ็š„ๆ’ไปถ

API ๆŽฅๅฃ

api.blockMenu.hide

้š่—ๅ—่œๅ•

api.blockMenu.show

ไธบๆŒ‡ๅฎšๅ—ๆ˜พ็คบ่œๅ•

<API name="show"> <APIParameters> <APIItem name="id" type="'context' | string"> ่ฆๆ˜พ็คบ่œๅ•็š„ๅ—ID๏ผŒๆˆ–ไฝฟ็”จ'context'่กจ็คบไธŠไธ‹ๆ–‡่œๅ• </APIItem> <APIItem name="position" type="{ x: number; y: number }" optional> ่œๅ•ๆ˜พ็คบไฝ็ฝฎๅๆ ‡ใ€‚่‹ฅๆœชๆไพ›๏ผŒๅˆ™ไป…ๆ›ดๆ–ฐopenId็Šถๆ€ </APIItem> </APIParameters> </API>

api.blockMenu.showContextMenu

ไธบๆŒ‡ๅฎšๅ—ๆ˜พ็คบไธŠไธ‹ๆ–‡่œๅ•ๅนถ่‡ชๅŠจ้€‰ไธญ่ฏฅๅ—

<API name="showContextMenu"> <APIParameters> <APIItem name="blockId" type="string"> ่ฆๆ˜พ็คบไธŠไธ‹ๆ–‡่œๅ•็š„ๅ—ID </APIItem> <APIItem name="position" type="{ x: number; y: number }"> ่œๅ•ๆ˜พ็คบไฝ็ฝฎๅๆ ‡ </APIItem> </APIParameters> </API>
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

โ† Root | โ†‘ Up