prosekit-registry 0.0.13 → 0.0.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/dist/r/lit-ui-button.json +1 -1
  2. package/dist/r/lit-ui-image-upload-popover.json +1 -1
  3. package/dist/r/lit-ui-slash-menu.json +1 -1
  4. package/dist/r/lit-ui-table-handle.json +1 -1
  5. package/dist/r/preact-example-text-color.json +1 -1
  6. package/dist/r/preact-ui-block-handle.json +1 -1
  7. package/dist/r/preact-ui-button.json +1 -1
  8. package/dist/r/preact-ui-image-upload-popover.json +1 -1
  9. package/dist/r/preact-ui-inline-menu.json +1 -1
  10. package/dist/r/preact-ui-slash-menu.json +1 -1
  11. package/dist/r/preact-ui-table-handle.json +1 -1
  12. package/dist/r/preact-ui-tag-menu.json +1 -1
  13. package/dist/r/preact-ui-user-menu.json +1 -1
  14. package/dist/r/react-example-notion.json +2 -2
  15. package/dist/r/react-example-text-color.json +1 -1
  16. package/dist/r/react-ui-block-handle.json +1 -1
  17. package/dist/r/react-ui-button.json +1 -1
  18. package/dist/r/react-ui-image-upload-popover.json +1 -1
  19. package/dist/r/react-ui-inline-menu.json +1 -1
  20. package/dist/r/react-ui-slash-menu.json +1 -1
  21. package/dist/r/react-ui-table-handle.json +1 -1
  22. package/dist/r/react-ui-tag-menu.json +1 -1
  23. package/dist/r/react-ui-user-menu.json +1 -1
  24. package/dist/r/solid-example-text-color.json +1 -1
  25. package/dist/r/solid-ui-block-handle.json +1 -1
  26. package/dist/r/solid-ui-button.json +1 -1
  27. package/dist/r/solid-ui-image-upload-popover.json +1 -1
  28. package/dist/r/solid-ui-inline-menu.json +1 -1
  29. package/dist/r/solid-ui-slash-menu.json +1 -1
  30. package/dist/r/solid-ui-table-handle.json +1 -1
  31. package/dist/r/solid-ui-tag-menu.json +1 -1
  32. package/dist/r/solid-ui-user-menu.json +1 -1
  33. package/dist/r/svelte-example-text-color.json +1 -1
  34. package/dist/r/svelte-ui-block-handle.json +1 -1
  35. package/dist/r/svelte-ui-button.json +1 -1
  36. package/dist/r/svelte-ui-image-upload-popover.json +1 -1
  37. package/dist/r/svelte-ui-inline-menu.json +1 -1
  38. package/dist/r/svelte-ui-slash-menu.json +1 -1
  39. package/dist/r/svelte-ui-table-handle.json +1 -1
  40. package/dist/r/svelte-ui-tag-menu.json +1 -1
  41. package/dist/r/svelte-ui-user-menu.json +1 -1
  42. package/dist/r/vanilla-ui-slash-menu.json +1 -1
  43. package/dist/r/vue-example-text-color.json +1 -1
  44. package/dist/r/vue-ui-block-handle.json +1 -1
  45. package/dist/r/vue-ui-button.json +1 -1
  46. package/dist/r/vue-ui-image-upload-popover.json +1 -1
  47. package/dist/r/vue-ui-inline-menu.json +1 -1
  48. package/dist/r/vue-ui-slash-menu.json +1 -1
  49. package/dist/r/vue-ui-table-handle.json +1 -1
  50. package/dist/r/vue-ui-tag-menu.json +1 -1
  51. package/dist/r/vue-ui-user-menu.json +1 -1
  52. package/package.json +3 -4
@@ -22,7 +22,7 @@
22
22
  "path": "registry/src/vue/ui/inline-menu/inline-menu.vue",
23
23
  "type": "registry:component",
24
24
  "target": "components/editor/ui/inline-menu/inline-menu.vue",
25
- "content": "<script setup lang=\"ts\">\nimport type { BasicExtension } from 'prosekit/basic'\nimport type { Editor } from 'prosekit/core'\nimport type { LinkAttrs } from 'prosekit/extensions/link'\nimport type { EditorState } from 'prosekit/pm/state'\nimport { useEditor, useEditorDerivedValue } from 'prosekit/vue'\nimport { InlinePopoverPopup, InlinePopoverPositioner, InlinePopoverRoot } from 'prosekit/vue/inline-popover'\nimport { ref } from 'vue'\n\nimport { Button } from '../button'\n\nfunction getInlineMenuItems(editor: Editor<BasicExtension>) {\n return {\n bold: editor.commands.toggleBold\n ? {\n isActive: editor.marks.bold.isActive(),\n canExec: editor.commands.toggleBold.canExec(),\n command: () => editor.commands.toggleBold(),\n }\n : undefined,\n italic: editor.commands.toggleItalic\n ? {\n isActive: editor.marks.italic.isActive(),\n canExec: editor.commands.toggleItalic.canExec(),\n command: () => editor.commands.toggleItalic(),\n }\n : undefined,\n underline: editor.commands.toggleUnderline\n ? {\n isActive: editor.marks.underline.isActive(),\n canExec: editor.commands.toggleUnderline.canExec(),\n command: () => editor.commands.toggleUnderline(),\n }\n : undefined,\n strike: editor.commands.toggleStrike\n ? {\n isActive: editor.marks.strike.isActive(),\n canExec: editor.commands.toggleStrike.canExec(),\n command: () => editor.commands.toggleStrike(),\n }\n : undefined,\n code: editor.commands.toggleCode\n ? {\n isActive: editor.marks.code.isActive(),\n canExec: editor.commands.toggleCode.canExec(),\n command: () => editor.commands.toggleCode(),\n }\n : undefined,\n link: editor.commands.addLink\n ? {\n isActive: editor.marks.link.isActive(),\n canExec: editor.commands.addLink.canExec({ href: '' }),\n command: () => editor.commands.expandLink(),\n currentLink: getCurrentLink(editor.state) || '',\n }\n : undefined,\n }\n}\n\nfunction getCurrentLink(state: EditorState): string | undefined {\n const { $from } = state.selection\n const marks = $from.marksAcross($from)\n if (!marks) {\n return\n }\n for (const mark of marks) {\n if (mark.type.name === 'link') {\n return (mark.attrs as LinkAttrs).href\n }\n }\n}\n\nconst editor = useEditor<BasicExtension>()\nconst items = useEditorDerivedValue(getInlineMenuItems)\n\nconst linkMenuOpen = ref(false)\nfunction toggleLinkMenuOpen() {\n linkMenuOpen.value = !linkMenuOpen.value\n}\n\nfunction handleLinkUpdate(href?: string) {\n if (href) {\n editor.value.commands.addLink({ href })\n } else {\n editor.value.commands.removeLink()\n }\n\n linkMenuOpen.value = false\n editor.value.focus()\n}\n</script>\n\n<template>\n <InlinePopoverRoot\n @open-change=\"(event) => {\n if (!event.detail) linkMenuOpen = false\n }\"\n >\n <InlinePopoverPositioner class=\"block overflow-visible bg-transparent w-min h-min z-50 motion-safe:ease-out motion-safe:transition-transform motion-safe:duration-100\">\n <InlinePopoverPopup\n data-testid=\"inline-menu-main\"\n class=\"box-border data-[state=closed]:motion-safe:duration-150 motion-safe:transition-discrete motion-safe:transition-all data-[state=closed]:opacity-0 starting:opacity-0 opacity-100 data-[state=closed]:scale-95 starting:scale-95 scale-100 motion-safe:duration-40 border border-gray-200 dark:border-gray-800 bg-white dark:bg-gray-950 shadow-lg relative flex min-w-32 space-x-1 overflow-auto whitespace-nowrap rounded-md p-1\"\n >\n <Button\n v-if=\"items.bold\"\n :pressed=\"items.bold.isActive\"\n :disabled=\"!items.bold.canExec\"\n tooltip=\"Bold\"\n @click=\"items.bold.command\"\n >\n <div class=\"i-lucide-bold size-5 block\"></div>\n </Button>\n <Button\n v-if=\"items.italic\"\n :pressed=\"items.italic.isActive\"\n :disabled=\"!items.italic.canExec\"\n tooltip=\"Italic\"\n @click=\"items.italic.command\"\n >\n <div class=\"i-lucide-italic size-5 block\"></div>\n </Button>\n <Button\n v-if=\"items.underline\"\n :pressed=\"items.underline.isActive\"\n :disabled=\"!items.underline.canExec\"\n tooltip=\"Underline\"\n @click=\"items.underline.command\"\n >\n <div class=\"i-lucide-underline size-5 block\"></div>\n </Button>\n <Button\n v-if=\"items.strike\"\n :pressed=\"items.strike.isActive\"\n :disabled=\"!items.strike.canExec\"\n tooltip=\"Strikethrough\"\n @click=\"items.strike.command\"\n >\n <div class=\"i-lucide-strikethrough size-5 block\"></div>\n </Button>\n <Button\n v-if=\"items.code\"\n :pressed=\"items.code.isActive\"\n :disabled=\"!items.code.canExec\"\n tooltip=\"Code\"\n @click=\"items.code.command\"\n >\n <div class=\"i-lucide-code size-5 block\"></div>\n </Button>\n <Button\n v-if=\"items.link?.canExec && items.link\"\n :pressed=\"items.link.isActive\"\n tooltip=\"Link\"\n @click=\"() => {\n items.link!.command()\n toggleLinkMenuOpen()\n }\"\n >\n <div class=\"i-lucide-link size-5 block\"></div>\n </Button>\n </InlinePopoverPopup>\n </InlinePopoverPositioner>\n </InlinePopoverRoot>\n\n <InlinePopoverRoot\n v-if=\"items.link\"\n :default-open=\"false\"\n :open=\"linkMenuOpen\"\n @open-change=\"(event) => {\n linkMenuOpen = event.detail\n }\"\n >\n <InlinePopoverPositioner placement=\"bottom\" class=\"block overflow-visible bg-transparent w-min h-min z-50 motion-safe:ease-out motion-safe:transition-transform motion-safe:duration-100\">\n <InlinePopoverPopup\n data-testid=\"inline-menu-link\"\n class=\"box-border data-[state=closed]:motion-safe:duration-150 motion-safe:transition-discrete motion-safe:transition-all data-[state=closed]:opacity-0 starting:opacity-0 opacity-100 data-[state=closed]:scale-95 starting:scale-95 scale-100 motion-safe:duration-40 border border-gray-200 dark:border-gray-800 bg-white dark:bg-gray-950 shadow-lg relative flex flex-col w-xs rounded-lg p-4 gap-y-2 items-stretch\"\n >\n <form\n v-if=\"linkMenuOpen\"\n @submit.prevent=\"(event) => {\n const target = event.target as HTMLFormElement | null\n const href = target?.querySelector('input')?.value?.trim()\n handleLinkUpdate(href)\n }\"\n >\n <input\n placeholder=\"Paste the link...\"\n :value=\"items.link.currentLink || ''\"\n class=\"flex h-9 rounded-md w-full bg-white dark:bg-gray-950 px-3 py-2 text-sm placeholder:text-gray-500 dark:placeholder:text-gray-500 transition border box-border border-gray-200 dark:border-gray-800 border-solid ring-0 ring-transparent focus-visible:ring-2 focus-visible:ring-gray-900 dark:focus-visible:ring-gray-300 focus-visible:ring-offset-0 outline-hidden focus-visible:outline-hidden file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:cursor-not-allowed disabled:opacity-50\"\n >\n </form>\n <button\n v-if=\"items.link.isActive\"\n class=\"inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-white dark:ring-offset-gray-950 transition-colors focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-gray-900 dark:focus-visible:ring-gray-300 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 border-0 bg-gray-900 dark:bg-gray-50 text-gray-50 dark:text-gray-900 hover:bg-gray-900/90 dark:hover:bg-gray-50/90 h-9 px-3\"\n @click=\"() => handleLinkUpdate()\"\n @mousedown.prevent\n >\n Remove link\n </button>\n </InlinePopoverPopup>\n </InlinePopoverPositioner>\n </InlinePopoverRoot>\n</template>\n"
25
+ "content": "<script setup lang=\"ts\">\nimport type { BasicExtension } from 'prosekit/basic'\nimport type { Editor } from 'prosekit/core'\nimport type { LinkAttrs } from 'prosekit/extensions/link'\nimport type { EditorState } from 'prosekit/pm/state'\nimport { useEditor, useEditorDerivedValue } from 'prosekit/vue'\nimport { InlinePopoverPopup, InlinePopoverPositioner, InlinePopoverRoot } from 'prosekit/vue/inline-popover'\nimport { ref } from 'vue'\n\nimport { Button } from '../button'\n\nfunction getInlineMenuItems(editor: Editor<BasicExtension>) {\n return {\n bold: editor.commands.toggleBold\n ? {\n isActive: editor.marks.bold.isActive(),\n canExec: editor.commands.toggleBold.canExec(),\n command: () => editor.commands.toggleBold(),\n }\n : undefined,\n italic: editor.commands.toggleItalic\n ? {\n isActive: editor.marks.italic.isActive(),\n canExec: editor.commands.toggleItalic.canExec(),\n command: () => editor.commands.toggleItalic(),\n }\n : undefined,\n underline: editor.commands.toggleUnderline\n ? {\n isActive: editor.marks.underline.isActive(),\n canExec: editor.commands.toggleUnderline.canExec(),\n command: () => editor.commands.toggleUnderline(),\n }\n : undefined,\n strike: editor.commands.toggleStrike\n ? {\n isActive: editor.marks.strike.isActive(),\n canExec: editor.commands.toggleStrike.canExec(),\n command: () => editor.commands.toggleStrike(),\n }\n : undefined,\n code: editor.commands.toggleCode\n ? {\n isActive: editor.marks.code.isActive(),\n canExec: editor.commands.toggleCode.canExec(),\n command: () => editor.commands.toggleCode(),\n }\n : undefined,\n link: editor.commands.addLink\n ? {\n isActive: editor.marks.link.isActive(),\n canExec: editor.commands.addLink.canExec({ href: '' }),\n command: () => editor.commands.expandLink(),\n currentLink: getCurrentLink(editor.state) || '',\n }\n : undefined,\n }\n}\n\nfunction getCurrentLink(state: EditorState): string | undefined {\n const { $from } = state.selection\n const marks = $from.marksAcross($from)\n if (!marks) {\n return\n }\n for (const mark of marks) {\n if (mark.type.name === 'link') {\n return (mark.attrs as LinkAttrs).href\n }\n }\n}\n\nconst editor = useEditor<BasicExtension>()\nconst items = useEditorDerivedValue(getInlineMenuItems)\n\nconst linkMenuOpen = ref(false)\nfunction toggleLinkMenuOpen() {\n linkMenuOpen.value = !linkMenuOpen.value\n}\n\nfunction handleLinkUpdate(href?: string) {\n if (href) {\n editor.value.commands.addLink({ href })\n } else {\n editor.value.commands.removeLink()\n }\n\n linkMenuOpen.value = false\n editor.value.focus()\n}\n</script>\n\n<template>\n <InlinePopoverRoot\n @open-change=\"(event) => {\n if (!event.detail) linkMenuOpen = false\n }\"\n >\n <InlinePopoverPositioner class=\"block overflow-visible bg-transparent w-min h-min z-50 ease-out transition-transform duration-100 motion-reduce:transition-none\">\n <InlinePopoverPopup\n data-testid=\"inline-menu-main\"\n class=\"box-border origin-(--transform-origin) transition transition-discrete motion-reduce:transition-none data-[state=closed]:duration-150 data-[state=closed]:opacity-0 starting:opacity-0 data-[state=closed]:scale-95 starting:scale-95 duration-40 border border-gray-200 dark:border-gray-800 bg-white dark:bg-gray-950 shadow-lg relative flex min-w-32 space-x-1 overflow-auto whitespace-nowrap rounded-md p-1\"\n >\n <Button\n v-if=\"items.bold\"\n :pressed=\"items.bold.isActive\"\n :disabled=\"!items.bold.canExec\"\n tooltip=\"Bold\"\n @click=\"items.bold.command\"\n >\n <div class=\"i-lucide-bold size-5 block\"></div>\n </Button>\n <Button\n v-if=\"items.italic\"\n :pressed=\"items.italic.isActive\"\n :disabled=\"!items.italic.canExec\"\n tooltip=\"Italic\"\n @click=\"items.italic.command\"\n >\n <div class=\"i-lucide-italic size-5 block\"></div>\n </Button>\n <Button\n v-if=\"items.underline\"\n :pressed=\"items.underline.isActive\"\n :disabled=\"!items.underline.canExec\"\n tooltip=\"Underline\"\n @click=\"items.underline.command\"\n >\n <div class=\"i-lucide-underline size-5 block\"></div>\n </Button>\n <Button\n v-if=\"items.strike\"\n :pressed=\"items.strike.isActive\"\n :disabled=\"!items.strike.canExec\"\n tooltip=\"Strikethrough\"\n @click=\"items.strike.command\"\n >\n <div class=\"i-lucide-strikethrough size-5 block\"></div>\n </Button>\n <Button\n v-if=\"items.code\"\n :pressed=\"items.code.isActive\"\n :disabled=\"!items.code.canExec\"\n tooltip=\"Code\"\n @click=\"items.code.command\"\n >\n <div class=\"i-lucide-code size-5 block\"></div>\n </Button>\n <Button\n v-if=\"items.link?.canExec && items.link\"\n :pressed=\"items.link.isActive\"\n tooltip=\"Link\"\n @click=\"() => {\n items.link!.command()\n toggleLinkMenuOpen()\n }\"\n >\n <div class=\"i-lucide-link size-5 block\"></div>\n </Button>\n </InlinePopoverPopup>\n </InlinePopoverPositioner>\n </InlinePopoverRoot>\n\n <InlinePopoverRoot\n v-if=\"items.link\"\n :default-open=\"false\"\n :open=\"linkMenuOpen\"\n @open-change=\"(event) => {\n linkMenuOpen = event.detail\n }\"\n >\n <InlinePopoverPositioner placement=\"bottom\" class=\"block overflow-visible bg-transparent w-min h-min z-50 ease-out transition-transform duration-100 motion-reduce:transition-none\">\n <InlinePopoverPopup\n data-testid=\"inline-menu-link\"\n class=\"box-border origin-(--transform-origin) transition transition-discrete motion-reduce:transition-none data-[state=closed]:duration-150 data-[state=closed]:opacity-0 starting:opacity-0 data-[state=closed]:scale-95 starting:scale-95 duration-40 border border-gray-200 dark:border-gray-800 bg-white dark:bg-gray-950 shadow-lg relative flex flex-col w-xs rounded-lg p-4 gap-y-2 items-stretch\"\n >\n <form\n v-if=\"linkMenuOpen\"\n @submit.prevent=\"(event) => {\n const target = event.target as HTMLFormElement | null\n const href = target?.querySelector('input')?.value?.trim()\n handleLinkUpdate(href)\n }\"\n >\n <input\n placeholder=\"Paste the link...\"\n :value=\"items.link.currentLink || ''\"\n class=\"flex h-9 rounded-md w-full bg-white dark:bg-gray-950 px-3 py-2 text-sm placeholder:text-gray-500 dark:placeholder:text-gray-500 transition border box-border border-gray-200 dark:border-gray-800 border-solid ring-0 ring-transparent focus-visible:ring-2 focus-visible:ring-gray-900 dark:focus-visible:ring-gray-300 focus-visible:ring-offset-0 outline-hidden focus-visible:outline-hidden file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:cursor-not-allowed disabled:opacity-50\"\n >\n </form>\n <button\n v-if=\"items.link.isActive\"\n class=\"inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-white dark:ring-offset-gray-950 transition-colors focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-gray-900 dark:focus-visible:ring-gray-300 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 border-0 bg-gray-900 dark:bg-gray-50 text-gray-50 dark:text-gray-900 hover:bg-gray-900/90 dark:hover:bg-gray-50/90 h-9 px-3\"\n @click=\"() => handleLinkUpdate()\"\n @mousedown.prevent\n >\n Remove link\n </button>\n </InlinePopoverPopup>\n </InlinePopoverPositioner>\n </InlinePopoverRoot>\n</template>\n"
26
26
  }
27
27
  ],
28
28
  "meta": {
@@ -30,7 +30,7 @@
30
30
  "path": "registry/src/vue/ui/slash-menu/slash-menu.vue",
31
31
  "type": "registry:component",
32
32
  "target": "components/editor/ui/slash-menu/slash-menu.vue",
33
- "content": "<script setup lang=\"ts\">\nimport type { BasicExtension } from 'prosekit/basic'\nimport { canUseRegexLookbehind } from 'prosekit/core'\nimport { useEditor } from 'prosekit/vue'\nimport { AutocompletePopup, AutocompletePositioner, AutocompleteRoot } from 'prosekit/vue/autocomplete'\n\nimport SlashMenuEmpty from './slash-menu-empty.vue'\nimport SlashMenuItem from './slash-menu-item.vue'\n\nconst editor = useEditor<BasicExtension>()\n\n// Match inputs like \"/\", \"/table\", \"/heading 1\" etc. Do not match \"/ heading\".\nconst regex = canUseRegexLookbehind() ? /(?<!\\S)\\/(\\S.*)?$/u : /\\/(\\S.*)?$/u\n</script>\n\n<template>\n <AutocompleteRoot :regex=\"regex\">\n <AutocompletePositioner class=\"block overflow-visible bg-transparent w-min h-min z-50 motion-safe:ease-out motion-safe:transition-transform motion-safe:duration-100\">\n <AutocompletePopup class=\"box-border data-[state=closed]:motion-safe:duration-150 motion-safe:transition-discrete motion-safe:transition-all data-[state=closed]:opacity-0 starting:opacity-0 opacity-100 data-[state=closed]:scale-95 starting:scale-95 scale-100 motion-safe:duration-40 rounded-lg border border-gray-200 dark:border-gray-800 bg-white dark:bg-gray-950 shadow-lg flex flex-col relative max-h-100 min-w-60 select-none overflow-auto whitespace-nowrap p-1\">\n <SlashMenuItem\n label=\"Text\"\n @select=\"() => editor.commands.setParagraph()\"\n />\n\n <SlashMenuItem\n label=\"Heading 1\"\n kbd=\"#\"\n @select=\"() => editor.commands.setHeading({ level: 1 })\"\n />\n\n <SlashMenuItem\n label=\"Heading 2\"\n kbd=\"##\"\n @select=\"() => editor.commands.setHeading({ level: 2 })\"\n />\n\n <SlashMenuItem\n label=\"Heading 3\"\n kbd=\"###\"\n @select=\"() => editor.commands.setHeading({ level: 3 })\"\n />\n\n <SlashMenuItem\n label=\"Bullet list\"\n kbd=\"-\"\n @select=\"() => editor.commands.wrapInList({ kind: 'bullet' })\"\n />\n\n <SlashMenuItem\n label=\"Ordered list\"\n kbd=\"1.\"\n @select=\"() => editor.commands.wrapInList({ kind: 'ordered' })\"\n />\n\n <SlashMenuItem\n label=\"Task list\"\n kbd=\"[]\"\n @select=\"() => editor.commands.wrapInList({ kind: 'task' })\"\n />\n\n <SlashMenuItem\n label=\"Toggle list\"\n kbd=\">>\"\n @select=\"() => editor.commands.wrapInList({ kind: 'toggle' })\"\n />\n\n <SlashMenuItem\n label=\"Quote\"\n kbd=\">\"\n @select=\"() => editor.commands.setBlockquote()\"\n />\n\n <SlashMenuItem\n label=\"Table\"\n @select=\"() => editor.commands.insertTable({ row: 3, col: 3 })\"\n />\n\n <SlashMenuItem\n label=\"Divider\"\n kbd=\"---\"\n @select=\"() => editor.commands.insertHorizontalRule()\"\n />\n\n <SlashMenuItem\n label=\"Code\"\n kbd=\"```\"\n @select=\"() => editor.commands.setCodeBlock()\"\n />\n\n <SlashMenuEmpty />\n </AutocompletePopup>\n </AutocompletePositioner>\n </AutocompleteRoot>\n</template>\n"
33
+ "content": "<script setup lang=\"ts\">\nimport type { BasicExtension } from 'prosekit/basic'\nimport { canUseRegexLookbehind } from 'prosekit/core'\nimport { useEditor } from 'prosekit/vue'\nimport { AutocompletePopup, AutocompletePositioner, AutocompleteRoot } from 'prosekit/vue/autocomplete'\n\nimport SlashMenuEmpty from './slash-menu-empty.vue'\nimport SlashMenuItem from './slash-menu-item.vue'\n\nconst editor = useEditor<BasicExtension>()\n\n// Match inputs like \"/\", \"/table\", \"/heading 1\" etc. Do not match \"/ heading\".\nconst regex = canUseRegexLookbehind() ? /(?<!\\S)\\/(\\S.*)?$/u : /\\/(\\S.*)?$/u\n</script>\n\n<template>\n <AutocompleteRoot :regex=\"regex\">\n <AutocompletePositioner class=\"block overflow-visible bg-transparent w-min h-min z-50 ease-out transition-transform duration-100 motion-reduce:transition-none\">\n <AutocompletePopup class=\"box-border origin-(--transform-origin) transition transition-discrete motion-reduce:transition-none data-[state=closed]:duration-150 data-[state=closed]:opacity-0 starting:opacity-0 data-[state=closed]:scale-95 starting:scale-95 duration-40 rounded-lg border border-gray-200 dark:border-gray-800 bg-white dark:bg-gray-950 shadow-lg flex flex-col relative max-h-100 min-w-60 select-none overflow-auto whitespace-nowrap p-1\">\n <SlashMenuItem\n label=\"Text\"\n @select=\"() => editor.commands.setParagraph()\"\n />\n\n <SlashMenuItem\n label=\"Heading 1\"\n kbd=\"#\"\n @select=\"() => editor.commands.setHeading({ level: 1 })\"\n />\n\n <SlashMenuItem\n label=\"Heading 2\"\n kbd=\"##\"\n @select=\"() => editor.commands.setHeading({ level: 2 })\"\n />\n\n <SlashMenuItem\n label=\"Heading 3\"\n kbd=\"###\"\n @select=\"() => editor.commands.setHeading({ level: 3 })\"\n />\n\n <SlashMenuItem\n label=\"Bullet list\"\n kbd=\"-\"\n @select=\"() => editor.commands.wrapInList({ kind: 'bullet' })\"\n />\n\n <SlashMenuItem\n label=\"Ordered list\"\n kbd=\"1.\"\n @select=\"() => editor.commands.wrapInList({ kind: 'ordered' })\"\n />\n\n <SlashMenuItem\n label=\"Task list\"\n kbd=\"[]\"\n @select=\"() => editor.commands.wrapInList({ kind: 'task' })\"\n />\n\n <SlashMenuItem\n label=\"Toggle list\"\n kbd=\">>\"\n @select=\"() => editor.commands.wrapInList({ kind: 'toggle' })\"\n />\n\n <SlashMenuItem\n label=\"Quote\"\n kbd=\">\"\n @select=\"() => editor.commands.setBlockquote()\"\n />\n\n <SlashMenuItem\n label=\"Table\"\n @select=\"() => editor.commands.insertTable({ row: 3, col: 3 })\"\n />\n\n <SlashMenuItem\n label=\"Divider\"\n kbd=\"---\"\n @select=\"() => editor.commands.insertHorizontalRule()\"\n />\n\n <SlashMenuItem\n label=\"Code\"\n kbd=\"```\"\n @select=\"() => editor.commands.setCodeBlock()\"\n />\n\n <SlashMenuEmpty />\n </AutocompletePopup>\n </AutocompletePositioner>\n </AutocompleteRoot>\n</template>\n"
34
34
  }
35
35
  ],
36
36
  "meta": {
@@ -20,7 +20,7 @@
20
20
  "path": "registry/src/vue/ui/table-handle/table-handle.vue",
21
21
  "type": "registry:component",
22
22
  "target": "components/editor/ui/table-handle/table-handle.vue",
23
- "content": "<script setup lang=\"ts\">\nimport type { Editor } from 'prosekit/core'\nimport type { TableExtension } from 'prosekit/extensions/table'\nimport { useEditorDerivedValue } from 'prosekit/vue'\nimport { MenuItem, MenuPopup, MenuPositioner } from 'prosekit/vue/menu'\nimport {\n TableHandleColumnMenuRoot,\n TableHandleColumnMenuTrigger,\n TableHandleColumnPopup,\n TableHandleColumnPositioner,\n TableHandleDragPreview,\n TableHandleDropIndicator,\n TableHandleRoot,\n TableHandleRowMenuRoot,\n TableHandleRowMenuTrigger,\n TableHandleRowPopup,\n TableHandleRowPositioner,\n} from 'prosekit/vue/table-handle'\n\nfunction getTableHandleState(editor: Editor<TableExtension>) {\n return {\n addTableColumnBefore: {\n canExec: editor.commands.addTableColumnBefore.canExec(),\n command: () => editor.commands.addTableColumnBefore(),\n },\n addTableColumnAfter: {\n canExec: editor.commands.addTableColumnAfter.canExec(),\n command: () => editor.commands.addTableColumnAfter(),\n },\n deleteCellSelection: {\n canExec: editor.commands.deleteCellSelection.canExec(),\n command: () => editor.commands.deleteCellSelection(),\n },\n deleteTableColumn: {\n canExec: editor.commands.deleteTableColumn.canExec(),\n command: () => editor.commands.deleteTableColumn(),\n },\n addTableRowAbove: {\n canExec: editor.commands.addTableRowAbove.canExec(),\n command: () => editor.commands.addTableRowAbove(),\n },\n addTableRowBelow: {\n canExec: editor.commands.addTableRowBelow.canExec(),\n command: () => editor.commands.addTableRowBelow(),\n },\n deleteTableRow: {\n canExec: editor.commands.deleteTableRow.canExec(),\n command: () => editor.commands.deleteTableRow(),\n },\n deleteTable: {\n canExec: editor.commands.deleteTable.canExec(),\n command: () => editor.commands.deleteTable(),\n },\n }\n}\n\ninterface Props {\n dir?: 'ltr' | 'rtl'\n}\n\nconst props = defineProps<Props>()\n\nconst state = useEditorDerivedValue(getTableHandleState)\n</script>\n\n<template>\n <TableHandleRoot>\n <TableHandleDragPreview />\n <TableHandleDropIndicator />\n <TableHandleColumnPositioner class=\"block overflow-visible bg-transparent w-min h-min z-50 motion-safe:ease-out motion-safe:transition-transform motion-safe:duration-100\">\n <TableHandleColumnPopup class=\"translate-y-[50%] flex box-border motion-safe:duration-100 data-[state=closed]:motion-safe:duration-150 motion-safe:transition-discrete motion-safe:transition-all data-[state=closed]:opacity-0 starting:opacity-0 opacity-100 data-[state=closed]:scale-95 starting:scale-95 scale-100\">\n <TableHandleColumnMenuRoot>\n <TableHandleColumnMenuTrigger class=\"h-4.5 w-6 flex items-center box-border justify-center bg-white dark:bg-gray-950 hover:bg-gray-100 dark:hover:bg-gray-800 rounded-sm text-gray-500/50 dark:text-gray-400/50 border border-gray-200 dark:border-gray-800 border-solid p-0 transition-colors overflow-clip\">\n <div class=\"i-lucide-grip-horizontal size-5 min-h-5 min-w-5 block\"></div>\n </TableHandleColumnMenuTrigger>\n <MenuPositioner class=\"overflow-visible bg-transparent\">\n <MenuPopup class=\"box-border data-[state=closed]:motion-safe:duration-150 motion-safe:transition-discrete motion-safe:transition-all data-[state=closed]:opacity-0 starting:opacity-0 opacity-100 data-[state=closed]:scale-95 starting:scale-95 scale-100 motion-safe:duration-40 rounded-lg border border-gray-200 dark:border-gray-800 bg-white dark:bg-gray-950 shadow-lg relative flex flex-col max-h-100 min-w-32 select-none overflow-auto whitespace-nowrap p-1 outline-none\">\n <MenuItem\n v-if=\"state.addTableColumnBefore.canExec\"\n class=\"relative min-w-32 scroll-my-1 rounded-sm px-3 py-1.5 flex items-center justify-between gap-8 data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 hover:data-[disabled=true]:opacity-50 data-danger:text-red-500 box-border cursor-default select-none whitespace-nowrap outline-hidden data-highlighted:bg-gray-100 dark:data-highlighted:bg-gray-800\"\n @select=\"state.addTableColumnBefore.command\"\n >\n <span>Insert Left</span>\n </MenuItem>\n <MenuItem\n v-if=\"state.addTableColumnAfter.canExec\"\n class=\"relative min-w-32 scroll-my-1 rounded-sm px-3 py-1.5 flex items-center justify-between gap-8 data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 hover:data-[disabled=true]:opacity-50 data-danger:text-red-500 box-border cursor-default select-none whitespace-nowrap outline-hidden data-highlighted:bg-gray-100 dark:data-highlighted:bg-gray-800\"\n @select=\"state.addTableColumnAfter.command\"\n >\n <span>Insert Right</span>\n </MenuItem>\n <MenuItem\n v-if=\"state.deleteCellSelection.canExec\"\n class=\"relative min-w-32 scroll-my-1 rounded-sm px-3 py-1.5 flex items-center justify-between gap-8 data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 hover:data-[disabled=true]:opacity-50 data-danger:text-red-500 box-border cursor-default select-none whitespace-nowrap outline-hidden data-highlighted:bg-gray-100 dark:data-highlighted:bg-gray-800\"\n @select=\"state.deleteCellSelection.command\"\n >\n <span>Clear Contents</span>\n <span class=\"text-xs tracking-widest text-gray-500 dark:text-gray-500\">Del</span>\n </MenuItem>\n <MenuItem\n v-if=\"state.deleteTableColumn.canExec\"\n class=\"relative min-w-32 scroll-my-1 rounded-sm px-3 py-1.5 flex items-center justify-between gap-8 data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 hover:data-[disabled=true]:opacity-50 data-danger:text-red-500 box-border cursor-default select-none whitespace-nowrap outline-hidden data-highlighted:bg-gray-100 dark:data-highlighted:bg-gray-800\"\n @select=\"state.deleteTableColumn.command\"\n >\n <span>Delete Column</span>\n </MenuItem>\n <MenuItem\n v-if=\"state.deleteTable.canExec\"\n class=\"relative min-w-32 scroll-my-1 rounded-sm px-3 py-1.5 flex items-center justify-between gap-8 data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 hover:data-[disabled=true]:opacity-50 data-danger:text-red-500 box-border cursor-default select-none whitespace-nowrap outline-hidden data-highlighted:bg-gray-100 dark:data-highlighted:bg-gray-800\"\n data-danger\n @select=\"state.deleteTable.command\"\n >\n <span>Delete Table</span>\n </MenuItem>\n </MenuPopup>\n </MenuPositioner>\n </TableHandleColumnMenuRoot>\n </TableHandleColumnPopup>\n </TableHandleColumnPositioner>\n <TableHandleRowPositioner\n :placement=\"props.dir === 'rtl' ? 'right' : 'left'\"\n class=\"block overflow-visible bg-transparent w-min h-min z-50 motion-safe:ease-out motion-safe:transition-transform motion-safe:duration-100\"\n >\n <TableHandleRowPopup class=\"ltr:translate-x-[50%] rtl:translate-x-[-50%] flex box-border motion-safe:duration-100 data-[state=closed]:motion-safe:duration-150 motion-safe:transition-discrete motion-safe:transition-all data-[state=closed]:opacity-0 starting:opacity-0 opacity-100 data-[state=closed]:scale-95 starting:scale-95 scale-100\">\n <TableHandleRowMenuRoot>\n <TableHandleRowMenuTrigger class=\"h-6 w-4.5 flex items-center box-border justify-center bg-white dark:bg-gray-950 hover:bg-gray-100 dark:hover:bg-gray-800 rounded-sm text-gray-500/50 dark:text-gray-400/50 border border-gray-200 dark:border-gray-800 border-solid p-0 transition-colors overflow-clip\">\n <div class=\"i-lucide-grip-vertical size-5 min-h-5 min-w-5 block\"></div>\n </TableHandleRowMenuTrigger>\n <MenuPositioner class=\"overflow-visible bg-transparent\">\n <MenuPopup class=\"box-border data-[state=closed]:motion-safe:duration-150 motion-safe:transition-discrete motion-safe:transition-all data-[state=closed]:opacity-0 starting:opacity-0 opacity-100 data-[state=closed]:scale-95 starting:scale-95 scale-100 motion-safe:duration-40 rounded-lg border border-gray-200 dark:border-gray-800 bg-white dark:bg-gray-950 shadow-lg relative flex flex-col max-h-100 min-w-32 select-none overflow-auto whitespace-nowrap p-1 outline-none\">\n <MenuItem\n v-if=\"state.addTableRowAbove.canExec\"\n class=\"relative min-w-32 scroll-my-1 rounded-sm px-3 py-1.5 flex items-center justify-between gap-8 data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 hover:data-[disabled=true]:opacity-50 data-danger:text-red-500 box-border cursor-default select-none whitespace-nowrap outline-hidden data-highlighted:bg-gray-100 dark:data-highlighted:bg-gray-800\"\n @select=\"state.addTableRowAbove.command\"\n >\n <span>Insert Above</span>\n </MenuItem>\n <MenuItem\n v-if=\"state.addTableRowBelow.canExec\"\n class=\"relative min-w-32 scroll-my-1 rounded-sm px-3 py-1.5 flex items-center justify-between gap-8 data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 hover:data-[disabled=true]:opacity-50 data-danger:text-red-500 box-border cursor-default select-none whitespace-nowrap outline-hidden data-highlighted:bg-gray-100 dark:data-highlighted:bg-gray-800\"\n @select=\"state.addTableRowBelow.command\"\n >\n <span>Insert Below</span>\n </MenuItem>\n <MenuItem\n v-if=\"state.deleteCellSelection.canExec\"\n class=\"relative min-w-32 scroll-my-1 rounded-sm px-3 py-1.5 flex items-center justify-between gap-8 data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 hover:data-[disabled=true]:opacity-50 data-danger:text-red-500 box-border cursor-default select-none whitespace-nowrap outline-hidden data-highlighted:bg-gray-100 dark:data-highlighted:bg-gray-800\"\n @select=\"state.deleteCellSelection.command\"\n >\n <span>Clear Contents</span>\n <span class=\"text-xs tracking-widest text-gray-500 dark:text-gray-500\">Del</span>\n </MenuItem>\n <MenuItem\n v-if=\"state.deleteTableRow.canExec\"\n class=\"relative min-w-32 scroll-my-1 rounded-sm px-3 py-1.5 flex items-center justify-between gap-8 data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 hover:data-[disabled=true]:opacity-50 data-danger:text-red-500 box-border cursor-default select-none whitespace-nowrap outline-hidden data-highlighted:bg-gray-100 dark:data-highlighted:bg-gray-800\"\n @select=\"state.deleteTableRow.command\"\n >\n <span>Delete Row</span>\n </MenuItem>\n <MenuItem\n v-if=\"state.deleteTable.canExec\"\n class=\"relative min-w-32 scroll-my-1 rounded-sm px-3 py-1.5 flex items-center justify-between gap-8 data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 hover:data-[disabled=true]:opacity-50 data-danger:text-red-500 box-border cursor-default select-none whitespace-nowrap outline-hidden data-highlighted:bg-gray-100 dark:data-highlighted:bg-gray-800\"\n data-danger\n @select=\"state.deleteTable.command\"\n >\n <span>Delete Table</span>\n </MenuItem>\n </MenuPopup>\n </MenuPositioner>\n </TableHandleRowMenuRoot>\n </TableHandleRowPopup>\n </TableHandleRowPositioner>\n </TableHandleRoot>\n</template>\n"
23
+ "content": "<script setup lang=\"ts\">\nimport type { Editor } from 'prosekit/core'\nimport type { TableExtension } from 'prosekit/extensions/table'\nimport { useEditorDerivedValue } from 'prosekit/vue'\nimport { MenuItem, MenuPopup, MenuPositioner } from 'prosekit/vue/menu'\nimport {\n TableHandleColumnMenuRoot,\n TableHandleColumnMenuTrigger,\n TableHandleColumnPopup,\n TableHandleColumnPositioner,\n TableHandleDragPreview,\n TableHandleDropIndicator,\n TableHandleRoot,\n TableHandleRowMenuRoot,\n TableHandleRowMenuTrigger,\n TableHandleRowPopup,\n TableHandleRowPositioner,\n} from 'prosekit/vue/table-handle'\n\nfunction getTableHandleState(editor: Editor<TableExtension>) {\n return {\n addTableColumnBefore: {\n canExec: editor.commands.addTableColumnBefore.canExec(),\n command: () => editor.commands.addTableColumnBefore(),\n },\n addTableColumnAfter: {\n canExec: editor.commands.addTableColumnAfter.canExec(),\n command: () => editor.commands.addTableColumnAfter(),\n },\n deleteCellSelection: {\n canExec: editor.commands.deleteCellSelection.canExec(),\n command: () => editor.commands.deleteCellSelection(),\n },\n deleteTableColumn: {\n canExec: editor.commands.deleteTableColumn.canExec(),\n command: () => editor.commands.deleteTableColumn(),\n },\n addTableRowAbove: {\n canExec: editor.commands.addTableRowAbove.canExec(),\n command: () => editor.commands.addTableRowAbove(),\n },\n addTableRowBelow: {\n canExec: editor.commands.addTableRowBelow.canExec(),\n command: () => editor.commands.addTableRowBelow(),\n },\n deleteTableRow: {\n canExec: editor.commands.deleteTableRow.canExec(),\n command: () => editor.commands.deleteTableRow(),\n },\n deleteTable: {\n canExec: editor.commands.deleteTable.canExec(),\n command: () => editor.commands.deleteTable(),\n },\n }\n}\n\ninterface Props {\n dir?: 'ltr' | 'rtl'\n}\n\nconst props = defineProps<Props>()\n\nconst state = useEditorDerivedValue(getTableHandleState)\n</script>\n\n<template>\n <TableHandleRoot>\n <TableHandleDragPreview />\n <TableHandleDropIndicator />\n <TableHandleColumnPositioner class=\"block overflow-visible bg-transparent w-min h-min z-50 ease-out transition-transform duration-100 motion-reduce:transition-none\">\n <TableHandleColumnPopup class=\"translate-y-[50%] flex box-border origin-(--transform-origin) transition transition-discrete motion-reduce:transition-none duration-100 data-[state=closed]:duration-150 data-[state=closed]:opacity-0 starting:opacity-0 data-[state=closed]:scale-95 starting:scale-95\">\n <TableHandleColumnMenuRoot>\n <TableHandleColumnMenuTrigger class=\"h-4.5 w-6 flex items-center box-border justify-center bg-white dark:bg-gray-950 hover:bg-gray-100 dark:hover:bg-gray-800 rounded-sm text-gray-500/50 dark:text-gray-400/50 border border-gray-200 dark:border-gray-800 border-solid p-0 transition-colors overflow-clip\">\n <div class=\"i-lucide-grip-horizontal size-5 min-h-5 min-w-5 block\"></div>\n </TableHandleColumnMenuTrigger>\n <MenuPositioner class=\"overflow-visible bg-transparent\">\n <MenuPopup class=\"box-border origin-(--transform-origin) transition transition-discrete motion-reduce:transition-none data-[state=closed]:duration-150 data-[state=closed]:opacity-0 starting:opacity-0 data-[state=closed]:scale-95 starting:scale-95 duration-40 rounded-lg border border-gray-200 dark:border-gray-800 bg-white dark:bg-gray-950 shadow-lg relative flex flex-col max-h-100 min-w-32 select-none overflow-auto whitespace-nowrap p-1 outline-none\">\n <MenuItem\n v-if=\"state.addTableColumnBefore.canExec\"\n class=\"relative min-w-32 scroll-my-1 rounded-sm px-3 py-1.5 flex items-center justify-between gap-8 data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 hover:data-[disabled=true]:opacity-50 data-danger:text-red-500 box-border cursor-default select-none whitespace-nowrap outline-hidden data-highlighted:bg-gray-100 dark:data-highlighted:bg-gray-800\"\n @select=\"state.addTableColumnBefore.command\"\n >\n <span>Insert Left</span>\n </MenuItem>\n <MenuItem\n v-if=\"state.addTableColumnAfter.canExec\"\n class=\"relative min-w-32 scroll-my-1 rounded-sm px-3 py-1.5 flex items-center justify-between gap-8 data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 hover:data-[disabled=true]:opacity-50 data-danger:text-red-500 box-border cursor-default select-none whitespace-nowrap outline-hidden data-highlighted:bg-gray-100 dark:data-highlighted:bg-gray-800\"\n @select=\"state.addTableColumnAfter.command\"\n >\n <span>Insert Right</span>\n </MenuItem>\n <MenuItem\n v-if=\"state.deleteCellSelection.canExec\"\n class=\"relative min-w-32 scroll-my-1 rounded-sm px-3 py-1.5 flex items-center justify-between gap-8 data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 hover:data-[disabled=true]:opacity-50 data-danger:text-red-500 box-border cursor-default select-none whitespace-nowrap outline-hidden data-highlighted:bg-gray-100 dark:data-highlighted:bg-gray-800\"\n @select=\"state.deleteCellSelection.command\"\n >\n <span>Clear Contents</span>\n <span class=\"text-xs tracking-widest text-gray-500 dark:text-gray-500\">Del</span>\n </MenuItem>\n <MenuItem\n v-if=\"state.deleteTableColumn.canExec\"\n class=\"relative min-w-32 scroll-my-1 rounded-sm px-3 py-1.5 flex items-center justify-between gap-8 data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 hover:data-[disabled=true]:opacity-50 data-danger:text-red-500 box-border cursor-default select-none whitespace-nowrap outline-hidden data-highlighted:bg-gray-100 dark:data-highlighted:bg-gray-800\"\n @select=\"state.deleteTableColumn.command\"\n >\n <span>Delete Column</span>\n </MenuItem>\n <MenuItem\n v-if=\"state.deleteTable.canExec\"\n class=\"relative min-w-32 scroll-my-1 rounded-sm px-3 py-1.5 flex items-center justify-between gap-8 data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 hover:data-[disabled=true]:opacity-50 data-danger:text-red-500 box-border cursor-default select-none whitespace-nowrap outline-hidden data-highlighted:bg-gray-100 dark:data-highlighted:bg-gray-800\"\n data-danger\n @select=\"state.deleteTable.command\"\n >\n <span>Delete Table</span>\n </MenuItem>\n </MenuPopup>\n </MenuPositioner>\n </TableHandleColumnMenuRoot>\n </TableHandleColumnPopup>\n </TableHandleColumnPositioner>\n <TableHandleRowPositioner\n :placement=\"props.dir === 'rtl' ? 'right' : 'left'\"\n class=\"block overflow-visible bg-transparent w-min h-min z-50 ease-out transition-transform duration-100 motion-reduce:transition-none\"\n >\n <TableHandleRowPopup class=\"ltr:translate-x-[50%] rtl:translate-x-[-50%] flex box-border origin-(--transform-origin) transition transition-discrete motion-reduce:transition-none duration-100 data-[state=closed]:duration-150 data-[state=closed]:opacity-0 starting:opacity-0 data-[state=closed]:scale-95 starting:scale-95\">\n <TableHandleRowMenuRoot>\n <TableHandleRowMenuTrigger class=\"h-6 w-4.5 flex items-center box-border justify-center bg-white dark:bg-gray-950 hover:bg-gray-100 dark:hover:bg-gray-800 rounded-sm text-gray-500/50 dark:text-gray-400/50 border border-gray-200 dark:border-gray-800 border-solid p-0 transition-colors overflow-clip\">\n <div class=\"i-lucide-grip-vertical size-5 min-h-5 min-w-5 block\"></div>\n </TableHandleRowMenuTrigger>\n <MenuPositioner class=\"overflow-visible bg-transparent\">\n <MenuPopup class=\"box-border origin-(--transform-origin) transition transition-discrete motion-reduce:transition-none data-[state=closed]:duration-150 data-[state=closed]:opacity-0 starting:opacity-0 data-[state=closed]:scale-95 starting:scale-95 duration-40 rounded-lg border border-gray-200 dark:border-gray-800 bg-white dark:bg-gray-950 shadow-lg relative flex flex-col max-h-100 min-w-32 select-none overflow-auto whitespace-nowrap p-1 outline-none\">\n <MenuItem\n v-if=\"state.addTableRowAbove.canExec\"\n class=\"relative min-w-32 scroll-my-1 rounded-sm px-3 py-1.5 flex items-center justify-between gap-8 data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 hover:data-[disabled=true]:opacity-50 data-danger:text-red-500 box-border cursor-default select-none whitespace-nowrap outline-hidden data-highlighted:bg-gray-100 dark:data-highlighted:bg-gray-800\"\n @select=\"state.addTableRowAbove.command\"\n >\n <span>Insert Above</span>\n </MenuItem>\n <MenuItem\n v-if=\"state.addTableRowBelow.canExec\"\n class=\"relative min-w-32 scroll-my-1 rounded-sm px-3 py-1.5 flex items-center justify-between gap-8 data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 hover:data-[disabled=true]:opacity-50 data-danger:text-red-500 box-border cursor-default select-none whitespace-nowrap outline-hidden data-highlighted:bg-gray-100 dark:data-highlighted:bg-gray-800\"\n @select=\"state.addTableRowBelow.command\"\n >\n <span>Insert Below</span>\n </MenuItem>\n <MenuItem\n v-if=\"state.deleteCellSelection.canExec\"\n class=\"relative min-w-32 scroll-my-1 rounded-sm px-3 py-1.5 flex items-center justify-between gap-8 data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 hover:data-[disabled=true]:opacity-50 data-danger:text-red-500 box-border cursor-default select-none whitespace-nowrap outline-hidden data-highlighted:bg-gray-100 dark:data-highlighted:bg-gray-800\"\n @select=\"state.deleteCellSelection.command\"\n >\n <span>Clear Contents</span>\n <span class=\"text-xs tracking-widest text-gray-500 dark:text-gray-500\">Del</span>\n </MenuItem>\n <MenuItem\n v-if=\"state.deleteTableRow.canExec\"\n class=\"relative min-w-32 scroll-my-1 rounded-sm px-3 py-1.5 flex items-center justify-between gap-8 data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 hover:data-[disabled=true]:opacity-50 data-danger:text-red-500 box-border cursor-default select-none whitespace-nowrap outline-hidden data-highlighted:bg-gray-100 dark:data-highlighted:bg-gray-800\"\n @select=\"state.deleteTableRow.command\"\n >\n <span>Delete Row</span>\n </MenuItem>\n <MenuItem\n v-if=\"state.deleteTable.canExec\"\n class=\"relative min-w-32 scroll-my-1 rounded-sm px-3 py-1.5 flex items-center justify-between gap-8 data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 hover:data-[disabled=true]:opacity-50 data-danger:text-red-500 box-border cursor-default select-none whitespace-nowrap outline-hidden data-highlighted:bg-gray-100 dark:data-highlighted:bg-gray-800\"\n data-danger\n @select=\"state.deleteTable.command\"\n >\n <span>Delete Table</span>\n </MenuItem>\n </MenuPopup>\n </MenuPositioner>\n </TableHandleRowMenuRoot>\n </TableHandleRowPopup>\n </TableHandleRowPositioner>\n </TableHandleRoot>\n</template>\n"
24
24
  }
25
25
  ],
26
26
  "meta": {
@@ -18,7 +18,7 @@
18
18
  "path": "registry/src/vue/ui/tag-menu/tag-menu.vue",
19
19
  "type": "registry:component",
20
20
  "target": "components/editor/ui/tag-menu/tag-menu.vue",
21
- "content": "<script setup lang=\"ts\">\nimport type { BasicExtension } from 'prosekit/basic'\nimport type { Union } from 'prosekit/core'\nimport type { MentionExtension } from 'prosekit/extensions/mention'\nimport { useEditor } from 'prosekit/vue'\nimport { AutocompleteEmpty, AutocompleteItem, AutocompletePopup, AutocompletePositioner, AutocompleteRoot } from 'prosekit/vue/autocomplete'\n\nconst props = defineProps<{ tags: { id: number; label: string }[] }>()\n\nconst editor = useEditor<Union<[MentionExtension, BasicExtension]>>()\n\nfunction handleTagInsert(id: number, label: string) {\n editor.value.commands.insertMention({\n id: id.toString(),\n value: '#' + label,\n kind: 'tag',\n })\n editor.value.commands.insertText({ text: ' ' })\n}\n\nconst regex = /#[\\da-z]*$/i\n</script>\n\n<template>\n <AutocompleteRoot :regex=\"regex\">\n <AutocompletePositioner class=\"block overflow-visible bg-transparent w-min h-min z-50 motion-safe:ease-out motion-safe:transition-transform motion-safe:duration-100\">\n <AutocompletePopup class=\"box-border data-[state=closed]:motion-safe:duration-150 motion-safe:transition-discrete motion-safe:transition-all data-[state=closed]:opacity-0 starting:opacity-0 opacity-100 data-[state=closed]:scale-95 starting:scale-95 scale-100 motion-safe:duration-40 rounded-lg border border-gray-200 dark:border-gray-800 bg-white dark:bg-gray-950 shadow-lg flex flex-col relative max-h-100 min-w-60 select-none overflow-auto whitespace-nowrap p-1\">\n <AutocompleteEmpty class=\"relative flex items-center justify-between min-w-32 scroll-my-1 rounded-sm px-3 py-1.5 box-border cursor-default select-none whitespace-nowrap outline-hidden data-highlighted:bg-gray-100 dark:data-highlighted:bg-gray-800\">\n No results\n </AutocompleteEmpty>\n\n <AutocompleteItem\n v-for=\"tag in props.tags\"\n :key=\"tag.id\"\n class=\"relative flex items-center justify-between min-w-32 scroll-my-1 rounded-sm px-3 py-1.5 box-border cursor-default select-none whitespace-nowrap outline-hidden data-highlighted:bg-gray-100 dark:data-highlighted:bg-gray-800\"\n @select=\"() => handleTagInsert(tag.id, tag.label)\"\n >\n #{{ tag.label }}\n </AutocompleteItem>\n </AutocompletePopup>\n </AutocompletePositioner>\n </AutocompleteRoot>\n</template>\n"
21
+ "content": "<script setup lang=\"ts\">\nimport type { BasicExtension } from 'prosekit/basic'\nimport type { Union } from 'prosekit/core'\nimport type { MentionExtension } from 'prosekit/extensions/mention'\nimport { useEditor } from 'prosekit/vue'\nimport { AutocompleteEmpty, AutocompleteItem, AutocompletePopup, AutocompletePositioner, AutocompleteRoot } from 'prosekit/vue/autocomplete'\n\nconst props = defineProps<{ tags: { id: number; label: string }[] }>()\n\nconst editor = useEditor<Union<[MentionExtension, BasicExtension]>>()\n\nfunction handleTagInsert(id: number, label: string) {\n editor.value.commands.insertMention({\n id: id.toString(),\n value: '#' + label,\n kind: 'tag',\n })\n editor.value.commands.insertText({ text: ' ' })\n}\n\nconst regex = /#[\\da-z]*$/i\n</script>\n\n<template>\n <AutocompleteRoot :regex=\"regex\">\n <AutocompletePositioner class=\"block overflow-visible bg-transparent w-min h-min z-50 ease-out transition-transform duration-100 motion-reduce:transition-none\">\n <AutocompletePopup class=\"box-border origin-(--transform-origin) transition transition-discrete motion-reduce:transition-none data-[state=closed]:duration-150 data-[state=closed]:opacity-0 starting:opacity-0 data-[state=closed]:scale-95 starting:scale-95 duration-40 rounded-lg border border-gray-200 dark:border-gray-800 bg-white dark:bg-gray-950 shadow-lg flex flex-col relative max-h-100 min-w-60 select-none overflow-auto whitespace-nowrap p-1\">\n <AutocompleteEmpty class=\"relative flex items-center justify-between min-w-32 scroll-my-1 rounded-sm px-3 py-1.5 box-border cursor-default select-none whitespace-nowrap outline-hidden data-highlighted:bg-gray-100 dark:data-highlighted:bg-gray-800\">\n No results\n </AutocompleteEmpty>\n\n <AutocompleteItem\n v-for=\"tag in props.tags\"\n :key=\"tag.id\"\n class=\"relative flex items-center justify-between min-w-32 scroll-my-1 rounded-sm px-3 py-1.5 box-border cursor-default select-none whitespace-nowrap outline-hidden data-highlighted:bg-gray-100 dark:data-highlighted:bg-gray-800\"\n @select=\"() => handleTagInsert(tag.id, tag.label)\"\n >\n #{{ tag.label }}\n </AutocompleteItem>\n </AutocompletePopup>\n </AutocompletePositioner>\n </AutocompleteRoot>\n</template>\n"
22
22
  }
23
23
  ],
24
24
  "meta": {
@@ -18,7 +18,7 @@
18
18
  "path": "registry/src/vue/ui/user-menu/user-menu.vue",
19
19
  "type": "registry:component",
20
20
  "target": "components/editor/ui/user-menu/user-menu.vue",
21
- "content": "<script setup lang=\"ts\">\nimport type { BasicExtension } from 'prosekit/basic'\nimport { canUseRegexLookbehind, type Union } from 'prosekit/core'\nimport type { MentionExtension } from 'prosekit/extensions/mention'\nimport { useEditor } from 'prosekit/vue'\nimport { AutocompleteEmpty, AutocompleteItem, AutocompletePopup, AutocompletePositioner, AutocompleteRoot } from 'prosekit/vue/autocomplete'\n\nconst props = defineProps<{\n users: { id: number; name: string }[]\n loading?: boolean\n onQueryChange?: (query: string) => void\n onOpenChange?: (open: boolean) => void\n}>()\n\nconst editor = useEditor<Union<[MentionExtension, BasicExtension]>>()\n\nfunction handleUserInsert(id: number, username: string) {\n editor.value.commands.insertMention({\n id: id.toString(),\n value: '@' + username,\n kind: 'user',\n })\n editor.value.commands.insertText({ text: ' ' })\n}\n\n// Match inputs like \"@\", \"@foo\", \"@foo bar\" etc. Do not match \"@ foo\".\nconst regex = canUseRegexLookbehind() ? /(?<!\\S)@(\\S.*)?$/u : /@(\\S.*)?$/u\n</script>\n\n<template>\n <AutocompleteRoot\n :regex=\"regex\"\n @query-change=\"(event) => props.onQueryChange?.(event.detail)\"\n @open-change=\"(event) => props.onOpenChange?.(event.detail)\"\n >\n <AutocompletePositioner class=\"block overflow-visible bg-transparent w-min h-min z-50 motion-safe:ease-out motion-safe:transition-transform motion-safe:duration-100\">\n <AutocompletePopup class=\"box-border data-[state=closed]:motion-safe:duration-150 motion-safe:transition-discrete motion-safe:transition-all data-[state=closed]:opacity-0 starting:opacity-0 opacity-100 data-[state=closed]:scale-95 starting:scale-95 scale-100 motion-safe:duration-40 rounded-lg border border-gray-200 dark:border-gray-800 bg-white dark:bg-gray-950 shadow-lg flex flex-col relative max-h-100 min-w-60 select-none overflow-auto whitespace-nowrap p-1\">\n <AutocompleteEmpty class=\"relative flex items-center justify-between min-w-32 scroll-my-1 rounded-sm px-3 py-1.5 box-border cursor-default select-none whitespace-nowrap outline-hidden data-highlighted:bg-gray-100 dark:data-highlighted:bg-gray-800\">\n {{ props.loading ? 'Loading...' : 'No results' }}\n </AutocompleteEmpty>\n\n <AutocompleteItem\n v-for=\"user in props.users\"\n :key=\"user.id\"\n class=\"relative flex items-center justify-between min-w-32 scroll-my-1 rounded-sm px-3 py-1.5 box-border cursor-default select-none whitespace-nowrap outline-hidden data-highlighted:bg-gray-100 dark:data-highlighted:bg-gray-800\"\n @select=\"() => handleUserInsert(user.id, user.name)\"\n >\n <span v-if=\"props.loading\" class=\"opacity-50\">\n {{ user.name }}\n </span>\n <span v-else>\n {{ user.name }}\n </span>\n </AutocompleteItem>\n </AutocompletePopup>\n </AutocompletePositioner>\n </AutocompleteRoot>\n</template>\n"
21
+ "content": "<script setup lang=\"ts\">\nimport type { BasicExtension } from 'prosekit/basic'\nimport { canUseRegexLookbehind, type Union } from 'prosekit/core'\nimport type { MentionExtension } from 'prosekit/extensions/mention'\nimport { useEditor } from 'prosekit/vue'\nimport { AutocompleteEmpty, AutocompleteItem, AutocompletePopup, AutocompletePositioner, AutocompleteRoot } from 'prosekit/vue/autocomplete'\n\nconst props = defineProps<{\n users: { id: number; name: string }[]\n loading?: boolean\n onQueryChange?: (query: string) => void\n onOpenChange?: (open: boolean) => void\n}>()\n\nconst editor = useEditor<Union<[MentionExtension, BasicExtension]>>()\n\nfunction handleUserInsert(id: number, username: string) {\n editor.value.commands.insertMention({\n id: id.toString(),\n value: '@' + username,\n kind: 'user',\n })\n editor.value.commands.insertText({ text: ' ' })\n}\n\n// Match inputs like \"@\", \"@foo\", \"@foo bar\" etc. Do not match \"@ foo\".\nconst regex = canUseRegexLookbehind() ? /(?<!\\S)@(\\S.*)?$/u : /@(\\S.*)?$/u\n</script>\n\n<template>\n <AutocompleteRoot\n :regex=\"regex\"\n @query-change=\"(event) => props.onQueryChange?.(event.detail)\"\n @open-change=\"(event) => props.onOpenChange?.(event.detail)\"\n >\n <AutocompletePositioner class=\"block overflow-visible bg-transparent w-min h-min z-50 ease-out transition-transform duration-100 motion-reduce:transition-none\">\n <AutocompletePopup class=\"box-border origin-(--transform-origin) transition transition-discrete motion-reduce:transition-none data-[state=closed]:duration-150 data-[state=closed]:opacity-0 starting:opacity-0 data-[state=closed]:scale-95 starting:scale-95 duration-40 rounded-lg border border-gray-200 dark:border-gray-800 bg-white dark:bg-gray-950 shadow-lg flex flex-col relative max-h-100 min-w-60 select-none overflow-auto whitespace-nowrap p-1\">\n <AutocompleteEmpty class=\"relative flex items-center justify-between min-w-32 scroll-my-1 rounded-sm px-3 py-1.5 box-border cursor-default select-none whitespace-nowrap outline-hidden data-highlighted:bg-gray-100 dark:data-highlighted:bg-gray-800\">\n {{ props.loading ? 'Loading...' : 'No results' }}\n </AutocompleteEmpty>\n\n <AutocompleteItem\n v-for=\"user in props.users\"\n :key=\"user.id\"\n class=\"relative flex items-center justify-between min-w-32 scroll-my-1 rounded-sm px-3 py-1.5 box-border cursor-default select-none whitespace-nowrap outline-hidden data-highlighted:bg-gray-100 dark:data-highlighted:bg-gray-800\"\n @select=\"() => handleUserInsert(user.id, user.name)\"\n >\n <span v-if=\"props.loading\" class=\"opacity-50\">\n {{ user.name }}\n </span>\n <span v-else>\n {{ user.name }}\n </span>\n </AutocompleteItem>\n </AutocompletePopup>\n </AutocompletePositioner>\n </AutocompleteRoot>\n</template>\n"
22
22
  }
23
23
  ],
24
24
  "meta": {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "prosekit-registry",
3
3
  "type": "module",
4
- "version": "0.0.13",
4
+ "version": "0.0.15",
5
5
  "private": false,
6
6
  "description": "The registry of ProseKit examples",
7
7
  "license": "MIT",
@@ -70,7 +70,6 @@
70
70
  "temml": "^0.13.2",
71
71
  "tinyexec": "^1.1.1",
72
72
  "tsx": "^4.21.0",
73
- "tw-animate-css": "^1.4.0",
74
73
  "vite": "^8.0.8",
75
74
  "vite-plugin-solid": "^2.11.12",
76
75
  "vite-plugin-wasm": "^3.6.0",
@@ -84,8 +83,8 @@
84
83
  "vue-tsc": "^3.2.6",
85
84
  "vue-tweet": "^2.4.0",
86
85
  "@prosekit/config-vitest": "0.0.0",
87
- "prosekit": "0.20.0-beta.5",
88
- "@prosekit/dev": "0.0.0"
86
+ "@prosekit/dev": "0.0.0",
87
+ "prosekit": "0.20.0-beta.5"
89
88
  },
90
89
  "scripts": {
91
90
  "gen": "tsx src/gen.ts",