@multiplatform.one/rich-text 6.0.0
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/LICENSE +201 -0
- package/dist/cjs/RichEditor.cjs +132 -0
- package/dist/cjs/RichEditor.native.js +120 -0
- package/dist/cjs/RichEditor.native.js.map +1 -0
- package/dist/cjs/RichEditor.stories.cjs +327 -0
- package/dist/cjs/RichEditor.stories.native.js +342 -0
- package/dist/cjs/RichEditor.stories.native.js.map +1 -0
- package/dist/cjs/RichTextEditor/index.cjs +148 -0
- package/dist/cjs/RichTextEditor/index.native.js +160 -0
- package/dist/cjs/RichTextEditor/index.native.js.map +1 -0
- package/dist/cjs/constants.cjs +135 -0
- package/dist/cjs/constants.native.js +138 -0
- package/dist/cjs/constants.native.js.map +1 -0
- package/dist/cjs/context.cjs +33 -0
- package/dist/cjs/context.native.js +36 -0
- package/dist/cjs/context.native.js.map +1 -0
- package/dist/cjs/editor/BlockDragHandle.cjs +137 -0
- package/dist/cjs/editor/BlockDragHandle.native.js +142 -0
- package/dist/cjs/editor/BlockDragHandle.native.js.map +1 -0
- package/dist/cjs/editor/MarkdownPaste.cjs +65 -0
- package/dist/cjs/editor/MarkdownPaste.native.js +68 -0
- package/dist/cjs/editor/MarkdownPaste.native.js.map +1 -0
- package/dist/cjs/editor/SlashCommands.cjs +369 -0
- package/dist/cjs/editor/SlashCommands.native.js +424 -0
- package/dist/cjs/editor/SlashCommands.native.js.map +1 -0
- package/dist/cjs/editor/TentapEditor.native.js +242 -0
- package/dist/cjs/editor/TentapEditor.native.js.map +1 -0
- package/dist/cjs/editor/TiptapEditor.cjs +578 -0
- package/dist/cjs/editor/TiptapEditor.native.js +661 -0
- package/dist/cjs/editor/TiptapEditor.native.js.map +1 -0
- package/dist/cjs/editor/editorStyles.cjs +272 -0
- package/dist/cjs/editor/editorStyles.native.js +276 -0
- package/dist/cjs/editor/editorStyles.native.js.map +1 -0
- package/dist/cjs/editor/index.cjs +33 -0
- package/dist/cjs/editor/index.native.js +36 -0
- package/dist/cjs/editor/index.native.js.map +1 -0
- package/dist/cjs/editor/types.cjs +54 -0
- package/dist/cjs/editor/types.native.js +57 -0
- package/dist/cjs/editor/types.native.js.map +1 -0
- package/dist/cjs/editor/useEditorState.cjs +129 -0
- package/dist/cjs/editor/useEditorState.native.js +135 -0
- package/dist/cjs/editor/useEditorState.native.js.map +1 -0
- package/dist/cjs/index.cjs +30 -0
- package/dist/cjs/index.native.js +33 -0
- package/dist/cjs/index.native.js.map +1 -0
- package/dist/cjs/styled.cjs +173 -0
- package/dist/cjs/styled.native.js +185 -0
- package/dist/cjs/styled.native.js.map +1 -0
- package/dist/cjs/toolbar/BubbleToolbar.cjs +130 -0
- package/dist/cjs/toolbar/BubbleToolbar.native.js +159 -0
- package/dist/cjs/toolbar/BubbleToolbar.native.js.map +1 -0
- package/dist/cjs/toolbar/CodeBlockBubble.cjs +211 -0
- package/dist/cjs/toolbar/CodeBlockBubble.native.js +228 -0
- package/dist/cjs/toolbar/CodeBlockBubble.native.js.map +1 -0
- package/dist/cjs/toolbar/ColorPicker.cjs +217 -0
- package/dist/cjs/toolbar/ColorPicker.native.js +234 -0
- package/dist/cjs/toolbar/ColorPicker.native.js.map +1 -0
- package/dist/cjs/toolbar/FixedToolbar.cjs +221 -0
- package/dist/cjs/toolbar/FixedToolbar.native.js +322 -0
- package/dist/cjs/toolbar/FixedToolbar.native.js.map +1 -0
- package/dist/cjs/toolbar/HeadingPicker.cjs +158 -0
- package/dist/cjs/toolbar/HeadingPicker.native.js +167 -0
- package/dist/cjs/toolbar/HeadingPicker.native.js.map +1 -0
- package/dist/cjs/toolbar/ImageBubble.cjs +156 -0
- package/dist/cjs/toolbar/ImageBubble.native.js +165 -0
- package/dist/cjs/toolbar/ImageBubble.native.js.map +1 -0
- package/dist/cjs/toolbar/ImageDialog.cjs +115 -0
- package/dist/cjs/toolbar/ImageDialog.native.js +122 -0
- package/dist/cjs/toolbar/ImageDialog.native.js.map +1 -0
- package/dist/cjs/toolbar/LinkBubble.cjs +195 -0
- package/dist/cjs/toolbar/LinkBubble.native.js +204 -0
- package/dist/cjs/toolbar/LinkBubble.native.js.map +1 -0
- package/dist/cjs/toolbar/LinkDialog.cjs +138 -0
- package/dist/cjs/toolbar/LinkDialog.native.js +146 -0
- package/dist/cjs/toolbar/LinkDialog.native.js.map +1 -0
- package/dist/cjs/toolbar/ListPicker.cjs +117 -0
- package/dist/cjs/toolbar/ListPicker.native.js +124 -0
- package/dist/cjs/toolbar/ListPicker.native.js.map +1 -0
- package/dist/cjs/toolbar/MoreDropdown.cjs +201 -0
- package/dist/cjs/toolbar/MoreDropdown.native.js +224 -0
- package/dist/cjs/toolbar/MoreDropdown.native.js.map +1 -0
- package/dist/cjs/toolbar/ResizeHandle.cjs +105 -0
- package/dist/cjs/toolbar/ResizeHandle.native.js +109 -0
- package/dist/cjs/toolbar/ResizeHandle.native.js.map +1 -0
- package/dist/cjs/toolbar/StatusBar.cjs +91 -0
- package/dist/cjs/toolbar/StatusBar.native.js +100 -0
- package/dist/cjs/toolbar/StatusBar.native.js.map +1 -0
- package/dist/cjs/toolbar/TableBubble.cjs +232 -0
- package/dist/cjs/toolbar/TableBubble.native.js +273 -0
- package/dist/cjs/toolbar/TableBubble.native.js.map +1 -0
- package/dist/cjs/toolbar/ToolbarButton.cjs +105 -0
- package/dist/cjs/toolbar/ToolbarButton.native.js +97 -0
- package/dist/cjs/toolbar/ToolbarButton.native.js.map +1 -0
- package/dist/cjs/toolbar/ToolbarGroup.cjs +41 -0
- package/dist/cjs/toolbar/ToolbarGroup.native.js +45 -0
- package/dist/cjs/toolbar/ToolbarGroup.native.js.map +1 -0
- package/dist/cjs/toolbar/icons.cjs +601 -0
- package/dist/cjs/toolbar/icons.native.js +165 -0
- package/dist/cjs/toolbar/icons.native.js.map +1 -0
- package/dist/cjs/toolbar/shortcuts.cjs +62 -0
- package/dist/cjs/toolbar/shortcuts.native.js +66 -0
- package/dist/cjs/toolbar/shortcuts.native.js.map +1 -0
- package/dist/cjs/toolbar/useHorizontalScroll.cjs +250 -0
- package/dist/cjs/toolbar/useHorizontalScroll.native.js +260 -0
- package/dist/cjs/toolbar/useHorizontalScroll.native.js.map +1 -0
- package/dist/cjs/types.cjs +56 -0
- package/dist/cjs/types.native.js +59 -0
- package/dist/cjs/types.native.js.map +1 -0
- package/dist/esm/RichEditor.mjs +107 -0
- package/dist/esm/RichEditor.mjs.map +1 -0
- package/dist/esm/RichEditor.native.js +92 -0
- package/dist/esm/RichEditor.native.js.map +1 -0
- package/dist/esm/RichEditor.stories.mjs +291 -0
- package/dist/esm/RichEditor.stories.mjs.map +1 -0
- package/dist/esm/RichEditor.stories.native.js +303 -0
- package/dist/esm/RichEditor.stories.native.js.map +1 -0
- package/dist/esm/RichTextEditor/index.mjs +123 -0
- package/dist/esm/RichTextEditor/index.mjs.map +1 -0
- package/dist/esm/RichTextEditor/index.native.js +132 -0
- package/dist/esm/RichTextEditor/index.native.js.map +1 -0
- package/dist/esm/constants.mjs +108 -0
- package/dist/esm/constants.mjs.map +1 -0
- package/dist/esm/constants.native.js +108 -0
- package/dist/esm/constants.native.js.map +1 -0
- package/dist/esm/context.mjs +8 -0
- package/dist/esm/context.mjs.map +1 -0
- package/dist/esm/context.native.js +8 -0
- package/dist/esm/context.native.js.map +1 -0
- package/dist/esm/editor/BlockDragHandle.mjs +112 -0
- package/dist/esm/editor/BlockDragHandle.mjs.map +1 -0
- package/dist/esm/editor/BlockDragHandle.native.js +114 -0
- package/dist/esm/editor/BlockDragHandle.native.js.map +1 -0
- package/dist/esm/editor/MarkdownPaste.mjs +40 -0
- package/dist/esm/editor/MarkdownPaste.mjs.map +1 -0
- package/dist/esm/editor/MarkdownPaste.native.js +40 -0
- package/dist/esm/editor/MarkdownPaste.native.js.map +1 -0
- package/dist/esm/editor/SlashCommands.mjs +333 -0
- package/dist/esm/editor/SlashCommands.mjs.map +1 -0
- package/dist/esm/editor/SlashCommands.native.js +385 -0
- package/dist/esm/editor/SlashCommands.native.js.map +1 -0
- package/dist/esm/editor/TentapEditor.native.js +214 -0
- package/dist/esm/editor/TentapEditor.native.js.map +1 -0
- package/dist/esm/editor/TiptapEditor.mjs +542 -0
- package/dist/esm/editor/TiptapEditor.mjs.map +1 -0
- package/dist/esm/editor/TiptapEditor.native.js +622 -0
- package/dist/esm/editor/TiptapEditor.native.js.map +1 -0
- package/dist/esm/editor/editorStyles.mjs +247 -0
- package/dist/esm/editor/editorStyles.mjs.map +1 -0
- package/dist/esm/editor/editorStyles.native.js +248 -0
- package/dist/esm/editor/editorStyles.native.js.map +1 -0
- package/dist/esm/editor/index.mjs +5 -0
- package/dist/esm/editor/index.mjs.map +1 -0
- package/dist/esm/editor/index.native.js +5 -0
- package/dist/esm/editor/index.native.js.map +1 -0
- package/dist/esm/editor/types.mjs +29 -0
- package/dist/esm/editor/types.mjs.map +1 -0
- package/dist/esm/editor/types.native.js +29 -0
- package/dist/esm/editor/types.native.js.map +1 -0
- package/dist/esm/editor/useEditorState.mjs +102 -0
- package/dist/esm/editor/useEditorState.mjs.map +1 -0
- package/dist/esm/editor/useEditorState.native.js +105 -0
- package/dist/esm/editor/useEditorState.native.js.map +1 -0
- package/dist/esm/index.mjs +4 -0
- package/dist/esm/index.mjs.map +1 -0
- package/dist/esm/index.native.js +4 -0
- package/dist/esm/index.native.js.map +1 -0
- package/dist/esm/styled.mjs +144 -0
- package/dist/esm/styled.mjs.map +1 -0
- package/dist/esm/styled.native.js +153 -0
- package/dist/esm/styled.native.js.map +1 -0
- package/dist/esm/toolbar/BubbleToolbar.mjs +105 -0
- package/dist/esm/toolbar/BubbleToolbar.mjs.map +1 -0
- package/dist/esm/toolbar/BubbleToolbar.native.js +131 -0
- package/dist/esm/toolbar/BubbleToolbar.native.js.map +1 -0
- package/dist/esm/toolbar/CodeBlockBubble.mjs +186 -0
- package/dist/esm/toolbar/CodeBlockBubble.mjs.map +1 -0
- package/dist/esm/toolbar/CodeBlockBubble.native.js +200 -0
- package/dist/esm/toolbar/CodeBlockBubble.native.js.map +1 -0
- package/dist/esm/toolbar/ColorPicker.mjs +191 -0
- package/dist/esm/toolbar/ColorPicker.mjs.map +1 -0
- package/dist/esm/toolbar/ColorPicker.native.js +205 -0
- package/dist/esm/toolbar/ColorPicker.native.js.map +1 -0
- package/dist/esm/toolbar/FixedToolbar.mjs +196 -0
- package/dist/esm/toolbar/FixedToolbar.mjs.map +1 -0
- package/dist/esm/toolbar/FixedToolbar.native.js +294 -0
- package/dist/esm/toolbar/FixedToolbar.native.js.map +1 -0
- package/dist/esm/toolbar/HeadingPicker.mjs +133 -0
- package/dist/esm/toolbar/HeadingPicker.mjs.map +1 -0
- package/dist/esm/toolbar/HeadingPicker.native.js +139 -0
- package/dist/esm/toolbar/HeadingPicker.native.js.map +1 -0
- package/dist/esm/toolbar/ImageBubble.mjs +131 -0
- package/dist/esm/toolbar/ImageBubble.mjs.map +1 -0
- package/dist/esm/toolbar/ImageBubble.native.js +137 -0
- package/dist/esm/toolbar/ImageBubble.native.js.map +1 -0
- package/dist/esm/toolbar/ImageDialog.mjs +90 -0
- package/dist/esm/toolbar/ImageDialog.mjs.map +1 -0
- package/dist/esm/toolbar/ImageDialog.native.js +94 -0
- package/dist/esm/toolbar/ImageDialog.native.js.map +1 -0
- package/dist/esm/toolbar/LinkBubble.mjs +170 -0
- package/dist/esm/toolbar/LinkBubble.mjs.map +1 -0
- package/dist/esm/toolbar/LinkBubble.native.js +176 -0
- package/dist/esm/toolbar/LinkBubble.native.js.map +1 -0
- package/dist/esm/toolbar/LinkDialog.mjs +112 -0
- package/dist/esm/toolbar/LinkDialog.mjs.map +1 -0
- package/dist/esm/toolbar/LinkDialog.native.js +117 -0
- package/dist/esm/toolbar/LinkDialog.native.js.map +1 -0
- package/dist/esm/toolbar/ListPicker.mjs +92 -0
- package/dist/esm/toolbar/ListPicker.mjs.map +1 -0
- package/dist/esm/toolbar/ListPicker.native.js +96 -0
- package/dist/esm/toolbar/ListPicker.native.js.map +1 -0
- package/dist/esm/toolbar/MoreDropdown.mjs +176 -0
- package/dist/esm/toolbar/MoreDropdown.mjs.map +1 -0
- package/dist/esm/toolbar/MoreDropdown.native.js +196 -0
- package/dist/esm/toolbar/MoreDropdown.native.js.map +1 -0
- package/dist/esm/toolbar/ResizeHandle.mjs +80 -0
- package/dist/esm/toolbar/ResizeHandle.mjs.map +1 -0
- package/dist/esm/toolbar/ResizeHandle.native.js +81 -0
- package/dist/esm/toolbar/ResizeHandle.native.js.map +1 -0
- package/dist/esm/toolbar/StatusBar.mjs +66 -0
- package/dist/esm/toolbar/StatusBar.mjs.map +1 -0
- package/dist/esm/toolbar/StatusBar.native.js +72 -0
- package/dist/esm/toolbar/StatusBar.native.js.map +1 -0
- package/dist/esm/toolbar/TableBubble.mjs +207 -0
- package/dist/esm/toolbar/TableBubble.mjs.map +1 -0
- package/dist/esm/toolbar/TableBubble.native.js +245 -0
- package/dist/esm/toolbar/TableBubble.native.js.map +1 -0
- package/dist/esm/toolbar/ToolbarButton.mjs +79 -0
- package/dist/esm/toolbar/ToolbarButton.mjs.map +1 -0
- package/dist/esm/toolbar/ToolbarButton.native.js +68 -0
- package/dist/esm/toolbar/ToolbarButton.native.js.map +1 -0
- package/dist/esm/toolbar/ToolbarGroup.mjs +16 -0
- package/dist/esm/toolbar/ToolbarGroup.mjs.map +1 -0
- package/dist/esm/toolbar/ToolbarGroup.native.js +17 -0
- package/dist/esm/toolbar/ToolbarGroup.native.js.map +1 -0
- package/dist/esm/toolbar/icons.mjs +554 -0
- package/dist/esm/toolbar/icons.mjs.map +1 -0
- package/dist/esm/toolbar/icons.native.js +115 -0
- package/dist/esm/toolbar/icons.native.js.map +1 -0
- package/dist/esm/toolbar/shortcuts.mjs +36 -0
- package/dist/esm/toolbar/shortcuts.mjs.map +1 -0
- package/dist/esm/toolbar/shortcuts.native.js +37 -0
- package/dist/esm/toolbar/shortcuts.native.js.map +1 -0
- package/dist/esm/toolbar/useHorizontalScroll.mjs +223 -0
- package/dist/esm/toolbar/useHorizontalScroll.mjs.map +1 -0
- package/dist/esm/toolbar/useHorizontalScroll.native.js +230 -0
- package/dist/esm/toolbar/useHorizontalScroll.native.js.map +1 -0
- package/dist/esm/types.mjs +31 -0
- package/dist/esm/types.mjs.map +1 -0
- package/dist/esm/types.native.js +31 -0
- package/dist/esm/types.native.js.map +1 -0
- package/dist/jsx/RichEditor.mjs +107 -0
- package/dist/jsx/RichEditor.mjs.map +1 -0
- package/dist/jsx/RichEditor.native.js +120 -0
- package/dist/jsx/RichEditor.native.js.map +1 -0
- package/dist/jsx/RichEditor.stories.mjs +291 -0
- package/dist/jsx/RichEditor.stories.mjs.map +1 -0
- package/dist/jsx/RichEditor.stories.native.js +342 -0
- package/dist/jsx/RichEditor.stories.native.js.map +1 -0
- package/dist/jsx/RichTextEditor/index.mjs +123 -0
- package/dist/jsx/RichTextEditor/index.mjs.map +1 -0
- package/dist/jsx/RichTextEditor/index.native.js +160 -0
- package/dist/jsx/RichTextEditor/index.native.js.map +1 -0
- package/dist/jsx/constants.mjs +108 -0
- package/dist/jsx/constants.mjs.map +1 -0
- package/dist/jsx/constants.native.js +138 -0
- package/dist/jsx/constants.native.js.map +1 -0
- package/dist/jsx/context.mjs +8 -0
- package/dist/jsx/context.mjs.map +1 -0
- package/dist/jsx/context.native.js +36 -0
- package/dist/jsx/context.native.js.map +1 -0
- package/dist/jsx/editor/BlockDragHandle.mjs +112 -0
- package/dist/jsx/editor/BlockDragHandle.mjs.map +1 -0
- package/dist/jsx/editor/BlockDragHandle.native.js +142 -0
- package/dist/jsx/editor/BlockDragHandle.native.js.map +1 -0
- package/dist/jsx/editor/MarkdownPaste.mjs +40 -0
- package/dist/jsx/editor/MarkdownPaste.mjs.map +1 -0
- package/dist/jsx/editor/MarkdownPaste.native.js +68 -0
- package/dist/jsx/editor/MarkdownPaste.native.js.map +1 -0
- package/dist/jsx/editor/SlashCommands.mjs +333 -0
- package/dist/jsx/editor/SlashCommands.mjs.map +1 -0
- package/dist/jsx/editor/SlashCommands.native.js +424 -0
- package/dist/jsx/editor/SlashCommands.native.js.map +1 -0
- package/dist/jsx/editor/TentapEditor.native.js +242 -0
- package/dist/jsx/editor/TentapEditor.native.js.map +1 -0
- package/dist/jsx/editor/TiptapEditor.mjs +542 -0
- package/dist/jsx/editor/TiptapEditor.mjs.map +1 -0
- package/dist/jsx/editor/TiptapEditor.native.js +661 -0
- package/dist/jsx/editor/TiptapEditor.native.js.map +1 -0
- package/dist/jsx/editor/editorStyles.mjs +247 -0
- package/dist/jsx/editor/editorStyles.mjs.map +1 -0
- package/dist/jsx/editor/editorStyles.native.js +276 -0
- package/dist/jsx/editor/editorStyles.native.js.map +1 -0
- package/dist/jsx/editor/index.mjs +5 -0
- package/dist/jsx/editor/index.mjs.map +1 -0
- package/dist/jsx/editor/index.native.js +36 -0
- package/dist/jsx/editor/index.native.js.map +1 -0
- package/dist/jsx/editor/types.mjs +29 -0
- package/dist/jsx/editor/types.mjs.map +1 -0
- package/dist/jsx/editor/types.native.js +57 -0
- package/dist/jsx/editor/types.native.js.map +1 -0
- package/dist/jsx/editor/useEditorState.mjs +102 -0
- package/dist/jsx/editor/useEditorState.mjs.map +1 -0
- package/dist/jsx/editor/useEditorState.native.js +135 -0
- package/dist/jsx/editor/useEditorState.native.js.map +1 -0
- package/dist/jsx/index.js +4 -0
- package/dist/jsx/index.js.map +1 -0
- package/dist/jsx/index.mjs +4 -0
- package/dist/jsx/index.mjs.map +1 -0
- package/dist/jsx/index.native.js +33 -0
- package/dist/jsx/index.native.js.map +1 -0
- package/dist/jsx/styled.mjs +144 -0
- package/dist/jsx/styled.mjs.map +1 -0
- package/dist/jsx/styled.native.js +185 -0
- package/dist/jsx/styled.native.js.map +1 -0
- package/dist/jsx/toolbar/BubbleToolbar.mjs +105 -0
- package/dist/jsx/toolbar/BubbleToolbar.mjs.map +1 -0
- package/dist/jsx/toolbar/BubbleToolbar.native.js +159 -0
- package/dist/jsx/toolbar/BubbleToolbar.native.js.map +1 -0
- package/dist/jsx/toolbar/CodeBlockBubble.mjs +186 -0
- package/dist/jsx/toolbar/CodeBlockBubble.mjs.map +1 -0
- package/dist/jsx/toolbar/CodeBlockBubble.native.js +228 -0
- package/dist/jsx/toolbar/CodeBlockBubble.native.js.map +1 -0
- package/dist/jsx/toolbar/ColorPicker.mjs +191 -0
- package/dist/jsx/toolbar/ColorPicker.mjs.map +1 -0
- package/dist/jsx/toolbar/ColorPicker.native.js +234 -0
- package/dist/jsx/toolbar/ColorPicker.native.js.map +1 -0
- package/dist/jsx/toolbar/FixedToolbar.mjs +196 -0
- package/dist/jsx/toolbar/FixedToolbar.mjs.map +1 -0
- package/dist/jsx/toolbar/FixedToolbar.native.js +322 -0
- package/dist/jsx/toolbar/FixedToolbar.native.js.map +1 -0
- package/dist/jsx/toolbar/HeadingPicker.mjs +133 -0
- package/dist/jsx/toolbar/HeadingPicker.mjs.map +1 -0
- package/dist/jsx/toolbar/HeadingPicker.native.js +167 -0
- package/dist/jsx/toolbar/HeadingPicker.native.js.map +1 -0
- package/dist/jsx/toolbar/ImageBubble.mjs +131 -0
- package/dist/jsx/toolbar/ImageBubble.mjs.map +1 -0
- package/dist/jsx/toolbar/ImageBubble.native.js +165 -0
- package/dist/jsx/toolbar/ImageBubble.native.js.map +1 -0
- package/dist/jsx/toolbar/ImageDialog.mjs +90 -0
- package/dist/jsx/toolbar/ImageDialog.mjs.map +1 -0
- package/dist/jsx/toolbar/ImageDialog.native.js +122 -0
- package/dist/jsx/toolbar/ImageDialog.native.js.map +1 -0
- package/dist/jsx/toolbar/LinkBubble.mjs +170 -0
- package/dist/jsx/toolbar/LinkBubble.mjs.map +1 -0
- package/dist/jsx/toolbar/LinkBubble.native.js +204 -0
- package/dist/jsx/toolbar/LinkBubble.native.js.map +1 -0
- package/dist/jsx/toolbar/LinkDialog.mjs +112 -0
- package/dist/jsx/toolbar/LinkDialog.mjs.map +1 -0
- package/dist/jsx/toolbar/LinkDialog.native.js +146 -0
- package/dist/jsx/toolbar/LinkDialog.native.js.map +1 -0
- package/dist/jsx/toolbar/ListPicker.mjs +92 -0
- package/dist/jsx/toolbar/ListPicker.mjs.map +1 -0
- package/dist/jsx/toolbar/ListPicker.native.js +124 -0
- package/dist/jsx/toolbar/ListPicker.native.js.map +1 -0
- package/dist/jsx/toolbar/MoreDropdown.mjs +176 -0
- package/dist/jsx/toolbar/MoreDropdown.mjs.map +1 -0
- package/dist/jsx/toolbar/MoreDropdown.native.js +224 -0
- package/dist/jsx/toolbar/MoreDropdown.native.js.map +1 -0
- package/dist/jsx/toolbar/ResizeHandle.mjs +80 -0
- package/dist/jsx/toolbar/ResizeHandle.mjs.map +1 -0
- package/dist/jsx/toolbar/ResizeHandle.native.js +109 -0
- package/dist/jsx/toolbar/ResizeHandle.native.js.map +1 -0
- package/dist/jsx/toolbar/StatusBar.mjs +66 -0
- package/dist/jsx/toolbar/StatusBar.mjs.map +1 -0
- package/dist/jsx/toolbar/StatusBar.native.js +100 -0
- package/dist/jsx/toolbar/StatusBar.native.js.map +1 -0
- package/dist/jsx/toolbar/TableBubble.mjs +207 -0
- package/dist/jsx/toolbar/TableBubble.mjs.map +1 -0
- package/dist/jsx/toolbar/TableBubble.native.js +273 -0
- package/dist/jsx/toolbar/TableBubble.native.js.map +1 -0
- package/dist/jsx/toolbar/ToolbarButton.mjs +79 -0
- package/dist/jsx/toolbar/ToolbarButton.mjs.map +1 -0
- package/dist/jsx/toolbar/ToolbarButton.native.js +97 -0
- package/dist/jsx/toolbar/ToolbarButton.native.js.map +1 -0
- package/dist/jsx/toolbar/ToolbarGroup.mjs +16 -0
- package/dist/jsx/toolbar/ToolbarGroup.mjs.map +1 -0
- package/dist/jsx/toolbar/ToolbarGroup.native.js +45 -0
- package/dist/jsx/toolbar/ToolbarGroup.native.js.map +1 -0
- package/dist/jsx/toolbar/icons.mjs +554 -0
- package/dist/jsx/toolbar/icons.mjs.map +1 -0
- package/dist/jsx/toolbar/icons.native.js +165 -0
- package/dist/jsx/toolbar/icons.native.js.map +1 -0
- package/dist/jsx/toolbar/shortcuts.mjs +36 -0
- package/dist/jsx/toolbar/shortcuts.mjs.map +1 -0
- package/dist/jsx/toolbar/shortcuts.native.js +66 -0
- package/dist/jsx/toolbar/shortcuts.native.js.map +1 -0
- package/dist/jsx/toolbar/useHorizontalScroll.mjs +223 -0
- package/dist/jsx/toolbar/useHorizontalScroll.mjs.map +1 -0
- package/dist/jsx/toolbar/useHorizontalScroll.native.js +260 -0
- package/dist/jsx/toolbar/useHorizontalScroll.native.js.map +1 -0
- package/dist/jsx/types.mjs +31 -0
- package/dist/jsx/types.mjs.map +1 -0
- package/dist/jsx/types.native.js +59 -0
- package/dist/jsx/types.native.js.map +1 -0
- package/package.json +117 -0
- package/src/RichEditor.native.tsx +161 -0
- package/src/RichEditor.stories.tsx +324 -0
- package/src/RichEditor.tsx +185 -0
- package/src/RichTextEditor/index.tsx +245 -0
- package/src/RichTextEditor/richTextEditor.spec.tsx +239 -0
- package/src/constants.ts +100 -0
- package/src/context.spec.ts +9 -0
- package/src/context.ts +16 -0
- package/src/editor/BlockDragHandle.ts +141 -0
- package/src/editor/MarkdownPaste.ts +50 -0
- package/src/editor/SlashCommands.tsx +357 -0
- package/src/editor/TentapEditor.native.tsx +269 -0
- package/src/editor/TiptapEditor.tsx +616 -0
- package/src/editor/editorStyles.spec.ts +24 -0
- package/src/editor/editorStyles.ts +260 -0
- package/src/editor/index.ts +10 -0
- package/src/editor/tentapEditor.spec.ts +125 -0
- package/src/editor/tiptapEditor.spec.tsx +169 -0
- package/src/editor/types.ts +142 -0
- package/src/editor/useEditorState.spec.ts +93 -0
- package/src/editor/useEditorState.ts +125 -0
- package/src/exports.spec.ts +128 -0
- package/src/index.ts +13 -0
- package/src/integration.spec.tsx +430 -0
- package/src/richEditor.spec.tsx +169 -0
- package/src/styled.spec.tsx +42 -0
- package/src/styled.ts +177 -0
- package/src/toolbar/BubbleToolbar.tsx +151 -0
- package/src/toolbar/CodeBlockBubble.tsx +141 -0
- package/src/toolbar/ColorPicker.tsx +211 -0
- package/src/toolbar/FixedToolbar.native.tsx +381 -0
- package/src/toolbar/FixedToolbar.tsx +252 -0
- package/src/toolbar/HeadingPicker.tsx +169 -0
- package/src/toolbar/ImageBubble.tsx +126 -0
- package/src/toolbar/ImageDialog.tsx +93 -0
- package/src/toolbar/LinkBubble.tsx +166 -0
- package/src/toolbar/LinkDialog.tsx +124 -0
- package/src/toolbar/ListPicker.tsx +121 -0
- package/src/toolbar/MoreDropdown.tsx +185 -0
- package/src/toolbar/ResizeHandle.tsx +80 -0
- package/src/toolbar/StatusBar.tsx +76 -0
- package/src/toolbar/TableBubble.tsx +197 -0
- package/src/toolbar/ToolbarButton.native.tsx +105 -0
- package/src/toolbar/ToolbarButton.tsx +114 -0
- package/src/toolbar/ToolbarGroup.tsx +38 -0
- package/src/toolbar/bubbleToolbar.spec.tsx +93 -0
- package/src/toolbar/fixedToolbar.spec.tsx +127 -0
- package/src/toolbar/icons.native.tsx +112 -0
- package/src/toolbar/icons.tsx +417 -0
- package/src/toolbar/shortcuts.ts +42 -0
- package/src/toolbar/toolbarPrimitives.spec.tsx +118 -0
- package/src/toolbar/toolbarSubComponents.spec.tsx +115 -0
- package/src/toolbar/useHorizontalScroll.tsx +270 -0
- package/src/types.spec.ts +102 -0
- package/src/types.ts +217 -0
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Native toolbar button — avoids Tooltip (from @multiplatform.one/components)
|
|
3
|
+
* and CaretDownIcon (from @phosphor-icons/react) which pull in web-only code.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type { ReactNode } from "react";
|
|
7
|
+
import type { SizeTokens } from "tamagui";
|
|
8
|
+
import { Text, XStack } from "tamagui";
|
|
9
|
+
import { Button } from "@multiplatform.one/forms";
|
|
10
|
+
import { RichEditorContext } from "../context";
|
|
11
|
+
|
|
12
|
+
// ===========================================================================
|
|
13
|
+
// Types
|
|
14
|
+
// ===========================================================================
|
|
15
|
+
|
|
16
|
+
export interface ToolbarButtonProps {
|
|
17
|
+
active?: boolean;
|
|
18
|
+
disabled?: boolean;
|
|
19
|
+
onPress: () => void;
|
|
20
|
+
children: ReactNode;
|
|
21
|
+
"aria-label": string;
|
|
22
|
+
tooltip?: string;
|
|
23
|
+
size?: SizeTokens;
|
|
24
|
+
compact?: boolean;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export interface ToolbarDropdownButtonProps {
|
|
28
|
+
active?: boolean;
|
|
29
|
+
disabled?: boolean;
|
|
30
|
+
onPress: () => void;
|
|
31
|
+
children: ReactNode;
|
|
32
|
+
"aria-label": string;
|
|
33
|
+
size?: SizeTokens;
|
|
34
|
+
compact?: boolean;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// ===========================================================================
|
|
38
|
+
// ToolbarButton
|
|
39
|
+
// ===========================================================================
|
|
40
|
+
|
|
41
|
+
export function ToolbarButton({
|
|
42
|
+
active,
|
|
43
|
+
disabled,
|
|
44
|
+
onPress,
|
|
45
|
+
children,
|
|
46
|
+
size: sizeProp,
|
|
47
|
+
compact: compactProp,
|
|
48
|
+
...props
|
|
49
|
+
}: ToolbarButtonProps) {
|
|
50
|
+
const ctx = RichEditorContext.useStyledContext();
|
|
51
|
+
const size = sizeProp ?? (ctx.size as SizeTokens);
|
|
52
|
+
const compact = compactProp ?? ctx.compact;
|
|
53
|
+
const isDisabled = disabled ?? ctx.disabled;
|
|
54
|
+
|
|
55
|
+
return (
|
|
56
|
+
<Button
|
|
57
|
+
chromeless
|
|
58
|
+
size={size}
|
|
59
|
+
compact={compact}
|
|
60
|
+
disabled={isDisabled}
|
|
61
|
+
onPress={onPress}
|
|
62
|
+
paddingHorizontal="$2"
|
|
63
|
+
{...(active ? { theme: "active" } : undefined)}
|
|
64
|
+
{...props}
|
|
65
|
+
>
|
|
66
|
+
{children}
|
|
67
|
+
</Button>
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// ===========================================================================
|
|
72
|
+
// ToolbarDropdownButton
|
|
73
|
+
// ===========================================================================
|
|
74
|
+
|
|
75
|
+
export function ToolbarDropdownButton({
|
|
76
|
+
active,
|
|
77
|
+
disabled,
|
|
78
|
+
onPress,
|
|
79
|
+
children,
|
|
80
|
+
size: sizeProp,
|
|
81
|
+
compact: compactProp,
|
|
82
|
+
...props
|
|
83
|
+
}: ToolbarDropdownButtonProps) {
|
|
84
|
+
const ctx = RichEditorContext.useStyledContext();
|
|
85
|
+
const size = sizeProp ?? (ctx.size as SizeTokens);
|
|
86
|
+
const compact = compactProp ?? ctx.compact;
|
|
87
|
+
const isDisabled = disabled ?? ctx.disabled;
|
|
88
|
+
|
|
89
|
+
return (
|
|
90
|
+
<Button
|
|
91
|
+
chromeless
|
|
92
|
+
size={size}
|
|
93
|
+
compact={compact}
|
|
94
|
+
disabled={isDisabled}
|
|
95
|
+
onPress={onPress}
|
|
96
|
+
{...(active ? { theme: "active" } : undefined)}
|
|
97
|
+
{...props}
|
|
98
|
+
>
|
|
99
|
+
<XStack alignItems="center" gap="$1">
|
|
100
|
+
{children}
|
|
101
|
+
<Text fontSize={10}>{"▼"}</Text>
|
|
102
|
+
</XStack>
|
|
103
|
+
</Button>
|
|
104
|
+
);
|
|
105
|
+
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Toolbar button primitives for the rich text editor.
|
|
3
|
+
*
|
|
4
|
+
* ToolbarButton: square icon button (fixed aspect ratio)
|
|
5
|
+
* ToolbarDropdownButton: button with trailing caret (variable width, fixed height)
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { ReactNode } from "react";
|
|
9
|
+
import { XStack, View } from "tamagui";
|
|
10
|
+
import { Button } from "@multiplatform.one/forms";
|
|
11
|
+
import { Tooltip } from "@multiplatform.one/components";
|
|
12
|
+
import { CaretDownIcon } from "@phosphor-icons/react";
|
|
13
|
+
import { RichEditorContext } from "../context";
|
|
14
|
+
|
|
15
|
+
const BUTTON_SIZE = 30;
|
|
16
|
+
|
|
17
|
+
// ===========================================================================
|
|
18
|
+
// Types
|
|
19
|
+
// ===========================================================================
|
|
20
|
+
|
|
21
|
+
export interface ToolbarButtonProps {
|
|
22
|
+
active?: boolean;
|
|
23
|
+
disabled?: boolean;
|
|
24
|
+
onPress: () => void;
|
|
25
|
+
children: ReactNode;
|
|
26
|
+
"aria-label": string;
|
|
27
|
+
tooltip?: string;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export interface ToolbarDropdownButtonProps {
|
|
31
|
+
active?: boolean;
|
|
32
|
+
disabled?: boolean;
|
|
33
|
+
onPress: () => void;
|
|
34
|
+
children: ReactNode;
|
|
35
|
+
"aria-label": string;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// ===========================================================================
|
|
39
|
+
// ToolbarButton (square)
|
|
40
|
+
// ===========================================================================
|
|
41
|
+
|
|
42
|
+
export function ToolbarButton({
|
|
43
|
+
active,
|
|
44
|
+
disabled,
|
|
45
|
+
onPress,
|
|
46
|
+
children,
|
|
47
|
+
tooltip,
|
|
48
|
+
...props
|
|
49
|
+
}: ToolbarButtonProps) {
|
|
50
|
+
const ctx = RichEditorContext.useStyledContext();
|
|
51
|
+
const isDisabled = disabled ?? ctx.disabled;
|
|
52
|
+
|
|
53
|
+
const button = (
|
|
54
|
+
<Button
|
|
55
|
+
chromeless
|
|
56
|
+
disabled={isDisabled}
|
|
57
|
+
onPress={onPress}
|
|
58
|
+
width={BUTTON_SIZE}
|
|
59
|
+
height={BUTTON_SIZE}
|
|
60
|
+
padding={0}
|
|
61
|
+
borderRadius="$2"
|
|
62
|
+
{...(active ? { theme: "active" } : undefined)}
|
|
63
|
+
{...props}
|
|
64
|
+
>
|
|
65
|
+
<View alignItems="center" justifyContent="center" width="100%" height="100%">
|
|
66
|
+
{children}
|
|
67
|
+
</View>
|
|
68
|
+
</Button>
|
|
69
|
+
);
|
|
70
|
+
|
|
71
|
+
if (tooltip) {
|
|
72
|
+
return (
|
|
73
|
+
<Tooltip content={tooltip} placement="bottom" delay={400}>
|
|
74
|
+
{button}
|
|
75
|
+
</Tooltip>
|
|
76
|
+
);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return button;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// ===========================================================================
|
|
83
|
+
// ToolbarDropdownButton (fixed height, variable width)
|
|
84
|
+
// ===========================================================================
|
|
85
|
+
|
|
86
|
+
export function ToolbarDropdownButton({
|
|
87
|
+
active,
|
|
88
|
+
disabled,
|
|
89
|
+
onPress,
|
|
90
|
+
children,
|
|
91
|
+
...props
|
|
92
|
+
}: ToolbarDropdownButtonProps) {
|
|
93
|
+
const ctx = RichEditorContext.useStyledContext();
|
|
94
|
+
const isDisabled = disabled ?? ctx.disabled;
|
|
95
|
+
|
|
96
|
+
return (
|
|
97
|
+
<Button
|
|
98
|
+
chromeless
|
|
99
|
+
disabled={isDisabled}
|
|
100
|
+
onPress={onPress}
|
|
101
|
+
height={BUTTON_SIZE}
|
|
102
|
+
paddingHorizontal="$2"
|
|
103
|
+
paddingVertical={0}
|
|
104
|
+
borderRadius="$2"
|
|
105
|
+
{...(active ? { theme: "active" } : undefined)}
|
|
106
|
+
{...props}
|
|
107
|
+
>
|
|
108
|
+
<XStack alignItems="center" gap="$1">
|
|
109
|
+
{children}
|
|
110
|
+
<CaretDownIcon size={10} />
|
|
111
|
+
</XStack>
|
|
112
|
+
</Button>
|
|
113
|
+
);
|
|
114
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Toolbar group wrapper with trailing separator and visibility control
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import type { ReactNode } from "react";
|
|
6
|
+
import { ToolbarGroupFrame, ToolbarSeparatorFrame } from "../styled";
|
|
7
|
+
|
|
8
|
+
// ===========================================================================
|
|
9
|
+
// Types
|
|
10
|
+
// ===========================================================================
|
|
11
|
+
|
|
12
|
+
export interface ToolbarGroupProps {
|
|
13
|
+
/** Group content (toolbar buttons) */
|
|
14
|
+
children: ReactNode;
|
|
15
|
+
/** Whether the group is visible (hides entire group when false) */
|
|
16
|
+
visible?: boolean;
|
|
17
|
+
/** Whether to show the trailing separator (default: true) */
|
|
18
|
+
showSeparator?: boolean;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// ===========================================================================
|
|
22
|
+
// ToolbarGroup
|
|
23
|
+
// ===========================================================================
|
|
24
|
+
|
|
25
|
+
export function ToolbarGroup({
|
|
26
|
+
children,
|
|
27
|
+
visible = true,
|
|
28
|
+
showSeparator = true,
|
|
29
|
+
}: ToolbarGroupProps) {
|
|
30
|
+
if (!visible) return null;
|
|
31
|
+
|
|
32
|
+
return (
|
|
33
|
+
<>
|
|
34
|
+
<ToolbarGroupFrame>{children}</ToolbarGroupFrame>
|
|
35
|
+
{showSeparator && <ToolbarSeparatorFrame />}
|
|
36
|
+
</>
|
|
37
|
+
);
|
|
38
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { describe, it, expect, vi } from "vitest";
|
|
2
|
+
import { renderWithProviders } from "@multiplatform.one/test-utils";
|
|
3
|
+
import { RichEditorContext } from "../context";
|
|
4
|
+
import { defaultEditorState } from "../types";
|
|
5
|
+
|
|
6
|
+
vi.mock("@multiplatform.one/forms", () => ({
|
|
7
|
+
Button: (props: any) => (
|
|
8
|
+
<button
|
|
9
|
+
role="button"
|
|
10
|
+
aria-label={props["aria-label"]}
|
|
11
|
+
disabled={props.disabled}
|
|
12
|
+
onClick={props.onPress}
|
|
13
|
+
>
|
|
14
|
+
{props.children}
|
|
15
|
+
</button>
|
|
16
|
+
),
|
|
17
|
+
}));
|
|
18
|
+
|
|
19
|
+
vi.mock("@multiplatform.one/components", () => ({
|
|
20
|
+
Tooltip: ({ children }: any) => children,
|
|
21
|
+
}));
|
|
22
|
+
|
|
23
|
+
vi.mock("@tiptap/react/menus", () => ({
|
|
24
|
+
BubbleMenu: ({ children, editor: _editor }: any) => (
|
|
25
|
+
<div data-testid="bubble-menu">{children}</div>
|
|
26
|
+
),
|
|
27
|
+
}));
|
|
28
|
+
|
|
29
|
+
const { BubbleToolbar } = await import("./BubbleToolbar");
|
|
30
|
+
|
|
31
|
+
function withContext(ui: React.ReactElement) {
|
|
32
|
+
return (
|
|
33
|
+
<RichEditorContext.Provider size="$true" compact={false} disabled={false}>
|
|
34
|
+
{ui}
|
|
35
|
+
</RichEditorContext.Provider>
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
describe("BubbleToolbar", () => {
|
|
40
|
+
it("renders inline formatting buttons only", () => {
|
|
41
|
+
const editorRef = { current: null };
|
|
42
|
+
const mockEditor = {} as any;
|
|
43
|
+
|
|
44
|
+
const { container } = renderWithProviders(
|
|
45
|
+
withContext(
|
|
46
|
+
<BubbleToolbar editor={mockEditor} editorRef={editorRef} state={defaultEditorState} />,
|
|
47
|
+
),
|
|
48
|
+
);
|
|
49
|
+
|
|
50
|
+
const buttons = container.querySelectorAll("[role='button']");
|
|
51
|
+
const labels = Array.from(buttons).map((b) => b.getAttribute("aria-label"));
|
|
52
|
+
|
|
53
|
+
// Inline formatting buttons should be present
|
|
54
|
+
expect(labels).toContain("Bold");
|
|
55
|
+
expect(labels).toContain("Italic");
|
|
56
|
+
expect(labels).toContain("Underline");
|
|
57
|
+
expect(labels).toContain("Strikethrough");
|
|
58
|
+
expect(labels).toContain("Code");
|
|
59
|
+
expect(labels).toContain("Subscript");
|
|
60
|
+
expect(labels).toContain("Superscript");
|
|
61
|
+
expect(labels).toContain("Text Color");
|
|
62
|
+
expect(labels).toContain("Highlight Color");
|
|
63
|
+
expect(labels).toContain("Link");
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
it("does not render heading, list, or alignment controls", () => {
|
|
67
|
+
const editorRef = { current: null };
|
|
68
|
+
const mockEditor = {} as any;
|
|
69
|
+
|
|
70
|
+
const { container } = renderWithProviders(
|
|
71
|
+
withContext(
|
|
72
|
+
<BubbleToolbar editor={mockEditor} editorRef={editorRef} state={defaultEditorState} />,
|
|
73
|
+
),
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
const buttons = container.querySelectorAll("[role='button']");
|
|
77
|
+
const labels = Array.from(buttons).map((b) => b.getAttribute("aria-label"));
|
|
78
|
+
|
|
79
|
+
// Heading, list, alignment, block controls should NOT be present
|
|
80
|
+
expect(labels).not.toContain("Heading");
|
|
81
|
+
expect(labels).not.toContain("Lists");
|
|
82
|
+
expect(labels).not.toContain("Align Left");
|
|
83
|
+
expect(labels).not.toContain("Align Center");
|
|
84
|
+
expect(labels).not.toContain("Align Right");
|
|
85
|
+
expect(labels).not.toContain("Blockquote");
|
|
86
|
+
expect(labels).not.toContain("Code Block");
|
|
87
|
+
expect(labels).not.toContain("Horizontal Rule");
|
|
88
|
+
expect(labels).not.toContain("Clear Formatting");
|
|
89
|
+
expect(labels).not.toContain("Insert Image");
|
|
90
|
+
expect(labels).not.toContain("Undo");
|
|
91
|
+
expect(labels).not.toContain("Redo");
|
|
92
|
+
});
|
|
93
|
+
});
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { describe, it, expect, vi } from "vitest";
|
|
2
|
+
import { renderWithProviders } from "@multiplatform.one/test-utils";
|
|
3
|
+
import { RichEditorContext } from "../context";
|
|
4
|
+
import { defaultEditorState } from "../types";
|
|
5
|
+
import type { ToolbarSection } from "../types";
|
|
6
|
+
|
|
7
|
+
vi.mock("@multiplatform.one/forms", () => ({
|
|
8
|
+
Button: (props: any) => (
|
|
9
|
+
<button
|
|
10
|
+
role="button"
|
|
11
|
+
aria-label={props["aria-label"]}
|
|
12
|
+
disabled={props.disabled}
|
|
13
|
+
onClick={props.onPress}
|
|
14
|
+
data-active={props.theme === "active" ? "true" : undefined}
|
|
15
|
+
>
|
|
16
|
+
{props.children}
|
|
17
|
+
</button>
|
|
18
|
+
),
|
|
19
|
+
}));
|
|
20
|
+
|
|
21
|
+
vi.mock("@multiplatform.one/components", () => ({
|
|
22
|
+
Tooltip: ({ children }: any) => children,
|
|
23
|
+
}));
|
|
24
|
+
|
|
25
|
+
const { FixedToolbar } = await import("./FixedToolbar");
|
|
26
|
+
|
|
27
|
+
function withContext(ui: React.ReactElement) {
|
|
28
|
+
return (
|
|
29
|
+
<RichEditorContext.Provider size="$true" compact={false} disabled={false}>
|
|
30
|
+
{ui}
|
|
31
|
+
</RichEditorContext.Provider>
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
describe("FixedToolbar (web)", () => {
|
|
36
|
+
it("renders primary toolbar groups and the More overflow button", () => {
|
|
37
|
+
const editorRef = { current: null };
|
|
38
|
+
const { container } = renderWithProviders(
|
|
39
|
+
withContext(<FixedToolbar editorRef={editorRef} state={defaultEditorState} />),
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
const buttons = container.querySelectorAll("[role='button']");
|
|
43
|
+
const labels = Array.from(buttons).map((b) => b.getAttribute("aria-label"));
|
|
44
|
+
|
|
45
|
+
// Primary groups (always visible)
|
|
46
|
+
expect(labels).toContain("Undo");
|
|
47
|
+
expect(labels).toContain("Redo");
|
|
48
|
+
expect(labels).toContain("Bold");
|
|
49
|
+
expect(labels).toContain("Italic");
|
|
50
|
+
expect(labels).toContain("Underline");
|
|
51
|
+
expect(labels).toContain("Strikethrough");
|
|
52
|
+
expect(labels).toContain("Text Color");
|
|
53
|
+
expect(labels).toContain("Highlight Color");
|
|
54
|
+
expect(labels).toContain("Heading");
|
|
55
|
+
expect(labels).toContain("Lists");
|
|
56
|
+
expect(labels).toContain("Blockquote");
|
|
57
|
+
expect(labels).toContain("Code Block");
|
|
58
|
+
expect(labels).toContain("Link");
|
|
59
|
+
expect(labels).toContain("Insert Image");
|
|
60
|
+
|
|
61
|
+
// Overflow items are inside the More dropdown (not directly visible)
|
|
62
|
+
expect(labels).toContain("More formatting options");
|
|
63
|
+
expect(labels).not.toContain("Align Left");
|
|
64
|
+
expect(labels).not.toContain("Clear Formatting");
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
it("sections prop controls visibility of toolbar groups", () => {
|
|
68
|
+
const editorRef = { current: null };
|
|
69
|
+
const sections: ToolbarSection[] = ["formatting", "link"];
|
|
70
|
+
const { container } = renderWithProviders(
|
|
71
|
+
withContext(
|
|
72
|
+
<FixedToolbar editorRef={editorRef} state={defaultEditorState} sections={sections} />,
|
|
73
|
+
),
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
const buttons = container.querySelectorAll("[role='button']");
|
|
77
|
+
const labels = Array.from(buttons).map((b) => b.getAttribute("aria-label"));
|
|
78
|
+
|
|
79
|
+
// Visible sections
|
|
80
|
+
expect(labels).toContain("Bold");
|
|
81
|
+
expect(labels).toContain("Link");
|
|
82
|
+
|
|
83
|
+
// Hidden sections
|
|
84
|
+
expect(labels).not.toContain("Undo");
|
|
85
|
+
expect(labels).not.toContain("Heading");
|
|
86
|
+
expect(labels).not.toContain("Insert Image");
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
it("renders with all primary sections visible when sections prop is omitted", () => {
|
|
90
|
+
const editorRef = { current: null };
|
|
91
|
+
const { container } = renderWithProviders(
|
|
92
|
+
withContext(<FixedToolbar editorRef={editorRef} state={defaultEditorState} />),
|
|
93
|
+
);
|
|
94
|
+
|
|
95
|
+
const buttons = container.querySelectorAll("[role='button']");
|
|
96
|
+
const labels = Array.from(buttons).map((b) => b.getAttribute("aria-label"));
|
|
97
|
+
|
|
98
|
+
expect(labels).toContain("Undo");
|
|
99
|
+
expect(labels).toContain("Bold");
|
|
100
|
+
expect(labels).toContain("Text Color");
|
|
101
|
+
expect(labels).toContain("Heading");
|
|
102
|
+
expect(labels).toContain("Lists");
|
|
103
|
+
expect(labels).toContain("Blockquote");
|
|
104
|
+
expect(labels).toContain("Link");
|
|
105
|
+
expect(labels).toContain("Insert Image");
|
|
106
|
+
expect(labels).toContain("More formatting options");
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
it("correctly orders groups: History before Formatting before Color", () => {
|
|
110
|
+
const editorRef = { current: null };
|
|
111
|
+
const { container } = renderWithProviders(
|
|
112
|
+
withContext(<FixedToolbar editorRef={editorRef} state={defaultEditorState} />),
|
|
113
|
+
);
|
|
114
|
+
|
|
115
|
+
const buttons = container.querySelectorAll("[role='button']");
|
|
116
|
+
const labels = Array.from(buttons).map((b) => b.getAttribute("aria-label"));
|
|
117
|
+
|
|
118
|
+
const undoIdx = labels.indexOf("Undo");
|
|
119
|
+
const boldIdx = labels.indexOf("Bold");
|
|
120
|
+
const textColorIdx = labels.indexOf("Text Color");
|
|
121
|
+
const headingIdx = labels.indexOf("Heading");
|
|
122
|
+
|
|
123
|
+
expect(undoIdx).toBeLessThan(boldIdx);
|
|
124
|
+
expect(boldIdx).toBeLessThan(textColorIdx);
|
|
125
|
+
expect(textColorIdx).toBeLessThan(headingIdx);
|
|
126
|
+
});
|
|
127
|
+
});
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Native icon components for the rich text editor toolbar
|
|
3
|
+
*
|
|
4
|
+
* Text-based replacements for the web SVG icons.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { Text, styled } from "tamagui";
|
|
8
|
+
|
|
9
|
+
// ===========================================================================
|
|
10
|
+
// Text Style Icons (same as web)
|
|
11
|
+
// ===========================================================================
|
|
12
|
+
|
|
13
|
+
export const BoldIcon = styled(Text, {
|
|
14
|
+
fontWeight: "bold",
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
export const ItalicIcon = styled(Text, {
|
|
18
|
+
fontStyle: "italic",
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
export const UnderlineIcon = styled(Text, {
|
|
22
|
+
textDecorationLine: "underline",
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
export const StrikeIcon = styled(Text, {
|
|
26
|
+
textDecorationLine: "line-through",
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
// ===========================================================================
|
|
30
|
+
// Text-based icon replacements for native
|
|
31
|
+
// ===========================================================================
|
|
32
|
+
|
|
33
|
+
const IconText = styled(Text, {
|
|
34
|
+
fontSize: 13,
|
|
35
|
+
color: "$color11",
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
export function UndoIcon() {
|
|
39
|
+
return <IconText>{"↩"}</IconText>;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export function RedoIcon() {
|
|
43
|
+
return <IconText>{"↪"}</IconText>;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export function AlignLeftIcon() {
|
|
47
|
+
return <IconText>{"☰"}</IconText>;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export function AlignCenterIcon() {
|
|
51
|
+
return <IconText>{"☰"}</IconText>;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export function AlignRightIcon() {
|
|
55
|
+
return <IconText>{"☰"}</IconText>;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export function AlignJustifyIcon() {
|
|
59
|
+
return <IconText>{"☰"}</IconText>;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export function LinkIcon() {
|
|
63
|
+
return <IconText>{"🔗"}</IconText>;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export function TextColorIcon(_props: { color?: string | null }) {
|
|
67
|
+
return <IconText>{"A"}</IconText>;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export function HighlightIcon(_props: { color?: string | null }) {
|
|
71
|
+
return <IconText>{"🖊"}</IconText>;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export function HorizontalRuleIcon() {
|
|
75
|
+
return <IconText>{"―"}</IconText>;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export function ClearFormattingIcon() {
|
|
79
|
+
return <IconText>{"✕"}</IconText>;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export function SubscriptIcon() {
|
|
83
|
+
return <IconText>{"X₂"}</IconText>;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export function SuperscriptIcon() {
|
|
87
|
+
return <IconText>{"X²"}</IconText>;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export function BulletListIcon() {
|
|
91
|
+
return <IconText>{"•≡"}</IconText>;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export function OrderedListIcon() {
|
|
95
|
+
return <IconText>{"1."}</IconText>;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export function TaskListIcon() {
|
|
99
|
+
return <IconText>{"☑"}</IconText>;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export function ImageIcon() {
|
|
103
|
+
return <IconText>{"🖼"}</IconText>;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export function BlockquoteIcon() {
|
|
107
|
+
return <IconText>{"❝"}</IconText>;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export function CodeBlockIcon() {
|
|
111
|
+
return <IconText>{"</>"}</IconText>;
|
|
112
|
+
}
|