UNPKG

@platejs/utils

Version:
1 lines 17.5 kB
{"version":3,"sources":["../../src/react/hooks/useEditorString.ts","../../src/react/hooks/useFormInputProps.ts","../../src/react/hooks/useMarkToolbarButton.ts","../../src/react/hooks/useRemoveNodeButton.ts","../../src/react/hooks/useSelection.ts","../../src/react/hooks/useSelectionFragment.ts","../../src/react/plugins/BlockPlaceholderPlugin.tsx","../../src/lib/plate-keys.ts"],"sourcesContent":["import { useEditorSelector } from '@platejs/core/react';\n\nexport const useEditorString = () => {\n return useEditorSelector((editor) => editor.api.string([]), []);\n};\n","interface InputProps {\n /**\n * Should we activate the onKeyDownCapture handler to preventDefault when the\n * user presses enter?\n */\n preventDefaultOnEnterKeydown?: boolean;\n}\n\n/**\n * Hook to allow the user to spread a set of predefined props to the Div wrapper\n * of an Input element\n *\n * @param param0 An options object which can be expanded to add further\n * functionality\n * @returns A props object which can be spread onto the element\n */\nexport const useFormInputProps = (options?: InputProps) => {\n // Nothing provided to just return an empty object which can still be spread.\n // If we need to add more functionality later we will still be able to do so\n if (!options) return { props: {} };\n\n // Destructure our options so we can use them\n const { preventDefaultOnEnterKeydown } = options;\n\n /**\n * Handle the keydown capture event and prevent the default behaviour when the\n * user presses enter.\n *\n * In the event the user presses enter on a field such as a link, prior to\n * filling in both label and url, the default behaviour is to submit the form.\n * This, ultimately, results in no link being added as you need to fill both\n * fields to pass validation.\n *\n * By calling preventDefault we short circuit the form's submission thus\n * allowing the user to continue filling in the other fields\n *\n * @param e The original event which was provided by the VDOM implement their\n * own behaviour on this event\n */\n const handleEnterKeydownCapture = (\n e: React.KeyboardEvent<HTMLDivElement>\n ) => {\n // Prevent the form from submitting\n if (e.key === 'Enter' || e.keyCode === 13) {\n e.preventDefault();\n }\n };\n\n return {\n props: {\n onKeyDownCapture: preventDefaultOnEnterKeydown\n ? (e: React.KeyboardEvent<HTMLDivElement>) =>\n handleEnterKeydownCapture(e)\n : undefined,\n },\n };\n};\n","import { useEditorRef, useEditorSelector } from '@platejs/core/react';\n\nexport const useMarkToolbarButtonState = ({\n clear,\n nodeType,\n}: {\n nodeType: string;\n clear?: string[] | string;\n}) => {\n const pressed = useEditorSelector(\n (editor) => editor.api.hasMark(nodeType),\n [nodeType]\n );\n\n return {\n clear,\n nodeType,\n pressed,\n };\n};\n\nexport const useMarkToolbarButton = (\n state: ReturnType<typeof useMarkToolbarButtonState>\n) => {\n const editor = useEditorRef();\n\n return {\n props: {\n pressed: state.pressed,\n onClick: () => {\n editor.tf.toggleMark(state.nodeType, { remove: state.clear });\n editor.tf.focus();\n },\n onMouseDown: (e: React.MouseEvent<HTMLButtonElement>) => {\n e.preventDefault();\n },\n },\n };\n};\n","import type { TElement } from '@platejs/slate';\n\nimport { useEditorRef } from '@platejs/core/react';\n\nexport const useRemoveNodeButton = ({ element }: { element: TElement }) => {\n const editor = useEditorRef();\n\n return {\n props: {\n onClick: () => {\n const path = editor.api.findPath(element);\n\n editor.tf.removeNodes({ at: path });\n },\n onMouseDown: (e: React.MouseEvent<HTMLButtonElement>) => {\n e.preventDefault();\n },\n },\n };\n};\n","import { useEditorSelector } from '@platejs/core/react';\n\nexport function useSelectionCollapsed() {\n return useEditorSelector((editor) => !editor.api.isExpanded(), []);\n}\n\nexport function useSelectionExpanded() {\n return useEditorSelector((editor) => editor.api.isExpanded(), []);\n}\n\nexport function useSelectionWithinBlock() {\n return useEditorSelector((editor) => editor.api.isAt({ block: true }), []);\n}\n\nexport function useSelectionAcrossBlocks() {\n return useEditorSelector((editor) => editor.api.isAt({ blocks: true }), []);\n}\n","import type { EditorPropOptions, TElement } from '@platejs/slate';\n\nimport { getContainerTypes } from '@platejs/core';\nimport { useEditorSelector } from '@platejs/core/react';\n\nexport const useSelectionFragment = () => {\n return useEditorSelector((editor) => {\n return editor.api.fragment(editor.selection, {\n unwrap: getContainerTypes(editor),\n });\n }, []);\n};\n\nexport const useSelectionFragmentProp = (\n options: Omit<EditorPropOptions, 'nodes'> = {}\n) => {\n return useEditorSelector((editor) => {\n const fragment = editor.api.fragment<TElement>(editor.selection, {\n unwrap: getContainerTypes(editor),\n });\n\n return editor.api.prop({ nodes: fragment, ...options });\n }, []);\n};\n","import React from 'react';\n\nimport type { PluginConfig } from '@platejs/core';\nimport type { Path, TElement } from '@platejs/slate';\n\nimport {\n type PlatePluginContext,\n createTPlatePlugin,\n useEditorComposing,\n useEditorReadOnly,\n useEditorSelector,\n useFocused,\n usePluginOption,\n} from '@platejs/core/react';\n\nimport { KEYS } from '../../lib';\n\nexport type BlockPlaceholderConfig = PluginConfig<\n 'blockPlaceholder',\n {\n _target: { node: TElement; placeholder: string } | null;\n placeholders: Record<string, string>;\n query: (\n context: PlatePluginContext<BlockPlaceholderConfig> & {\n node: TElement;\n path: Path;\n }\n ) => boolean;\n className?: string;\n }\n>;\n\nexport const BlockPlaceholderPlugin =\n createTPlatePlugin<BlockPlaceholderConfig>({\n key: KEYS.blockPlaceholder,\n editOnly: true,\n options: {\n _target: null,\n placeholders: {\n [KEYS.p]: 'Type something...',\n },\n query: ({ path }) => {\n return path.length === 1;\n },\n },\n useHooks: (ctx) => {\n const { editor, getOptions, setOption } = ctx;\n const focused = useFocused();\n\n const readOnly = useEditorReadOnly();\n const composing = useEditorComposing();\n const entry = useEditorSelector(() => {\n if (\n readOnly ||\n composing ||\n !focused ||\n !editor.selection ||\n editor.api.isExpanded()\n )\n return null;\n\n return editor.api.block();\n }, [readOnly, composing, focused]);\n\n React.useEffect(() => {\n if (!entry) {\n setOption('_target', null);\n return;\n }\n\n const { placeholders, query } = getOptions();\n\n const [element, path] = entry;\n\n // const getPlaceholder = (node: TElement) => {\n // if (node?.listStyleType) {\n // switch (node.listStyleType) {\n // case 'disc':\n // return 'List';\n // break;\n // case 'decimal':\n // return 'List';\n // break;\n // case 'todo':\n // return 'To-do';\n // break;\n // }\n // }\n\n // const key = getPluginKey(editor, node.type);\n // if (!key) return;\n\n // return placeholders?.[key];\n // }\n\n const placeholder = Object.keys(placeholders).find(\n (key) => editor.getType(key) === element.type\n );\n\n if (\n query({ ...ctx, node: element, path }) &&\n placeholder &&\n editor.api.isEmpty(element) &&\n !editor.api.isEmpty()\n ) {\n setOption('_target', {\n node: element,\n placeholder: placeholders[placeholder],\n });\n } else {\n setOption('_target', null);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [editor, entry, setOption, getOptions]);\n },\n })\n .extendSelectors(({ getOption }) => ({\n placeholder: (node: TElement) => {\n const target = getOption('_target');\n\n if (target?.node === node) {\n return target.placeholder;\n }\n },\n }))\n .extend({\n inject: {\n isBlock: true,\n nodeProps: {\n transformProps: (props) => {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const placeholder = usePluginOption(\n props.plugin,\n 'placeholder',\n props.element!\n );\n\n if (placeholder) {\n return {\n className: props.getOption('className'),\n placeholder,\n };\n }\n },\n },\n },\n });\n","export const NODES = {\n a: 'a',\n ai: 'ai',\n aiChat: 'aiChat',\n audio: 'audio',\n blockquote: 'blockquote',\n bold: 'bold',\n callout: 'callout',\n code: 'code',\n codeBlock: 'code_block',\n codeLine: 'code_line',\n codeSyntax: 'code_syntax',\n column: 'column',\n columnGroup: 'column_group',\n comment: 'comment',\n date: 'date',\n emojiInput: 'emoji_input',\n equation: 'equation',\n excalidraw: 'excalidraw',\n file: 'file',\n h1: 'h1',\n h2: 'h2',\n h3: 'h3',\n h4: 'h4',\n h5: 'h5',\n h6: 'h6',\n highlight: 'highlight',\n hr: 'hr',\n img: 'img',\n inlineEquation: 'inline_equation',\n italic: 'italic',\n kbd: 'kbd',\n li: 'li',\n lic: 'lic',\n link: 'a',\n listTodoClassic: 'action_item',\n mediaEmbed: 'media_embed',\n mention: 'mention',\n mentionInput: 'mention_input',\n olClassic: 'ol',\n p: 'p',\n searchHighlight: 'search_highlight',\n slashInput: 'slash_input',\n strikethrough: 'strikethrough',\n sub: 'subscript',\n suggestion: 'suggestion',\n sup: 'superscript',\n table: 'table',\n tag: 'tag',\n taskList: 'taskList',\n td: 'td',\n th: 'th',\n toc: 'toc',\n toggle: 'toggle',\n tr: 'tr',\n ulClassic: 'ul',\n underline: 'underline',\n video: 'video',\n} as const;\n\nexport const STYLE_KEYS = {\n backgroundColor: 'backgroundColor',\n color: 'color',\n fontFamily: 'fontFamily',\n fontSize: 'fontSize',\n fontWeight: 'fontWeight',\n indent: 'indent',\n lineHeight: 'lineHeight',\n listType: 'listStyleType',\n textAlign: 'textAlign',\n textIndent: 'textIndent',\n} as const;\n\nexport const KEYS = {\n ...NODES,\n ...STYLE_KEYS,\n autoformat: 'autoformat',\n blockMenu: 'blockMenu',\n blockPlaceholder: 'blockPlaceholder',\n blockSelection: 'blockSelection',\n caption: 'caption',\n copilot: 'copilot',\n csv: 'csv',\n cursorOverlay: 'cursorOverlay',\n delete: 'delete',\n dnd: 'dnd',\n docx: 'docx',\n emoji: 'emoji',\n exitBreak: 'exitBreak',\n heading: ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'] as string[],\n html: 'html',\n juice: 'juice',\n list: 'list',\n listChecked: 'checked',\n listClassic: 'listClassic',\n listRestart: 'listRestart',\n listRestartPolite: 'listRestartPolite',\n listStart: 'listStart',\n listTodo: 'todo',\n markdown: 'markdown',\n nodeId: 'nodeId',\n normalizeTypes: 'normalizeTypes',\n ol: 'decimal',\n placeholder: 'placeholder',\n playwright: 'playwright',\n removeEmptyNodes: 'removeEmptyNodes',\n resetNode: 'resetNode',\n singleBlock: 'singleBlock',\n singleLine: 'singleLine',\n slashCommand: 'slash_command',\n softBreak: 'softBreak',\n tabbable: 'tabbable',\n trailingBlock: 'trailingBlock',\n ul: 'disc',\n yjs: 'yjs',\n} as const;\n\nexport type NodeKey = (typeof NODES)[keyof typeof NODES];\nexport type StyleKey = (typeof STYLE_KEYS)[keyof typeof STYLE_KEYS];\nexport type PlateKey = (typeof KEYS)[keyof typeof KEYS];\n"],"mappings":"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","names":["useEditorSelector","useEditorRef","useEditorSelector","useEditorSelector","useEditorSelector","useEditorSelector"]}