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/svelte-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/svelte/ui/image-upload-popover/image-upload-popover.svelte",
|
|
15
15
|
"type": "registry:component",
|
|
16
16
|
"target": "components/editor/ui/image-upload-popover/image-upload-popover.svelte",
|
|
17
|
-
"content": "<script lang=\"ts\">\nimport type { Uploader } from 'prosekit/extensions/file'\nimport type { ImageExtension } from 'prosekit/extensions/image'\nimport { useEditor } from 'prosekit/svelte'\nimport { PopoverPopup, PopoverPositioner, PopoverRoot, PopoverTrigger } from 'prosekit/svelte/popover'\nimport type { OpenChangeEvent } from 'prosekit/web/popover'\n\nimport { Button } from '../button'\n\ninterface Props {\n uploader: Uploader<string>\n tooltip: string\n disabled: boolean\n children?: import('svelte').Snippet\n}\n\nconst props: Props = $props()\n\nlet open = $state(false)\nlet url = $state('')\nlet file = $state<File | null>(null)\nconst ariaId = $props.id()\n\nconst editor = useEditor<ImageExtension>()\n\nfunction handleFileChange(event: Event) {\n const target = event.target as HTMLInputElement\n const selectedFile = target.files?.[0]\n\n if (selectedFile) {\n file = selectedFile\n url = ''\n } else {\n file = null\n }\n}\n\nfunction handleUrlChange(event: Event) {\n const target = event.target as HTMLInputElement\n const inputUrl = target.value\n\n if (inputUrl) {\n url = inputUrl\n file = null\n } else {\n url = ''\n }\n}\n\nfunction deferResetState() {\n setTimeout(() => {\n url = ''\n file = null\n }, 300)\n}\n\nfunction handleSubmit() {\n if (url) {\n $editor.commands.insertImage({ src: url })\n } else if (file) {\n $editor.commands.uploadImage({ file, uploader: props.uploader })\n }\n open = false\n deferResetState()\n}\n\nfunction handleOpenChange(event: OpenChangeEvent) {\n if (!event.detail) {\n deferResetState()\n }\n open = event.detail\n}\n</script>\n\n<PopoverRoot {open} onOpenChange={handleOpenChange}>\n <PopoverTrigger>\n <Button pressed={open} disabled={props.disabled} tooltip={props.tooltip}>\n {@render props.children?.()}\n </Button>\n </PopoverTrigger>\n\n <PopoverPositioner\n placement=\"bottom\"\n class=\"block overflow-visible w-min h-min z-50 ease-out transition-transform duration-100 motion-reduce:transition-none\"\n ><PopoverPopup 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-
|
|
17
|
+
"content": "<script lang=\"ts\">\nimport type { Uploader } from 'prosekit/extensions/file'\nimport type { ImageExtension } from 'prosekit/extensions/image'\nimport { useEditor } from 'prosekit/svelte'\nimport { PopoverPopup, PopoverPositioner, PopoverRoot, PopoverTrigger } from 'prosekit/svelte/popover'\nimport type { OpenChangeEvent } from 'prosekit/web/popover'\n\nimport { Button } from '../button'\n\ninterface Props {\n uploader: Uploader<string>\n tooltip: string\n disabled: boolean\n children?: import('svelte').Snippet\n}\n\nconst props: Props = $props()\n\nlet open = $state(false)\nlet url = $state('')\nlet file = $state<File | null>(null)\nconst ariaId = $props.id()\n\nconst editor = useEditor<ImageExtension>()\n\nfunction handleFileChange(event: Event) {\n const target = event.target as HTMLInputElement\n const selectedFile = target.files?.[0]\n\n if (selectedFile) {\n file = selectedFile\n url = ''\n } else {\n file = null\n }\n}\n\nfunction handleUrlChange(event: Event) {\n const target = event.target as HTMLInputElement\n const inputUrl = target.value\n\n if (inputUrl) {\n url = inputUrl\n file = null\n } else {\n url = ''\n }\n}\n\nfunction deferResetState() {\n setTimeout(() => {\n url = ''\n file = null\n }, 300)\n}\n\nfunction handleSubmit() {\n if (url) {\n $editor.commands.insertImage({ src: url })\n } else if (file) {\n $editor.commands.uploadImage({ file, uploader: props.uploader })\n }\n open = false\n deferResetState()\n}\n\nfunction handleOpenChange(event: OpenChangeEvent) {\n if (!event.detail) {\n deferResetState()\n }\n open = event.detail\n}\n</script>\n\n<PopoverRoot {open} onOpenChange={handleOpenChange}>\n <PopoverTrigger>\n <Button pressed={open} disabled={props.disabled} tooltip={props.tooltip}>\n {@render props.children?.()}\n </Button>\n </PopoverTrigger>\n\n <PopoverPositioner\n placement=\"bottom\"\n class=\"block overflow-visible w-min h-min z-50 ease-out transition-transform duration-100 motion-reduce:transition-none\"\n ><PopoverPopup class=\"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 {#if !file}\n <label for=\"id-link-{ariaId}\">Embed Link</label>\n <input\n id=\"id-link-{ariaId}\"\n class=\"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 oninput={handleUrlChange}\n />\n {/if}\n\n {#if !url}\n <label for=\"id-upload-{ariaId}\">Upload</label>\n <input\n id=\"id-upload-{ariaId}\"\n class=\"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 {/if}\n\n {#if url}\n <button 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-10 px-4 py-2 w-full\" onclick={handleSubmit}>\n Insert Image\n </button>\n {/if}\n\n {#if file}\n <button 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-10 px-4 py-2 w-full\" onclick={handleSubmit}>\n Upload Image\n </button>\n {/if}\n </PopoverPopup></PopoverPositioner>\n</PopoverRoot>\n"
|
|
18
18
|
},
|
|
19
19
|
{
|
|
20
20
|
"path": "registry/src/svelte/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/svelte/ui/inline-menu/inline-menu.svelte",
|
|
23
23
|
"type": "registry:component",
|
|
24
24
|
"target": "components/editor/ui/inline-menu/inline-menu.svelte",
|
|
25
|
-
"content": "<script 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/svelte'\nimport { InlinePopoverPopup, InlinePopoverPositioner, InlinePopoverRoot } from 'prosekit/svelte/inline-popover'\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.$from\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\nlet linkMenuOpen = $state(false)\nfunction toggleLinkMenuOpen() {\n linkMenuOpen = !linkMenuOpen\n}\n\nfunction handleLinkUpdate(href?: string) {\n if (href) {\n $editor.commands.addLink({ href })\n } else {\n $editor.commands.removeLink()\n }\n\n linkMenuOpen = false\n $editor.focus()\n}\n</script>\n\n<InlinePopoverRoot\n onOpenChange={(event) => {\n if (!event.detail) linkMenuOpen = false\n }}\n>\n <InlinePopoverPositioner class=\"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 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
|
|
25
|
+
"content": "<script 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/svelte'\nimport { InlinePopoverPopup, InlinePopoverPositioner, InlinePopoverRoot } from 'prosekit/svelte/inline-popover'\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.$from\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\nlet linkMenuOpen = $state(false)\nfunction toggleLinkMenuOpen() {\n linkMenuOpen = !linkMenuOpen\n}\n\nfunction handleLinkUpdate(href?: string) {\n if (href) {\n $editor.commands.addLink({ href })\n } else {\n $editor.commands.removeLink()\n }\n\n linkMenuOpen = false\n $editor.focus()\n}\n</script>\n\n<InlinePopoverRoot\n onOpenChange={(event) => {\n if (!event.detail) linkMenuOpen = false\n }}\n>\n <InlinePopoverPositioner class=\"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 class=\"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 {#if $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 class=\"i-lucide-bold size-5 block\"></div>\n </Button>\n {/if}\n {#if $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 class=\"i-lucide-italic size-5 block\"></div>\n </Button>\n {/if}\n {#if $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 class=\"i-lucide-underline size-5 block\"></div>\n </Button>\n {/if}\n {#if $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 class=\"i-lucide-strikethrough size-5 block\"></div>\n </Button>\n {/if}\n {#if $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 class=\"i-lucide-code size-5 block\"></div>\n </Button>\n {/if}\n {#if $items.link?.canExec && $items.link}\n <Button\n pressed={$items.link.isActive}\n onClick={() => {\n $items.link!.command()\n toggleLinkMenuOpen()\n }}\n tooltip=\"Link\"\n >\n <div class=\"i-lucide-link size-5 block\"></div>\n </Button>\n {/if}\n </InlinePopoverPopup>\n </InlinePopoverPositioner>\n</InlinePopoverRoot>\n\n<InlinePopoverRoot\n defaultOpen={false}\n open={linkMenuOpen}\n onOpenChange={(event) => {\n linkMenuOpen = event.detail\n }}\n>\n <InlinePopoverPositioner placement=\"bottom\" class=\"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 class=\"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 {#if linkMenuOpen && $items.link}\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 value={$items.link.currentLink || ''}\n class=\"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 {/if}\n {#if $items.link?.isActive}\n <button\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 onclick={() => handleLinkUpdate()}\n onmousedown={(e) => e.preventDefault()}\n >\n Remove link\n </button>\n {/if}\n </InlinePopoverPopup>\n </InlinePopoverPositioner>\n</InlinePopoverRoot>\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/svelte/ui/search/search.svelte",
|
|
23
23
|
"type": "registry:component",
|
|
24
24
|
"target": "components/editor/ui/search/search.svelte",
|
|
25
|
-
"content": "<script lang=\"ts\">\nimport { defineSearchQuery, type SearchCommandsExtension } from 'prosekit/extensions/search'\nimport { useEditor, useExtension } from 'prosekit/svelte'\nimport { toStore } from 'svelte/store'\n\nimport { Button } from '../button'\n\ninterface Props {\n onClose?: () => void\n}\n\nconst props: Props = $props()\n\nlet showReplace = $state(false)\nlet searchText = $state('')\nlet replaceText = $state('')\n\nconst editor = useEditor<SearchCommandsExtension>()\n\nconst extension = $derived(\n searchText\n ? defineSearchQuery({ search: searchText, replace: replaceText })\n : null,\n)\n\nuseExtension(toStore(() => extension))\n\nfunction toggleReplace() {\n showReplace = !showReplace\n}\n\nfunction isPlainEnter(event: KeyboardEvent) {\n return (\n event.key === 'Enter'\n && !event.shiftKey\n && !event.metaKey\n && !event.altKey\n && !event.ctrlKey\n && !event.isComposing\n )\n}\n\nfunction isShiftEnter(event: KeyboardEvent) {\n return (\n event.key === 'Enter'\n && event.shiftKey\n && !event.metaKey\n && !event.altKey\n && !event.ctrlKey\n && !event.isComposing\n )\n}\n\nfunction handleSearchKeyDown(event: KeyboardEvent) {\n if (isPlainEnter(event)) {\n event.preventDefault()\n $editor.commands.findNext()\n } else if (isShiftEnter(event)) {\n event.preventDefault()\n $editor.commands.findPrev()\n }\n}\n\nfunction handleReplaceKeyDown(event: KeyboardEvent) {\n if (isPlainEnter(event)) {\n event.preventDefault()\n $editor.commands.replaceNext()\n } else if (isShiftEnter(event)) {\n event.preventDefault()\n $editor.commands.replaceAll()\n }\n}\n</script>\n\n<div class=\"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 class=\"i-lucide-chevron-right size-5 block transition-transform data-rotate:rotate-90\"\n ></span>\n </Button>\n <input\n bind:value={searchText}\n placeholder=\"Search\"\n type=\"text\"\n class=\"flex h-9 rounded-md w-full bg-
|
|
25
|
+
"content": "<script lang=\"ts\">\nimport { defineSearchQuery, type SearchCommandsExtension } from 'prosekit/extensions/search'\nimport { useEditor, useExtension } from 'prosekit/svelte'\nimport { toStore } from 'svelte/store'\n\nimport { Button } from '../button'\n\ninterface Props {\n onClose?: () => void\n}\n\nconst props: Props = $props()\n\nlet showReplace = $state(false)\nlet searchText = $state('')\nlet replaceText = $state('')\n\nconst editor = useEditor<SearchCommandsExtension>()\n\nconst extension = $derived(\n searchText\n ? defineSearchQuery({ search: searchText, replace: replaceText })\n : null,\n)\n\nuseExtension(toStore(() => extension))\n\nfunction toggleReplace() {\n showReplace = !showReplace\n}\n\nfunction isPlainEnter(event: KeyboardEvent) {\n return (\n event.key === 'Enter'\n && !event.shiftKey\n && !event.metaKey\n && !event.altKey\n && !event.ctrlKey\n && !event.isComposing\n )\n}\n\nfunction isShiftEnter(event: KeyboardEvent) {\n return (\n event.key === 'Enter'\n && event.shiftKey\n && !event.metaKey\n && !event.altKey\n && !event.ctrlKey\n && !event.isComposing\n )\n}\n\nfunction handleSearchKeyDown(event: KeyboardEvent) {\n if (isPlainEnter(event)) {\n event.preventDefault()\n $editor.commands.findNext()\n } else if (isShiftEnter(event)) {\n event.preventDefault()\n $editor.commands.findPrev()\n }\n}\n\nfunction handleReplaceKeyDown(event: KeyboardEvent) {\n if (isPlainEnter(event)) {\n event.preventDefault()\n $editor.commands.replaceNext()\n } else if (isShiftEnter(event)) {\n event.preventDefault()\n $editor.commands.replaceAll()\n }\n}\n</script>\n\n<div class=\"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 class=\"i-lucide-chevron-right size-5 block transition-transform data-rotate:rotate-90\"\n ></span>\n </Button>\n <input\n bind:value={searchText}\n placeholder=\"Search\"\n type=\"text\"\n class=\"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 onkeydown={handleSearchKeyDown}\n />\n <div class=\"flex items-center justify-between gap-1\">\n <Button\n tooltip=\"Previous (Shift Enter)\"\n onClick={$editor.commands.findPrev}\n >\n <span class=\"i-lucide-arrow-left size-5 block\"></span>\n </Button>\n <Button\n tooltip=\"Next (Enter)\"\n onClick={$editor.commands.findNext}\n >\n <span class=\"i-lucide-arrow-right size-5 block\"></span>\n </Button>\n <Button tooltip=\"Close\" onClick={props.onClose}>\n <span class=\"i-lucide-x size-5 block\"></span>\n </Button>\n </div>\n {#if showReplace}\n <input\n bind:value={replaceText}\n placeholder=\"Replace\"\n type=\"text\"\n class=\"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 onkeydown={handleReplaceKeyDown}\n />\n <div class=\"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 {/if}\n</div>\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/svelte/ui/slash-menu/slash-menu-empty.svelte",
|
|
19
19
|
"type": "registry:component",
|
|
20
20
|
"target": "components/editor/ui/slash-menu/slash-menu-empty.svelte",
|
|
21
|
-
"content": "<script lang=\"ts\">\nimport { AutocompleteEmpty } from 'prosekit/svelte/autocomplete'\n</script>\n\n<AutocompleteEmpty class=\"relative flex items-center justify-between min-w-32 scroll-my-1 rounded-
|
|
21
|
+
"content": "<script lang=\"ts\">\nimport { AutocompleteEmpty } from 'prosekit/svelte/autocomplete'\n</script>\n\n<AutocompleteEmpty class=\"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"
|
|
22
22
|
},
|
|
23
23
|
{
|
|
24
24
|
"path": "registry/src/svelte/ui/slash-menu/slash-menu-item.svelte",
|
|
25
25
|
"type": "registry:component",
|
|
26
26
|
"target": "components/editor/ui/slash-menu/slash-menu-item.svelte",
|
|
27
|
-
"content": "<script lang=\"ts\">\nimport { AutocompleteItem } from 'prosekit/svelte/autocomplete'\n\ninterface Props {\n label: string\n kbd?: string\n onSelect: () => void\n}\n\nconst props: Props = $props()\n</script>\n\n<AutocompleteItem class=\"relative flex items-center justify-between min-w-32 scroll-my-1 rounded-
|
|
27
|
+
"content": "<script lang=\"ts\">\nimport { AutocompleteItem } from 'prosekit/svelte/autocomplete'\n\ninterface Props {\n label: string\n kbd?: string\n onSelect: () => void\n}\n\nconst props: Props = $props()\n</script>\n\n<AutocompleteItem class=\"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\" onSelect={props.onSelect}>\n <span>{props.label}</span>{#if props.kbd}<kbd class=\"text-xs font-mono text-gray-400 dark:text-gray-500\">{props.kbd}</kbd>{/if}\n</AutocompleteItem>\n"
|
|
28
28
|
},
|
|
29
29
|
{
|
|
30
30
|
"path": "registry/src/svelte/ui/slash-menu/slash-menu.svelte",
|
|
31
31
|
"type": "registry:component",
|
|
32
32
|
"target": "components/editor/ui/slash-menu/slash-menu.svelte",
|
|
33
|
-
"content": "<script lang=\"ts\">\nimport type { BasicExtension } from 'prosekit/basic'\nimport { canUseRegexLookbehind } from 'prosekit/core'\nimport { useEditor } from 'prosekit/svelte'\nimport { AutocompletePopup, AutocompletePositioner, AutocompleteRoot } from 'prosekit/svelte/autocomplete'\n\nimport SlashMenuEmpty from './slash-menu-empty.svelte'\nimport SlashMenuItem from './slash-menu-item.svelte'\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<AutocompleteRoot {regex}>\n <AutocompletePositioner class=\"block overflow-visible 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-
|
|
33
|
+
"content": "<script lang=\"ts\">\nimport type { BasicExtension } from 'prosekit/basic'\nimport { canUseRegexLookbehind } from 'prosekit/core'\nimport { useEditor } from 'prosekit/svelte'\nimport { AutocompletePopup, AutocompletePositioner, AutocompleteRoot } from 'prosekit/svelte/autocomplete'\n\nimport SlashMenuEmpty from './slash-menu-empty.svelte'\nimport SlashMenuItem from './slash-menu-item.svelte'\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<AutocompleteRoot {regex}>\n <AutocompletePositioner class=\"block overflow-visible 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-[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 class=\"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"
|
|
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/svelte/ui/table-handle/table-handle.svelte",
|
|
21
21
|
"type": "registry:component",
|
|
22
22
|
"target": "components/editor/ui/table-handle/table-handle.svelte",
|
|
23
|
-
"content": "<script lang=\"ts\">\nimport type { Editor } from 'prosekit/core'\nimport type { TableExtension } from 'prosekit/extensions/table'\nimport { useEditorDerivedValue } from 'prosekit/svelte'\nimport { MenuItem, MenuPopup, MenuPositioner } from 'prosekit/svelte/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/svelte/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: Props = $props()\n\nconst state = useEditorDerivedValue(getTableHandleState)\n</script>\n\n<TableHandleRoot>\n <TableHandleDragPreview />\n <TableHandleDropIndicator />\n <TableHandleColumnPositioner class=\"block overflow-visible 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=\"block overflow-visible w-min h-min z-50 ease-out transition-transform duration-100 motion-reduce:transition-none\">\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 overscroll-none relative flex flex-col max-h-100 min-w-32 select-none overflow-auto whitespace-nowrap p-1 outline-none\">\n {#if $state.addTableColumnBefore.canExec}\n <MenuItem\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 onSelect={$state.addTableColumnBefore.command}\n >\n <span>Insert Left</span>\n </MenuItem>\n {/if}\n {#if $state.addTableColumnAfter.canExec}\n <MenuItem\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 onSelect={$state.addTableColumnAfter.command}\n >\n <span>Insert Right</span>\n </MenuItem>\n {/if}\n {#if $state.deleteCellSelection.canExec}\n <MenuItem\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 onSelect={$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 {/if}\n {#if $state.deleteTableColumn.canExec}\n <MenuItem\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 onSelect={$state.deleteTableColumn.command}\n >\n <span>Delete Column</span>\n </MenuItem>\n {/if}\n {#if $state.deleteTable.canExec}\n <MenuItem\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 onSelect={$state.deleteTable.command}\n >\n <span>Delete Table</span>\n </MenuItem>\n {/if}\n </MenuPopup>\n </MenuPositioner>\n </TableHandleColumnMenuRoot>\n </TableHandleColumnPopup>\n </TableHandleColumnPositioner>\n <TableHandleRowPositioner\n placement={props.dir === 'rtl' ? 'right' : 'left'}\n class=\"block overflow-visible 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=\"block overflow-visible w-min h-min z-50 ease-out transition-transform duration-100 motion-reduce:transition-none\">\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 overscroll-none relative flex flex-col max-h-100 min-w-32 select-none overflow-auto whitespace-nowrap p-1 outline-none\">\n {#if $state.addTableRowAbove.canExec}\n <MenuItem\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 onSelect={$state.addTableRowAbove.command}\n >\n <span>Insert Above</span>\n </MenuItem>\n {/if}\n {#if $state.addTableRowBelow.canExec}\n <MenuItem\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 onSelect={$state.addTableRowBelow.command}\n >\n <span>Insert Below</span>\n </MenuItem>\n {/if}\n {#if $state.deleteCellSelection.canExec}\n <MenuItem\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 onSelect={$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 {/if}\n {#if $state.deleteTableRow.canExec}\n <MenuItem\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 onSelect={$state.deleteTableRow.command}\n >\n <span>Delete Row</span>\n </MenuItem>\n {/if}\n {#if $state.deleteTable.canExec}\n <MenuItem\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 onSelect={$state.deleteTable.command}\n >\n <span>Delete Table</span>\n </MenuItem>\n {/if}\n </MenuPopup>\n </MenuPositioner>\n </TableHandleRowMenuRoot>\n </TableHandleRowPopup>\n </TableHandleRowPositioner>\n</TableHandleRoot>\n"
|
|
23
|
+
"content": "<script lang=\"ts\">\nimport type { Editor } from 'prosekit/core'\nimport type { TableExtension } from 'prosekit/extensions/table'\nimport { useEditorDerivedValue } from 'prosekit/svelte'\nimport { MenuItem, MenuPopup, MenuPositioner } from 'prosekit/svelte/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/svelte/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: Props = $props()\n\nconst state = useEditorDerivedValue(getTableHandleState)\n</script>\n\n<TableHandleRoot>\n <TableHandleDragPreview />\n <TableHandleDropIndicator />\n <TableHandleColumnPositioner class=\"block overflow-visible 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-[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 class=\"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 class=\"i-lucide-grip-horizontal size-5 min-h-5 min-w-5 block\"></div>\n </TableHandleColumnMenuTrigger>\n <MenuPositioner class=\"block overflow-visible w-min h-min z-50 ease-out transition-transform duration-100 motion-reduce:transition-none\">\n <MenuPopup class=\"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 {#if $state.addTableColumnBefore.canExec}\n <MenuItem\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 onSelect={$state.addTableColumnBefore.command}\n >\n <span>Insert Left</span>\n </MenuItem>\n {/if}\n {#if $state.addTableColumnAfter.canExec}\n <MenuItem\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 onSelect={$state.addTableColumnAfter.command}\n >\n <span>Insert Right</span>\n </MenuItem>\n {/if}\n {#if $state.deleteCellSelection.canExec}\n <MenuItem\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 onSelect={$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 {/if}\n {#if $state.deleteTableColumn.canExec}\n <MenuItem\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 onSelect={$state.deleteTableColumn.command}\n >\n <span>Delete Column</span>\n </MenuItem>\n {/if}\n {#if $state.deleteTable.canExec}\n <MenuItem\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 onSelect={$state.deleteTable.command}\n >\n <span>Delete Table</span>\n </MenuItem>\n {/if}\n </MenuPopup>\n </MenuPositioner>\n </TableHandleColumnMenuRoot>\n </TableHandleColumnPopup>\n </TableHandleColumnPositioner>\n <TableHandleRowPositioner\n placement={props.dir === 'rtl' ? 'right' : 'left'}\n class=\"block overflow-visible 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-[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 class=\"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 class=\"i-lucide-grip-vertical size-5 min-h-5 min-w-5 block\"></div>\n </TableHandleRowMenuTrigger>\n <MenuPositioner class=\"block overflow-visible w-min h-min z-50 ease-out transition-transform duration-100 motion-reduce:transition-none\">\n <MenuPopup class=\"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 {#if $state.addTableRowAbove.canExec}\n <MenuItem\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 onSelect={$state.addTableRowAbove.command}\n >\n <span>Insert Above</span>\n </MenuItem>\n {/if}\n {#if $state.addTableRowBelow.canExec}\n <MenuItem\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 onSelect={$state.addTableRowBelow.command}\n >\n <span>Insert Below</span>\n </MenuItem>\n {/if}\n {#if $state.deleteCellSelection.canExec}\n <MenuItem\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 onSelect={$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 {/if}\n {#if $state.deleteTableRow.canExec}\n <MenuItem\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 onSelect={$state.deleteTableRow.command}\n >\n <span>Delete Row</span>\n </MenuItem>\n {/if}\n {#if $state.deleteTable.canExec}\n <MenuItem\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 onSelect={$state.deleteTable.command}\n >\n <span>Delete Table</span>\n </MenuItem>\n {/if}\n </MenuPopup>\n </MenuPositioner>\n </TableHandleRowMenuRoot>\n </TableHandleRowPopup>\n </TableHandleRowPositioner>\n</TableHandleRoot>\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/svelte/ui/tag-menu/tag-menu.svelte",
|
|
19
19
|
"type": "registry:component",
|
|
20
20
|
"target": "components/editor/ui/tag-menu/tag-menu.svelte",
|
|
21
|
-
"content": "<script 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/svelte'\nimport {\n AutocompleteEmpty,\n AutocompleteItem,\n AutocompletePopup,\n AutocompletePositioner,\n AutocompleteRoot,\n} from 'prosekit/svelte/autocomplete'\n\ninterface Props {\n tags: { id: number; label: string }[]\n}\n\nconst props: Props = $props()\n\nconst editor = useEditor<Union<[MentionExtension, BasicExtension]>>()\n\nfunction 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\nconst regex = /#[\\da-z]*$/i\n</script>\n\n<AutocompleteRoot {regex}>\n <AutocompletePositioner class=\"block overflow-visible 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-
|
|
21
|
+
"content": "<script 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/svelte'\nimport {\n AutocompleteEmpty,\n AutocompleteItem,\n AutocompletePopup,\n AutocompletePositioner,\n AutocompleteRoot,\n} from 'prosekit/svelte/autocomplete'\n\ninterface Props {\n tags: { id: number; label: string }[]\n}\n\nconst props: Props = $props()\n\nconst editor = useEditor<Union<[MentionExtension, BasicExtension]>>()\n\nfunction 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\nconst regex = /#[\\da-z]*$/i\n</script>\n\n<AutocompleteRoot {regex}>\n <AutocompletePositioner class=\"block overflow-visible 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-[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 class=\"flex flex-col flex-1 min-h-0 overflow-y-auto p-1 bg-[canvas] overscroll-contain\">\n <AutocompleteEmpty class=\"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 {#each props.tags as tag (tag.id)}\n <AutocompleteItem\n class=\"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 {/each}\n </div>\n </AutocompletePopup>\n </AutocompletePositioner>\n</AutocompleteRoot>\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/svelte/ui/user-menu/user-menu.svelte",
|
|
19
19
|
"type": "registry:component",
|
|
20
20
|
"target": "components/editor/ui/user-menu/user-menu.svelte",
|
|
21
|
-
"content": "<script 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/svelte'\nimport {\n AutocompleteEmpty,\n AutocompleteItem,\n AutocompletePopup,\n AutocompletePositioner,\n AutocompleteRoot,\n} from 'prosekit/svelte/autocomplete'\n\ninterface Props {\n users: { id: number; name: string }[]\n loading?: boolean\n onQueryChange?: (query: string) => void\n onOpenChange?: (open: boolean) => void\n}\n\nconst props: Props = $props()\nconst loading = $derived(props.loading ?? false)\n\nconst editor = useEditor<Union<[MentionExtension, BasicExtension]>>()\n\nfunction 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// Match inputs like \"@\", \"@foo\", \"@foo bar\" etc. Do not match \"@ foo\".\nconst regex = canUseRegexLookbehind() ? /(?<!\\S)@(\\S.*)?$/u : /@(\\S.*)?$/u\n</script>\n\n<AutocompleteRoot\n {regex}\n onQueryChange={(event) => props.onQueryChange?.(event.detail)}\n onOpenChange={(event) => props.onOpenChange?.(event.detail)}\n>\n <AutocompletePositioner class=\"block overflow-visible 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-
|
|
21
|
+
"content": "<script 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/svelte'\nimport {\n AutocompleteEmpty,\n AutocompleteItem,\n AutocompletePopup,\n AutocompletePositioner,\n AutocompleteRoot,\n} from 'prosekit/svelte/autocomplete'\n\ninterface Props {\n users: { id: number; name: string }[]\n loading?: boolean\n onQueryChange?: (query: string) => void\n onOpenChange?: (open: boolean) => void\n}\n\nconst props: Props = $props()\nconst loading = $derived(props.loading ?? false)\n\nconst editor = useEditor<Union<[MentionExtension, BasicExtension]>>()\n\nfunction 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// Match inputs like \"@\", \"@foo\", \"@foo bar\" etc. Do not match \"@ foo\".\nconst regex = canUseRegexLookbehind() ? /(?<!\\S)@(\\S.*)?$/u : /@(\\S.*)?$/u\n</script>\n\n<AutocompleteRoot\n {regex}\n onQueryChange={(event) => props.onQueryChange?.(event.detail)}\n onOpenChange={(event) => props.onOpenChange?.(event.detail)}\n>\n <AutocompletePositioner class=\"block overflow-visible 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-[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 class=\"flex flex-col flex-1 min-h-0 overflow-y-auto p-1 bg-[canvas] overscroll-contain\">\n <AutocompleteEmpty class=\"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 {loading ? 'Loading...' : 'No results'}\n </AutocompleteEmpty>\n\n {#each props.users as user (user.id)}\n <AutocompleteItem\n class=\"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 {#if loading}\n <span class=\"opacity-50\">\n {user.name}\n </span>\n {:else}\n <span>\n {user.name}\n </span>\n {/if}\n </AutocompleteItem>\n {/each}\n </div>\n </AutocompletePopup>\n </AutocompletePositioner>\n</AutocompleteRoot>\n"
|
|
22
22
|
}
|
|
23
23
|
],
|
|
24
24
|
"meta": {
|
|
@@ -7,14 +7,14 @@
|
|
|
7
7
|
"https://unpkg.com/prosekit-registry/dist/r/vanilla-ui-slash-menu.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/vanilla/examples/slash-menu/editor.ts",
|
|
15
15
|
"type": "registry:component",
|
|
16
16
|
"target": "components/editor/examples/slash-menu/editor.ts",
|
|
17
|
-
"content": "import 'prosekit/basic/style.css'\nimport 'prosekit/basic/typography.css'\n\nimport { createEditor } from 'prosekit/core'\n\nimport { renderSlashMenu } from '../../ui/slash-menu'\n\nimport { defineExtension } from './extension'\n\nexport function setupVanillaEditor() {\n const extension = defineExtension()\n const editor = createEditor({ extension })\n\n return {\n render: () => {\n const port = document.createElement('div')\n port.className = 'box-border h-full w-full min-h-36 overflow-y-hidden overflow-x-hidden rounded-md border border-solid border-gray-200 dark:border-gray-700 shadow-sm flex flex-col bg-
|
|
17
|
+
"content": "import 'prosekit/basic/style.css'\nimport 'prosekit/basic/typography.css'\n\nimport { createEditor } from 'prosekit/core'\n\nimport { renderSlashMenu } from '../../ui/slash-menu'\n\nimport { defineExtension } from './extension'\n\nexport function setupVanillaEditor() {\n const extension = defineExtension()\n const editor = createEditor({ extension })\n\n return {\n render: () => {\n const port = document.createElement('div')\n port.className = 'box-border h-full w-full min-h-36 overflow-y-hidden overflow-x-hidden rounded-md border border-solid border-gray-200 dark:border-gray-700 shadow-sm flex flex-col bg-[canvas] text-black dark:text-white'\n\n const scrolling = document.createElement('div')\n scrolling.className = 'relative w-full flex-1 box-border overflow-y-auto'\n port.append(scrolling)\n\n const content = document.createElement('div')\n content.className = 'ProseMirror box-border min-h-full px-[max(4rem,calc(50%-20rem))] py-8 outline-hidden outline-0 [&_span[data-mention=user]]:text-blue-500 [&_span[data-mention=tag]]:text-violet-500'\n scrolling.append(content)\n\n scrolling.append(renderSlashMenu(editor))\n\n editor.mount(content)\n\n return port\n },\n destroy: () => {\n editor.unmount()\n },\n }\n}\n"
|
|
18
18
|
},
|
|
19
19
|
{
|
|
20
20
|
"path": "registry/src/vanilla/examples/slash-menu/extension.ts",
|
|
@@ -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/vanilla/ui/slash-menu/slash-menu-empty.ts",
|
|
19
19
|
"type": "registry:component",
|
|
20
20
|
"target": "components/editor/ui/slash-menu/slash-menu-empty.ts",
|
|
21
|
-
"content": "import 'prosekit/web/autocomplete'\n\nimport type { AutocompleteEmptyElement } from 'prosekit/web/autocomplete'\n\nexport function renderSlashMenuEmpty() {\n const empty = document.createElement('prosekit-autocomplete-empty') as AutocompleteEmptyElement\n empty.className = 'relative flex items-center justify-between min-w-32 scroll-my-1 rounded-
|
|
21
|
+
"content": "import 'prosekit/web/autocomplete'\n\nimport type { AutocompleteEmptyElement } from 'prosekit/web/autocomplete'\n\nexport function renderSlashMenuEmpty() {\n const empty = document.createElement('prosekit-autocomplete-empty') as AutocompleteEmptyElement\n empty.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\n const span = document.createElement('span')\n span.textContent = 'No results'\n empty.append(span)\n\n return empty\n}\n"
|
|
22
22
|
},
|
|
23
23
|
{
|
|
24
24
|
"path": "registry/src/vanilla/ui/slash-menu/slash-menu-item.ts",
|
|
25
25
|
"type": "registry:component",
|
|
26
26
|
"target": "components/editor/ui/slash-menu/slash-menu-item.ts",
|
|
27
|
-
"content": "import 'prosekit/web/autocomplete'\n\nimport type { AutocompleteItemElement } from 'prosekit/web/autocomplete'\n\nexport function renderSlashMenuItem(options: {\n label: string\n kbd?: string\n onSelect: () => void\n}) {\n const item = document.createElement('prosekit-autocomplete-item') as AutocompleteItemElement\n item.className = 'relative flex items-center justify-between min-w-32 scroll-my-1 rounded-
|
|
27
|
+
"content": "import 'prosekit/web/autocomplete'\n\nimport type { AutocompleteItemElement } from 'prosekit/web/autocomplete'\n\nexport function renderSlashMenuItem(options: {\n label: string\n kbd?: string\n onSelect: () => void\n}) {\n const item = document.createElement('prosekit-autocomplete-item') as AutocompleteItemElement\n item.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 item.addEventListener('select', () => options.onSelect())\n\n const span = document.createElement('span')\n span.textContent = options.label\n item.append(span)\n\n if (options.kbd) {\n const kbd = document.createElement('kbd')\n kbd.className = 'text-xs font-mono text-gray-400 dark:text-gray-500'\n kbd.textContent = options.kbd\n item.append(kbd)\n }\n\n return item\n}\n"
|
|
28
28
|
},
|
|
29
29
|
{
|
|
30
30
|
"path": "registry/src/vanilla/ui/slash-menu/slash-menu.ts",
|
|
31
31
|
"type": "registry:component",
|
|
32
32
|
"target": "components/editor/ui/slash-menu/slash-menu.ts",
|
|
33
|
-
"content": "import 'prosekit/web/autocomplete'\n\nimport type { BasicExtension } from 'prosekit/basic'\nimport type { Editor } from 'prosekit/core'\nimport { canUseRegexLookbehind } from 'prosekit/core'\nimport type { AutocompletePopupElement, AutocompletePositionerElement, AutocompleteRootElement } from 'prosekit/web/autocomplete'\n\nimport { renderSlashMenuEmpty } from './slash-menu-empty'\nimport { renderSlashMenuItem } 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 function renderSlashMenu(\n editor: Editor<BasicExtension>,\n) {\n const root = document.createElement('prosekit-autocomplete-root') as AutocompleteRootElement\n root.editor = editor\n root.regex = regex\n\n const positioner = document.createElement('prosekit-autocomplete-positioner') as AutocompletePositionerElement\n positioner.className = 'block overflow-visible w-min h-min z-50 ease-out transition-transform duration-100 motion-reduce:transition-none'\n\n const popup = document.createElement('prosekit-autocomplete-popup') as AutocompletePopupElement\n popup.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": "import 'prosekit/web/autocomplete'\n\nimport type { BasicExtension } from 'prosekit/basic'\nimport type { Editor } from 'prosekit/core'\nimport { canUseRegexLookbehind } from 'prosekit/core'\nimport type { AutocompletePopupElement, AutocompletePositionerElement, AutocompleteRootElement } from 'prosekit/web/autocomplete'\n\nimport { renderSlashMenuEmpty } from './slash-menu-empty'\nimport { renderSlashMenuItem } 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 function renderSlashMenu(\n editor: Editor<BasicExtension>,\n) {\n const root = document.createElement('prosekit-autocomplete-root') as AutocompleteRootElement\n root.editor = editor\n root.regex = regex\n\n const positioner = document.createElement('prosekit-autocomplete-positioner') as AutocompletePositionerElement\n positioner.className = 'block overflow-visible w-min h-min z-50 ease-out transition-transform duration-100 motion-reduce:transition-none'\n\n const popup = document.createElement('prosekit-autocomplete-popup') as AutocompletePopupElement\n popup.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\n const content = document.createElement('div')\n content.className = 'flex flex-col flex-1 min-h-0 overflow-y-auto p-1 bg-[canvas] overscroll-contain'\n\n content.append(renderSlashMenuItem({ label: 'Text', kbd: undefined, onSelect: () => editor.commands.setParagraph() }))\n content.append(renderSlashMenuItem({ label: 'Heading 1', kbd: '#', onSelect: () => editor.commands.setHeading({ level: 1 }) }))\n content.append(renderSlashMenuItem({ label: 'Heading 2', kbd: '##', onSelect: () => editor.commands.setHeading({ level: 2 }) }))\n content.append(renderSlashMenuItem({ label: 'Heading 3', kbd: '###', onSelect: () => editor.commands.setHeading({ level: 3 }) }))\n content.append(renderSlashMenuItem({ label: 'Bullet list', kbd: '-', onSelect: () => editor.commands.wrapInList({ kind: 'bullet' }) }))\n content.append(renderSlashMenuItem({ label: 'Ordered list', kbd: '1.', onSelect: () => editor.commands.wrapInList({ kind: 'ordered' }) }))\n content.append(renderSlashMenuItem({ label: 'Task list', kbd: '[]', onSelect: () => editor.commands.wrapInList({ kind: 'task' }) }))\n content.append(renderSlashMenuItem({ label: 'Toggle list', kbd: '>>', onSelect: () => editor.commands.wrapInList({ kind: 'toggle' }) }))\n content.append(renderSlashMenuItem({ label: 'Quote', kbd: '>', onSelect: () => editor.commands.setBlockquote() }))\n content.append(renderSlashMenuItem({ label: 'Table', onSelect: () => editor.commands.insertTable({ row: 3, col: 3 }) }))\n content.append(renderSlashMenuItem({ label: 'Divider', kbd: '---', onSelect: () => editor.commands.insertHorizontalRule() }))\n content.append(renderSlashMenuItem({ label: 'Code', kbd: '```', onSelect: () => editor.commands.setCodeBlock() }))\n content.append(renderSlashMenuEmpty())\n\n popup.append(content)\n positioner.append(popup)\n root.append(positioner)\n\n return root\n}\n"
|
|
34
34
|
}
|
|
35
35
|
],
|
|
36
36
|
"meta": {
|
|
@@ -10,14 +10,14 @@
|
|
|
10
10
|
"https://unpkg.com/prosekit-registry/dist/r/vue-ui-drop-indicator.json"
|
|
11
11
|
],
|
|
12
12
|
"dependencies": [
|
|
13
|
-
"prosekit@^0.20.0
|
|
13
|
+
"prosekit@^0.20.0"
|
|
14
14
|
],
|
|
15
15
|
"files": [
|
|
16
16
|
{
|
|
17
17
|
"path": "registry/src/vue/examples/block-handle/editor.vue",
|
|
18
18
|
"type": "registry:component",
|
|
19
19
|
"target": "components/editor/examples/block-handle/editor.vue",
|
|
20
|
-
"content": "<script setup lang=\"ts\">\nimport 'prosekit/basic/style.css'\nimport 'prosekit/basic/typography.css'\n\nimport { createEditor, type NodeJSON } from 'prosekit/core'\nimport { ProseKit } from 'prosekit/vue'\n\nimport { sampleContent } from '../../sample/sample-doc-block-handle'\nimport { BlockHandle } from '../../ui/block-handle'\nimport { DropIndicator } from '../../ui/drop-indicator'\n\nimport { defineExtension } from './extension'\n\nconst props = defineProps<{\n initialContent?: NodeJSON\n}>()\n\nconst extension = defineExtension()\nconst defaultContent = props.initialContent ?? sampleContent\nconst editor = createEditor({ extension, defaultContent })\n</script>\n\n<template>\n <ProseKit :editor=\"editor\">\n <div class=\"box-border h-full w-full min-h-36 overflow-y-hidden overflow-x-hidden rounded-md border border-solid border-gray-200 dark:border-gray-700 shadow-sm flex flex-col bg-
|
|
20
|
+
"content": "<script setup lang=\"ts\">\nimport 'prosekit/basic/style.css'\nimport 'prosekit/basic/typography.css'\n\nimport { createEditor, type NodeJSON } from 'prosekit/core'\nimport { ProseKit } from 'prosekit/vue'\n\nimport { sampleContent } from '../../sample/sample-doc-block-handle'\nimport { BlockHandle } from '../../ui/block-handle'\nimport { DropIndicator } from '../../ui/drop-indicator'\n\nimport { defineExtension } from './extension'\n\nconst props = defineProps<{\n initialContent?: NodeJSON\n}>()\n\nconst extension = defineExtension()\nconst defaultContent = props.initialContent ?? sampleContent\nconst editor = createEditor({ extension, defaultContent })\n</script>\n\n<template>\n <ProseKit :editor=\"editor\">\n <div class=\"box-border h-full w-full min-h-36 overflow-y-hidden overflow-x-hidden rounded-md border border-solid border-gray-200 dark:border-gray-700 shadow-sm flex flex-col bg-[canvas] text-black dark:text-white\">\n <div class=\"relative w-full flex-1 box-border overflow-y-auto\">\n <div :ref=\"(el) => editor.mount(el as HTMLElement | null)\" class=\"ProseMirror box-border min-h-full px-[max(4rem,calc(50%-20rem))] py-8 outline-hidden outline-0 [&_span[data-mention=user]]:text-blue-500 [&_span[data-mention=tag]]:text-violet-500\" />\n <BlockHandle />\n <DropIndicator />\n </div>\n </div>\n </ProseKit>\n</template>\n"
|
|
21
21
|
},
|
|
22
22
|
{
|
|
23
23
|
"path": "registry/src/vue/examples/block-handle/extension.ts",
|
|
@@ -7,14 +7,14 @@
|
|
|
7
7
|
"https://unpkg.com/prosekit-registry/dist/r/vue-ui-toolbar.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/vue/examples/blockquote/editor.vue",
|
|
15
15
|
"type": "registry:component",
|
|
16
16
|
"target": "components/editor/examples/blockquote/editor.vue",
|
|
17
|
-
"content": "<script setup lang=\"ts\">\nimport 'prosekit/basic/style.css'\nimport 'prosekit/basic/typography.css'\n\nimport { createEditor } from 'prosekit/core'\nimport { ProseKit } from 'prosekit/vue'\n\nimport { Toolbar } from '../../ui/toolbar'\n\nimport { defineExtension } from './extension'\n\nconst extension = defineExtension()\nconst editor = createEditor({ extension })\n</script>\n\n<template>\n <ProseKit :editor=\"editor\">\n <div class=\"box-border h-full w-full min-h-36 overflow-y-hidden overflow-x-hidden rounded-md border border-solid border-gray-200 dark:border-gray-700 shadow-sm flex flex-col bg-
|
|
17
|
+
"content": "<script setup lang=\"ts\">\nimport 'prosekit/basic/style.css'\nimport 'prosekit/basic/typography.css'\n\nimport { createEditor } from 'prosekit/core'\nimport { ProseKit } from 'prosekit/vue'\n\nimport { Toolbar } from '../../ui/toolbar'\n\nimport { defineExtension } from './extension'\n\nconst extension = defineExtension()\nconst editor = createEditor({ extension })\n</script>\n\n<template>\n <ProseKit :editor=\"editor\">\n <div class=\"box-border h-full w-full min-h-36 overflow-y-hidden overflow-x-hidden rounded-md border border-solid border-gray-200 dark:border-gray-700 shadow-sm flex flex-col bg-[canvas] text-black dark:text-white\">\n <Toolbar />\n <div class=\"relative w-full flex-1 box-border overflow-y-auto\">\n <div :ref=\"(el) => editor.mount(el as HTMLElement | null)\" class=\"ProseMirror box-border min-h-full px-[max(4rem,calc(50%-20rem))] py-8 outline-hidden outline-0 [&_span[data-mention=user]]:text-blue-500 [&_span[data-mention=tag]]:text-violet-500\" />\n </div>\n </div>\n </ProseKit>\n</template>\n"
|
|
18
18
|
},
|
|
19
19
|
{
|
|
20
20
|
"path": "registry/src/vue/examples/blockquote/extension.ts",
|
|
@@ -8,14 +8,14 @@
|
|
|
8
8
|
"https://unpkg.com/prosekit-registry/dist/r/vue-ui-toolbar.json"
|
|
9
9
|
],
|
|
10
10
|
"dependencies": [
|
|
11
|
-
"prosekit@^0.20.0
|
|
11
|
+
"prosekit@^0.20.0"
|
|
12
12
|
],
|
|
13
13
|
"files": [
|
|
14
14
|
{
|
|
15
15
|
"path": "registry/src/vue/examples/bold/editor.vue",
|
|
16
16
|
"type": "registry:component",
|
|
17
17
|
"target": "components/editor/examples/bold/editor.vue",
|
|
18
|
-
"content": "<script setup lang=\"ts\">\nimport 'prosekit/basic/style.css'\nimport 'prosekit/basic/typography.css'\n\nimport { createEditor, type NodeJSON } from 'prosekit/core'\nimport { ProseKit } from 'prosekit/vue'\n\nimport { sampleContent } from '../../sample/sample-doc-bold'\nimport { Toolbar } from '../../ui/toolbar'\n\nimport { defineExtension } from './extension'\n\nconst props = defineProps<{\n initialContent?: NodeJSON\n}>()\n\nconst extension = defineExtension()\nconst defaultContent = props.initialContent ?? sampleContent\nconst editor = createEditor({ extension, defaultContent })\n</script>\n\n<template>\n <ProseKit :editor=\"editor\">\n <div class=\"box-border h-full w-full min-h-36 overflow-y-hidden overflow-x-hidden rounded-md border border-solid border-gray-200 dark:border-gray-700 shadow-sm flex flex-col bg-
|
|
18
|
+
"content": "<script setup lang=\"ts\">\nimport 'prosekit/basic/style.css'\nimport 'prosekit/basic/typography.css'\n\nimport { createEditor, type NodeJSON } from 'prosekit/core'\nimport { ProseKit } from 'prosekit/vue'\n\nimport { sampleContent } from '../../sample/sample-doc-bold'\nimport { Toolbar } from '../../ui/toolbar'\n\nimport { defineExtension } from './extension'\n\nconst props = defineProps<{\n initialContent?: NodeJSON\n}>()\n\nconst extension = defineExtension()\nconst defaultContent = props.initialContent ?? sampleContent\nconst editor = createEditor({ extension, defaultContent })\n</script>\n\n<template>\n <ProseKit :editor=\"editor\">\n <div class=\"box-border h-full w-full min-h-36 overflow-y-hidden overflow-x-hidden rounded-md border border-solid border-gray-200 dark:border-gray-700 shadow-sm flex flex-col bg-[canvas] text-black dark:text-white\">\n <Toolbar />\n <div class=\"relative w-full flex-1 box-border overflow-y-auto\">\n <div :ref=\"(el) => editor.mount(el as HTMLElement | null)\" class=\"ProseMirror box-border min-h-full px-[max(4rem,calc(50%-20rem))] py-8 outline-hidden outline-0 [&_span[data-mention=user]]:text-blue-500 [&_span[data-mention=tag]]:text-violet-500\" />\n </div>\n </div>\n </ProseKit>\n</template>\n"
|
|
19
19
|
},
|
|
20
20
|
{
|
|
21
21
|
"path": "registry/src/vue/examples/bold/extension.ts",
|
|
@@ -5,20 +5,20 @@
|
|
|
5
5
|
"description": "Track and commit document changes with version history.",
|
|
6
6
|
"registryDependencies": [],
|
|
7
7
|
"dependencies": [
|
|
8
|
-
"prosekit@^0.20.0
|
|
8
|
+
"prosekit@^0.20.0"
|
|
9
9
|
],
|
|
10
10
|
"files": [
|
|
11
11
|
{
|
|
12
12
|
"path": "registry/src/vue/examples/change-tracking/editor-diff.vue",
|
|
13
13
|
"type": "registry:component",
|
|
14
14
|
"target": "components/editor/examples/change-tracking/editor-diff.vue",
|
|
15
|
-
"content": "<script setup lang=\"ts\">\nimport { defineBasicExtension } from 'prosekit/basic'\nimport { createEditor, union } from 'prosekit/core'\nimport { defineCommitViewer, type Commit } from 'prosekit/extensions/commit'\nimport { defineReadonly } from 'prosekit/extensions/readonly'\nimport { ProseKit } from 'prosekit/vue'\n\nconst props = defineProps<{ commit: Commit }>()\n\nconst editor = createEditor({\n extension: union(\n defineBasicExtension(),\n defineReadonly(),\n defineCommitViewer(props.commit),\n ),\n})\n</script>\n\n<template>\n <ProseKit :editor=\"editor\">\n <div class=\"box-border h-full w-full min-h-36 overflow-y-hidden overflow-x-hidden rounded-md border border-solid border-gray-200 dark:border-gray-700 shadow-sm flex flex-col bg-
|
|
15
|
+
"content": "<script setup lang=\"ts\">\nimport { defineBasicExtension } from 'prosekit/basic'\nimport { createEditor, union } from 'prosekit/core'\nimport { defineCommitViewer, type Commit } from 'prosekit/extensions/commit'\nimport { defineReadonly } from 'prosekit/extensions/readonly'\nimport { ProseKit } from 'prosekit/vue'\n\nconst props = defineProps<{ commit: Commit }>()\n\nconst editor = createEditor({\n extension: union(\n defineBasicExtension(),\n defineReadonly(),\n defineCommitViewer(props.commit),\n ),\n})\n</script>\n\n<template>\n <ProseKit :editor=\"editor\">\n <div class=\"box-border h-full w-full min-h-36 overflow-y-hidden overflow-x-hidden rounded-md border border-solid border-gray-200 dark:border-gray-700 shadow-sm flex flex-col bg-[canvas] text-black dark:text-white\">\n <div class=\"relative w-full flex-1 box-border overflow-y-auto\">\n <div :ref=\"(el) => editor.mount(el as HTMLElement | null)\" class=\"ProseMirror box-border min-h-full px-[max(4rem,calc(50%-20rem))] py-8 outline-hidden outline-0 [&_span[data-mention=user]]:text-blue-500 [&_span[data-mention=tag]]:text-violet-500\"></div>\n </div>\n </div>\n </ProseKit>\n</template>\n"
|
|
16
16
|
},
|
|
17
17
|
{
|
|
18
18
|
"path": "registry/src/vue/examples/change-tracking/editor-main.vue",
|
|
19
19
|
"type": "registry:component",
|
|
20
20
|
"target": "components/editor/examples/change-tracking/editor-main.vue",
|
|
21
|
-
"content": "<script setup lang=\"ts\">\nimport 'prosekit/basic/style.css'\nimport 'prosekit/basic/typography.css'\n\nimport { defineBasicExtension } from 'prosekit/basic'\nimport { createEditor, union, type NodeJSON } from 'prosekit/core'\nimport { defineCommitRecorder, type CommitRecorder } from 'prosekit/extensions/commit'\nimport { ProseKit } from 'prosekit/vue'\n\nconst props = defineProps<{\n commitRecorder: CommitRecorder\n initialContent?: NodeJSON\n}>()\n\nconst editor = createEditor({\n extension: union(\n defineBasicExtension(),\n defineCommitRecorder(props.commitRecorder),\n ),\n defaultContent: props.initialContent,\n})\n</script>\n\n<template>\n <ProseKit :editor=\"editor\">\n <div class=\"box-border h-full w-full min-h-36 overflow-y-hidden overflow-x-hidden rounded-md border border-solid border-gray-200 dark:border-gray-700 shadow-sm flex flex-col bg-
|
|
21
|
+
"content": "<script setup lang=\"ts\">\nimport 'prosekit/basic/style.css'\nimport 'prosekit/basic/typography.css'\n\nimport { defineBasicExtension } from 'prosekit/basic'\nimport { createEditor, union, type NodeJSON } from 'prosekit/core'\nimport { defineCommitRecorder, type CommitRecorder } from 'prosekit/extensions/commit'\nimport { ProseKit } from 'prosekit/vue'\n\nconst props = defineProps<{\n commitRecorder: CommitRecorder\n initialContent?: NodeJSON\n}>()\n\nconst editor = createEditor({\n extension: union(\n defineBasicExtension(),\n defineCommitRecorder(props.commitRecorder),\n ),\n defaultContent: props.initialContent,\n})\n</script>\n\n<template>\n <ProseKit :editor=\"editor\">\n <div class=\"box-border h-full w-full min-h-36 overflow-y-hidden overflow-x-hidden rounded-md border border-solid border-gray-200 dark:border-gray-700 shadow-sm flex flex-col bg-[canvas] text-black dark:text-white\">\n <div class=\"relative w-full flex-1 box-border overflow-y-auto\">\n <div :ref=\"(el) => editor.mount(el as HTMLElement | null)\" class=\"ProseMirror box-border min-h-full px-[max(4rem,calc(50%-20rem))] py-8 outline-hidden outline-0 [&_span[data-mention=user]]:text-blue-500 [&_span[data-mention=tag]]:text-violet-500\"></div>\n </div>\n </div>\n </ProseKit>\n</template>\n"
|
|
22
22
|
},
|
|
23
23
|
{
|
|
24
24
|
"path": "registry/src/vue/examples/change-tracking/editor.vue",
|
|
@@ -8,14 +8,14 @@
|
|
|
8
8
|
"https://unpkg.com/prosekit-registry/dist/r/vue-ui-code-block-view.json"
|
|
9
9
|
],
|
|
10
10
|
"dependencies": [
|
|
11
|
-
"prosekit@^0.20.0
|
|
11
|
+
"prosekit@^0.20.0"
|
|
12
12
|
],
|
|
13
13
|
"files": [
|
|
14
14
|
{
|
|
15
15
|
"path": "registry/src/vue/examples/code-block-themes/editor.vue",
|
|
16
16
|
"type": "registry:component",
|
|
17
17
|
"target": "components/editor/examples/code-block-themes/editor.vue",
|
|
18
|
-
"content": "<script setup lang=\"ts\">\nimport 'prosekit/basic/style.css'\nimport 'prosekit/basic/typography.css'\n\nimport { createEditor, type NodeJSON } from 'prosekit/core'\nimport { ProseKit } from 'prosekit/vue'\n\nimport { sampleContent } from '../../sample/sample-doc-code-block'\n\nimport { defineExtension } from './extension'\nimport Toolbar from './toolbar.vue'\n\nconst props = defineProps<{\n initialContent?: NodeJSON\n}>()\n\nconst extension = defineExtension()\nconst defaultContent = props.initialContent ?? sampleContent\nconst editor = createEditor({\n extension,\n defaultContent,\n})\n</script>\n\n<template>\n <ProseKit :editor=\"editor\">\n <div class=\"box-border h-full w-full min-h-36 overflow-y-hidden overflow-x-hidden rounded-md border border-solid border-gray-200 dark:border-gray-700 shadow-sm flex flex-col bg-
|
|
18
|
+
"content": "<script setup lang=\"ts\">\nimport 'prosekit/basic/style.css'\nimport 'prosekit/basic/typography.css'\n\nimport { createEditor, type NodeJSON } from 'prosekit/core'\nimport { ProseKit } from 'prosekit/vue'\n\nimport { sampleContent } from '../../sample/sample-doc-code-block'\n\nimport { defineExtension } from './extension'\nimport Toolbar from './toolbar.vue'\n\nconst props = defineProps<{\n initialContent?: NodeJSON\n}>()\n\nconst extension = defineExtension()\nconst defaultContent = props.initialContent ?? sampleContent\nconst editor = createEditor({\n extension,\n defaultContent,\n})\n</script>\n\n<template>\n <ProseKit :editor=\"editor\">\n <div class=\"box-border h-full w-full min-h-36 overflow-y-hidden overflow-x-hidden rounded-md border border-solid border-gray-200 dark:border-gray-700 shadow-sm flex flex-col bg-[canvas] text-black dark:text-white\">\n <Toolbar />\n <div class=\"relative w-full flex-1 box-border overflow-y-auto\">\n <div :ref=\"(el) => editor.mount(el as HTMLElement | null)\" class=\"ProseMirror box-border min-h-full px-[max(4rem,calc(50%-20rem))] py-8 outline-hidden outline-0 [&_span[data-mention=user]]:text-blue-500 [&_span[data-mention=tag]]:text-violet-500\" />\n </div>\n </div>\n </ProseKit>\n</template>\n"
|
|
19
19
|
},
|
|
20
20
|
{
|
|
21
21
|
"path": "registry/src/vue/examples/code-block-themes/extension.ts",
|