prosekit-registry 0.0.21 → 0.0.22
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.
- package/dist/r/lit-example-minimal.json +1 -1
- package/dist/r/lit-example-slash-menu.json +2 -2
- package/dist/r/lit-example-table.json +2 -2
- package/dist/r/lit-example-toolbar.json +2 -2
- package/dist/r/lit-sample-sample-doc-table.json +1 -1
- package/dist/r/lit-sample-sample-uploader.json +1 -1
- package/dist/r/lit-ui-button.json +2 -2
- package/dist/r/lit-ui-editor-context.json +1 -1
- package/dist/r/lit-ui-image-upload-popover.json +2 -2
- package/dist/r/lit-ui-slash-menu.json +4 -4
- package/dist/r/lit-ui-table-handle.json +2 -2
- package/dist/r/lit-ui-toolbar.json +1 -1
- package/dist/r/preact-example-block-handle.json +2 -2
- package/dist/r/preact-example-blockquote.json +2 -2
- package/dist/r/preact-example-bold.json +2 -2
- package/dist/r/preact-example-change-tracking.json +3 -3
- package/dist/r/preact-example-code-block-themes.json +2 -2
- package/dist/r/preact-example-code-block.json +2 -2
- package/dist/r/preact-example-code.json +2 -2
- package/dist/r/preact-example-drop-cursor.json +2 -2
- package/dist/r/preact-example-emoji-rules.json +2 -2
- package/dist/r/preact-example-full.json +2 -2
- package/dist/r/preact-example-gap-cursor.json +2 -2
- package/dist/r/preact-example-hard-break.json +2 -2
- package/dist/r/preact-example-heading.json +2 -2
- package/dist/r/preact-example-horizontal-rule.json +2 -2
- package/dist/r/preact-example-image-view.json +2 -2
- package/dist/r/preact-example-inline-menu.json +2 -2
- package/dist/r/preact-example-italic.json +2 -2
- package/dist/r/preact-example-keymap.json +2 -2
- package/dist/r/preact-example-link-mark-view.json +2 -2
- package/dist/r/preact-example-link.json +2 -2
- package/dist/r/preact-example-list-custom-checkbox.json +2 -2
- package/dist/r/preact-example-list.json +2 -2
- package/dist/r/preact-example-loro.json +2 -2
- package/dist/r/preact-example-mark-rule.json +2 -2
- package/dist/r/preact-example-minimal.json +1 -1
- package/dist/r/preact-example-placeholder.json +2 -2
- package/dist/r/preact-example-readonly.json +2 -2
- package/dist/r/preact-example-rtl.json +2 -2
- package/dist/r/preact-example-save-html.json +2 -2
- package/dist/r/preact-example-save-json.json +2 -2
- package/dist/r/preact-example-save-markdown.json +2 -2
- package/dist/r/preact-example-search.json +2 -2
- package/dist/r/preact-example-slash-menu.json +2 -2
- package/dist/r/preact-example-strike.json +2 -2
- package/dist/r/preact-example-table.json +2 -2
- package/dist/r/preact-example-temml.json +2 -2
- package/dist/r/preact-example-text-align.json +2 -2
- package/dist/r/preact-example-text-color.json +3 -3
- package/dist/r/preact-example-toolbar.json +2 -2
- package/dist/r/preact-example-typography.json +2 -2
- package/dist/r/preact-example-underline.json +2 -2
- package/dist/r/preact-example-unmount.json +2 -2
- package/dist/r/preact-example-user-menu-dynamic.json +2 -2
- package/dist/r/preact-example-user-menu.json +2 -2
- package/dist/r/preact-example-view-adapter.json +2 -2
- package/dist/r/preact-example-word-counter.json +2 -2
- package/dist/r/preact-example-yjs.json +2 -2
- package/dist/r/preact-sample-define-atom-block.json +1 -1
- package/dist/r/preact-sample-sample-doc-block-handle.json +1 -1
- package/dist/r/preact-sample-sample-doc-bold.json +1 -1
- package/dist/r/preact-sample-sample-doc-code-block.json +1 -1
- package/dist/r/preact-sample-sample-doc-code.json +1 -1
- package/dist/r/preact-sample-sample-doc-drop-cursor.json +1 -1
- package/dist/r/preact-sample-sample-doc-full.json +1 -1
- package/dist/r/preact-sample-sample-doc-gap-cursor.json +1 -1
- package/dist/r/preact-sample-sample-doc-hard-break.json +1 -1
- package/dist/r/preact-sample-sample-doc-heading.json +1 -1
- package/dist/r/preact-sample-sample-doc-image.json +1 -1
- package/dist/r/preact-sample-sample-doc-inline-menu.json +1 -1
- package/dist/r/preact-sample-sample-doc-italic.json +1 -1
- package/dist/r/preact-sample-sample-doc-link-mark-view.json +1 -1
- package/dist/r/preact-sample-sample-doc-link.json +1 -1
- package/dist/r/preact-sample-sample-doc-list-custom-checkbox.json +1 -1
- package/dist/r/preact-sample-sample-doc-list.json +1 -1
- package/dist/r/preact-sample-sample-doc-readonly.json +1 -1
- package/dist/r/preact-sample-sample-doc-rtl.json +1 -1
- package/dist/r/preact-sample-sample-doc-search.json +1 -1
- package/dist/r/preact-sample-sample-doc-strike.json +1 -1
- package/dist/r/preact-sample-sample-doc-table.json +1 -1
- package/dist/r/preact-sample-sample-doc-tex.json +1 -1
- package/dist/r/preact-sample-sample-doc-text-align.json +1 -1
- package/dist/r/preact-sample-sample-doc-text-color.json +1 -1
- package/dist/r/preact-sample-sample-doc-typography.json +1 -1
- package/dist/r/preact-sample-sample-doc-underline.json +1 -1
- package/dist/r/preact-sample-sample-doc-view-adapter.json +1 -1
- package/dist/r/preact-sample-sample-doc-word-counter.json +1 -1
- package/dist/r/preact-sample-sample-uploader.json +1 -1
- package/dist/r/preact-ui-block-handle.json +2 -2
- package/dist/r/preact-ui-button.json +2 -2
- package/dist/r/preact-ui-code-block-view.json +1 -1
- package/dist/r/preact-ui-drop-indicator.json +1 -1
- package/dist/r/preact-ui-image-upload-popover.json +2 -2
- package/dist/r/preact-ui-image-view.json +1 -1
- package/dist/r/preact-ui-inline-menu.json +2 -2
- package/dist/r/preact-ui-search.json +2 -2
- package/dist/r/preact-ui-slash-menu.json +4 -4
- package/dist/r/preact-ui-table-handle.json +2 -2
- package/dist/r/preact-ui-tag-menu.json +2 -2
- package/dist/r/preact-ui-toolbar.json +1 -1
- package/dist/r/preact-ui-user-menu.json +2 -2
- package/dist/r/preact-ui-word-counter.json +1 -1
- package/dist/r/react-example-block-handle.json +2 -2
- package/dist/r/react-example-blockquote.json +2 -2
- package/dist/r/react-example-bold.json +2 -2
- package/dist/r/react-example-change-tracking.json +3 -3
- package/dist/r/react-example-code-block-themes.json +2 -2
- package/dist/r/react-example-code-block.json +2 -2
- package/dist/r/react-example-code.json +2 -2
- package/dist/r/react-example-drop-cursor.json +2 -2
- package/dist/r/react-example-emoji-rules.json +2 -2
- package/dist/r/react-example-full.json +2 -2
- package/dist/r/react-example-gap-cursor.json +2 -2
- package/dist/r/react-example-hard-break.json +2 -2
- package/dist/r/react-example-heading.json +2 -2
- package/dist/r/react-example-horizontal-rule.json +2 -2
- package/dist/r/react-example-image-view.json +2 -2
- package/dist/r/react-example-inline-menu.json +2 -2
- package/dist/r/react-example-italic.json +2 -2
- package/dist/r/react-example-keymap.json +2 -2
- package/dist/r/react-example-link-mark-view.json +2 -2
- package/dist/r/react-example-link.json +2 -2
- package/dist/r/react-example-list-custom-checkbox.json +2 -2
- package/dist/r/react-example-list.json +2 -2
- package/dist/r/react-example-loro.json +2 -2
- package/dist/r/react-example-mark-rule.json +2 -2
- package/dist/r/react-example-minimal.json +1 -1
- package/dist/r/react-example-notion.json +6 -6
- package/dist/r/react-example-page.json +2 -2
- package/dist/r/react-example-placeholder.json +2 -2
- package/dist/r/react-example-readonly.json +2 -2
- package/dist/r/react-example-rtl.json +2 -2
- package/dist/r/react-example-save-html.json +2 -2
- package/dist/r/react-example-save-json.json +2 -2
- package/dist/r/react-example-save-markdown.json +2 -2
- package/dist/r/react-example-search.json +2 -2
- package/dist/r/react-example-slash-menu.json +2 -2
- package/dist/r/react-example-strike.json +2 -2
- package/dist/r/react-example-table.json +2 -2
- package/dist/r/react-example-temml.json +2 -2
- package/dist/r/react-example-text-align.json +2 -2
- package/dist/r/react-example-text-color.json +3 -3
- package/dist/r/react-example-toolbar.json +2 -2
- package/dist/r/react-example-tweet.json +2 -2
- package/dist/r/react-example-typography.json +2 -2
- package/dist/r/react-example-underline.json +2 -2
- package/dist/r/react-example-unmount.json +2 -2
- package/dist/r/react-example-user-menu-dynamic.json +2 -2
- package/dist/r/react-example-user-menu.json +2 -2
- package/dist/r/react-example-view-adapter.json +2 -2
- package/dist/r/react-example-word-counter.json +2 -2
- package/dist/r/react-example-yjs.json +2 -2
- package/dist/r/react-sample-define-atom-block.json +1 -1
- package/dist/r/react-sample-sample-doc-block-handle.json +1 -1
- package/dist/r/react-sample-sample-doc-bold.json +1 -1
- package/dist/r/react-sample-sample-doc-code-block.json +1 -1
- package/dist/r/react-sample-sample-doc-code.json +1 -1
- package/dist/r/react-sample-sample-doc-drop-cursor.json +1 -1
- package/dist/r/react-sample-sample-doc-full.json +1 -1
- package/dist/r/react-sample-sample-doc-gap-cursor.json +1 -1
- package/dist/r/react-sample-sample-doc-hard-break.json +1 -1
- package/dist/r/react-sample-sample-doc-heading.json +1 -1
- package/dist/r/react-sample-sample-doc-image.json +1 -1
- package/dist/r/react-sample-sample-doc-inline-menu.json +1 -1
- package/dist/r/react-sample-sample-doc-italic.json +1 -1
- package/dist/r/react-sample-sample-doc-link-mark-view.json +1 -1
- package/dist/r/react-sample-sample-doc-link.json +1 -1
- package/dist/r/react-sample-sample-doc-list-custom-checkbox.json +1 -1
- package/dist/r/react-sample-sample-doc-list.json +1 -1
- package/dist/r/react-sample-sample-doc-notion.json +1 -1
- package/dist/r/react-sample-sample-doc-page.json +1 -1
- package/dist/r/react-sample-sample-doc-readonly.json +1 -1
- package/dist/r/react-sample-sample-doc-rtl.json +1 -1
- package/dist/r/react-sample-sample-doc-search.json +1 -1
- package/dist/r/react-sample-sample-doc-strike.json +1 -1
- package/dist/r/react-sample-sample-doc-table.json +1 -1
- package/dist/r/react-sample-sample-doc-tex.json +1 -1
- package/dist/r/react-sample-sample-doc-text-align.json +1 -1
- package/dist/r/react-sample-sample-doc-text-color.json +1 -1
- package/dist/r/react-sample-sample-doc-tweet.json +1 -1
- package/dist/r/react-sample-sample-doc-typography.json +1 -1
- package/dist/r/react-sample-sample-doc-underline.json +1 -1
- package/dist/r/react-sample-sample-doc-view-adapter.json +1 -1
- package/dist/r/react-sample-sample-doc-word-counter.json +1 -1
- package/dist/r/react-sample-sample-uploader.json +1 -1
- package/dist/r/react-ui-block-handle.json +2 -2
- package/dist/r/react-ui-button.json +2 -2
- package/dist/r/react-ui-code-block-view.json +1 -1
- package/dist/r/react-ui-drop-indicator.json +1 -1
- package/dist/r/react-ui-image-upload-popover.json +2 -2
- package/dist/r/react-ui-image-view.json +1 -1
- package/dist/r/react-ui-inline-menu.json +2 -2
- package/dist/r/react-ui-search.json +2 -2
- package/dist/r/react-ui-slash-menu.json +4 -4
- package/dist/r/react-ui-table-handle.json +2 -2
- package/dist/r/react-ui-tag-menu.json +2 -2
- package/dist/r/react-ui-toolbar.json +1 -1
- package/dist/r/react-ui-user-menu.json +2 -2
- package/dist/r/react-ui-word-counter.json +1 -1
- package/dist/r/registry.json +480 -480
- package/dist/r/solid-example-block-handle.json +2 -2
- package/dist/r/solid-example-blockquote.json +2 -2
- package/dist/r/solid-example-bold.json +2 -2
- package/dist/r/solid-example-change-tracking.json +3 -3
- package/dist/r/solid-example-code-block-themes.json +2 -2
- package/dist/r/solid-example-code-block.json +2 -2
- package/dist/r/solid-example-code.json +2 -2
- package/dist/r/solid-example-drop-cursor.json +2 -2
- package/dist/r/solid-example-emoji-rules.json +2 -2
- package/dist/r/solid-example-full.json +2 -2
- package/dist/r/solid-example-gap-cursor.json +2 -2
- package/dist/r/solid-example-hard-break.json +2 -2
- package/dist/r/solid-example-heading.json +2 -2
- package/dist/r/solid-example-horizontal-rule.json +2 -2
- package/dist/r/solid-example-image-view.json +2 -2
- package/dist/r/solid-example-inline-menu.json +2 -2
- package/dist/r/solid-example-italic.json +2 -2
- package/dist/r/solid-example-keymap.json +2 -2
- package/dist/r/solid-example-link-mark-view.json +2 -2
- package/dist/r/solid-example-link.json +2 -2
- package/dist/r/solid-example-list-custom-checkbox.json +2 -2
- package/dist/r/solid-example-list.json +2 -2
- package/dist/r/solid-example-loro.json +2 -2
- package/dist/r/solid-example-mark-rule.json +2 -2
- package/dist/r/solid-example-minimal.json +1 -1
- package/dist/r/solid-example-placeholder.json +2 -2
- package/dist/r/solid-example-readonly.json +2 -2
- package/dist/r/solid-example-rtl.json +2 -2
- package/dist/r/solid-example-save-html.json +2 -2
- package/dist/r/solid-example-save-json.json +2 -2
- package/dist/r/solid-example-save-markdown.json +2 -2
- package/dist/r/solid-example-search.json +2 -2
- package/dist/r/solid-example-slash-menu.json +2 -2
- package/dist/r/solid-example-strike.json +2 -2
- package/dist/r/solid-example-table.json +2 -2
- package/dist/r/solid-example-temml.json +2 -2
- package/dist/r/solid-example-text-align.json +2 -2
- package/dist/r/solid-example-text-color.json +3 -3
- package/dist/r/solid-example-toolbar.json +2 -2
- package/dist/r/solid-example-typography.json +2 -2
- package/dist/r/solid-example-underline.json +2 -2
- package/dist/r/solid-example-unmount.json +2 -2
- package/dist/r/solid-example-user-menu-dynamic.json +2 -2
- package/dist/r/solid-example-user-menu.json +2 -2
- package/dist/r/solid-example-view-adapter.json +2 -2
- package/dist/r/solid-example-word-counter.json +2 -2
- package/dist/r/solid-example-yjs.json +2 -2
- package/dist/r/solid-sample-define-atom-block.json +1 -1
- package/dist/r/solid-sample-sample-doc-block-handle.json +1 -1
- package/dist/r/solid-sample-sample-doc-bold.json +1 -1
- package/dist/r/solid-sample-sample-doc-code-block.json +1 -1
- package/dist/r/solid-sample-sample-doc-code.json +1 -1
- package/dist/r/solid-sample-sample-doc-drop-cursor.json +1 -1
- package/dist/r/solid-sample-sample-doc-full.json +1 -1
- package/dist/r/solid-sample-sample-doc-gap-cursor.json +1 -1
- package/dist/r/solid-sample-sample-doc-hard-break.json +1 -1
- package/dist/r/solid-sample-sample-doc-heading.json +1 -1
- package/dist/r/solid-sample-sample-doc-image.json +1 -1
- package/dist/r/solid-sample-sample-doc-inline-menu.json +1 -1
- package/dist/r/solid-sample-sample-doc-italic.json +1 -1
- package/dist/r/solid-sample-sample-doc-link-mark-view.json +1 -1
- package/dist/r/solid-sample-sample-doc-link.json +1 -1
- package/dist/r/solid-sample-sample-doc-list-custom-checkbox.json +1 -1
- package/dist/r/solid-sample-sample-doc-list.json +1 -1
- package/dist/r/solid-sample-sample-doc-readonly.json +1 -1
- package/dist/r/solid-sample-sample-doc-rtl.json +1 -1
- package/dist/r/solid-sample-sample-doc-search.json +1 -1
- package/dist/r/solid-sample-sample-doc-strike.json +1 -1
- package/dist/r/solid-sample-sample-doc-table.json +1 -1
- package/dist/r/solid-sample-sample-doc-tex.json +1 -1
- package/dist/r/solid-sample-sample-doc-text-align.json +1 -1
- package/dist/r/solid-sample-sample-doc-text-color.json +1 -1
- package/dist/r/solid-sample-sample-doc-typography.json +1 -1
- package/dist/r/solid-sample-sample-doc-underline.json +1 -1
- package/dist/r/solid-sample-sample-doc-view-adapter.json +1 -1
- package/dist/r/solid-sample-sample-doc-word-counter.json +1 -1
- package/dist/r/solid-sample-sample-uploader.json +1 -1
- package/dist/r/solid-ui-block-handle.json +2 -2
- package/dist/r/solid-ui-button.json +2 -2
- package/dist/r/solid-ui-code-block-view.json +1 -1
- package/dist/r/solid-ui-drop-indicator.json +1 -1
- package/dist/r/solid-ui-image-upload-popover.json +2 -2
- package/dist/r/solid-ui-image-view.json +1 -1
- package/dist/r/solid-ui-inline-menu.json +2 -2
- package/dist/r/solid-ui-search.json +2 -2
- package/dist/r/solid-ui-slash-menu.json +4 -4
- package/dist/r/solid-ui-table-handle.json +2 -2
- package/dist/r/solid-ui-tag-menu.json +2 -2
- package/dist/r/solid-ui-toolbar.json +1 -1
- package/dist/r/solid-ui-user-menu.json +2 -2
- package/dist/r/solid-ui-word-counter.json +1 -1
- package/dist/r/svelte-example-block-handle.json +2 -2
- package/dist/r/svelte-example-blockquote.json +2 -2
- package/dist/r/svelte-example-bold.json +2 -2
- package/dist/r/svelte-example-change-tracking.json +3 -3
- package/dist/r/svelte-example-code-block-themes.json +2 -2
- package/dist/r/svelte-example-code-block.json +2 -2
- package/dist/r/svelte-example-code.json +2 -2
- package/dist/r/svelte-example-drop-cursor.json +2 -2
- package/dist/r/svelte-example-emoji-rules.json +2 -2
- package/dist/r/svelte-example-full.json +2 -2
- package/dist/r/svelte-example-gap-cursor.json +2 -2
- package/dist/r/svelte-example-hard-break.json +2 -2
- package/dist/r/svelte-example-heading.json +2 -2
- package/dist/r/svelte-example-horizontal-rule.json +2 -2
- package/dist/r/svelte-example-image-view.json +2 -2
- package/dist/r/svelte-example-inline-menu.json +2 -2
- package/dist/r/svelte-example-italic.json +2 -2
- package/dist/r/svelte-example-katex.json +2 -2
- package/dist/r/svelte-example-keymap.json +2 -2
- package/dist/r/svelte-example-link-mark-view.json +2 -2
- package/dist/r/svelte-example-link.json +2 -2
- package/dist/r/svelte-example-list-custom-checkbox.json +2 -2
- package/dist/r/svelte-example-list.json +2 -2
- package/dist/r/svelte-example-loro.json +2 -2
- package/dist/r/svelte-example-mark-rule.json +2 -2
- package/dist/r/svelte-example-minimal.json +1 -1
- package/dist/r/svelte-example-page.json +2 -2
- package/dist/r/svelte-example-placeholder.json +2 -2
- package/dist/r/svelte-example-readonly.json +2 -2
- package/dist/r/svelte-example-rtl.json +2 -2
- package/dist/r/svelte-example-save-html.json +2 -2
- package/dist/r/svelte-example-save-json.json +2 -2
- package/dist/r/svelte-example-save-markdown.json +2 -2
- package/dist/r/svelte-example-search.json +2 -2
- package/dist/r/svelte-example-slash-menu.json +2 -2
- package/dist/r/svelte-example-strike.json +2 -2
- package/dist/r/svelte-example-table.json +2 -2
- package/dist/r/svelte-example-text-align.json +2 -2
- package/dist/r/svelte-example-text-color.json +3 -3
- package/dist/r/svelte-example-toolbar.json +2 -2
- package/dist/r/svelte-example-typography.json +2 -2
- package/dist/r/svelte-example-underline.json +2 -2
- package/dist/r/svelte-example-unmount.json +2 -2
- package/dist/r/svelte-example-user-menu-dynamic.json +2 -2
- package/dist/r/svelte-example-user-menu.json +2 -2
- package/dist/r/svelte-example-view-adapter.json +2 -2
- package/dist/r/svelte-example-word-counter.json +2 -2
- package/dist/r/svelte-example-yjs.json +2 -2
- package/dist/r/svelte-sample-define-atom-block.json +1 -1
- package/dist/r/svelte-sample-sample-doc-block-handle.json +1 -1
- package/dist/r/svelte-sample-sample-doc-bold.json +1 -1
- package/dist/r/svelte-sample-sample-doc-code-block.json +1 -1
- package/dist/r/svelte-sample-sample-doc-code.json +1 -1
- package/dist/r/svelte-sample-sample-doc-drop-cursor.json +1 -1
- package/dist/r/svelte-sample-sample-doc-full.json +1 -1
- package/dist/r/svelte-sample-sample-doc-gap-cursor.json +1 -1
- package/dist/r/svelte-sample-sample-doc-hard-break.json +1 -1
- package/dist/r/svelte-sample-sample-doc-heading.json +1 -1
- package/dist/r/svelte-sample-sample-doc-image.json +1 -1
- package/dist/r/svelte-sample-sample-doc-inline-menu.json +1 -1
- package/dist/r/svelte-sample-sample-doc-italic.json +1 -1
- package/dist/r/svelte-sample-sample-doc-link-mark-view.json +1 -1
- package/dist/r/svelte-sample-sample-doc-link.json +1 -1
- package/dist/r/svelte-sample-sample-doc-list-custom-checkbox.json +1 -1
- package/dist/r/svelte-sample-sample-doc-list.json +1 -1
- package/dist/r/svelte-sample-sample-doc-page.json +1 -1
- package/dist/r/svelte-sample-sample-doc-readonly.json +1 -1
- package/dist/r/svelte-sample-sample-doc-rtl.json +1 -1
- package/dist/r/svelte-sample-sample-doc-search.json +1 -1
- package/dist/r/svelte-sample-sample-doc-strike.json +1 -1
- package/dist/r/svelte-sample-sample-doc-table.json +1 -1
- package/dist/r/svelte-sample-sample-doc-tex.json +1 -1
- package/dist/r/svelte-sample-sample-doc-text-align.json +1 -1
- package/dist/r/svelte-sample-sample-doc-text-color.json +1 -1
- package/dist/r/svelte-sample-sample-doc-typography.json +1 -1
- package/dist/r/svelte-sample-sample-doc-underline.json +1 -1
- package/dist/r/svelte-sample-sample-doc-view-adapter.json +1 -1
- package/dist/r/svelte-sample-sample-doc-word-counter.json +1 -1
- package/dist/r/svelte-sample-sample-uploader.json +1 -1
- package/dist/r/svelte-ui-block-handle.json +2 -2
- package/dist/r/svelte-ui-button.json +2 -2
- package/dist/r/svelte-ui-code-block-view.json +1 -1
- package/dist/r/svelte-ui-drop-indicator.json +1 -1
- package/dist/r/svelte-ui-image-upload-popover.json +2 -2
- package/dist/r/svelte-ui-image-view.json +1 -1
- package/dist/r/svelte-ui-inline-menu.json +2 -2
- package/dist/r/svelte-ui-search.json +2 -2
- package/dist/r/svelte-ui-slash-menu.json +4 -4
- package/dist/r/svelte-ui-table-handle.json +2 -2
- package/dist/r/svelte-ui-tag-menu.json +2 -2
- package/dist/r/svelte-ui-toolbar.json +1 -1
- package/dist/r/svelte-ui-user-menu.json +2 -2
- package/dist/r/svelte-ui-word-counter.json +1 -1
- package/dist/r/vanilla-example-minimal.json +1 -1
- package/dist/r/vanilla-example-slash-menu.json +2 -2
- package/dist/r/vanilla-ui-slash-menu.json +4 -4
- package/dist/r/vue-example-block-handle.json +2 -2
- package/dist/r/vue-example-blockquote.json +2 -2
- package/dist/r/vue-example-bold.json +2 -2
- package/dist/r/vue-example-change-tracking.json +3 -3
- package/dist/r/vue-example-code-block-themes.json +2 -2
- package/dist/r/vue-example-code-block.json +2 -2
- package/dist/r/vue-example-code.json +2 -2
- package/dist/r/vue-example-drop-cursor.json +2 -2
- package/dist/r/vue-example-emoji-rules.json +2 -2
- package/dist/r/vue-example-full.json +2 -2
- package/dist/r/vue-example-gap-cursor.json +2 -2
- package/dist/r/vue-example-hard-break.json +2 -2
- package/dist/r/vue-example-heading.json +2 -2
- package/dist/r/vue-example-horizontal-rule.json +2 -2
- package/dist/r/vue-example-image-view.json +2 -2
- package/dist/r/vue-example-inline-menu.json +2 -2
- package/dist/r/vue-example-italic.json +2 -2
- package/dist/r/vue-example-katex.json +2 -2
- package/dist/r/vue-example-keymap.json +2 -2
- package/dist/r/vue-example-link-mark-view.json +2 -2
- package/dist/r/vue-example-link.json +2 -2
- package/dist/r/vue-example-list-custom-checkbox.json +2 -2
- package/dist/r/vue-example-list.json +2 -2
- package/dist/r/vue-example-loro.json +2 -2
- package/dist/r/vue-example-mark-rule.json +2 -2
- package/dist/r/vue-example-minimal.json +1 -1
- package/dist/r/vue-example-placeholder.json +2 -2
- package/dist/r/vue-example-readonly.json +2 -2
- package/dist/r/vue-example-rtl.json +2 -2
- package/dist/r/vue-example-save-html.json +2 -2
- package/dist/r/vue-example-save-json.json +2 -2
- package/dist/r/vue-example-save-markdown.json +2 -2
- package/dist/r/vue-example-search.json +2 -2
- package/dist/r/vue-example-slash-menu.json +2 -2
- package/dist/r/vue-example-strike.json +2 -2
- package/dist/r/vue-example-table.json +2 -2
- package/dist/r/vue-example-text-align.json +2 -2
- package/dist/r/vue-example-text-color.json +3 -3
- package/dist/r/vue-example-toolbar.json +2 -2
- package/dist/r/vue-example-tweet.json +2 -2
- package/dist/r/vue-example-typography.json +2 -2
- package/dist/r/vue-example-underline.json +2 -2
- package/dist/r/vue-example-unmount.json +2 -2
- package/dist/r/vue-example-user-menu-dynamic.json +2 -2
- package/dist/r/vue-example-user-menu.json +2 -2
- package/dist/r/vue-example-view-adapter.json +2 -2
- package/dist/r/vue-example-word-counter.json +2 -2
- package/dist/r/vue-example-yjs.json +2 -2
- package/dist/r/vue-sample-define-atom-block.json +1 -1
- package/dist/r/vue-sample-sample-doc-block-handle.json +1 -1
- package/dist/r/vue-sample-sample-doc-bold.json +1 -1
- package/dist/r/vue-sample-sample-doc-code-block.json +1 -1
- package/dist/r/vue-sample-sample-doc-code.json +1 -1
- package/dist/r/vue-sample-sample-doc-drop-cursor.json +1 -1
- package/dist/r/vue-sample-sample-doc-full.json +1 -1
- package/dist/r/vue-sample-sample-doc-gap-cursor.json +1 -1
- package/dist/r/vue-sample-sample-doc-hard-break.json +1 -1
- package/dist/r/vue-sample-sample-doc-heading.json +1 -1
- package/dist/r/vue-sample-sample-doc-image.json +1 -1
- package/dist/r/vue-sample-sample-doc-inline-menu.json +1 -1
- package/dist/r/vue-sample-sample-doc-italic.json +1 -1
- package/dist/r/vue-sample-sample-doc-link-mark-view.json +1 -1
- package/dist/r/vue-sample-sample-doc-link.json +1 -1
- package/dist/r/vue-sample-sample-doc-list-custom-checkbox.json +1 -1
- package/dist/r/vue-sample-sample-doc-list.json +1 -1
- package/dist/r/vue-sample-sample-doc-readonly.json +1 -1
- package/dist/r/vue-sample-sample-doc-rtl.json +1 -1
- package/dist/r/vue-sample-sample-doc-search.json +1 -1
- package/dist/r/vue-sample-sample-doc-strike.json +1 -1
- package/dist/r/vue-sample-sample-doc-table.json +1 -1
- package/dist/r/vue-sample-sample-doc-tex.json +1 -1
- package/dist/r/vue-sample-sample-doc-text-align.json +1 -1
- package/dist/r/vue-sample-sample-doc-text-color.json +1 -1
- package/dist/r/vue-sample-sample-doc-tweet.json +1 -1
- package/dist/r/vue-sample-sample-doc-typography.json +1 -1
- package/dist/r/vue-sample-sample-doc-underline.json +1 -1
- package/dist/r/vue-sample-sample-doc-view-adapter.json +1 -1
- package/dist/r/vue-sample-sample-doc-word-counter.json +1 -1
- package/dist/r/vue-sample-sample-uploader.json +1 -1
- package/dist/r/vue-ui-block-handle.json +2 -2
- package/dist/r/vue-ui-button.json +2 -2
- package/dist/r/vue-ui-code-block-view.json +1 -1
- package/dist/r/vue-ui-drop-indicator.json +1 -1
- package/dist/r/vue-ui-image-upload-popover.json +2 -2
- package/dist/r/vue-ui-image-view.json +1 -1
- package/dist/r/vue-ui-inline-menu.json +2 -2
- package/dist/r/vue-ui-search.json +2 -2
- package/dist/r/vue-ui-slash-menu.json +4 -4
- package/dist/r/vue-ui-table-handle.json +2 -2
- package/dist/r/vue-ui-tag-menu.json +2 -2
- package/dist/r/vue-ui-toolbar.json +1 -1
- package/dist/r/vue-ui-user-menu.json +2 -2
- package/dist/r/vue-ui-word-counter.json +1 -1
- package/package.json +13 -13
|
@@ -7,14 +7,14 @@
|
|
|
7
7
|
"https://unpkg.com/prosekit-registry/dist/r/react-ui-button.json"
|
|
8
8
|
],
|
|
9
9
|
"dependencies": [
|
|
10
|
-
"prosekit@^0.20.0
|
|
10
|
+
"prosekit@^0.20.0"
|
|
11
11
|
],
|
|
12
12
|
"files": [
|
|
13
13
|
{
|
|
14
14
|
"path": "registry/src/react/ui/image-upload-popover/image-upload-popover.tsx",
|
|
15
15
|
"type": "registry:component",
|
|
16
16
|
"target": "components/editor/ui/image-upload-popover/image-upload-popover.tsx",
|
|
17
|
-
"content": "'use client'\n\nimport type { Uploader } from 'prosekit/extensions/file'\nimport type { ImageExtension } from 'prosekit/extensions/image'\nimport { useEditor } from 'prosekit/react'\nimport { PopoverPopup, PopoverPositioner, PopoverRoot, PopoverTrigger } from 'prosekit/react/popover'\nimport type { OpenChangeEvent } from 'prosekit/web/popover'\nimport { useId, useState, type ReactNode } from 'react'\n\nimport { Button } from '../button'\n\nexport default function ImageUploadPopover(props: {\n uploader: Uploader<string>\n tooltip: string\n disabled: boolean\n children: ReactNode\n}) {\n const [open, setOpen] = useState(false)\n const [url, setUrl] = useState('')\n const [file, setFile] = useState<File | null>(null)\n const ariaId = useId()\n\n const editor = useEditor<ImageExtension>()\n\n const handleFileChange: React.ChangeEventHandler<HTMLInputElement> = (\n event,\n ) => {\n const file = event.target.files?.[0]\n\n if (file) {\n setFile(file)\n setUrl('')\n } else {\n setFile(null)\n }\n }\n\n const handleUrlChange: React.ChangeEventHandler<HTMLInputElement> = (\n event,\n ) => {\n const url = event.target.value\n\n if (url) {\n setUrl(url)\n setFile(null)\n } else {\n setUrl('')\n }\n }\n\n const deferResetState = () => {\n setTimeout(() => {\n setUrl('')\n setFile(null)\n }, 300)\n }\n\n const handleSubmit = () => {\n if (url) {\n editor.commands.insertImage({ src: url })\n } else if (file) {\n editor.commands.uploadImage({ file, uploader: props.uploader })\n }\n setOpen(false)\n deferResetState()\n }\n\n const handleOpenChange = (event: OpenChangeEvent) => {\n if (!event.detail) {\n deferResetState()\n }\n setOpen(event.detail)\n }\n\n return (\n <PopoverRoot open={open} onOpenChange={handleOpenChange}>\n <PopoverTrigger>\n <Button pressed={open} disabled={props.disabled} tooltip={props.tooltip}>\n {props.children}\n </Button>\n </PopoverTrigger>\n\n <PopoverPositioner placement=\"bottom\" className=\"block overflow-visible w-min h-min z-50 ease-out transition-transform duration-100 motion-reduce:transition-none\">\n <PopoverPopup className=\"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-
|
|
17
|
+
"content": "'use client'\n\nimport type { Uploader } from 'prosekit/extensions/file'\nimport type { ImageExtension } from 'prosekit/extensions/image'\nimport { useEditor } from 'prosekit/react'\nimport { PopoverPopup, PopoverPositioner, PopoverRoot, PopoverTrigger } from 'prosekit/react/popover'\nimport type { OpenChangeEvent } from 'prosekit/web/popover'\nimport { useId, useState, type ReactNode } from 'react'\n\nimport { Button } from '../button'\n\nexport default function ImageUploadPopover(props: {\n uploader: Uploader<string>\n tooltip: string\n disabled: boolean\n children: ReactNode\n}) {\n const [open, setOpen] = useState(false)\n const [url, setUrl] = useState('')\n const [file, setFile] = useState<File | null>(null)\n const ariaId = useId()\n\n const editor = useEditor<ImageExtension>()\n\n const handleFileChange: React.ChangeEventHandler<HTMLInputElement> = (\n event,\n ) => {\n const file = event.target.files?.[0]\n\n if (file) {\n setFile(file)\n setUrl('')\n } else {\n setFile(null)\n }\n }\n\n const handleUrlChange: React.ChangeEventHandler<HTMLInputElement> = (\n event,\n ) => {\n const url = event.target.value\n\n if (url) {\n setUrl(url)\n setFile(null)\n } else {\n setUrl('')\n }\n }\n\n const deferResetState = () => {\n setTimeout(() => {\n setUrl('')\n setFile(null)\n }, 300)\n }\n\n const handleSubmit = () => {\n if (url) {\n editor.commands.insertImage({ src: url })\n } else if (file) {\n editor.commands.uploadImage({ file, uploader: props.uploader })\n }\n setOpen(false)\n deferResetState()\n }\n\n const handleOpenChange = (event: OpenChangeEvent) => {\n if (!event.detail) {\n deferResetState()\n }\n setOpen(event.detail)\n }\n\n return (\n <PopoverRoot open={open} onOpenChange={handleOpenChange}>\n <PopoverTrigger>\n <Button pressed={open} disabled={props.disabled} tooltip={props.tooltip}>\n {props.children}\n </Button>\n </PopoverTrigger>\n\n <PopoverPositioner placement=\"bottom\" className=\"block overflow-visible w-min h-min z-50 ease-out transition-transform duration-100 motion-reduce:transition-none\">\n <PopoverPopup className=\"box-border origin-(--transform-origin) transition-[opacity,scale] 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-xl border border-gray-200 dark:border-gray-800 shadow-lg bg-[canvas] flex flex-col gap-y-4 p-6 text-sm w-sm\">\n {file ? null : (\n <>\n <label htmlFor={`id-link-${ariaId}`}>Embed Link</label>\n <input\n id={`id-link-${ariaId}`}\n className=\"flex h-9 rounded-md w-full bg-[canvas] 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 placeholder=\"Paste the image link...\"\n type=\"url\"\n value={url}\n onChange={handleUrlChange}\n />\n </>\n )}\n\n {url ? null : (\n <>\n <label htmlFor={`id-upload-${ariaId}`}>Upload</label>\n <input\n id={`id-upload-${ariaId}`}\n className=\"flex h-9 rounded-md w-full bg-[canvas] 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 accept=\"image/*\"\n type=\"file\"\n onChange={handleFileChange}\n />\n </>\n )}\n\n {url\n ? (\n <button className=\"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-10 px-4 py-2 w-full\" onClick={handleSubmit}>\n Insert Image\n </button>\n )\n : null}\n\n {file\n ? (\n <button className=\"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-10 px-4 py-2 w-full\" onClick={handleSubmit}>\n Upload Image\n </button>\n )\n : null}\n </PopoverPopup>\n </PopoverPositioner>\n </PopoverRoot>\n )\n}\n"
|
|
18
18
|
},
|
|
19
19
|
{
|
|
20
20
|
"path": "registry/src/react/ui/image-upload-popover/index.ts",
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
"dependencies": [
|
|
10
10
|
"@egoist/tailwindcss-icons",
|
|
11
11
|
"@iconify-json/lucide",
|
|
12
|
-
"prosekit@^0.20.0
|
|
12
|
+
"prosekit@^0.20.0"
|
|
13
13
|
],
|
|
14
14
|
"files": [
|
|
15
15
|
{
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"path": "registry/src/react/ui/inline-menu/inline-menu.tsx",
|
|
23
23
|
"type": "registry:component",
|
|
24
24
|
"target": "components/editor/ui/inline-menu/inline-menu.tsx",
|
|
25
|
-
"content": "'use client'\n\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/react'\nimport { InlinePopoverPopup, InlinePopoverPositioner, InlinePopoverRoot } from 'prosekit/react/inline-popover'\nimport { useState } from 'react'\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\nexport default function InlineMenu() {\n const editor = useEditor<BasicExtension>()\n const items = useEditorDerivedValue(getInlineMenuItems)\n\n const [linkMenuOpen, setLinkMenuOpen] = useState(false)\n const toggleLinkMenuOpen = () => setLinkMenuOpen((open) => !open)\n\n const handleLinkUpdate = (href?: string) => {\n if (href) {\n editor.commands.addLink({ href })\n } else {\n editor.commands.removeLink()\n }\n\n setLinkMenuOpen(false)\n editor.focus()\n }\n\n return (\n <>\n <InlinePopoverRoot\n onOpenChange={(event) => {\n if (!event.detail) {\n setLinkMenuOpen(false)\n }\n }}\n >\n <InlinePopoverPositioner className=\"block overflow-visible 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 className=\"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
|
|
25
|
+
"content": "'use client'\n\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/react'\nimport { InlinePopoverPopup, InlinePopoverPositioner, InlinePopoverRoot } from 'prosekit/react/inline-popover'\nimport { useState } from 'react'\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\nexport default function InlineMenu() {\n const editor = useEditor<BasicExtension>()\n const items = useEditorDerivedValue(getInlineMenuItems)\n\n const [linkMenuOpen, setLinkMenuOpen] = useState(false)\n const toggleLinkMenuOpen = () => setLinkMenuOpen((open) => !open)\n\n const handleLinkUpdate = (href?: string) => {\n if (href) {\n editor.commands.addLink({ href })\n } else {\n editor.commands.removeLink()\n }\n\n setLinkMenuOpen(false)\n editor.focus()\n }\n\n return (\n <>\n <InlinePopoverRoot\n onOpenChange={(event) => {\n if (!event.detail) {\n setLinkMenuOpen(false)\n }\n }}\n >\n <InlinePopoverPositioner className=\"block overflow-visible 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 className=\"box-border origin-(--transform-origin) transition-[opacity,scale] 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 shadow-lg bg-[canvas] relative flex min-w-32 space-x-1 overflow-auto whitespace-nowrap rounded-lg p-1\"\n >\n {items.bold && (\n <Button\n pressed={items.bold.isActive}\n disabled={!items.bold.canExec}\n onClick={items.bold.command}\n tooltip=\"Bold\"\n >\n <div className=\"i-lucide-bold size-5 block\"></div>\n </Button>\n )}\n {items.italic && (\n <Button\n pressed={items.italic.isActive}\n disabled={!items.italic.canExec}\n onClick={items.italic.command}\n tooltip=\"Italic\"\n >\n <div className=\"i-lucide-italic size-5 block\"></div>\n </Button>\n )}\n {items.underline && (\n <Button\n pressed={items.underline.isActive}\n disabled={!items.underline.canExec}\n onClick={items.underline.command}\n tooltip=\"Underline\"\n >\n <div className=\"i-lucide-underline size-5 block\"></div>\n </Button>\n )}\n {items.strike && (\n <Button\n pressed={items.strike.isActive}\n disabled={!items.strike.canExec}\n onClick={items.strike.command}\n tooltip=\"Strikethrough\"\n >\n <div className=\"i-lucide-strikethrough size-5 block\"></div>\n </Button>\n )}\n {items.code && (\n <Button\n pressed={items.code.isActive}\n disabled={!items.code.canExec}\n onClick={items.code.command}\n tooltip=\"Code\"\n >\n <div className=\"i-lucide-code size-5 block\"></div>\n </Button>\n )}\n {items.link && items.link.canExec && (\n <Button\n pressed={items.link.isActive}\n onClick={() => {\n items.link?.command?.()\n toggleLinkMenuOpen()\n }}\n tooltip=\"Link\"\n >\n <div className=\"i-lucide-link size-5 block\"></div>\n </Button>\n )}\n </InlinePopoverPopup>\n </InlinePopoverPositioner>\n </InlinePopoverRoot>\n\n {items.link && (\n <InlinePopoverRoot\n defaultOpen={false}\n open={linkMenuOpen}\n onOpenChange={(event) => setLinkMenuOpen(event.detail)}\n >\n <InlinePopoverPositioner placement=\"bottom\" className=\"block overflow-visible 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 className=\"box-border origin-(--transform-origin) transition-[opacity,scale] 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 shadow-lg bg-[canvas] relative flex flex-col w-xs rounded-lg p-4 gap-y-2 items-stretch\"\n >\n {linkMenuOpen && (\n <form\n onSubmit={(event) => {\n event.preventDefault()\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 defaultValue={items.link.currentLink}\n className=\"flex h-9 rounded-md w-full bg-[canvas] 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 )}\n {items.link.isActive && (\n <button\n onClick={() => handleLinkUpdate()}\n onMouseDown={(event) => event.preventDefault()}\n className=\"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 >\n Remove link\n </button>\n )}\n </InlinePopoverPopup>\n </InlinePopoverPositioner>\n </InlinePopoverRoot>\n )}\n </>\n )\n}\n"
|
|
26
26
|
}
|
|
27
27
|
],
|
|
28
28
|
"meta": {
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
"dependencies": [
|
|
10
10
|
"@egoist/tailwindcss-icons",
|
|
11
11
|
"@iconify-json/lucide",
|
|
12
|
-
"prosekit@^0.20.0
|
|
12
|
+
"prosekit@^0.20.0"
|
|
13
13
|
],
|
|
14
14
|
"files": [
|
|
15
15
|
{
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"path": "registry/src/react/ui/search/search.tsx",
|
|
23
23
|
"type": "registry:component",
|
|
24
24
|
"target": "components/editor/ui/search/search.tsx",
|
|
25
|
-
"content": "'use client'\n\nimport { defineSearchQuery, type SearchCommandsExtension } from 'prosekit/extensions/search'\nimport { useEditor, useExtension } from 'prosekit/react'\nimport { useMemo, useState } from 'react'\n\nimport { Button } from '../button'\n\nexport default function Search(props: { onClose?: VoidFunction }) {\n const [showReplace, setShowReplace] = useState(false)\n const toggleReplace = () => setShowReplace((value) => !value)\n\n const [searchText, setSearchText] = useState('')\n const [replaceText, setReplaceText] = useState('')\n\n const extension = useMemo(() => {\n if (!searchText) {\n return null\n }\n return defineSearchQuery({ search: searchText, replace: replaceText })\n }, [searchText, replaceText])\n\n useExtension(extension)\n\n const editor = useEditor<SearchCommandsExtension>()\n\n const handleSearchKeyDown = (event: React.KeyboardEvent) => {\n if (isEnter(event)) {\n event.preventDefault()\n editor.commands.findNext()\n } else if (isShiftEnter(event)) {\n event.preventDefault()\n editor.commands.findPrev()\n }\n }\n\n const handleReplaceKeyDown = (event: React.KeyboardEvent) => {\n if (isEnter(event)) {\n event.preventDefault()\n editor.commands.replaceNext()\n } else if (isShiftEnter(event)) {\n event.preventDefault()\n editor.commands.replaceAll()\n }\n }\n\n return (\n <div className=\"z-2 box-border border-gray-200 dark:border-gray-800 border-solid border-l-0 border-r-0 border-t-0 border-b grid grid-cols-[min-content_1fr_min-content] gap-2 p-2\">\n <Button tooltip=\"Toggle Replace\" onClick={toggleReplace}>\n <span\n data-rotate={showReplace ? '' : undefined}\n className=\"i-lucide-chevron-right size-5 block transition-transform data-rotate:rotate-90\"\n />\n </Button>\n <input\n placeholder=\"Search\"\n type=\"text\"\n value={searchText}\n onChange={(event) => setSearchText(event.target.value)}\n onKeyDown={handleSearchKeyDown}\n className=\"flex h-9 rounded-md w-full bg-
|
|
25
|
+
"content": "'use client'\n\nimport { defineSearchQuery, type SearchCommandsExtension } from 'prosekit/extensions/search'\nimport { useEditor, useExtension } from 'prosekit/react'\nimport { useMemo, useState } from 'react'\n\nimport { Button } from '../button'\n\nexport default function Search(props: { onClose?: VoidFunction }) {\n const [showReplace, setShowReplace] = useState(false)\n const toggleReplace = () => setShowReplace((value) => !value)\n\n const [searchText, setSearchText] = useState('')\n const [replaceText, setReplaceText] = useState('')\n\n const extension = useMemo(() => {\n if (!searchText) {\n return null\n }\n return defineSearchQuery({ search: searchText, replace: replaceText })\n }, [searchText, replaceText])\n\n useExtension(extension)\n\n const editor = useEditor<SearchCommandsExtension>()\n\n const handleSearchKeyDown = (event: React.KeyboardEvent) => {\n if (isEnter(event)) {\n event.preventDefault()\n editor.commands.findNext()\n } else if (isShiftEnter(event)) {\n event.preventDefault()\n editor.commands.findPrev()\n }\n }\n\n const handleReplaceKeyDown = (event: React.KeyboardEvent) => {\n if (isEnter(event)) {\n event.preventDefault()\n editor.commands.replaceNext()\n } else if (isShiftEnter(event)) {\n event.preventDefault()\n editor.commands.replaceAll()\n }\n }\n\n return (\n <div className=\"z-2 box-border border-gray-200 dark:border-gray-800 border-solid border-l-0 border-r-0 border-t-0 border-b grid grid-cols-[min-content_1fr_min-content] gap-2 p-2\">\n <Button tooltip=\"Toggle Replace\" onClick={toggleReplace}>\n <span\n data-rotate={showReplace ? '' : undefined}\n className=\"i-lucide-chevron-right size-5 block transition-transform data-rotate:rotate-90\"\n />\n </Button>\n <input\n placeholder=\"Search\"\n type=\"text\"\n value={searchText}\n onChange={(event) => setSearchText(event.target.value)}\n onKeyDown={handleSearchKeyDown}\n className=\"flex h-9 rounded-md w-full bg-[canvas] 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 col-start-2\"\n />\n <div className=\"flex items-center justify-between gap-1\">\n <Button\n tooltip=\"Previous (Shift Enter)\"\n onClick={editor.commands.findPrev}\n >\n <span className=\"i-lucide-arrow-left size-5 block\" />\n </Button>\n <Button tooltip=\"Next (Enter)\" onClick={editor.commands.findNext}>\n <span className=\"i-lucide-arrow-right size-5 block\" />\n </Button>\n <Button tooltip=\"Close\" onClick={props.onClose}>\n <span className=\"i-lucide-x size-5 block\" />\n </Button>\n </div>\n {showReplace && (\n <input\n placeholder=\"Replace\"\n type=\"text\"\n value={replaceText}\n onChange={(event) => setReplaceText(event.target.value)}\n onKeyDown={handleReplaceKeyDown}\n className=\"flex h-9 rounded-md w-full bg-[canvas] 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 col-start-2\"\n />\n )}\n {showReplace && (\n <div className=\"flex items-center justify-between gap-1\">\n <Button\n tooltip=\"Replace (Enter)\"\n onClick={editor.commands.replaceNext}\n >\n Replace\n </Button>\n <Button\n tooltip=\"Replace All (Shift Enter)\"\n onClick={editor.commands.replaceAll}\n >\n All\n </Button>\n </div>\n )}\n </div>\n )\n}\n\nfunction isEnter(event: React.KeyboardEvent) {\n return (\n event.key === 'Enter'\n && !event.shiftKey\n && !event.metaKey\n && !event.altKey\n && !event.ctrlKey\n && !event.nativeEvent.isComposing\n )\n}\n\nfunction isShiftEnter(event: React.KeyboardEvent) {\n return (\n event.key === 'Enter'\n && event.shiftKey\n && !event.metaKey\n && !event.altKey\n && !event.ctrlKey\n && !event.nativeEvent.isComposing\n )\n}\n"
|
|
26
26
|
}
|
|
27
27
|
],
|
|
28
28
|
"meta": {
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"description": "",
|
|
6
6
|
"registryDependencies": [],
|
|
7
7
|
"dependencies": [
|
|
8
|
-
"prosekit@^0.20.0
|
|
8
|
+
"prosekit@^0.20.0"
|
|
9
9
|
],
|
|
10
10
|
"files": [
|
|
11
11
|
{
|
|
@@ -18,19 +18,19 @@
|
|
|
18
18
|
"path": "registry/src/react/ui/slash-menu/slash-menu-empty.tsx",
|
|
19
19
|
"type": "registry:component",
|
|
20
20
|
"target": "components/editor/ui/slash-menu/slash-menu-empty.tsx",
|
|
21
|
-
"content": "'use client'\n\nimport { AutocompleteEmpty } from 'prosekit/react/autocomplete'\n\nexport default function SlashMenuEmpty() {\n return (\n <AutocompleteEmpty className=\"relative flex items-center justify-between min-w-32 scroll-my-1 rounded-
|
|
21
|
+
"content": "'use client'\n\nimport { AutocompleteEmpty } from 'prosekit/react/autocomplete'\n\nexport default function SlashMenuEmpty() {\n return (\n <AutocompleteEmpty className=\"relative flex items-center justify-between min-w-32 scroll-my-1 rounded-md px-3 py-1.5 text-sm box-border cursor-default select-none whitespace-nowrap outline-hidden data-highlighted:bg-gray-100 dark:data-highlighted:bg-gray-800\">\n <span>No results</span>\n </AutocompleteEmpty>\n )\n}\n"
|
|
22
22
|
},
|
|
23
23
|
{
|
|
24
24
|
"path": "registry/src/react/ui/slash-menu/slash-menu-item.tsx",
|
|
25
25
|
"type": "registry:component",
|
|
26
26
|
"target": "components/editor/ui/slash-menu/slash-menu-item.tsx",
|
|
27
|
-
"content": "'use client'\n\nimport { AutocompleteItem } from 'prosekit/react/autocomplete'\n\nexport default function SlashMenuItem(props: {\n label: string\n kbd?: string\n onSelect: () => void\n}) {\n return (\n <AutocompleteItem onSelect={props.onSelect} className=\"relative flex items-center justify-between min-w-32 scroll-my-1 rounded-
|
|
27
|
+
"content": "'use client'\n\nimport { AutocompleteItem } from 'prosekit/react/autocomplete'\n\nexport default function SlashMenuItem(props: {\n label: string\n kbd?: string\n onSelect: () => void\n}) {\n return (\n <AutocompleteItem onSelect={props.onSelect} className=\"relative flex items-center justify-between min-w-32 scroll-my-1 rounded-md px-3 py-1.5 text-sm box-border cursor-default select-none whitespace-nowrap outline-hidden data-highlighted:bg-gray-100 dark:data-highlighted:bg-gray-800\">\n <span>{props.label}</span>\n {props.kbd && <kbd className=\"text-xs font-mono text-gray-400 dark:text-gray-500\">{props.kbd}</kbd>}\n </AutocompleteItem>\n )\n}\n"
|
|
28
28
|
},
|
|
29
29
|
{
|
|
30
30
|
"path": "registry/src/react/ui/slash-menu/slash-menu.tsx",
|
|
31
31
|
"type": "registry:component",
|
|
32
32
|
"target": "components/editor/ui/slash-menu/slash-menu.tsx",
|
|
33
|
-
"content": "'use client'\n\nimport type { BasicExtension } from 'prosekit/basic'\nimport { canUseRegexLookbehind } from 'prosekit/core'\nimport { useEditor } from 'prosekit/react'\nimport { AutocompletePopup, AutocompletePositioner, AutocompleteRoot } from 'prosekit/react/autocomplete'\n\nimport SlashMenuEmpty from './slash-menu-empty'\nimport SlashMenuItem from './slash-menu-item'\n\n// Match inputs like \"/\", \"/table\", \"/heading 1\" etc. Do not match \"/ heading\".\nconst regex = canUseRegexLookbehind() ? /(?<!\\S)\\/(\\S.*)?$/u : /\\/(\\S.*)?$/u\n\nexport default function SlashMenu() {\n const editor = useEditor<BasicExtension>()\n\n return (\n <AutocompleteRoot regex={regex}>\n <AutocompletePositioner className=\"block overflow-visible w-min h-min z-50 ease-out transition-transform duration-100 motion-reduce:transition-none\">\n <AutocompletePopup className=\"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-
|
|
33
|
+
"content": "'use client'\n\nimport type { BasicExtension } from 'prosekit/basic'\nimport { canUseRegexLookbehind } from 'prosekit/core'\nimport { useEditor } from 'prosekit/react'\nimport { AutocompletePopup, AutocompletePositioner, AutocompleteRoot } from 'prosekit/react/autocomplete'\n\nimport SlashMenuEmpty from './slash-menu-empty'\nimport SlashMenuItem from './slash-menu-item'\n\n// Match inputs like \"/\", \"/table\", \"/heading 1\" etc. Do not match \"/ heading\".\nconst regex = canUseRegexLookbehind() ? /(?<!\\S)\\/(\\S.*)?$/u : /\\/(\\S.*)?$/u\n\nexport default function SlashMenu() {\n const editor = useEditor<BasicExtension>()\n\n return (\n <AutocompleteRoot regex={regex}>\n <AutocompletePositioner className=\"block overflow-visible w-min h-min z-50 ease-out transition-transform duration-100 motion-reduce:transition-none\">\n <AutocompletePopup className=\"box-border origin-(--transform-origin) transition-[opacity,scale] 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-xl border border-gray-200 dark:border-gray-800 shadow-lg bg-[canvas] flex flex-col relative max-h-100 min-h-0 min-w-60 select-none overflow-hidden whitespace-nowrap\">\n <div className=\"flex flex-col flex-1 min-h-0 overflow-y-auto p-1 bg-[canvas] overscroll-contain\">\n <SlashMenuItem\n label=\"Text\"\n onSelect={() => editor.commands.setParagraph()}\n />\n\n <SlashMenuItem\n label=\"Heading 1\"\n kbd=\"#\"\n onSelect={() => editor.commands.setHeading({ level: 1 })}\n />\n\n <SlashMenuItem\n label=\"Heading 2\"\n kbd=\"##\"\n onSelect={() => editor.commands.setHeading({ level: 2 })}\n />\n\n <SlashMenuItem\n label=\"Heading 3\"\n kbd=\"###\"\n onSelect={() => editor.commands.setHeading({ level: 3 })}\n />\n\n <SlashMenuItem\n label=\"Bullet list\"\n kbd=\"-\"\n onSelect={() => editor.commands.wrapInList({ kind: 'bullet' })}\n />\n\n <SlashMenuItem\n label=\"Ordered list\"\n kbd=\"1.\"\n onSelect={() => editor.commands.wrapInList({ kind: 'ordered' })}\n />\n\n <SlashMenuItem\n label=\"Task list\"\n kbd=\"[]\"\n onSelect={() => editor.commands.wrapInList({ kind: 'task' })}\n />\n\n <SlashMenuItem\n label=\"Toggle list\"\n kbd=\">>\"\n onSelect={() => editor.commands.wrapInList({ kind: 'toggle' })}\n />\n\n <SlashMenuItem\n label=\"Quote\"\n kbd=\">\"\n onSelect={() => editor.commands.setBlockquote()}\n />\n\n <SlashMenuItem\n label=\"Table\"\n onSelect={() => editor.commands.insertTable({ row: 3, col: 3 })}\n />\n\n <SlashMenuItem\n label=\"Divider\"\n kbd=\"---\"\n onSelect={() => editor.commands.insertHorizontalRule()}\n />\n\n <SlashMenuItem\n label=\"Code\"\n kbd=\"```\"\n onSelect={() => editor.commands.setCodeBlock()}\n />\n\n <SlashMenuEmpty />\n </div>\n </AutocompletePopup>\n </AutocompletePositioner>\n </AutocompleteRoot>\n )\n}\n"
|
|
34
34
|
}
|
|
35
35
|
],
|
|
36
36
|
"meta": {
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
"dependencies": [
|
|
8
8
|
"@egoist/tailwindcss-icons",
|
|
9
9
|
"@iconify-json/lucide",
|
|
10
|
-
"prosekit@^0.20.0
|
|
10
|
+
"prosekit@^0.20.0"
|
|
11
11
|
],
|
|
12
12
|
"files": [
|
|
13
13
|
{
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"path": "registry/src/react/ui/table-handle/table-handle.tsx",
|
|
21
21
|
"type": "registry:component",
|
|
22
22
|
"target": "components/editor/ui/table-handle/table-handle.tsx",
|
|
23
|
-
"content": "'use client'\n\nimport type { Editor } from 'prosekit/core'\nimport type { TableExtension } from 'prosekit/extensions/table'\nimport { useEditorDerivedValue } from 'prosekit/react'\nimport { MenuItem, MenuPopup, MenuPositioner } from 'prosekit/react/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/react/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\nexport default function TableHandle(props: Props) {\n const state = useEditorDerivedValue(getTableHandleState)\n\n return (\n <TableHandleRoot>\n <TableHandleDragPreview />\n <TableHandleDropIndicator />\n <TableHandleColumnPositioner className=\"block overflow-visible w-min h-min z-50 ease-out transition-transform duration-100 motion-reduce:transition-none\">\n <TableHandleColumnPopup className=\"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 className=\"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 className=\"i-lucide-grip-horizontal size-5 min-h-5 min-w-5 block\"></div>\n </TableHandleColumnMenuTrigger>\n <MenuPositioner className=\"block overflow-visible w-min h-min z-50 ease-out transition-transform duration-100 motion-reduce:transition-none\">\n <MenuPopup className=\"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 overscroll-none relative flex flex-col max-h-100 min-w-32 select-none overflow-auto whitespace-nowrap p-1 outline-none\">\n {state.addTableColumnBefore.canExec && (\n <MenuItem\n className=\"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 onSelect={state.addTableColumnBefore.command}\n >\n <span>Insert Left</span>\n </MenuItem>\n )}\n {state.addTableColumnAfter.canExec && (\n <MenuItem\n className=\"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 onSelect={state.addTableColumnAfter.command}\n >\n <span>Insert Right</span>\n </MenuItem>\n )}\n {state.deleteCellSelection.canExec && (\n <MenuItem\n className=\"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 onSelect={state.deleteCellSelection.command}\n >\n <span>Clear Contents</span>\n <span className=\"text-xs tracking-widest text-gray-500 dark:text-gray-500\">Del</span>\n </MenuItem>\n )}\n {state.deleteTableColumn.canExec && (\n <MenuItem\n className=\"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 onSelect={state.deleteTableColumn.command}\n >\n <span>Delete Column</span>\n </MenuItem>\n )}\n {state.deleteTable.canExec && (\n <MenuItem\n className=\"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 onSelect={state.deleteTable.command}\n >\n <span>Delete Table</span>\n </MenuItem>\n )}\n </MenuPopup>\n </MenuPositioner>\n </TableHandleColumnMenuRoot>\n </TableHandleColumnPopup>\n </TableHandleColumnPositioner>\n <TableHandleRowPositioner\n placement={props.dir === 'rtl' ? 'right' : 'left'}\n className=\"block overflow-visible w-min h-min z-50 ease-out transition-transform duration-100 motion-reduce:transition-none\"\n >\n <TableHandleRowPopup className=\"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 className=\"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 className=\"i-lucide-grip-vertical size-5 min-h-5 min-w-5 block\"></div>\n </TableHandleRowMenuTrigger>\n <MenuPositioner className=\"block overflow-visible w-min h-min z-50 ease-out transition-transform duration-100 motion-reduce:transition-none\">\n <MenuPopup className=\"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 overscroll-none relative flex flex-col max-h-100 min-w-32 select-none overflow-auto whitespace-nowrap p-1 outline-none\">\n {state.addTableRowAbove.canExec && (\n <MenuItem\n className=\"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 onSelect={state.addTableRowAbove.command}\n >\n <span>Insert Above</span>\n </MenuItem>\n )}\n {state.addTableRowBelow.canExec && (\n <MenuItem\n className=\"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 onSelect={state.addTableRowBelow.command}\n >\n <span>Insert Below</span>\n </MenuItem>\n )}\n {state.deleteCellSelection.canExec && (\n <MenuItem\n className=\"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 onSelect={state.deleteCellSelection.command}\n >\n <span>Clear Contents</span>\n <span className=\"text-xs tracking-widest text-gray-500 dark:text-gray-500\">Del</span>\n </MenuItem>\n )}\n {state.deleteTableRow.canExec && (\n <MenuItem\n className=\"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 onSelect={state.deleteTableRow.command}\n >\n <span>Delete Row</span>\n </MenuItem>\n )}\n {state.deleteTable.canExec && (\n <MenuItem\n className=\"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 onSelect={state.deleteTable.command}\n >\n <span>Delete Table</span>\n </MenuItem>\n )}\n </MenuPopup>\n </MenuPositioner>\n </TableHandleRowMenuRoot>\n </TableHandleRowPopup>\n </TableHandleRowPositioner>\n </TableHandleRoot>\n )\n}\n"
|
|
23
|
+
"content": "'use client'\n\nimport type { Editor } from 'prosekit/core'\nimport type { TableExtension } from 'prosekit/extensions/table'\nimport { useEditorDerivedValue } from 'prosekit/react'\nimport { MenuItem, MenuPopup, MenuPositioner } from 'prosekit/react/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/react/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\nexport default function TableHandle(props: Props) {\n const state = useEditorDerivedValue(getTableHandleState)\n\n return (\n <TableHandleRoot>\n <TableHandleDragPreview />\n <TableHandleDropIndicator />\n <TableHandleColumnPositioner className=\"block overflow-visible w-min h-min z-50 ease-out transition-transform duration-100 motion-reduce:transition-none\">\n <TableHandleColumnPopup className=\"translate-y-[50%] flex box-border origin-(--transform-origin) transition-[opacity,scale] 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 className=\"h-4.5 w-6 flex items-center box-border justify-center bg-[canvas] 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 className=\"i-lucide-grip-horizontal size-5 min-h-5 min-w-5 block\"></div>\n </TableHandleColumnMenuTrigger>\n <MenuPositioner className=\"block overflow-visible w-min h-min z-50 ease-out transition-transform duration-100 motion-reduce:transition-none\">\n <MenuPopup className=\"box-border origin-(--transform-origin) transition-[opacity,scale] 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-xl border border-gray-200 dark:border-gray-800 shadow-lg bg-[canvas] relative flex flex-col max-h-100 min-w-32 select-none overflow-auto whitespace-nowrap p-1 outline-none\">\n {state.addTableColumnBefore.canExec && (\n <MenuItem\n className=\"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 onSelect={state.addTableColumnBefore.command}\n >\n <span>Insert Left</span>\n </MenuItem>\n )}\n {state.addTableColumnAfter.canExec && (\n <MenuItem\n className=\"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 onSelect={state.addTableColumnAfter.command}\n >\n <span>Insert Right</span>\n </MenuItem>\n )}\n {state.deleteCellSelection.canExec && (\n <MenuItem\n className=\"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 onSelect={state.deleteCellSelection.command}\n >\n <span>Clear Contents</span>\n <span className=\"text-xs tracking-widest text-gray-500 dark:text-gray-500\">Del</span>\n </MenuItem>\n )}\n {state.deleteTableColumn.canExec && (\n <MenuItem\n className=\"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 onSelect={state.deleteTableColumn.command}\n >\n <span>Delete Column</span>\n </MenuItem>\n )}\n {state.deleteTable.canExec && (\n <MenuItem\n className=\"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 onSelect={state.deleteTable.command}\n >\n <span>Delete Table</span>\n </MenuItem>\n )}\n </MenuPopup>\n </MenuPositioner>\n </TableHandleColumnMenuRoot>\n </TableHandleColumnPopup>\n </TableHandleColumnPositioner>\n <TableHandleRowPositioner\n placement={props.dir === 'rtl' ? 'right' : 'left'}\n className=\"block overflow-visible w-min h-min z-50 ease-out transition-transform duration-100 motion-reduce:transition-none\"\n >\n <TableHandleRowPopup className=\"ltr:translate-x-[50%] rtl:translate-x-[-50%] flex box-border origin-(--transform-origin) transition-[opacity,scale] 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 className=\"h-6 w-4.5 flex items-center box-border justify-center bg-[canvas] 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 className=\"i-lucide-grip-vertical size-5 min-h-5 min-w-5 block\"></div>\n </TableHandleRowMenuTrigger>\n <MenuPositioner className=\"block overflow-visible w-min h-min z-50 ease-out transition-transform duration-100 motion-reduce:transition-none\">\n <MenuPopup className=\"box-border origin-(--transform-origin) transition-[opacity,scale] 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-xl border border-gray-200 dark:border-gray-800 shadow-lg bg-[canvas] relative flex flex-col max-h-100 min-w-32 select-none overflow-auto whitespace-nowrap p-1 outline-none\">\n {state.addTableRowAbove.canExec && (\n <MenuItem\n className=\"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 onSelect={state.addTableRowAbove.command}\n >\n <span>Insert Above</span>\n </MenuItem>\n )}\n {state.addTableRowBelow.canExec && (\n <MenuItem\n className=\"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 onSelect={state.addTableRowBelow.command}\n >\n <span>Insert Below</span>\n </MenuItem>\n )}\n {state.deleteCellSelection.canExec && (\n <MenuItem\n className=\"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 onSelect={state.deleteCellSelection.command}\n >\n <span>Clear Contents</span>\n <span className=\"text-xs tracking-widest text-gray-500 dark:text-gray-500\">Del</span>\n </MenuItem>\n )}\n {state.deleteTableRow.canExec && (\n <MenuItem\n className=\"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 onSelect={state.deleteTableRow.command}\n >\n <span>Delete Row</span>\n </MenuItem>\n )}\n {state.deleteTable.canExec && (\n <MenuItem\n className=\"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 onSelect={state.deleteTable.command}\n >\n <span>Delete Table</span>\n </MenuItem>\n )}\n </MenuPopup>\n </MenuPositioner>\n </TableHandleRowMenuRoot>\n </TableHandleRowPopup>\n </TableHandleRowPositioner>\n </TableHandleRoot>\n )\n}\n"
|
|
24
24
|
}
|
|
25
25
|
],
|
|
26
26
|
"meta": {
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"description": "",
|
|
6
6
|
"registryDependencies": [],
|
|
7
7
|
"dependencies": [
|
|
8
|
-
"prosekit@^0.20.0
|
|
8
|
+
"prosekit@^0.20.0"
|
|
9
9
|
],
|
|
10
10
|
"files": [
|
|
11
11
|
{
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
"path": "registry/src/react/ui/tag-menu/tag-menu.tsx",
|
|
19
19
|
"type": "registry:component",
|
|
20
20
|
"target": "components/editor/ui/tag-menu/tag-menu.tsx",
|
|
21
|
-
"content": "'use client'\n\nimport type { BasicExtension } from 'prosekit/basic'\nimport type { Union } from 'prosekit/core'\nimport type { MentionExtension } from 'prosekit/extensions/mention'\nimport { useEditor } from 'prosekit/react'\nimport {\n AutocompleteEmpty,\n AutocompleteItem,\n AutocompletePopup,\n AutocompletePositioner,\n AutocompleteRoot,\n} from 'prosekit/react/autocomplete'\n\nconst regex = /#[\\da-z]*$/i\n\nexport default function TagMenu(props: { tags: { id: number; label: string }[] }) {\n const editor = useEditor<Union<[MentionExtension, BasicExtension]>>()\n\n const handleTagInsert = (id: number, label: string) => {\n editor.commands.insertMention({\n id: id.toString(),\n value: '#' + label,\n kind: 'tag',\n })\n editor.commands.insertText({ text: ' ' })\n }\n\n return (\n <AutocompleteRoot regex={regex}>\n <AutocompletePositioner className=\"block overflow-visible w-min h-min z-50 ease-out transition-transform duration-100 motion-reduce:transition-none\">\n <AutocompletePopup className=\"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-
|
|
21
|
+
"content": "'use client'\n\nimport type { BasicExtension } from 'prosekit/basic'\nimport type { Union } from 'prosekit/core'\nimport type { MentionExtension } from 'prosekit/extensions/mention'\nimport { useEditor } from 'prosekit/react'\nimport {\n AutocompleteEmpty,\n AutocompleteItem,\n AutocompletePopup,\n AutocompletePositioner,\n AutocompleteRoot,\n} from 'prosekit/react/autocomplete'\n\nconst regex = /#[\\da-z]*$/i\n\nexport default function TagMenu(props: { tags: { id: number; label: string }[] }) {\n const editor = useEditor<Union<[MentionExtension, BasicExtension]>>()\n\n const handleTagInsert = (id: number, label: string) => {\n editor.commands.insertMention({\n id: id.toString(),\n value: '#' + label,\n kind: 'tag',\n })\n editor.commands.insertText({ text: ' ' })\n }\n\n return (\n <AutocompleteRoot regex={regex}>\n <AutocompletePositioner className=\"block overflow-visible w-min h-min z-50 ease-out transition-transform duration-100 motion-reduce:transition-none\">\n <AutocompletePopup className=\"box-border origin-(--transform-origin) transition-[opacity,scale] 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-xl border border-gray-200 dark:border-gray-800 shadow-lg bg-[canvas] flex flex-col relative max-h-100 min-h-0 min-w-60 select-none overflow-hidden whitespace-nowrap\">\n <div className=\"flex flex-col flex-1 min-h-0 overflow-y-auto p-1 bg-[canvas] overscroll-contain\">\n <AutocompleteEmpty className=\"relative flex items-center justify-between min-w-32 scroll-my-1 rounded-md px-3 py-1.5 text-sm 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 {props.tags.map((tag) => (\n <AutocompleteItem\n key={tag.id}\n className=\"relative flex items-center justify-between min-w-32 scroll-my-1 rounded-md px-3 py-1.5 text-sm box-border cursor-default select-none whitespace-nowrap outline-hidden data-highlighted:bg-gray-100 dark:data-highlighted:bg-gray-800\"\n onSelect={() => handleTagInsert(tag.id, tag.label)}\n >\n #{tag.label}\n </AutocompleteItem>\n ))}\n </div>\n </AutocompletePopup>\n </AutocompletePositioner>\n </AutocompleteRoot>\n )\n}\n"
|
|
22
22
|
}
|
|
23
23
|
],
|
|
24
24
|
"meta": {
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"description": "",
|
|
6
6
|
"registryDependencies": [],
|
|
7
7
|
"dependencies": [
|
|
8
|
-
"prosekit@^0.20.0
|
|
8
|
+
"prosekit@^0.20.0"
|
|
9
9
|
],
|
|
10
10
|
"files": [
|
|
11
11
|
{
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
"path": "registry/src/react/ui/user-menu/user-menu.tsx",
|
|
19
19
|
"type": "registry:component",
|
|
20
20
|
"target": "components/editor/ui/user-menu/user-menu.tsx",
|
|
21
|
-
"content": "'use client'\n\nimport type { BasicExtension } from 'prosekit/basic'\nimport { canUseRegexLookbehind, type Union } from 'prosekit/core'\nimport type { MentionExtension } from 'prosekit/extensions/mention'\nimport { useEditor } from 'prosekit/react'\nimport {\n AutocompleteEmpty,\n AutocompleteItem,\n AutocompletePopup,\n AutocompletePositioner,\n AutocompleteRoot,\n} from 'prosekit/react/autocomplete'\n\n// Match inputs like \"@\", \"@foo\", \"@foo bar\" etc. Do not match \"@ foo\".\nconst regex = canUseRegexLookbehind() ? /(?<!\\S)@(\\S.*)?$/u : /@(\\S.*)?$/u\n\nexport default function UserMenu(props: {\n users: { id: number; name: string }[]\n loading?: boolean\n onQueryChange?: (query: string) => void\n onOpenChange?: (open: boolean) => void\n}) {\n const editor = useEditor<Union<[MentionExtension, BasicExtension]>>()\n\n const handleUserInsert = (id: number, username: string) => {\n editor.commands.insertMention({\n id: id.toString(),\n value: '@' + username,\n kind: 'user',\n })\n editor.commands.insertText({ text: ' ' })\n }\n\n return (\n <AutocompleteRoot\n regex={regex}\n onQueryChange={(event) => props.onQueryChange?.(event.detail)}\n onOpenChange={(event) => props.onOpenChange?.(event.detail)}\n >\n <AutocompletePositioner className=\"block overflow-visible w-min h-min z-50 ease-out transition-transform duration-100 motion-reduce:transition-none\">\n <AutocompletePopup className=\"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-
|
|
21
|
+
"content": "'use client'\n\nimport type { BasicExtension } from 'prosekit/basic'\nimport { canUseRegexLookbehind, type Union } from 'prosekit/core'\nimport type { MentionExtension } from 'prosekit/extensions/mention'\nimport { useEditor } from 'prosekit/react'\nimport {\n AutocompleteEmpty,\n AutocompleteItem,\n AutocompletePopup,\n AutocompletePositioner,\n AutocompleteRoot,\n} from 'prosekit/react/autocomplete'\n\n// Match inputs like \"@\", \"@foo\", \"@foo bar\" etc. Do not match \"@ foo\".\nconst regex = canUseRegexLookbehind() ? /(?<!\\S)@(\\S.*)?$/u : /@(\\S.*)?$/u\n\nexport default function UserMenu(props: {\n users: { id: number; name: string }[]\n loading?: boolean\n onQueryChange?: (query: string) => void\n onOpenChange?: (open: boolean) => void\n}) {\n const editor = useEditor<Union<[MentionExtension, BasicExtension]>>()\n\n const handleUserInsert = (id: number, username: string) => {\n editor.commands.insertMention({\n id: id.toString(),\n value: '@' + username,\n kind: 'user',\n })\n editor.commands.insertText({ text: ' ' })\n }\n\n return (\n <AutocompleteRoot\n regex={regex}\n onQueryChange={(event) => props.onQueryChange?.(event.detail)}\n onOpenChange={(event) => props.onOpenChange?.(event.detail)}\n >\n <AutocompletePositioner className=\"block overflow-visible w-min h-min z-50 ease-out transition-transform duration-100 motion-reduce:transition-none\">\n <AutocompletePopup className=\"box-border origin-(--transform-origin) transition-[opacity,scale] 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-xl border border-gray-200 dark:border-gray-800 shadow-lg bg-[canvas] flex flex-col relative max-h-100 min-h-0 min-w-60 select-none overflow-hidden whitespace-nowrap\">\n <div className=\"flex flex-col flex-1 min-h-0 overflow-y-auto p-1 bg-[canvas] overscroll-contain\">\n <AutocompleteEmpty className=\"relative flex items-center justify-between min-w-32 scroll-my-1 rounded-md px-3 py-1.5 text-sm 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 {props.users.map((user) => (\n <AutocompleteItem\n key={user.id}\n className=\"relative flex items-center justify-between min-w-32 scroll-my-1 rounded-md px-3 py-1.5 text-sm box-border cursor-default select-none whitespace-nowrap outline-hidden data-highlighted:bg-gray-100 dark:data-highlighted:bg-gray-800\"\n onSelect={() => handleUserInsert(user.id, user.name)}\n >\n <span className={props.loading ? 'opacity-50' : undefined}>\n {user.name}\n </span>\n </AutocompleteItem>\n ))}\n </div>\n </AutocompletePopup>\n </AutocompletePositioner>\n </AutocompleteRoot>\n )\n}\n"
|
|
22
22
|
}
|
|
23
23
|
],
|
|
24
24
|
"meta": {
|