@meta-1/editor 0.0.29 → 1.0.1
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/package.json +47 -66
- package/src/components/notion-like/notion-like-editor-toolbar-floating.tsx +181 -0
- package/src/components/tiptap-extension/list-normalization-extension.ts +112 -0
- package/src/components/tiptap-extension/node-alignment-extension.ts +285 -0
- package/src/components/tiptap-extension/node-background-extension.ts +150 -0
- package/src/components/tiptap-extension/ui-state-extension.ts +97 -0
- package/src/components/tiptap-icons/add-col-left-icon.tsx +30 -0
- package/src/components/tiptap-icons/add-col-right-icon.tsx +30 -0
- package/src/components/tiptap-icons/add-row-bottom-icon.tsx +30 -0
- package/src/components/tiptap-icons/add-row-top-icon.tsx +30 -0
- package/src/components/tiptap-icons/ai-sparkles-icon.tsx +32 -0
- package/src/components/tiptap-icons/align-bottom-icon.tsx +28 -0
- package/src/components/tiptap-icons/align-center-icon.tsx +38 -0
- package/src/components/tiptap-icons/align-center-vertical-icon.tsx +34 -0
- package/src/components/tiptap-icons/align-end-vertical-icon.tsx +34 -0
- package/src/components/tiptap-icons/align-justify-icon.tsx +38 -0
- package/src/components/tiptap-icons/align-left-icon.tsx +38 -0
- package/src/components/tiptap-icons/align-middle-icon.tsx +55 -0
- package/src/components/tiptap-icons/align-right-icon.tsx +38 -0
- package/src/components/tiptap-icons/align-start-vertical-icon.tsx +32 -0
- package/src/components/tiptap-icons/align-top-icon.tsx +28 -0
- package/src/components/tiptap-icons/alignment-icon.tsx +72 -0
- package/src/components/tiptap-icons/arrow-down-a-z-icon.tsx +34 -0
- package/src/components/tiptap-icons/arrow-down-icon.tsx +24 -0
- package/src/components/tiptap-icons/arrow-down-to-line-icon.tsx +28 -0
- package/src/components/tiptap-icons/arrow-down-z-a-icon.tsx +34 -0
- package/src/components/tiptap-icons/arrow-left-icon.tsx +24 -0
- package/src/components/tiptap-icons/arrow-right-icon.tsx +26 -0
- package/src/components/tiptap-icons/arrow-up-icon.tsx +26 -0
- package/src/components/tiptap-icons/at-sign-icon.tsx +26 -0
- package/src/components/tiptap-icons/ban-icon.tsx +26 -0
- package/src/components/tiptap-icons/blockquote-icon.tsx +44 -0
- package/src/components/tiptap-icons/bold-icon.tsx +26 -0
- package/src/components/tiptap-icons/check-ai-icon.tsx +32 -0
- package/src/components/tiptap-icons/check-icon.tsx +26 -0
- package/src/components/tiptap-icons/chevron-down-icon.tsx +26 -0
- package/src/components/tiptap-icons/chevron-right-icon.tsx +26 -0
- package/src/components/tiptap-icons/clipboard-icon.tsx +24 -0
- package/src/components/tiptap-icons/close-icon.tsx +24 -0
- package/src/components/tiptap-icons/code-block-icon.tsx +38 -0
- package/src/components/tiptap-icons/code2-icon.tsx +32 -0
- package/src/components/tiptap-icons/complete-sentence-icon.tsx +44 -0
- package/src/components/tiptap-icons/copy-icon.tsx +32 -0
- package/src/components/tiptap-icons/corner-down-left-icon.tsx +26 -0
- package/src/components/tiptap-icons/external-link-icon.tsx +28 -0
- package/src/components/tiptap-icons/grip-4-icon.tsx +24 -0
- package/src/components/tiptap-icons/grip-vertical-icon.tsx +44 -0
- package/src/components/tiptap-icons/heading-five-icon.tsx +28 -0
- package/src/components/tiptap-icons/heading-four-icon.tsx +28 -0
- package/src/components/tiptap-icons/heading-one-icon.tsx +28 -0
- package/src/components/tiptap-icons/heading-six-icon.tsx +30 -0
- package/src/components/tiptap-icons/heading-three-icon.tsx +36 -0
- package/src/components/tiptap-icons/heading-two-icon.tsx +28 -0
- package/src/components/tiptap-icons/highlighter-icon.tsx +26 -0
- package/src/components/tiptap-icons/image-caption-icon.tsx +38 -0
- package/src/components/tiptap-icons/image-icon.tsx +26 -0
- package/src/components/tiptap-icons/image-plus-icon.tsx +26 -0
- package/src/components/tiptap-icons/italic-icon.tsx +24 -0
- package/src/components/tiptap-icons/languages-icon.tsx +34 -0
- package/src/components/tiptap-icons/link-icon.tsx +28 -0
- package/src/components/tiptap-icons/list-icon.tsx +56 -0
- package/src/components/tiptap-icons/list-ordered-icon.tsx +56 -0
- package/src/components/tiptap-icons/list-todo-icon.tsx +50 -0
- package/src/components/tiptap-icons/message-square-icon.tsx +26 -0
- package/src/components/tiptap-icons/message-square-plus-icon.tsx +32 -0
- package/src/components/tiptap-icons/mic-ai-icon.tsx +34 -0
- package/src/components/tiptap-icons/minus-icon.tsx +26 -0
- package/src/components/tiptap-icons/moon-star-icon.tsx +30 -0
- package/src/components/tiptap-icons/more-vertical-icon.tsx +38 -0
- package/src/components/tiptap-icons/move-horizontal-icon.tsx +24 -0
- package/src/components/tiptap-icons/paint-bucket-icon.tsx +32 -0
- package/src/components/tiptap-icons/plus-icon.tsx +24 -0
- package/src/components/tiptap-icons/plus-small-icon.tsx +24 -0
- package/src/components/tiptap-icons/redo2-icon.tsx +26 -0
- package/src/components/tiptap-icons/refresh-ai-icon.tsx +34 -0
- package/src/components/tiptap-icons/refresh-ccw-icon.tsx +28 -0
- package/src/components/tiptap-icons/repeat-2-icon.tsx +26 -0
- package/src/components/tiptap-icons/rotate-ccw-icon.tsx +24 -0
- package/src/components/tiptap-icons/simplify-2-icon.tsx +24 -0
- package/src/components/tiptap-icons/smile-ai-icon.tsx +38 -0
- package/src/components/tiptap-icons/smile-plus-icon.tsx +26 -0
- package/src/components/tiptap-icons/square-x-icon.tsx +26 -0
- package/src/components/tiptap-icons/stop-circle-2-icon.tsx +26 -0
- package/src/components/tiptap-icons/strike-icon.tsx +28 -0
- package/src/components/tiptap-icons/subscript-icon.tsx +38 -0
- package/src/components/tiptap-icons/summarize-text-icon.tsx +36 -0
- package/src/components/tiptap-icons/sun-icon.tsx +58 -0
- package/src/components/tiptap-icons/superscript-icon.tsx +38 -0
- package/src/components/tiptap-icons/table-cell-merge-icon.tsx +44 -0
- package/src/components/tiptap-icons/table-cell-split-icon.tsx +44 -0
- package/src/components/tiptap-icons/table-column-icon.tsx +26 -0
- package/src/components/tiptap-icons/table-header-column-icon.tsx +28 -0
- package/src/components/tiptap-icons/table-header-row-icon.tsx +26 -0
- package/src/components/tiptap-icons/table-icon.tsx +26 -0
- package/src/components/tiptap-icons/table-row-icon.tsx +26 -0
- package/src/components/tiptap-icons/text-color-small-icon.tsx +26 -0
- package/src/components/tiptap-icons/text-extend-icon.tsx +36 -0
- package/src/components/tiptap-icons/text-reduce-icon.tsx +32 -0
- package/src/components/tiptap-icons/trash-icon.tsx +26 -0
- package/src/components/tiptap-icons/type-icon.tsx +24 -0
- package/src/components/tiptap-icons/underline-icon.tsx +26 -0
- package/src/components/tiptap-icons/undo2-icon.tsx +26 -0
- package/src/components/tiptap-icons/x-icon.tsx +24 -0
- package/src/components/tiptap-node/blockquote-node/blockquote-node.css +18 -0
- package/src/components/tiptap-node/code-block-node/code-block-node.css +24 -0
- package/src/components/tiptap-node/heading-node/heading-node.css +33 -0
- package/src/components/tiptap-node/horizontal-rule-node/horizontal-rule-node-extension.ts +11 -0
- package/src/components/tiptap-node/horizontal-rule-node/horizontal-rule-node.css +12 -0
- package/src/components/tiptap-node/image-node/image-node-extension.ts +169 -0
- package/src/components/tiptap-node/image-node/image-node-floating.tsx +41 -0
- package/src/components/tiptap-node/image-node/image-node-view.css +60 -0
- package/src/components/tiptap-node/image-node/image-node-view.tsx +316 -0
- package/src/components/tiptap-node/image-node/image-node.css +28 -0
- package/src/components/tiptap-node/image-upload-node/image-upload-node-extension.ts +155 -0
- package/src/components/tiptap-node/image-upload-node/image-upload-node.css +141 -0
- package/src/components/tiptap-node/image-upload-node/image-upload-node.tsx +513 -0
- package/src/components/tiptap-node/image-upload-node/index.tsx +1 -0
- package/src/components/tiptap-node/list-node/list-node.css +127 -0
- package/src/components/tiptap-node/paragraph-node/paragraph-node.css +198 -0
- package/src/components/tiptap-node/table-node/extensions/table-handle/helpers/create-image.ts +273 -0
- package/src/components/tiptap-node/table-node/extensions/table-handle/index.ts +2 -0
- package/src/components/tiptap-node/table-node/extensions/table-handle/table-handle-plugin.ts +718 -0
- package/src/components/tiptap-node/table-node/extensions/table-handle/table-handle.ts +48 -0
- package/src/components/tiptap-node/table-node/extensions/table-node-extension.ts +226 -0
- package/src/components/tiptap-node/table-node/hooks/use-table-handle-state.ts +66 -0
- package/src/components/tiptap-node/table-node/lib/tiptap-table-utils.ts +1289 -0
- package/src/components/tiptap-node/table-node/styles/prosemirror-table.css +35 -0
- package/src/components/tiptap-node/table-node/styles/table-node.css +158 -0
- package/src/components/tiptap-node/table-node/ui/table-add-row-column-button/index.tsx +2 -0
- package/src/components/tiptap-node/table-node/ui/table-add-row-column-button/table-add-row-column-button.tsx +94 -0
- package/src/components/tiptap-node/table-node/ui/table-add-row-column-button/use-table-add-row-column.ts +325 -0
- package/src/components/tiptap-node/table-node/ui/table-align-cell-button/index.tsx +2 -0
- package/src/components/tiptap-node/table-node/ui/table-align-cell-button/table-align-cell-button.tsx +129 -0
- package/src/components/tiptap-node/table-node/ui/table-align-cell-button/use-table-align-cell.ts +528 -0
- package/src/components/tiptap-node/table-node/ui/table-alignment-menu/index.tsx +1 -0
- package/src/components/tiptap-node/table-node/ui/table-alignment-menu/table-alignment-menu.tsx +154 -0
- package/src/components/tiptap-node/table-node/ui/table-cell-handle-menu/index.tsx +1 -0
- package/src/components/tiptap-node/table-node/ui/table-cell-handle-menu/table-cell-handle-menu.css +62 -0
- package/src/components/tiptap-node/table-node/ui/table-cell-handle-menu/table-cell-handle-menu.tsx +212 -0
- package/src/components/tiptap-node/table-node/ui/table-clear-row-column-content-button/index.tsx +2 -0
- package/src/components/tiptap-node/table-node/ui/table-clear-row-column-content-button/table-clear-row-column-content-button.tsx +101 -0
- package/src/components/tiptap-node/table-node/ui/table-clear-row-column-content-button/use-table-clear-row-column-content.ts +423 -0
- package/src/components/tiptap-node/table-node/ui/table-delete-row-column-button/index.tsx +2 -0
- package/src/components/tiptap-node/table-node/ui/table-delete-row-column-button/table-delete-row-column-button.tsx +100 -0
- package/src/components/tiptap-node/table-node/ui/table-delete-row-column-button/use-table-delete-row-column.ts +243 -0
- package/src/components/tiptap-node/table-node/ui/table-duplicate-row-column-button/index.tsx +2 -0
- package/src/components/tiptap-node/table-node/ui/table-duplicate-row-column-button/table-duplicate-row-column-button.tsx +92 -0
- package/src/components/tiptap-node/table-node/ui/table-duplicate-row-column-button/use-table-duplicate-row-column.ts +357 -0
- package/src/components/tiptap-node/table-node/ui/table-extend-row-column-button/index.tsx +2 -0
- package/src/components/tiptap-node/table-node/ui/table-extend-row-column-button/table-extend-row-column-button.css +17 -0
- package/src/components/tiptap-node/table-node/ui/table-extend-row-column-button/table-extend-row-column-button.tsx +240 -0
- package/src/components/tiptap-node/table-node/ui/table-extend-row-column-button/use-table-extend-row-column.ts +118 -0
- package/src/components/tiptap-node/table-node/ui/table-fit-to-width-button/index.tsx +2 -0
- package/src/components/tiptap-node/table-node/ui/table-fit-to-width-button/table-fit-to-width-button.tsx +98 -0
- package/src/components/tiptap-node/table-node/ui/table-fit-to-width-button/use-table-fit-to-width.ts +223 -0
- package/src/components/tiptap-node/table-node/ui/table-handle/index.tsx +2 -0
- package/src/components/tiptap-node/table-node/ui/table-handle/table-handle.tsx +163 -0
- package/src/components/tiptap-node/table-node/ui/table-handle/use-table-handle-positioning.ts +255 -0
- package/src/components/tiptap-node/table-node/ui/table-handle-menu/index.tsx +1 -0
- package/src/components/tiptap-node/table-node/ui/table-handle-menu/table-handle-menu.css +39 -0
- package/src/components/tiptap-node/table-node/ui/table-handle-menu/table-handle-menu.tsx +681 -0
- package/src/components/tiptap-node/table-node/ui/table-header-row-column-button/index.tsx +2 -0
- package/src/components/tiptap-node/table-node/ui/table-header-row-column-button/table-header-row-column-button.tsx +99 -0
- package/src/components/tiptap-node/table-node/ui/table-header-row-column-button/use-table-header-row-column.ts +227 -0
- package/src/components/tiptap-node/table-node/ui/table-merge-split-cell-button/index.tsx +2 -0
- package/src/components/tiptap-node/table-node/ui/table-merge-split-cell-button/table-merge-split-cell-button.tsx +125 -0
- package/src/components/tiptap-node/table-node/ui/table-merge-split-cell-button/use-table-merge-split-cell.ts +267 -0
- package/src/components/tiptap-node/table-node/ui/table-move-row-column-button/index.tsx +2 -0
- package/src/components/tiptap-node/table-node/ui/table-move-row-column-button/table-move-row-column-button.tsx +123 -0
- package/src/components/tiptap-node/table-node/ui/table-move-row-column-button/use-table-move-row-column.ts +431 -0
- package/src/components/tiptap-node/table-node/ui/table-selection-overlay/index.tsx +1 -0
- package/src/components/tiptap-node/table-node/ui/table-selection-overlay/table-selection-overlay.tsx +483 -0
- package/src/components/tiptap-node/table-node/ui/table-selection-overlay/use-resize-overlay.ts +78 -0
- package/src/components/tiptap-node/table-node/ui/table-sort-row-column-button/index.tsx +2 -0
- package/src/components/tiptap-node/table-node/ui/table-sort-row-column-button/table-sort-row-column-button.tsx +100 -0
- package/src/components/tiptap-node/table-node/ui/table-sort-row-column-button/use-table-sort-row-column.ts +444 -0
- package/src/components/tiptap-node/table-node/ui/table-trigger-button/index.tsx +3 -0
- package/src/components/tiptap-node/table-node/ui/table-trigger-button/table-grid-selector.css +39 -0
- package/src/components/tiptap-node/table-node/ui/table-trigger-button/table-grid-selector.tsx +219 -0
- package/src/components/tiptap-node/table-node/ui/table-trigger-button/table-trigger-button.tsx +132 -0
- package/src/components/tiptap-node/table-node/ui/table-trigger-button/use-table-trigger.ts +166 -0
- package/src/components/tiptap-ui/blockquote-button/blockquote-button.tsx +125 -0
- package/src/components/tiptap-ui/blockquote-button/index.tsx +2 -0
- package/src/components/tiptap-ui/blockquote-button/use-blockquote.ts +246 -0
- package/src/components/tiptap-ui/code-block-button/code-block-button.tsx +100 -0
- package/src/components/tiptap-ui/code-block-button/index.tsx +2 -0
- package/src/components/tiptap-ui/code-block-button/use-code-block.ts +256 -0
- package/src/components/tiptap-ui/color-highlight-button/color-highlight-button.css +32 -0
- package/src/components/tiptap-ui/color-highlight-button/color-highlight-button.tsx +171 -0
- package/src/components/tiptap-ui/color-highlight-button/index.tsx +2 -0
- package/src/components/tiptap-ui/color-highlight-button/use-color-highlight.ts +296 -0
- package/src/components/tiptap-ui/color-highlight-popover/color-highlight-popover.tsx +211 -0
- package/src/components/tiptap-ui/color-highlight-popover/index.tsx +1 -0
- package/src/components/tiptap-ui/color-menu/color-menu.tsx +178 -0
- package/src/components/tiptap-ui/color-menu/index.tsx +1 -0
- package/src/components/tiptap-ui/color-text-button/color-text-button.css +31 -0
- package/src/components/tiptap-ui/color-text-button/color-text-button.tsx +150 -0
- package/src/components/tiptap-ui/color-text-button/index.tsx +2 -0
- package/src/components/tiptap-ui/color-text-button/use-color-text.ts +251 -0
- package/src/components/tiptap-ui/color-text-popover/color-text-popover.css +25 -0
- package/src/components/tiptap-ui/color-text-popover/color-text-popover.tsx +360 -0
- package/src/components/tiptap-ui/color-text-popover/index.tsx +2 -0
- package/src/components/tiptap-ui/color-text-popover/use-color-text-popover.ts +229 -0
- package/src/components/tiptap-ui/copy-anchor-link-button/copy-anchor-link-button.tsx +118 -0
- package/src/components/tiptap-ui/copy-anchor-link-button/index.tsx +3 -0
- package/src/components/tiptap-ui/copy-anchor-link-button/use-copy-anchor-link.ts +252 -0
- package/src/components/tiptap-ui/copy-anchor-link-button/use-scroll-to-hash.ts +128 -0
- package/src/components/tiptap-ui/copy-to-clipboard-button/copy-to-clipboard-button.tsx +116 -0
- package/src/components/tiptap-ui/copy-to-clipboard-button/index.tsx +2 -0
- package/src/components/tiptap-ui/copy-to-clipboard-button/use-copy-to-clipboard.ts +234 -0
- package/src/components/tiptap-ui/delete-node-button/delete-node-button.tsx +98 -0
- package/src/components/tiptap-ui/delete-node-button/index.tsx +2 -0
- package/src/components/tiptap-ui/delete-node-button/use-delete-node.ts +236 -0
- package/src/components/tiptap-ui/drag-context-menu/drag-context-menu-types.ts +28 -0
- package/src/components/tiptap-ui/drag-context-menu/drag-context-menu.css +17 -0
- package/src/components/tiptap-ui/drag-context-menu/drag-context-menu.tsx +413 -0
- package/src/components/tiptap-ui/drag-context-menu/index.tsx +2 -0
- package/src/components/tiptap-ui/duplicate-button/duplicate-button.tsx +114 -0
- package/src/components/tiptap-ui/duplicate-button/index.tsx +2 -0
- package/src/components/tiptap-ui/duplicate-button/use-duplicate.ts +208 -0
- package/src/components/tiptap-ui/emoji-dropdown-menu/emoji-dropdown-menu.tsx +103 -0
- package/src/components/tiptap-ui/emoji-dropdown-menu/index.tsx +1 -0
- package/src/components/tiptap-ui/emoji-menu/emoji-menu-utils.ts +36 -0
- package/src/components/tiptap-ui/emoji-menu/emoji-menu.css +30 -0
- package/src/components/tiptap-ui/emoji-menu/emoji-menu.tsx +142 -0
- package/src/components/tiptap-ui/emoji-menu/index.tsx +2 -0
- package/src/components/tiptap-ui/emoji-trigger-button/emoji-trigger-button.tsx +128 -0
- package/src/components/tiptap-ui/emoji-trigger-button/index.tsx +2 -0
- package/src/components/tiptap-ui/emoji-trigger-button/use-emoji-trigger.ts +315 -0
- package/src/components/tiptap-ui/heading-button/heading-button.tsx +127 -0
- package/src/components/tiptap-ui/heading-button/index.tsx +2 -0
- package/src/components/tiptap-ui/heading-button/use-heading.ts +321 -0
- package/src/components/tiptap-ui/image-align-button/image-align-button.tsx +114 -0
- package/src/components/tiptap-ui/image-align-button/index.tsx +2 -0
- package/src/components/tiptap-ui/image-align-button/use-image-align.ts +295 -0
- package/src/components/tiptap-ui/image-caption-button/image-caption-button.tsx +77 -0
- package/src/components/tiptap-ui/image-caption-button/index.tsx +2 -0
- package/src/components/tiptap-ui/image-caption-button/use-image-caption.ts +212 -0
- package/src/components/tiptap-ui/image-download-button/image-download-button.tsx +104 -0
- package/src/components/tiptap-ui/image-download-button/index.tsx +2 -0
- package/src/components/tiptap-ui/image-download-button/use-image-download.ts +364 -0
- package/src/components/tiptap-ui/image-upload-button/image-upload-button.tsx +133 -0
- package/src/components/tiptap-ui/image-upload-button/index.tsx +2 -0
- package/src/components/tiptap-ui/image-upload-button/use-image-upload.ts +192 -0
- package/src/components/tiptap-ui/link-popover/index.tsx +2 -0
- package/src/components/tiptap-ui/link-popover/link-popover.tsx +271 -0
- package/src/components/tiptap-ui/link-popover/use-link-popover.ts +286 -0
- package/src/components/tiptap-ui/list-button/index.tsx +2 -0
- package/src/components/tiptap-ui/list-button/list-button.tsx +123 -0
- package/src/components/tiptap-ui/list-button/use-list.ts +326 -0
- package/src/components/tiptap-ui/mark-button/index.tsx +2 -0
- package/src/components/tiptap-ui/mark-button/mark-button.tsx +110 -0
- package/src/components/tiptap-ui/mark-button/use-mark.ts +195 -0
- package/src/components/tiptap-ui/mention-dropdown-menu/index.tsx +1 -0
- package/src/components/tiptap-ui/mention-dropdown-menu/mention-dropdown-menu.tsx +212 -0
- package/src/components/tiptap-ui/mention-trigger-button/index.tsx +2 -0
- package/src/components/tiptap-ui/mention-trigger-button/mention-trigger-button.tsx +122 -0
- package/src/components/tiptap-ui/mention-trigger-button/use-mention-trigger.ts +339 -0
- package/src/components/tiptap-ui/move-node-button/index.tsx +2 -0
- package/src/components/tiptap-ui/move-node-button/move-node-button.tsx +120 -0
- package/src/components/tiptap-ui/move-node-button/use-move-node.ts +207 -0
- package/src/components/tiptap-ui/reset-all-formatting-button/index.tsx +2 -0
- package/src/components/tiptap-ui/reset-all-formatting-button/reset-all-formatting-button.tsx +126 -0
- package/src/components/tiptap-ui/reset-all-formatting-button/use-reset-all-formatting.ts +250 -0
- package/src/components/tiptap-ui/slash-command-trigger-button/index.tsx +2 -0
- package/src/components/tiptap-ui/slash-command-trigger-button/slash-command-trigger-button.tsx +128 -0
- package/src/components/tiptap-ui/slash-command-trigger-button/use-slash-command-trigger.ts +255 -0
- package/src/components/tiptap-ui/slash-dropdown-menu/index.tsx +2 -0
- package/src/components/tiptap-ui/slash-dropdown-menu/slash-dropdown-menu.css +33 -0
- package/src/components/tiptap-ui/slash-dropdown-menu/slash-dropdown-menu.tsx +159 -0
- package/src/components/tiptap-ui/slash-dropdown-menu/use-slash-dropdown-menu.ts +317 -0
- package/src/components/tiptap-ui/text-align-button/index.tsx +2 -0
- package/src/components/tiptap-ui/text-align-button/text-align-button.tsx +120 -0
- package/src/components/tiptap-ui/text-align-button/use-text-align.ts +224 -0
- package/src/components/tiptap-ui/text-button/index.tsx +2 -0
- package/src/components/tiptap-ui/text-button/text-button.tsx +117 -0
- package/src/components/tiptap-ui/text-button/use-text.ts +264 -0
- package/src/components/tiptap-ui/turn-into-dropdown/index.tsx +2 -0
- package/src/components/tiptap-ui/turn-into-dropdown/turn-into-dropdown.tsx +192 -0
- package/src/components/tiptap-ui/turn-into-dropdown/use-turn-into-dropdown.ts +260 -0
- package/src/components/tiptap-ui/undo-redo-button/index.tsx +2 -0
- package/src/components/tiptap-ui/undo-redo-button/undo-redo-button.tsx +126 -0
- package/src/components/tiptap-ui/undo-redo-button/use-undo-redo.ts +184 -0
- package/src/components/tiptap-ui-primitive/avatar/avatar.css +83 -0
- package/src/components/tiptap-ui-primitive/avatar/avatar.tsx +239 -0
- package/src/components/tiptap-ui-primitive/avatar/index.tsx +1 -0
- package/src/components/tiptap-ui-primitive/badge/badge-colors.css +358 -0
- package/src/components/tiptap-ui-primitive/badge/badge-group.css +18 -0
- package/src/components/tiptap-ui-primitive/badge/badge.css +93 -0
- package/src/components/tiptap-ui-primitive/badge/badge.tsx +46 -0
- package/src/components/tiptap-ui-primitive/badge/index.tsx +1 -0
- package/src/components/tiptap-ui-primitive/button/button-colors.css +6 -0
- package/src/components/tiptap-ui-primitive/button/button-group.css +17 -0
- package/src/components/tiptap-ui-primitive/button/button.css +428 -0
- package/src/components/tiptap-ui-primitive/button/button.tsx +116 -0
- package/src/components/tiptap-ui-primitive/button/index.tsx +1 -0
- package/src/components/tiptap-ui-primitive/card/card.css +42 -0
- package/src/components/tiptap-ui-primitive/card/card.tsx +79 -0
- package/src/components/tiptap-ui-primitive/card/index.tsx +1 -0
- package/src/components/tiptap-ui-primitive/combobox/combobox.css +15 -0
- package/src/components/tiptap-ui-primitive/combobox/combobox.tsx +73 -0
- package/src/components/tiptap-ui-primitive/combobox/index.tsx +1 -0
- package/src/components/tiptap-ui-primitive/dropdown-menu/dropdown-menu.css +49 -0
- package/src/components/tiptap-ui-primitive/dropdown-menu/dropdown-menu.tsx +98 -0
- package/src/components/tiptap-ui-primitive/dropdown-menu/index.tsx +1 -0
- package/src/components/tiptap-ui-primitive/input/index.tsx +1 -0
- package/src/components/tiptap-ui-primitive/input/input.css +26 -0
- package/src/components/tiptap-ui-primitive/input/input.tsx +24 -0
- package/src/components/tiptap-ui-primitive/label/index.tsx +1 -0
- package/src/components/tiptap-ui-primitive/label/label.css +9 -0
- package/src/components/tiptap-ui-primitive/label/label.tsx +42 -0
- package/src/components/tiptap-ui-primitive/menu/index.tsx +5 -0
- package/src/components/tiptap-ui-primitive/menu/menu-context.ts +19 -0
- package/src/components/tiptap-ui-primitive/menu/menu-hooks.ts +102 -0
- package/src/components/tiptap-ui-primitive/menu/menu-types.ts +56 -0
- package/src/components/tiptap-ui-primitive/menu/menu-utils.ts +64 -0
- package/src/components/tiptap-ui-primitive/menu/menu.css +49 -0
- package/src/components/tiptap-ui-primitive/menu/menu.tsx +235 -0
- package/src/components/tiptap-ui-primitive/popover/index.tsx +1 -0
- package/src/components/tiptap-ui-primitive/popover/popover.css +49 -0
- package/src/components/tiptap-ui-primitive/popover/popover.tsx +37 -0
- package/src/components/tiptap-ui-primitive/separator/index.tsx +1 -0
- package/src/components/tiptap-ui-primitive/separator/separator.css +19 -0
- package/src/components/tiptap-ui-primitive/separator/separator.tsx +33 -0
- package/src/components/tiptap-ui-primitive/sidebar/index.tsx +1 -0
- package/src/components/tiptap-ui-primitive/sidebar/sidebar.css +140 -0
- package/src/components/tiptap-ui-primitive/sidebar/sidebar.tsx +299 -0
- package/src/components/tiptap-ui-primitive/spacer/index.tsx +1 -0
- package/src/components/tiptap-ui-primitive/spacer/spacer.tsx +26 -0
- package/src/components/tiptap-ui-primitive/textarea-autosize/index.tsx +1 -0
- package/src/components/tiptap-ui-primitive/textarea-autosize/textarea-autosize.tsx +18 -0
- package/src/components/tiptap-ui-primitive/toolbar/index.tsx +1 -0
- package/src/components/tiptap-ui-primitive/toolbar/toolbar.css +65 -0
- package/src/components/tiptap-ui-primitive/toolbar/toolbar.tsx +123 -0
- package/src/components/tiptap-ui-primitive/tooltip/index.tsx +1 -0
- package/src/components/tiptap-ui-primitive/tooltip/tooltip.css +21 -0
- package/src/components/tiptap-ui-primitive/tooltip/tooltip.tsx +237 -0
- package/src/components/tiptap-ui-utils/floating-element/floating-element-utils.ts +23 -0
- package/src/components/tiptap-ui-utils/floating-element/floating-element.tsx +343 -0
- package/src/components/tiptap-ui-utils/floating-element/index.tsx +2 -0
- package/src/components/tiptap-ui-utils/suggestion-menu/index.tsx +3 -0
- package/src/components/tiptap-ui-utils/suggestion-menu/suggestion-menu-types.ts +91 -0
- package/src/components/tiptap-ui-utils/suggestion-menu/suggestion-menu-utils.ts +87 -0
- package/src/components/tiptap-ui-utils/suggestion-menu/suggestion-menu.tsx +240 -0
- package/src/content/index.tsx +27 -0
- package/src/content/style.css +12 -0
- package/src/contexts/ai-context.tsx +65 -0
- package/src/contexts/app-context.tsx +159 -0
- package/src/contexts/user-context.tsx +138 -0
- package/src/editor/collaboration/index.tsx +64 -0
- package/src/editor/index.tsx +144 -42
- package/src/hooks/use-composed-ref.ts +47 -0
- package/src/hooks/use-cursor-visibility.ts +69 -0
- package/src/hooks/use-editor.ts +237 -0
- package/src/hooks/use-element-rect.ts +165 -0
- package/src/hooks/use-floating-element.ts +101 -0
- package/src/hooks/use-floating-toolbar-visibility.ts +123 -0
- package/src/hooks/use-is-breakpoint.ts +37 -0
- package/src/hooks/use-isomorphic-layout-effect.ts +11 -0
- package/src/hooks/use-menu-navigation.ts +182 -0
- package/src/hooks/use-on-click-outside.ts +135 -0
- package/src/hooks/use-scrolling.ts +75 -0
- package/src/hooks/use-throttled-callback.ts +48 -0
- package/src/hooks/use-tiptap-editor.ts +49 -0
- package/src/hooks/use-ui-editor-state.ts +29 -0
- package/src/hooks/use-unmount.ts +21 -0
- package/src/hooks/use-window-size.ts +88 -0
- package/src/index.ts +4 -7
- package/src/lib/tiptap-advanced-utils.ts +362 -0
- package/src/lib/tiptap-collab-utils.ts +289 -0
- package/src/lib/tiptap-utils.ts +612 -0
- package/src/locales/en.json +123 -0
- package/src/locales/zh-CN.json +123 -0
- package/src/locales/zh-TW.json +123 -0
- package/src/styles/variables.css +92 -0
- package/README.md +0 -458
- package/src/editor/constants.tsx +0 -66
- package/src/editor/container.css +0 -46
- package/src/editor/control/character-count/index.tsx +0 -39
- package/src/editor/control/drag-handle/index.tsx +0 -85
- package/src/editor/control/drag-handle/use.content.actions.ts +0 -71
- package/src/editor/control/drag-handle/use.data.ts +0 -29
- package/src/editor/control/drag-handle/use.handle.id.ts +0 -6
- package/src/editor/control/index.tsx +0 -35
- package/src/editor/editor.css +0 -626
- package/src/editor/extension/block-quote-figure/BlockquoteFigure.ts +0 -73
- package/src/editor/extension/block-quote-figure/Quote/Quote.ts +0 -31
- package/src/editor/extension/block-quote-figure/Quote/index.ts +0 -1
- package/src/editor/extension/block-quote-figure/QuoteCaption/QuoteCaption.ts +0 -54
- package/src/editor/extension/block-quote-figure/QuoteCaption/index.ts +0 -1
- package/src/editor/extension/block-quote-figure/index.ts +0 -1
- package/src/editor/extension/document/index.ts +0 -5
- package/src/editor/extension/figcaption/Figcaption.ts +0 -90
- package/src/editor/extension/figcaption/index.ts +0 -1
- package/src/editor/extension/figure/Figure.ts +0 -62
- package/src/editor/extension/figure/index.ts +0 -1
- package/src/editor/extension/font-size/FontSize.ts +0 -64
- package/src/editor/extension/font-size/index.ts +0 -1
- package/src/editor/extension/global-drag-handle/clipboard-serializer.ts +0 -28
- package/src/editor/extension/global-drag-handle/index.ts +0 -377
- package/src/editor/extension/heading/index.ts +0 -13
- package/src/editor/extension/horizontal-rule/HorizontalRule.ts +0 -10
- package/src/editor/extension/horizontal-rule/index.ts +0 -1
- package/src/editor/extension/image/index.ts +0 -5
- package/src/editor/extension/image-block/ImageBlock.ts +0 -103
- package/src/editor/extension/image-block/components/ImageBlockMenu.tsx +0 -100
- package/src/editor/extension/image-block/components/ImageBlockView.tsx +0 -47
- package/src/editor/extension/image-block/components/ImageBlockWidth.tsx +0 -40
- package/src/editor/extension/image-block/index.ts +0 -1
- package/src/editor/extension/image-upload/ImageUpload.ts +0 -58
- package/src/editor/extension/image-upload/index.ts +0 -1
- package/src/editor/extension/image-upload/view/ImageUpload.tsx +0 -27
- package/src/editor/extension/image-upload/view/ImageUploader.tsx +0 -64
- package/src/editor/extension/image-upload/view/hooks.ts +0 -109
- package/src/editor/extension/image-upload/view/index.tsx +0 -1
- package/src/editor/extension/index.ts +0 -30
- package/src/editor/extension/link/Link.ts +0 -39
- package/src/editor/extension/link/index.ts +0 -1
- package/src/editor/extension/multi-column/Column.ts +0 -33
- package/src/editor/extension/multi-column/Columns.ts +0 -65
- package/src/editor/extension/multi-column/index.ts +0 -2
- package/src/editor/extension/multi-column/menus/ColumnsMenu.tsx +0 -82
- package/src/editor/extension/multi-column/menus/index.ts +0 -1
- package/src/editor/extension/selection/Selection.ts +0 -36
- package/src/editor/extension/selection/index.ts +0 -1
- package/src/editor/extension/slash-command/MenuList.tsx +0 -145
- package/src/editor/extension/slash-command/groups.ts +0 -153
- package/src/editor/extension/slash-command/index.ts +0 -277
- package/src/editor/extension/slash-command/types.ts +0 -25
- package/src/editor/extension/table/Cell.ts +0 -126
- package/src/editor/extension/table/Header.ts +0 -89
- package/src/editor/extension/table/Row.ts +0 -8
- package/src/editor/extension/table/Table.ts +0 -9
- package/src/editor/extension/table/index.ts +0 -4
- package/src/editor/extension/table/menus/TableColumn/index.tsx +0 -73
- package/src/editor/extension/table/menus/TableColumn/utils.ts +0 -38
- package/src/editor/extension/table/menus/TableRow/index.tsx +0 -74
- package/src/editor/extension/table/menus/TableRow/utils.ts +0 -38
- package/src/editor/extension/table/menus/index.tsx +0 -2
- package/src/editor/extension/table/utils.ts +0 -258
- package/src/editor/extension/task-item/index.ts +0 -1
- package/src/editor/extension/task-item/task-item.ts +0 -225
- package/src/editor/extension/task-list/index.ts +0 -1
- package/src/editor/extension/task-list/task-list.ts +0 -81
- package/src/editor/extension/trailing-node/index.ts +0 -1
- package/src/editor/extension/trailing-node/trailing-node.ts +0 -70
- package/src/editor/extension/unique-id/index.ts +0 -1
- package/src/editor/extension/unique-id/uniqueId.ts +0 -123
- package/src/editor/hooks.ts +0 -264
- package/src/editor/menus/LinkMenu/LinkMenu.tsx +0 -75
- package/src/editor/menus/LinkMenu/index.tsx +0 -1
- package/src/editor/menus/TextMenu/TextMenu.tsx +0 -193
- package/src/editor/menus/TextMenu/components/AIDropdown.tsx +0 -140
- package/src/editor/menus/TextMenu/components/ContentTypePicker.tsx +0 -76
- package/src/editor/menus/TextMenu/components/EditLinkPopover.tsx +0 -25
- package/src/editor/menus/TextMenu/components/FontFamilyPicker.tsx +0 -84
- package/src/editor/menus/TextMenu/components/FontSizePicker.tsx +0 -56
- package/src/editor/menus/TextMenu/hooks/useTextmenuCommands.ts +0 -96
- package/src/editor/menus/TextMenu/hooks/useTextmenuContentTypes.ts +0 -86
- package/src/editor/menus/TextMenu/hooks/useTextmenuStates.ts +0 -50
- package/src/editor/menus/TextMenu/index.tsx +0 -2
- package/src/editor/menus/types.ts +0 -21
- package/src/editor/panels/Colorpicker/ColorButton.tsx +0 -35
- package/src/editor/panels/Colorpicker/Colorpicker.tsx +0 -67
- package/src/editor/panels/Colorpicker/index.tsx +0 -2
- package/src/editor/panels/LinkEditorPanel/LinkEditorPanel.tsx +0 -76
- package/src/editor/panels/LinkEditorPanel/index.tsx +0 -1
- package/src/editor/panels/LinkPreviewPanel/LinkPreviewPanel.tsx +0 -32
- package/src/editor/panels/LinkPreviewPanel/index.tsx +0 -1
- package/src/editor/panels/index.tsx +0 -3
- package/src/editor/types.tsx +0 -38
- package/src/editor/ui/Button/Button.tsx +0 -70
- package/src/editor/ui/Button/index.tsx +0 -2
- package/src/editor/ui/Dropdown/Dropdown.tsx +0 -39
- package/src/editor/ui/Dropdown/index.tsx +0 -1
- package/src/editor/ui/Icon.tsx +0 -21
- package/src/editor/ui/Loader/Loader.tsx +0 -39
- package/src/editor/ui/Loader/index.ts +0 -1
- package/src/editor/ui/Loader/types.ts +0 -7
- package/src/editor/ui/Panel/index.tsx +0 -109
- package/src/editor/ui/PopoverMenu.tsx +0 -127
- package/src/editor/ui/Spinner/Spinner.tsx +0 -10
- package/src/editor/ui/Spinner/index.tsx +0 -1
- package/src/editor/ui/Surface.tsx +0 -27
- package/src/editor/ui/Textarea/Textarea.tsx +0 -20
- package/src/editor/ui/Textarea/index.tsx +0 -1
- package/src/editor/ui/Toggle/Toggle.tsx +0 -39
- package/src/editor/ui/Toggle/index.tsx +0 -1
- package/src/editor/ui/Toolbar.tsx +0 -107
- package/src/editor/ui/Tooltip/index.tsx +0 -77
- package/src/editor/ui/Tooltip/types.ts +0 -17
- package/src/editor/utils/cssVar.ts +0 -14
- package/src/editor/utils/getRenderContainer.ts +0 -39
- package/src/editor/utils/index.ts +0 -16
- package/src/editor/utils/isCustomNodeSelected.ts +0 -47
- package/src/editor/utils/isTextSelected.ts +0 -25
- package/src/editor/utils/locale.ts +0 -5
- package/src/editor/viewer/index.tsx +0 -26
- package/src/globals.css +0 -1
- package/src/locales/en-us.ts +0 -133
- package/src/locales/zh-cn.ts +0 -133
- package/src/locales/zh-tw.ts +0 -133
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import { forwardRef } from "react"
|
|
4
|
+
import { cn } from "../../../lib/tiptap-utils"
|
|
5
|
+
import "./card.css"
|
|
6
|
+
|
|
7
|
+
const Card = forwardRef<HTMLDivElement, React.ComponentProps<"div">>(
|
|
8
|
+
({ className, ...props }, ref) => {
|
|
9
|
+
return <div ref={ref} className={cn("tiptap-card", className)} {...props} />
|
|
10
|
+
}
|
|
11
|
+
)
|
|
12
|
+
Card.displayName = "Card"
|
|
13
|
+
|
|
14
|
+
const CardHeader = forwardRef<HTMLDivElement, React.ComponentProps<"div">>(
|
|
15
|
+
({ className, ...props }, ref) => {
|
|
16
|
+
return (
|
|
17
|
+
<div
|
|
18
|
+
ref={ref}
|
|
19
|
+
className={cn("tiptap-card-header", className)}
|
|
20
|
+
{...props}
|
|
21
|
+
/>
|
|
22
|
+
)
|
|
23
|
+
}
|
|
24
|
+
)
|
|
25
|
+
CardHeader.displayName = "CardHeader"
|
|
26
|
+
|
|
27
|
+
const CardBody = forwardRef<HTMLDivElement, React.ComponentProps<"div">>(
|
|
28
|
+
({ className, ...props }, ref) => {
|
|
29
|
+
return (
|
|
30
|
+
<div ref={ref} className={cn("tiptap-card-body", className)} {...props} />
|
|
31
|
+
)
|
|
32
|
+
}
|
|
33
|
+
)
|
|
34
|
+
CardBody.displayName = "CardBody"
|
|
35
|
+
|
|
36
|
+
const CardItemGroup = forwardRef<
|
|
37
|
+
HTMLDivElement,
|
|
38
|
+
React.ComponentProps<"div"> & {
|
|
39
|
+
orientation?: "horizontal" | "vertical"
|
|
40
|
+
}
|
|
41
|
+
>(({ className, orientation = "vertical", ...props }, ref) => {
|
|
42
|
+
return (
|
|
43
|
+
<div
|
|
44
|
+
ref={ref}
|
|
45
|
+
data-orientation={orientation}
|
|
46
|
+
className={cn("tiptap-card-item-group", className)}
|
|
47
|
+
{...props}
|
|
48
|
+
/>
|
|
49
|
+
)
|
|
50
|
+
})
|
|
51
|
+
CardItemGroup.displayName = "CardItemGroup"
|
|
52
|
+
|
|
53
|
+
const CardGroupLabel = forwardRef<HTMLDivElement, React.ComponentProps<"div">>(
|
|
54
|
+
({ className, ...props }, ref) => {
|
|
55
|
+
return (
|
|
56
|
+
<div
|
|
57
|
+
ref={ref}
|
|
58
|
+
className={cn("tiptap-card-group-label", className)}
|
|
59
|
+
{...props}
|
|
60
|
+
/>
|
|
61
|
+
)
|
|
62
|
+
}
|
|
63
|
+
)
|
|
64
|
+
CardGroupLabel.displayName = "CardGroupLabel"
|
|
65
|
+
|
|
66
|
+
const CardFooter = forwardRef<HTMLDivElement, React.ComponentProps<"div">>(
|
|
67
|
+
({ className, ...props }, ref) => {
|
|
68
|
+
return (
|
|
69
|
+
<div
|
|
70
|
+
ref={ref}
|
|
71
|
+
className={cn("tiptap-card-footer", className)}
|
|
72
|
+
{...props}
|
|
73
|
+
/>
|
|
74
|
+
)
|
|
75
|
+
}
|
|
76
|
+
)
|
|
77
|
+
CardFooter.displayName = "CardFooter"
|
|
78
|
+
|
|
79
|
+
export { Card, CardHeader, CardFooter, CardBody, CardItemGroup, CardGroupLabel }
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./card"
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
@import "tailwindcss";
|
|
2
|
+
|
|
3
|
+
.tiptap-combobox-list {
|
|
4
|
+
@apply h-full rounded-xl border border-gray-200 bg-white text-gray-600 p-1.5 shadow-lg outline-none max-w-64 overflow-y-auto;
|
|
5
|
+
max-height: var(--popover-available-height);
|
|
6
|
+
margin-block: 0.375rem;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
.dark .tiptap-combobox-list {
|
|
10
|
+
@apply border-gray-800 bg-gray-900 text-gray-400;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
.tiptap-combobox-list:empty {
|
|
14
|
+
display: none !important;
|
|
15
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import { forwardRef } from "react"
|
|
4
|
+
import * as Ariakit from "@ariakit/react"
|
|
5
|
+
import { cn } from "../../../lib/tiptap-utils"
|
|
6
|
+
import "./combobox.css"
|
|
7
|
+
|
|
8
|
+
export function ComboboxProvider({ ...props }: Ariakit.ComboboxProviderProps) {
|
|
9
|
+
return (
|
|
10
|
+
<Ariakit.ComboboxProvider
|
|
11
|
+
includesBaseElement={false}
|
|
12
|
+
resetValueOnHide
|
|
13
|
+
{...props}
|
|
14
|
+
/>
|
|
15
|
+
)
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export const ComboboxList = forwardRef<
|
|
19
|
+
React.ComponentRef<typeof Ariakit.ComboboxList>,
|
|
20
|
+
React.ComponentProps<typeof Ariakit.ComboboxList>
|
|
21
|
+
>(({ className, ...props }, ref) => {
|
|
22
|
+
return (
|
|
23
|
+
<Ariakit.ComboboxList
|
|
24
|
+
ref={ref}
|
|
25
|
+
className={cn("tiptap-combobox-list", className)}
|
|
26
|
+
{...props}
|
|
27
|
+
/>
|
|
28
|
+
)
|
|
29
|
+
})
|
|
30
|
+
ComboboxList.displayName = "ComboboxList"
|
|
31
|
+
|
|
32
|
+
export const ComboboxPopover = forwardRef<
|
|
33
|
+
React.ComponentRef<typeof Ariakit.ComboboxPopover>,
|
|
34
|
+
React.ComponentProps<typeof Ariakit.ComboboxPopover>
|
|
35
|
+
>(({ className, ...props }, ref) => {
|
|
36
|
+
return (
|
|
37
|
+
<Ariakit.ComboboxPopover
|
|
38
|
+
ref={ref}
|
|
39
|
+
className={cn("tiptap-combobox-popover", className)}
|
|
40
|
+
{...props}
|
|
41
|
+
/>
|
|
42
|
+
)
|
|
43
|
+
})
|
|
44
|
+
ComboboxPopover.displayName = "ComboboxPopover"
|
|
45
|
+
|
|
46
|
+
export const Combobox = forwardRef<
|
|
47
|
+
React.ComponentRef<typeof Ariakit.Combobox>,
|
|
48
|
+
React.ComponentProps<typeof Ariakit.Combobox>
|
|
49
|
+
>(({ className, ...props }, ref) => {
|
|
50
|
+
return (
|
|
51
|
+
<Ariakit.Combobox
|
|
52
|
+
ref={ref}
|
|
53
|
+
autoSelect
|
|
54
|
+
{...props}
|
|
55
|
+
className={cn("tiptap-combobox", className)}
|
|
56
|
+
/>
|
|
57
|
+
)
|
|
58
|
+
})
|
|
59
|
+
Combobox.displayName = "Combobox"
|
|
60
|
+
|
|
61
|
+
export const ComboboxItem = forwardRef<
|
|
62
|
+
React.ComponentRef<typeof Ariakit.ComboboxItem>,
|
|
63
|
+
React.ComponentProps<typeof Ariakit.ComboboxItem>
|
|
64
|
+
>(({ className, ...props }, ref) => {
|
|
65
|
+
return (
|
|
66
|
+
<Ariakit.ComboboxItem
|
|
67
|
+
ref={ref}
|
|
68
|
+
className={cn("tiptap-combobox-item", className)}
|
|
69
|
+
{...props}
|
|
70
|
+
/>
|
|
71
|
+
)
|
|
72
|
+
})
|
|
73
|
+
ComboboxItem.displayName = "ComboboxItem"
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./combobox"
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
@import "tailwindcss";
|
|
2
|
+
|
|
3
|
+
.tiptap-dropdown-menu {
|
|
4
|
+
@apply z-50 outline-none;
|
|
5
|
+
transform-origin: var(--radix-dropdown-menu-content-transform-origin);
|
|
6
|
+
max-height: var(--radix-dropdown-menu-content-available-height);
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
.tiptap-dropdown-menu > * {
|
|
10
|
+
max-height: var(--radix-dropdown-menu-content-available-height);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/* Animation states */
|
|
14
|
+
.tiptap-dropdown-menu[data-state="open"] {
|
|
15
|
+
animation:
|
|
16
|
+
fadeIn 150ms cubic-bezier(0.16, 1, 0.3, 1),
|
|
17
|
+
zoomIn 150ms cubic-bezier(0.16, 1, 0.3, 1);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
.tiptap-dropdown-menu[data-state="closed"] {
|
|
21
|
+
animation:
|
|
22
|
+
fadeOut 150ms cubic-bezier(0.16, 1, 0.3, 1),
|
|
23
|
+
zoomOut 150ms cubic-bezier(0.16, 1, 0.3, 1);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/* Position-based animations */
|
|
27
|
+
.tiptap-dropdown-menu[data-side="top"],
|
|
28
|
+
.tiptap-dropdown-menu[data-side="top-start"],
|
|
29
|
+
.tiptap-dropdown-menu[data-side="top-end"] {
|
|
30
|
+
animation: slideFromBottom 150ms cubic-bezier(0.16, 1, 0.3, 1);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
.tiptap-dropdown-menu[data-side="right"],
|
|
34
|
+
.tiptap-dropdown-menu[data-side="right-start"],
|
|
35
|
+
.tiptap-dropdown-menu[data-side="right-end"] {
|
|
36
|
+
animation: slideFromLeft 150ms cubic-bezier(0.16, 1, 0.3, 1);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.tiptap-dropdown-menu[data-side="bottom"],
|
|
40
|
+
.tiptap-dropdown-menu[data-side="bottom-start"],
|
|
41
|
+
.tiptap-dropdown-menu[data-side="bottom-end"] {
|
|
42
|
+
animation: slideFromTop 150ms cubic-bezier(0.16, 1, 0.3, 1);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
.tiptap-dropdown-menu[data-side="left"],
|
|
46
|
+
.tiptap-dropdown-menu[data-side="left-start"],
|
|
47
|
+
.tiptap-dropdown-menu[data-side="left-end"] {
|
|
48
|
+
animation: slideFromRight 150ms cubic-bezier(0.16, 1, 0.3, 1);
|
|
49
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import { forwardRef } from "react"
|
|
4
|
+
import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu"
|
|
5
|
+
import { cn } from "../../../lib/tiptap-utils"
|
|
6
|
+
import "./dropdown-menu.css"
|
|
7
|
+
|
|
8
|
+
function DropdownMenu({
|
|
9
|
+
...props
|
|
10
|
+
}: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {
|
|
11
|
+
return <DropdownMenuPrimitive.Root modal={false} {...props} />
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function DropdownMenuPortal({
|
|
15
|
+
...props
|
|
16
|
+
}: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>) {
|
|
17
|
+
return <DropdownMenuPrimitive.Portal {...props} />
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const DropdownMenuTrigger = forwardRef<
|
|
21
|
+
React.ComponentRef<typeof DropdownMenuPrimitive.Trigger>,
|
|
22
|
+
React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Trigger>
|
|
23
|
+
>(({ ...props }, ref) => <DropdownMenuPrimitive.Trigger ref={ref} {...props} />)
|
|
24
|
+
DropdownMenuTrigger.displayName = DropdownMenuPrimitive.Trigger.displayName
|
|
25
|
+
|
|
26
|
+
const DropdownMenuGroup = DropdownMenuPrimitive.Group
|
|
27
|
+
|
|
28
|
+
const DropdownMenuSub = DropdownMenuPrimitive.Sub
|
|
29
|
+
|
|
30
|
+
const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup
|
|
31
|
+
|
|
32
|
+
const DropdownMenuItem = DropdownMenuPrimitive.Item
|
|
33
|
+
|
|
34
|
+
const DropdownMenuSubTrigger = DropdownMenuPrimitive.SubTrigger
|
|
35
|
+
|
|
36
|
+
const DropdownMenuSubContent = forwardRef<
|
|
37
|
+
React.ComponentRef<typeof DropdownMenuPrimitive.SubContent>,
|
|
38
|
+
React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent> & {
|
|
39
|
+
portal?: boolean | React.ComponentProps<typeof DropdownMenuPortal>
|
|
40
|
+
}
|
|
41
|
+
>(({ className, portal = true, ...props }, ref) => {
|
|
42
|
+
const content = (
|
|
43
|
+
<DropdownMenuPrimitive.SubContent
|
|
44
|
+
ref={ref}
|
|
45
|
+
className={cn("tiptap-dropdown-menu", className)}
|
|
46
|
+
{...props}
|
|
47
|
+
/>
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
return portal ? (
|
|
51
|
+
<DropdownMenuPortal {...(typeof portal === "object" ? portal : {})}>
|
|
52
|
+
{content}
|
|
53
|
+
</DropdownMenuPortal>
|
|
54
|
+
) : (
|
|
55
|
+
content
|
|
56
|
+
)
|
|
57
|
+
})
|
|
58
|
+
DropdownMenuSubContent.displayName =
|
|
59
|
+
DropdownMenuPrimitive.SubContent.displayName
|
|
60
|
+
|
|
61
|
+
const DropdownMenuContent = forwardRef<
|
|
62
|
+
React.ComponentRef<typeof DropdownMenuPrimitive.Content>,
|
|
63
|
+
React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content> & {
|
|
64
|
+
portal?: boolean
|
|
65
|
+
}
|
|
66
|
+
>(({ className, sideOffset = 4, portal = false, ...props }, ref) => {
|
|
67
|
+
const content = (
|
|
68
|
+
<DropdownMenuPrimitive.Content
|
|
69
|
+
ref={ref}
|
|
70
|
+
sideOffset={sideOffset}
|
|
71
|
+
onCloseAutoFocus={(e) => e.preventDefault()}
|
|
72
|
+
className={cn("tiptap-dropdown-menu", className)}
|
|
73
|
+
{...props}
|
|
74
|
+
/>
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
return portal ? (
|
|
78
|
+
<DropdownMenuPortal {...(typeof portal === "object" ? portal : {})}>
|
|
79
|
+
{content}
|
|
80
|
+
</DropdownMenuPortal>
|
|
81
|
+
) : (
|
|
82
|
+
content
|
|
83
|
+
)
|
|
84
|
+
})
|
|
85
|
+
DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName
|
|
86
|
+
|
|
87
|
+
export {
|
|
88
|
+
DropdownMenu,
|
|
89
|
+
DropdownMenuTrigger,
|
|
90
|
+
DropdownMenuContent,
|
|
91
|
+
DropdownMenuItem,
|
|
92
|
+
DropdownMenuGroup,
|
|
93
|
+
DropdownMenuSub,
|
|
94
|
+
DropdownMenuPortal,
|
|
95
|
+
DropdownMenuSubContent,
|
|
96
|
+
DropdownMenuSubTrigger,
|
|
97
|
+
DropdownMenuRadioGroup,
|
|
98
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./dropdown-menu"
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./input"
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
@import "tailwindcss";
|
|
2
|
+
|
|
3
|
+
.tiptap-input {
|
|
4
|
+
@apply block w-full h-8 text-sm font-normal rounded-md bg-transparent appearance-none outline-none;
|
|
5
|
+
line-height: 1.5;
|
|
6
|
+
padding: 0.375rem 0.5rem;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
.tiptap-input::placeholder {
|
|
10
|
+
@apply text-gray-400 dark:text-gray-600;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
.tiptap-input-clamp {
|
|
14
|
+
@apply min-w-48 pr-0 overflow-hidden;
|
|
15
|
+
text-overflow: ellipsis;
|
|
16
|
+
white-space: nowrap;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
.tiptap-input-clamp:focus {
|
|
20
|
+
text-overflow: clip;
|
|
21
|
+
overflow: visible;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
.tiptap-input-group {
|
|
25
|
+
@apply relative flex flex-wrap items-stretch;
|
|
26
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import { cn } from "../../../lib/tiptap-utils"
|
|
4
|
+
import "./input.css"
|
|
5
|
+
|
|
6
|
+
function Input({ className, type, ...props }: React.ComponentProps<"input">) {
|
|
7
|
+
return (
|
|
8
|
+
<input type={type} className={cn("tiptap-input", className)} {...props} />
|
|
9
|
+
)
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
function InputGroup({
|
|
13
|
+
className,
|
|
14
|
+
children,
|
|
15
|
+
...props
|
|
16
|
+
}: React.ComponentProps<"div">) {
|
|
17
|
+
return (
|
|
18
|
+
<div className={cn("tiptap-input-group", className)} {...props}>
|
|
19
|
+
{children}
|
|
20
|
+
</div>
|
|
21
|
+
)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export { Input, InputGroup }
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./label"
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import { cn } from "../../../lib/tiptap-utils"
|
|
4
|
+
import { createElement, forwardRef } from "react"
|
|
5
|
+
import "./label.css"
|
|
6
|
+
|
|
7
|
+
export interface BaseProps extends React.HTMLAttributes<HTMLElement> {
|
|
8
|
+
as?: "label" | "div"
|
|
9
|
+
onMouseDown?: React.MouseEventHandler<HTMLElement>
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export type LabelProps<T extends "label" | "div"> = T extends "label"
|
|
13
|
+
? BaseProps & { htmlFor?: string }
|
|
14
|
+
: BaseProps
|
|
15
|
+
|
|
16
|
+
export const Label = forwardRef<
|
|
17
|
+
HTMLElement,
|
|
18
|
+
LabelProps<"label"> | LabelProps<"div">
|
|
19
|
+
>(({ as = "div", ...props }, ref) => {
|
|
20
|
+
const renderProps = { ...props }
|
|
21
|
+
|
|
22
|
+
if (as === "label") {
|
|
23
|
+
renderProps.onMouseDown = (event: React.MouseEvent<HTMLElement>) => {
|
|
24
|
+
// only prevent text selection if clicking inside the label itself
|
|
25
|
+
const target = event.target as HTMLElement
|
|
26
|
+
if (target.closest("button, input, select, textarea")) return
|
|
27
|
+
props.onMouseDown?.(event)
|
|
28
|
+
// prevent text selection when double clicking label
|
|
29
|
+
if (!event.defaultPrevented && event.detail > 1) event.preventDefault()
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
return createElement(as, {
|
|
34
|
+
...renderProps,
|
|
35
|
+
ref,
|
|
36
|
+
className: cn("tiptap-label", props.className),
|
|
37
|
+
})
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
Label.displayName = "Label"
|
|
41
|
+
|
|
42
|
+
export default Label
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import { createContext, useContext } from "react"
|
|
4
|
+
import type { MenuContextValue } from "./menu-types"
|
|
5
|
+
|
|
6
|
+
export const SearchableContext = createContext<boolean>(false)
|
|
7
|
+
|
|
8
|
+
export const MenuContext = createContext<MenuContextValue>({
|
|
9
|
+
isRootMenu: false,
|
|
10
|
+
open: false,
|
|
11
|
+
})
|
|
12
|
+
|
|
13
|
+
export const useSearchableContext = (): boolean => {
|
|
14
|
+
return useContext(SearchableContext)
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export const useMenuContext = (): MenuContextValue => {
|
|
18
|
+
return useContext(MenuContext)
|
|
19
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import { useCallback, useEffect, useMemo } from "react"
|
|
4
|
+
import * as Ariakit from "@ariakit/react"
|
|
5
|
+
import type {
|
|
6
|
+
ContextMenuAnchor,
|
|
7
|
+
UseContextMenuReturn,
|
|
8
|
+
UseMenuStoreReturn,
|
|
9
|
+
} from "./menu-types"
|
|
10
|
+
|
|
11
|
+
export function useComboboxValueState(): readonly [
|
|
12
|
+
string,
|
|
13
|
+
(value: string) => void,
|
|
14
|
+
] {
|
|
15
|
+
const store = Ariakit.useComboboxContext()
|
|
16
|
+
const searchValue = Ariakit.useStoreState(store, "value") ?? ""
|
|
17
|
+
|
|
18
|
+
if (!store) {
|
|
19
|
+
throw new Error(
|
|
20
|
+
"useComboboxValueState must be used within ComboboxProvider"
|
|
21
|
+
)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
return [searchValue, store.setValue] as const
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function useMenuPlacement(): string {
|
|
28
|
+
const store = Ariakit.useMenuStore()
|
|
29
|
+
const currentPlacement = Ariakit.useStoreState(
|
|
30
|
+
store,
|
|
31
|
+
(state) => state.currentPlacement?.split("-")[0] || "bottom"
|
|
32
|
+
)
|
|
33
|
+
return currentPlacement
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export function useContextMenu(
|
|
37
|
+
anchorRect: ContextMenuAnchor
|
|
38
|
+
): UseContextMenuReturn {
|
|
39
|
+
const menu = Ariakit.useMenuStore()
|
|
40
|
+
|
|
41
|
+
useEffect(() => {
|
|
42
|
+
if (anchorRect) {
|
|
43
|
+
menu.render()
|
|
44
|
+
}
|
|
45
|
+
}, [anchorRect, menu])
|
|
46
|
+
|
|
47
|
+
const getAnchorRect = useCallback(() => anchorRect, [anchorRect])
|
|
48
|
+
|
|
49
|
+
const show = useCallback(() => {
|
|
50
|
+
menu.show()
|
|
51
|
+
menu.setAutoFocusOnShow(true)
|
|
52
|
+
}, [menu])
|
|
53
|
+
|
|
54
|
+
return useMemo(
|
|
55
|
+
() => ({
|
|
56
|
+
store: menu,
|
|
57
|
+
getAnchorRect,
|
|
58
|
+
show,
|
|
59
|
+
}),
|
|
60
|
+
[menu, getAnchorRect, show]
|
|
61
|
+
)
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export function useFloatingMenuStore(): UseMenuStoreReturn {
|
|
65
|
+
const menu = Ariakit.useMenuStore()
|
|
66
|
+
|
|
67
|
+
const show = useCallback(
|
|
68
|
+
(anchorElement: HTMLElement) => {
|
|
69
|
+
menu.setAnchorElement(anchorElement)
|
|
70
|
+
menu.show()
|
|
71
|
+
menu.setAutoFocusOnShow(true)
|
|
72
|
+
},
|
|
73
|
+
[menu]
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
return useMemo(
|
|
77
|
+
() => ({
|
|
78
|
+
store: menu,
|
|
79
|
+
show,
|
|
80
|
+
}),
|
|
81
|
+
[menu, show]
|
|
82
|
+
)
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export function useMenuItemClick(
|
|
86
|
+
menu?: Ariakit.MenuStore,
|
|
87
|
+
preventClose?: boolean
|
|
88
|
+
) {
|
|
89
|
+
return useCallback(
|
|
90
|
+
(event: React.MouseEvent<HTMLElement, MouseEvent>) => {
|
|
91
|
+
const expandable = event.currentTarget.hasAttribute("aria-expanded")
|
|
92
|
+
|
|
93
|
+
if (expandable || preventClose) {
|
|
94
|
+
return false
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
menu?.hideAll()
|
|
98
|
+
return false
|
|
99
|
+
},
|
|
100
|
+
[menu, preventClose]
|
|
101
|
+
)
|
|
102
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import type * as React from "react"
|
|
4
|
+
import type * as Ariakit from "@ariakit/react"
|
|
5
|
+
|
|
6
|
+
export interface Action {
|
|
7
|
+
filterItems?: boolean
|
|
8
|
+
group?: string
|
|
9
|
+
icon?: React.ReactNode
|
|
10
|
+
items?: Action[]
|
|
11
|
+
keywords?: string[]
|
|
12
|
+
label?: string
|
|
13
|
+
value?: string
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export interface MenuItemProps
|
|
17
|
+
extends Omit<Ariakit.ComboboxItemProps, "store"> {
|
|
18
|
+
group?: string
|
|
19
|
+
name?: string
|
|
20
|
+
parentGroup?: string
|
|
21
|
+
preventClose?: boolean
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export interface MenuContextValue {
|
|
25
|
+
isRootMenu: boolean
|
|
26
|
+
open: boolean
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export interface MenuProps extends Ariakit.MenuProviderProps {
|
|
30
|
+
trigger?: React.ReactNode
|
|
31
|
+
value?: string
|
|
32
|
+
onOpenChange?: Ariakit.MenuProviderProps["setOpen"]
|
|
33
|
+
onValueChange?: Ariakit.ComboboxProviderProps["setValue"]
|
|
34
|
+
onValuesChange?: Ariakit.MenuProviderProps["setValues"]
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export interface MenuContentProps
|
|
38
|
+
extends React.ComponentProps<typeof Ariakit.Menu> {
|
|
39
|
+
onClickOutside?: (event: MouseEvent | TouchEvent | FocusEvent) => void
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export interface ContextMenuAnchor {
|
|
43
|
+
x: number
|
|
44
|
+
y: number
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export interface UseContextMenuReturn {
|
|
48
|
+
store: ReturnType<typeof Ariakit.useMenuStore>
|
|
49
|
+
getAnchorRect: () => ContextMenuAnchor
|
|
50
|
+
show: () => void
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export interface UseMenuStoreReturn {
|
|
54
|
+
store: ReturnType<typeof Ariakit.useMenuStore>
|
|
55
|
+
show: (anchorElement: HTMLElement) => void
|
|
56
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import type { Action } from "./menu-types"
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Filters menu items based on search value
|
|
7
|
+
* @param group - The action group containing items to filter
|
|
8
|
+
* @param searchValue - The search string to filter against
|
|
9
|
+
* @returns Filtered array of actions
|
|
10
|
+
*/
|
|
11
|
+
export function filterMenuItems(
|
|
12
|
+
{ items = [], ...group }: Action,
|
|
13
|
+
searchValue: string
|
|
14
|
+
): Action[] {
|
|
15
|
+
if (!searchValue.trim()) return items
|
|
16
|
+
|
|
17
|
+
const normalizedSearchValue = searchValue.toLowerCase().trim()
|
|
18
|
+
|
|
19
|
+
const groupKeywords = [group.label, ...(group.keywords || [])]
|
|
20
|
+
.filter(Boolean)
|
|
21
|
+
.join(" ")
|
|
22
|
+
.toLowerCase()
|
|
23
|
+
|
|
24
|
+
if (groupKeywords.includes(normalizedSearchValue)) {
|
|
25
|
+
return items
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
return items.filter((item) => {
|
|
29
|
+
if (item.filterItems) return true
|
|
30
|
+
|
|
31
|
+
const itemKeywords = [item.label, item.value, ...(item.keywords || [])]
|
|
32
|
+
.filter(Boolean)
|
|
33
|
+
.join(" ")
|
|
34
|
+
.toLowerCase()
|
|
35
|
+
|
|
36
|
+
return itemKeywords.includes(normalizedSearchValue)
|
|
37
|
+
})
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Filters menu groups based on search value
|
|
42
|
+
* @param menuGroups - Array of action groups to filter
|
|
43
|
+
* @param searchValue - The search string to filter against
|
|
44
|
+
* @returns Filtered array of action groups
|
|
45
|
+
*/
|
|
46
|
+
export function filterMenuGroups(
|
|
47
|
+
menuGroups: Action[],
|
|
48
|
+
searchValue: string
|
|
49
|
+
): Action[] {
|
|
50
|
+
if (!searchValue.trim()) return menuGroups
|
|
51
|
+
|
|
52
|
+
return menuGroups.reduce<Action[]>((acc, group) => {
|
|
53
|
+
const filteredItems = filterMenuItems(group, searchValue)
|
|
54
|
+
|
|
55
|
+
if (filteredItems.length > 0) {
|
|
56
|
+
acc.push({
|
|
57
|
+
...group,
|
|
58
|
+
items: filteredItems,
|
|
59
|
+
})
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return acc
|
|
63
|
+
}, [])
|
|
64
|
+
}
|