@strapi/content-manager 5.45.1 → 5.46.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/dist/admin/constants/hooks.js +5 -0
- package/dist/admin/constants/hooks.js.map +1 -1
- package/dist/admin/constants/hooks.mjs +5 -0
- package/dist/admin/constants/hooks.mjs.map +1 -1
- package/dist/admin/content-manager.js +26 -2
- package/dist/admin/content-manager.js.map +1 -1
- package/dist/admin/content-manager.mjs +26 -2
- package/dist/admin/content-manager.mjs.map +1 -1
- package/dist/admin/history/components/VersionInputRenderer.js +1 -1
- package/dist/admin/history/components/VersionInputRenderer.js.map +1 -1
- package/dist/admin/history/components/VersionInputRenderer.mjs +1 -1
- package/dist/admin/history/components/VersionInputRenderer.mjs.map +1 -1
- package/dist/admin/hooks/usePersistentQueryParams.js +4 -1
- package/dist/admin/hooks/usePersistentQueryParams.js.map +1 -1
- package/dist/admin/hooks/usePersistentQueryParams.mjs +4 -1
- package/dist/admin/hooks/usePersistentQueryParams.mjs.map +1 -1
- package/dist/admin/pages/ComponentConfigurationPage.js +2 -45
- package/dist/admin/pages/ComponentConfigurationPage.js.map +1 -1
- package/dist/admin/pages/ComponentConfigurationPage.mjs +3 -46
- package/dist/admin/pages/ComponentConfigurationPage.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.js +21 -4
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.mjs +19 -2
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Link.mjs +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js +9 -6
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.mjs +10 -7
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.js +1 -34
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.mjs +3 -35
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.js +33 -18
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.mjs +34 -19
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/DefaultBlocksStore.js +22 -0
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/DefaultBlocksStore.js.map +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/DefaultBlocksStore.mjs +20 -0
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/DefaultBlocksStore.mjs.map +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js +15 -4
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs +16 -5
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js +26 -4
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs +26 -4
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js +31 -0
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs +31 -0
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs.map +1 -1
- package/dist/admin/pages/ListConfiguration/ListConfigurationPage.js +11 -3
- package/dist/admin/pages/ListConfiguration/ListConfigurationPage.js.map +1 -1
- package/dist/admin/pages/ListConfiguration/ListConfigurationPage.mjs +11 -3
- package/dist/admin/pages/ListConfiguration/ListConfigurationPage.mjs.map +1 -1
- package/dist/admin/pages/ListView/ListViewPage.js +1 -0
- package/dist/admin/pages/ListView/ListViewPage.js.map +1 -1
- package/dist/admin/pages/ListView/ListViewPage.mjs +1 -0
- package/dist/admin/pages/ListView/ListViewPage.mjs.map +1 -1
- package/dist/admin/pages/ListView/components/Filters.js +38 -4
- package/dist/admin/pages/ListView/components/Filters.js.map +1 -1
- package/dist/admin/pages/ListView/components/Filters.mjs +39 -5
- package/dist/admin/pages/ListView/components/Filters.mjs.map +1 -1
- package/dist/admin/pages/formatComponentConfigurationEditLayout.js +58 -0
- package/dist/admin/pages/formatComponentConfigurationEditLayout.js.map +1 -0
- package/dist/admin/pages/formatComponentConfigurationEditLayout.mjs +56 -0
- package/dist/admin/pages/formatComponentConfigurationEditLayout.mjs.map +1 -0
- package/dist/admin/preview/components/InputPopover.js +3 -0
- package/dist/admin/preview/components/InputPopover.js.map +1 -1
- package/dist/admin/preview/components/InputPopover.mjs +3 -0
- package/dist/admin/preview/components/InputPopover.mjs.map +1 -1
- package/dist/admin/preview/hooks/usePreviewInputManager.js +24 -0
- package/dist/admin/preview/hooks/usePreviewInputManager.js.map +1 -1
- package/dist/admin/preview/hooks/usePreviewInputManager.mjs +24 -0
- package/dist/admin/preview/hooks/usePreviewInputManager.mjs.map +1 -1
- package/dist/admin/preview/utils/previewScript.js +616 -78
- package/dist/admin/preview/utils/previewScript.js.map +1 -1
- package/dist/admin/preview/utils/previewScript.mjs +616 -78
- package/dist/admin/preview/utils/previewScript.mjs.map +1 -1
- package/dist/admin/src/constants/hooks.d.ts +23 -0
- package/dist/admin/src/content-manager.d.ts +26 -0
- package/dist/admin/src/exports.d.ts +2 -0
- package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.d.ts +14 -8
- package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/DefaultBlocksStore.d.ts +3 -0
- package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/ComponentCard.d.ts +1 -1
- package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.d.ts +11 -1
- package/dist/admin/src/pages/EditView/components/FormInputs/Relations/Relations.d.ts +9 -5
- package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.d.ts +4 -2
- package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/WysiwygStyles.d.ts +38 -6
- package/dist/admin/src/pages/EditView/components/FormLayout.d.ts +27 -5
- package/dist/admin/src/pages/ListView/components/Filters.d.ts +3 -4
- package/dist/admin/src/pages/formatComponentConfigurationEditLayout.d.ts +15 -0
- package/dist/admin/translations/cs.json.js +0 -1
- package/dist/admin/translations/cs.json.js.map +1 -1
- package/dist/admin/translations/cs.json.mjs +0 -1
- package/dist/admin/translations/cs.json.mjs.map +1 -1
- package/dist/admin/translations/de.json.js +0 -1
- package/dist/admin/translations/de.json.js.map +1 -1
- package/dist/admin/translations/de.json.mjs +0 -1
- package/dist/admin/translations/de.json.mjs.map +1 -1
- package/dist/admin/translations/en.json.js +0 -1
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +0 -1
- package/dist/admin/translations/en.json.mjs.map +1 -1
- package/dist/admin/translations/es.json.js +0 -1
- package/dist/admin/translations/es.json.js.map +1 -1
- package/dist/admin/translations/es.json.mjs +0 -1
- package/dist/admin/translations/es.json.mjs.map +1 -1
- package/dist/admin/translations/fr.json.js +0 -1
- package/dist/admin/translations/fr.json.js.map +1 -1
- package/dist/admin/translations/fr.json.mjs +0 -1
- package/dist/admin/translations/fr.json.mjs.map +1 -1
- package/dist/admin/translations/nl.json.js +0 -1
- package/dist/admin/translations/nl.json.js.map +1 -1
- package/dist/admin/translations/nl.json.mjs +0 -1
- package/dist/admin/translations/nl.json.mjs.map +1 -1
- package/dist/admin/translations/pl.json.js +0 -1
- package/dist/admin/translations/pl.json.js.map +1 -1
- package/dist/admin/translations/pl.json.mjs +0 -1
- package/dist/admin/translations/pl.json.mjs.map +1 -1
- package/dist/admin/translations/ru.json.js +0 -1
- package/dist/admin/translations/ru.json.js.map +1 -1
- package/dist/admin/translations/ru.json.mjs +0 -1
- package/dist/admin/translations/ru.json.mjs.map +1 -1
- package/dist/admin/translations/uk.json.js +0 -1
- package/dist/admin/translations/uk.json.js.map +1 -1
- package/dist/admin/translations/uk.json.mjs +0 -1
- package/dist/admin/translations/uk.json.mjs.map +1 -1
- package/dist/admin/translations/zh-Hans.json.js +0 -1
- package/dist/admin/translations/zh-Hans.json.js.map +1 -1
- package/dist/admin/translations/zh-Hans.json.mjs +0 -1
- package/dist/admin/translations/zh-Hans.json.mjs.map +1 -1
- package/dist/server/homepage/services/homepage.js +12 -8
- package/dist/server/homepage/services/homepage.js.map +1 -1
- package/dist/server/homepage/services/homepage.mjs +12 -8
- package/dist/server/homepage/services/homepage.mjs.map +1 -1
- package/dist/server/services/metrics.js +1 -5
- package/dist/server/services/metrics.js.map +1 -1
- package/dist/server/services/metrics.mjs +1 -5
- package/dist/server/services/metrics.mjs.map +1 -1
- package/dist/server/src/homepage/services/homepage.d.ts.map +1 -1
- package/dist/server/src/services/metrics.d.ts.map +1 -1
- package/package.json +7 -7
|
@@ -4,7 +4,7 @@ var jsxRuntime = require('react/jsx-runtime');
|
|
|
4
4
|
var React = require('react');
|
|
5
5
|
var designSystem = require('@strapi/design-system');
|
|
6
6
|
var Icons = require('@strapi/icons');
|
|
7
|
-
var
|
|
7
|
+
var PrismModule = require('prismjs');
|
|
8
8
|
var reactIntl = require('react-intl');
|
|
9
9
|
var slate = require('slate');
|
|
10
10
|
var slateReact = require('slate-react');
|
|
@@ -82,19 +82,36 @@ function _interopNamespaceDefault(e) {
|
|
|
82
82
|
}
|
|
83
83
|
|
|
84
84
|
var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
|
|
85
|
-
var
|
|
85
|
+
var PrismModule__namespace = /*#__PURE__*/_interopNamespaceDefault(PrismModule);
|
|
86
86
|
|
|
87
|
+
/**
|
|
88
|
+
* prismjs is UMD and may not expose a namespace when bundled by Vite; the content-manager
|
|
89
|
+
* index preloads it so `window.Prism` is set. Use that when the module import is empty.
|
|
90
|
+
*/ function resolvePrism() {
|
|
91
|
+
if (typeof PrismModule__namespace !== 'undefined' && PrismModule__namespace?.languages) {
|
|
92
|
+
return PrismModule__namespace;
|
|
93
|
+
}
|
|
94
|
+
if (typeof window === 'undefined') {
|
|
95
|
+
return undefined;
|
|
96
|
+
}
|
|
97
|
+
const globalPrism = window.Prism;
|
|
98
|
+
return globalPrism;
|
|
99
|
+
}
|
|
100
|
+
const Prism = resolvePrism();
|
|
87
101
|
const decorateCode = ([node, path])=>{
|
|
88
102
|
const ranges = [];
|
|
103
|
+
// Prism can be undefined when the UMD bundle doesn't expose a namespace and window.Prism
|
|
104
|
+
// isn't set yet (e.g. this chunk ran before the content-manager preload). Skip decoration.
|
|
105
|
+
if (!Prism?.languages) return ranges;
|
|
89
106
|
// make sure it is an Slate Element
|
|
90
107
|
if (!slate.Element.isElement(node) || node.type !== 'code') return ranges;
|
|
91
108
|
// transform the Element into a string
|
|
92
109
|
const text = slate.Node.string(node);
|
|
93
110
|
const language = constants.codeLanguages.find((lang)=>lang.value === node.language);
|
|
94
111
|
const decorateKey = language?.decorate ?? language?.value;
|
|
95
|
-
const selectedLanguage =
|
|
112
|
+
const selectedLanguage = Prism.languages[decorateKey || 'plaintext'];
|
|
96
113
|
// create "tokens" with "prismjs" and put them in "ranges"
|
|
97
|
-
const tokens =
|
|
114
|
+
const tokens = Prism.tokenize(text, selectedLanguage);
|
|
98
115
|
let start = 0;
|
|
99
116
|
for (const token of tokens){
|
|
100
117
|
const length = token.length;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Code.js","sources":["../../../../../../../../admin/src/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, SingleSelect, SingleSelectOption } from '@strapi/design-system';\nimport { CodeBlock as CodeBlockIcon } from '@strapi/icons';\nimport * as Prism from 'prismjs';\nimport { useIntl } from 'react-intl';\nimport { BaseRange, Element, Editor, Node, NodeEntry, Transforms } from 'slate';\nimport { useSelected, type RenderElementProps, useFocused, ReactEditor } from 'slate-react';\nimport { styled } from 'styled-components';\n\nimport { useBlocksEditorContext, type BlocksStore } from '../BlocksEditor';\nimport { codeLanguages } from '../utils/constants';\nimport { baseHandleConvert } from '../utils/conversions';\nimport { pressEnterTwiceToExit } from '../utils/enterKey';\nimport { type Block } from '../utils/types';\n\nimport 'prismjs/themes/prism-solarizedlight.css';\nimport 'prismjs/components/prism-asmatmel';\nimport 'prismjs/components/prism-bash';\nimport 'prismjs/components/prism-basic';\nimport 'prismjs/components/prism-c';\nimport 'prismjs/components/prism-clojure';\nimport 'prismjs/components/prism-cobol';\nimport 'prismjs/components/prism-cpp';\nimport 'prismjs/components/prism-csharp';\nimport 'prismjs/components/prism-dart';\nimport 'prismjs/components/prism-docker';\nimport 'prismjs/components/prism-elixir';\nimport 'prismjs/components/prism-erlang';\nimport 'prismjs/components/prism-fortran';\nimport 'prismjs/components/prism-fsharp';\nimport 'prismjs/components/prism-go';\nimport 'prismjs/components/prism-graphql';\nimport 'prismjs/components/prism-groovy';\nimport 'prismjs/components/prism-haskell';\nimport 'prismjs/components/prism-haxe';\nimport 'prismjs/components/prism-ini';\nimport 'prismjs/components/prism-java';\nimport 'prismjs/components/prism-javascript';\nimport 'prismjs/components/prism-jsx';\nimport 'prismjs/components/prism-json';\nimport 'prismjs/components/prism-julia';\nimport 'prismjs/components/prism-kotlin';\nimport 'prismjs/components/prism-latex';\nimport 'prismjs/components/prism-lua';\nimport 'prismjs/components/prism-markdown';\nimport 'prismjs/components/prism-matlab';\nimport 'prismjs/components/prism-makefile';\nimport 'prismjs/components/prism-objectivec';\nimport 'prismjs/components/prism-perl';\nimport 'prismjs/components/prism-php';\nimport 'prismjs/components/prism-powershell';\nimport 'prismjs/components/prism-python';\nimport 'prismjs/components/prism-r';\nimport 'prismjs/components/prism-ruby';\nimport 'prismjs/components/prism-rust';\nimport 'prismjs/components/prism-sas';\nimport 'prismjs/components/prism-scala';\nimport 'prismjs/components/prism-scheme';\nimport 'prismjs/components/prism-sql';\nimport 'prismjs/components/prism-stata';\nimport 'prismjs/components/prism-swift';\nimport 'prismjs/components/prism-typescript';\nimport 'prismjs/components/prism-tsx';\nimport 'prismjs/components/prism-vbnet';\nimport 'prismjs/components/prism-yaml';\n\ntype BaseRangeCustom = BaseRange & { className: string };\n\nexport const decorateCode = ([node, path]: NodeEntry) => {\n const ranges: BaseRangeCustom[] = [];\n\n // make sure it is an Slate Element\n if (!Element.isElement(node) || node.type !== 'code') return ranges;\n // transform the Element into a string\n const text = Node.string(node);\n const language = codeLanguages.find((lang) => lang.value === node.language);\n const decorateKey = language?.decorate ?? language?.value;\n\n const selectedLanguage = Prism.languages[decorateKey || 'plaintext'];\n\n // create \"tokens\" with \"prismjs\" and put them in \"ranges\"\n const tokens = Prism.tokenize(text, selectedLanguage);\n let start = 0;\n for (const token of tokens) {\n const length = token.length;\n const end = start + length;\n if (typeof token !== 'string') {\n ranges.push({\n anchor: { path, offset: start },\n focus: { path, offset: end },\n className: `token ${token.type}`,\n });\n }\n start = end;\n }\n\n // these will be found in \"renderLeaf\" in \"leaf\" and their \"className\" will be applied\n return ranges;\n};\n\nconst CodeBlock = styled.pre`\n border-radius: ${({ theme }) => theme.borderRadius};\n background-color: ${({ theme }) => theme.colors.neutral100};\n max-width: 100%;\n overflow: auto;\n padding: ${({ theme }) => `${theme.spaces[3]} ${theme.spaces[4]}`};\n flex-shrink: 1;\n\n & > code {\n font-family: 'SF Mono', SFMono-Regular, ui-monospace, 'DejaVu Sans Mono', Menlo, Consolas,\n monospace;\n color: ${({ theme }) => theme.colors.neutral800};\n overflow: auto;\n max-width: 100%;\n }\n`;\n\nconst CodeEditor = (props: RenderElementProps) => {\n const { editor } = useBlocksEditorContext('ImageDialog');\n const editorIsFocused = useFocused();\n const imageIsSelected = useSelected();\n const { formatMessage } = useIntl();\n const [isSelectOpen, setIsSelectOpen] = React.useState(false);\n const shouldDisplayLanguageSelect = (editorIsFocused && imageIsSelected) || isSelectOpen;\n\n return (\n <Box position=\"relative\" width=\"100%\">\n <CodeBlock {...props.attributes}>\n <code>{props.children}</code>\n </CodeBlock>\n {shouldDisplayLanguageSelect && (\n <Box\n position=\"absolute\"\n background=\"neutral0\"\n borderColor=\"neutral150\"\n borderStyle=\"solid\"\n borderWidth=\"0.5px\"\n shadow=\"tableShadow\"\n top=\"100%\"\n marginTop={1}\n right={0}\n padding={1}\n hasRadius\n >\n <SingleSelect\n onChange={(open) => {\n Transforms.setNodes(\n editor,\n { language: open.toString() },\n { match: (node) => !Editor.isEditor(node) && node.type === 'code' }\n );\n }}\n value={(props.element.type === 'code' && props.element.language) || 'plaintext'}\n onOpenChange={(open) => {\n setIsSelectOpen(open);\n\n // Focus the editor again when closing the select so the user can continue typing\n if (!open) {\n ReactEditor.focus(editor);\n }\n }}\n onCloseAutoFocus={(e) => e.preventDefault()}\n aria-label={formatMessage({\n id: 'components.Blocks.blocks.code.languageLabel',\n defaultMessage: 'Select a language',\n })}\n >\n {codeLanguages.map(({ value, label }) => (\n <SingleSelectOption value={value} key={value}>\n {label}\n </SingleSelectOption>\n ))}\n </SingleSelect>\n </Box>\n )}\n </Box>\n );\n};\n\nconst withCode = (editor: Editor) => {\n const { insertData } = editor;\n\n editor.insertData = (data) => {\n const pastedText = data.getData('text/plain');\n\n if (pastedText && editor.selection) {\n // Check if we're currently inside a code block\n const codeBlockEntry = Editor.above(editor, {\n match: (node) => !Editor.isEditor(node) && node.type === 'code',\n });\n\n if (codeBlockEntry) {\n // We're inside a code block, handle the paste specially\n // Replace the selected content with the pasted text, preserving newlines\n Transforms.insertText(editor, pastedText);\n return;\n }\n }\n\n // For non-code blocks, use the default behavior\n insertData(data);\n };\n\n return editor;\n};\n\nconst codeBlocks: Pick<BlocksStore, 'code'> = {\n code: {\n renderElement: (props) => <CodeEditor {...props} />,\n icon: CodeBlockIcon,\n label: {\n id: 'components.Blocks.blocks.code',\n defaultMessage: 'Code block',\n },\n matchNode: (node) => node.type === 'code',\n isInBlocksSelector: true,\n handleConvert(editor) {\n baseHandleConvert<Block<'code'>>(editor, { type: 'code', language: 'plaintext' });\n },\n handleEnterKey(editor) {\n pressEnterTwiceToExit(editor);\n },\n snippets: ['```'],\n plugin: withCode,\n },\n};\n\nexport { codeBlocks };\n"],"names":["decorateCode","node","path","ranges","Element","isElement","type","text","Node","string","language","codeLanguages","find","lang","value","decorateKey","decorate","selectedLanguage","Prism","languages","tokens","tokenize","start","token","length","end","push","anchor","offset","focus","className","CodeBlock","styled","pre","theme","borderRadius","colors","neutral100","spaces","neutral800","CodeEditor","props","editor","useBlocksEditorContext","editorIsFocused","useFocused","imageIsSelected","useSelected","formatMessage","useIntl","isSelectOpen","setIsSelectOpen","React","useState","shouldDisplayLanguageSelect","_jsxs","Box","position","width","_jsx","attributes","code","children","background","borderColor","borderStyle","borderWidth","shadow","top","marginTop","right","padding","hasRadius","SingleSelect","onChange","open","Transforms","setNodes","toString","match","Editor","isEditor","element","onOpenChange","ReactEditor","onCloseAutoFocus","e","preventDefault","aria-label","id","defaultMessage","map","label","SingleSelectOption","withCode","insertData","data","pastedText","getData","selection","codeBlockEntry","above","insertText","codeBlocks","renderElement","icon","CodeBlockIcon","matchNode","isInBlocksSelector","handleConvert","baseHandleConvert","handleEnterKey","pressEnterTwiceToExit","snippets","plugin"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Code.js","sources":["../../../../../../../../admin/src/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, SingleSelect, SingleSelectOption } from '@strapi/design-system';\nimport { CodeBlock as CodeBlockIcon } from '@strapi/icons';\nimport * as PrismModule from 'prismjs';\nimport { useIntl } from 'react-intl';\nimport { BaseRange, Element, Editor, Node, NodeEntry, Transforms } from 'slate';\nimport { useSelected, type RenderElementProps, useFocused, ReactEditor } from 'slate-react';\nimport { styled } from 'styled-components';\n\nimport { useBlocksEditorContext, type BlocksStore } from '../BlocksEditor';\nimport { codeLanguages } from '../utils/constants';\nimport { baseHandleConvert } from '../utils/conversions';\nimport { pressEnterTwiceToExit } from '../utils/enterKey';\nimport { type Block } from '../utils/types';\n\nimport 'prismjs/themes/prism-solarizedlight.css';\nimport 'prismjs/components/prism-asmatmel';\nimport 'prismjs/components/prism-bash';\nimport 'prismjs/components/prism-basic';\nimport 'prismjs/components/prism-c';\nimport 'prismjs/components/prism-clojure';\nimport 'prismjs/components/prism-cobol';\nimport 'prismjs/components/prism-cpp';\nimport 'prismjs/components/prism-csharp';\nimport 'prismjs/components/prism-dart';\nimport 'prismjs/components/prism-docker';\nimport 'prismjs/components/prism-elixir';\nimport 'prismjs/components/prism-erlang';\nimport 'prismjs/components/prism-fortran';\nimport 'prismjs/components/prism-fsharp';\nimport 'prismjs/components/prism-go';\nimport 'prismjs/components/prism-graphql';\nimport 'prismjs/components/prism-groovy';\nimport 'prismjs/components/prism-haskell';\nimport 'prismjs/components/prism-haxe';\nimport 'prismjs/components/prism-ini';\nimport 'prismjs/components/prism-java';\nimport 'prismjs/components/prism-javascript';\nimport 'prismjs/components/prism-jsx';\nimport 'prismjs/components/prism-json';\nimport 'prismjs/components/prism-julia';\nimport 'prismjs/components/prism-kotlin';\nimport 'prismjs/components/prism-latex';\nimport 'prismjs/components/prism-lua';\nimport 'prismjs/components/prism-markdown';\nimport 'prismjs/components/prism-matlab';\nimport 'prismjs/components/prism-makefile';\nimport 'prismjs/components/prism-objectivec';\nimport 'prismjs/components/prism-perl';\nimport 'prismjs/components/prism-php';\nimport 'prismjs/components/prism-powershell';\nimport 'prismjs/components/prism-python';\nimport 'prismjs/components/prism-r';\nimport 'prismjs/components/prism-ruby';\nimport 'prismjs/components/prism-rust';\nimport 'prismjs/components/prism-sas';\nimport 'prismjs/components/prism-scala';\nimport 'prismjs/components/prism-scheme';\nimport 'prismjs/components/prism-sql';\nimport 'prismjs/components/prism-stata';\nimport 'prismjs/components/prism-swift';\nimport 'prismjs/components/prism-typescript';\nimport 'prismjs/components/prism-tsx';\nimport 'prismjs/components/prism-vbnet';\nimport 'prismjs/components/prism-yaml';\n\n/**\n * prismjs is UMD and may not expose a namespace when bundled by Vite; the content-manager\n * index preloads it so `window.Prism` is set. Use that when the module import is empty.\n */\nfunction resolvePrism(): typeof PrismModule | undefined {\n if (typeof PrismModule !== 'undefined' && PrismModule?.languages) {\n return PrismModule;\n }\n\n if (typeof window === 'undefined') {\n return undefined;\n }\n\n const globalPrism = (window as Window & { Prism?: typeof PrismModule }).Prism;\n return globalPrism;\n}\n\nconst Prism = resolvePrism();\n\ntype BaseRangeCustom = BaseRange & { className: string };\n\nexport const decorateCode = ([node, path]: NodeEntry) => {\n const ranges: BaseRangeCustom[] = [];\n\n // Prism can be undefined when the UMD bundle doesn't expose a namespace and window.Prism\n // isn't set yet (e.g. this chunk ran before the content-manager preload). Skip decoration.\n if (!Prism?.languages) return ranges;\n\n // make sure it is an Slate Element\n if (!Element.isElement(node) || node.type !== 'code') return ranges;\n // transform the Element into a string\n const text = Node.string(node);\n const language = codeLanguages.find((lang) => lang.value === node.language);\n const decorateKey = language?.decorate ?? language?.value;\n\n const selectedLanguage = Prism.languages[decorateKey || 'plaintext'];\n\n // create \"tokens\" with \"prismjs\" and put them in \"ranges\"\n const tokens = Prism.tokenize(text, selectedLanguage);\n let start = 0;\n for (const token of tokens) {\n const length = token.length;\n const end = start + length;\n if (typeof token !== 'string') {\n ranges.push({\n anchor: { path, offset: start },\n focus: { path, offset: end },\n className: `token ${token.type}`,\n });\n }\n start = end;\n }\n\n // these will be found in \"renderLeaf\" in \"leaf\" and their \"className\" will be applied\n return ranges;\n};\n\nconst CodeBlock = styled.pre`\n border-radius: ${({ theme }) => theme.borderRadius};\n background-color: ${({ theme }) => theme.colors.neutral100};\n max-width: 100%;\n overflow: auto;\n padding: ${({ theme }) => `${theme.spaces[3]} ${theme.spaces[4]}`};\n flex-shrink: 1;\n\n & > code {\n font-family: 'SF Mono', SFMono-Regular, ui-monospace, 'DejaVu Sans Mono', Menlo, Consolas,\n monospace;\n color: ${({ theme }) => theme.colors.neutral800};\n overflow: auto;\n max-width: 100%;\n }\n`;\n\nconst CodeEditor = (props: RenderElementProps) => {\n const { editor } = useBlocksEditorContext('ImageDialog');\n const editorIsFocused = useFocused();\n const imageIsSelected = useSelected();\n const { formatMessage } = useIntl();\n const [isSelectOpen, setIsSelectOpen] = React.useState(false);\n const shouldDisplayLanguageSelect = (editorIsFocused && imageIsSelected) || isSelectOpen;\n\n return (\n <Box position=\"relative\" width=\"100%\">\n <CodeBlock {...props.attributes}>\n <code>{props.children}</code>\n </CodeBlock>\n {shouldDisplayLanguageSelect && (\n <Box\n position=\"absolute\"\n background=\"neutral0\"\n borderColor=\"neutral150\"\n borderStyle=\"solid\"\n borderWidth=\"0.5px\"\n shadow=\"tableShadow\"\n top=\"100%\"\n marginTop={1}\n right={0}\n padding={1}\n hasRadius\n >\n <SingleSelect\n onChange={(open) => {\n Transforms.setNodes(\n editor,\n { language: open.toString() },\n { match: (node) => !Editor.isEditor(node) && node.type === 'code' }\n );\n }}\n value={(props.element.type === 'code' && props.element.language) || 'plaintext'}\n onOpenChange={(open) => {\n setIsSelectOpen(open);\n\n // Focus the editor again when closing the select so the user can continue typing\n if (!open) {\n ReactEditor.focus(editor);\n }\n }}\n onCloseAutoFocus={(e) => e.preventDefault()}\n aria-label={formatMessage({\n id: 'components.Blocks.blocks.code.languageLabel',\n defaultMessage: 'Select a language',\n })}\n >\n {codeLanguages.map(({ value, label }) => (\n <SingleSelectOption value={value} key={value}>\n {label}\n </SingleSelectOption>\n ))}\n </SingleSelect>\n </Box>\n )}\n </Box>\n );\n};\n\nconst withCode = (editor: Editor) => {\n const { insertData } = editor;\n\n editor.insertData = (data) => {\n const pastedText = data.getData('text/plain');\n\n if (pastedText && editor.selection) {\n // Check if we're currently inside a code block\n const codeBlockEntry = Editor.above(editor, {\n match: (node) => !Editor.isEditor(node) && node.type === 'code',\n });\n\n if (codeBlockEntry) {\n // We're inside a code block, handle the paste specially\n // Replace the selected content with the pasted text, preserving newlines\n Transforms.insertText(editor, pastedText);\n return;\n }\n }\n\n // For non-code blocks, use the default behavior\n insertData(data);\n };\n\n return editor;\n};\n\nconst codeBlocks: Pick<BlocksStore, 'code'> = {\n code: {\n renderElement: (props) => <CodeEditor {...props} />,\n icon: CodeBlockIcon,\n label: {\n id: 'components.Blocks.blocks.code',\n defaultMessage: 'Code block',\n },\n matchNode: (node) => node.type === 'code',\n isInBlocksSelector: true,\n handleConvert(editor) {\n baseHandleConvert<Block<'code'>>(editor, { type: 'code', language: 'plaintext' });\n },\n handleEnterKey(editor) {\n pressEnterTwiceToExit(editor);\n },\n snippets: ['```'],\n plugin: withCode,\n },\n};\n\nexport { codeBlocks };\n"],"names":["resolvePrism","PrismModule","languages","window","undefined","globalPrism","Prism","decorateCode","node","path","ranges","Element","isElement","type","text","Node","string","language","codeLanguages","find","lang","value","decorateKey","decorate","selectedLanguage","tokens","tokenize","start","token","length","end","push","anchor","offset","focus","className","CodeBlock","styled","pre","theme","borderRadius","colors","neutral100","spaces","neutral800","CodeEditor","props","editor","useBlocksEditorContext","editorIsFocused","useFocused","imageIsSelected","useSelected","formatMessage","useIntl","isSelectOpen","setIsSelectOpen","React","useState","shouldDisplayLanguageSelect","_jsxs","Box","position","width","_jsx","attributes","code","children","background","borderColor","borderStyle","borderWidth","shadow","top","marginTop","right","padding","hasRadius","SingleSelect","onChange","open","Transforms","setNodes","toString","match","Editor","isEditor","element","onOpenChange","ReactEditor","onCloseAutoFocus","e","preventDefault","aria-label","id","defaultMessage","map","label","SingleSelectOption","withCode","insertData","data","pastedText","getData","selection","codeBlockEntry","above","insertText","codeBlocks","renderElement","icon","CodeBlockIcon","matchNode","isInBlocksSelector","handleConvert","baseHandleConvert","handleEnterKey","pressEnterTwiceToExit","snippets","plugin"],"mappings":"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"}
|
|
@@ -2,9 +2,9 @@ import { jsx, jsxs } from 'react/jsx-runtime';
|
|
|
2
2
|
import * as React from 'react';
|
|
3
3
|
import { Box, SingleSelect, SingleSelectOption } from '@strapi/design-system';
|
|
4
4
|
import { CodeBlock as CodeBlock$1 } from '@strapi/icons';
|
|
5
|
-
import * as
|
|
5
|
+
import * as PrismModule from 'prismjs';
|
|
6
6
|
import { useIntl } from 'react-intl';
|
|
7
|
-
import {
|
|
7
|
+
import { Element, Node, Editor, Transforms } from 'slate';
|
|
8
8
|
import { useFocused, useSelected, ReactEditor } from 'slate-react';
|
|
9
9
|
import { styled } from 'styled-components';
|
|
10
10
|
import { useBlocksEditorContext } from '../BlocksEditor.mjs';
|
|
@@ -62,8 +62,25 @@ import 'prismjs/components/prism-tsx';
|
|
|
62
62
|
import 'prismjs/components/prism-vbnet';
|
|
63
63
|
import 'prismjs/components/prism-yaml';
|
|
64
64
|
|
|
65
|
+
/**
|
|
66
|
+
* prismjs is UMD and may not expose a namespace when bundled by Vite; the content-manager
|
|
67
|
+
* index preloads it so `window.Prism` is set. Use that when the module import is empty.
|
|
68
|
+
*/ function resolvePrism() {
|
|
69
|
+
if (typeof PrismModule !== 'undefined' && PrismModule?.languages) {
|
|
70
|
+
return PrismModule;
|
|
71
|
+
}
|
|
72
|
+
if (typeof window === 'undefined') {
|
|
73
|
+
return undefined;
|
|
74
|
+
}
|
|
75
|
+
const globalPrism = window.Prism;
|
|
76
|
+
return globalPrism;
|
|
77
|
+
}
|
|
78
|
+
const Prism = resolvePrism();
|
|
65
79
|
const decorateCode = ([node, path])=>{
|
|
66
80
|
const ranges = [];
|
|
81
|
+
// Prism can be undefined when the UMD bundle doesn't expose a namespace and window.Prism
|
|
82
|
+
// isn't set yet (e.g. this chunk ran before the content-manager preload). Skip decoration.
|
|
83
|
+
if (!Prism?.languages) return ranges;
|
|
67
84
|
// make sure it is an Slate Element
|
|
68
85
|
if (!Element.isElement(node) || node.type !== 'code') return ranges;
|
|
69
86
|
// transform the Element into a string
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Code.mjs","sources":["../../../../../../../../admin/src/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, SingleSelect, SingleSelectOption } from '@strapi/design-system';\nimport { CodeBlock as CodeBlockIcon } from '@strapi/icons';\nimport * as Prism from 'prismjs';\nimport { useIntl } from 'react-intl';\nimport { BaseRange, Element, Editor, Node, NodeEntry, Transforms } from 'slate';\nimport { useSelected, type RenderElementProps, useFocused, ReactEditor } from 'slate-react';\nimport { styled } from 'styled-components';\n\nimport { useBlocksEditorContext, type BlocksStore } from '../BlocksEditor';\nimport { codeLanguages } from '../utils/constants';\nimport { baseHandleConvert } from '../utils/conversions';\nimport { pressEnterTwiceToExit } from '../utils/enterKey';\nimport { type Block } from '../utils/types';\n\nimport 'prismjs/themes/prism-solarizedlight.css';\nimport 'prismjs/components/prism-asmatmel';\nimport 'prismjs/components/prism-bash';\nimport 'prismjs/components/prism-basic';\nimport 'prismjs/components/prism-c';\nimport 'prismjs/components/prism-clojure';\nimport 'prismjs/components/prism-cobol';\nimport 'prismjs/components/prism-cpp';\nimport 'prismjs/components/prism-csharp';\nimport 'prismjs/components/prism-dart';\nimport 'prismjs/components/prism-docker';\nimport 'prismjs/components/prism-elixir';\nimport 'prismjs/components/prism-erlang';\nimport 'prismjs/components/prism-fortran';\nimport 'prismjs/components/prism-fsharp';\nimport 'prismjs/components/prism-go';\nimport 'prismjs/components/prism-graphql';\nimport 'prismjs/components/prism-groovy';\nimport 'prismjs/components/prism-haskell';\nimport 'prismjs/components/prism-haxe';\nimport 'prismjs/components/prism-ini';\nimport 'prismjs/components/prism-java';\nimport 'prismjs/components/prism-javascript';\nimport 'prismjs/components/prism-jsx';\nimport 'prismjs/components/prism-json';\nimport 'prismjs/components/prism-julia';\nimport 'prismjs/components/prism-kotlin';\nimport 'prismjs/components/prism-latex';\nimport 'prismjs/components/prism-lua';\nimport 'prismjs/components/prism-markdown';\nimport 'prismjs/components/prism-matlab';\nimport 'prismjs/components/prism-makefile';\nimport 'prismjs/components/prism-objectivec';\nimport 'prismjs/components/prism-perl';\nimport 'prismjs/components/prism-php';\nimport 'prismjs/components/prism-powershell';\nimport 'prismjs/components/prism-python';\nimport 'prismjs/components/prism-r';\nimport 'prismjs/components/prism-ruby';\nimport 'prismjs/components/prism-rust';\nimport 'prismjs/components/prism-sas';\nimport 'prismjs/components/prism-scala';\nimport 'prismjs/components/prism-scheme';\nimport 'prismjs/components/prism-sql';\nimport 'prismjs/components/prism-stata';\nimport 'prismjs/components/prism-swift';\nimport 'prismjs/components/prism-typescript';\nimport 'prismjs/components/prism-tsx';\nimport 'prismjs/components/prism-vbnet';\nimport 'prismjs/components/prism-yaml';\n\ntype BaseRangeCustom = BaseRange & { className: string };\n\nexport const decorateCode = ([node, path]: NodeEntry) => {\n const ranges: BaseRangeCustom[] = [];\n\n // make sure it is an Slate Element\n if (!Element.isElement(node) || node.type !== 'code') return ranges;\n // transform the Element into a string\n const text = Node.string(node);\n const language = codeLanguages.find((lang) => lang.value === node.language);\n const decorateKey = language?.decorate ?? language?.value;\n\n const selectedLanguage = Prism.languages[decorateKey || 'plaintext'];\n\n // create \"tokens\" with \"prismjs\" and put them in \"ranges\"\n const tokens = Prism.tokenize(text, selectedLanguage);\n let start = 0;\n for (const token of tokens) {\n const length = token.length;\n const end = start + length;\n if (typeof token !== 'string') {\n ranges.push({\n anchor: { path, offset: start },\n focus: { path, offset: end },\n className: `token ${token.type}`,\n });\n }\n start = end;\n }\n\n // these will be found in \"renderLeaf\" in \"leaf\" and their \"className\" will be applied\n return ranges;\n};\n\nconst CodeBlock = styled.pre`\n border-radius: ${({ theme }) => theme.borderRadius};\n background-color: ${({ theme }) => theme.colors.neutral100};\n max-width: 100%;\n overflow: auto;\n padding: ${({ theme }) => `${theme.spaces[3]} ${theme.spaces[4]}`};\n flex-shrink: 1;\n\n & > code {\n font-family: 'SF Mono', SFMono-Regular, ui-monospace, 'DejaVu Sans Mono', Menlo, Consolas,\n monospace;\n color: ${({ theme }) => theme.colors.neutral800};\n overflow: auto;\n max-width: 100%;\n }\n`;\n\nconst CodeEditor = (props: RenderElementProps) => {\n const { editor } = useBlocksEditorContext('ImageDialog');\n const editorIsFocused = useFocused();\n const imageIsSelected = useSelected();\n const { formatMessage } = useIntl();\n const [isSelectOpen, setIsSelectOpen] = React.useState(false);\n const shouldDisplayLanguageSelect = (editorIsFocused && imageIsSelected) || isSelectOpen;\n\n return (\n <Box position=\"relative\" width=\"100%\">\n <CodeBlock {...props.attributes}>\n <code>{props.children}</code>\n </CodeBlock>\n {shouldDisplayLanguageSelect && (\n <Box\n position=\"absolute\"\n background=\"neutral0\"\n borderColor=\"neutral150\"\n borderStyle=\"solid\"\n borderWidth=\"0.5px\"\n shadow=\"tableShadow\"\n top=\"100%\"\n marginTop={1}\n right={0}\n padding={1}\n hasRadius\n >\n <SingleSelect\n onChange={(open) => {\n Transforms.setNodes(\n editor,\n { language: open.toString() },\n { match: (node) => !Editor.isEditor(node) && node.type === 'code' }\n );\n }}\n value={(props.element.type === 'code' && props.element.language) || 'plaintext'}\n onOpenChange={(open) => {\n setIsSelectOpen(open);\n\n // Focus the editor again when closing the select so the user can continue typing\n if (!open) {\n ReactEditor.focus(editor);\n }\n }}\n onCloseAutoFocus={(e) => e.preventDefault()}\n aria-label={formatMessage({\n id: 'components.Blocks.blocks.code.languageLabel',\n defaultMessage: 'Select a language',\n })}\n >\n {codeLanguages.map(({ value, label }) => (\n <SingleSelectOption value={value} key={value}>\n {label}\n </SingleSelectOption>\n ))}\n </SingleSelect>\n </Box>\n )}\n </Box>\n );\n};\n\nconst withCode = (editor: Editor) => {\n const { insertData } = editor;\n\n editor.insertData = (data) => {\n const pastedText = data.getData('text/plain');\n\n if (pastedText && editor.selection) {\n // Check if we're currently inside a code block\n const codeBlockEntry = Editor.above(editor, {\n match: (node) => !Editor.isEditor(node) && node.type === 'code',\n });\n\n if (codeBlockEntry) {\n // We're inside a code block, handle the paste specially\n // Replace the selected content with the pasted text, preserving newlines\n Transforms.insertText(editor, pastedText);\n return;\n }\n }\n\n // For non-code blocks, use the default behavior\n insertData(data);\n };\n\n return editor;\n};\n\nconst codeBlocks: Pick<BlocksStore, 'code'> = {\n code: {\n renderElement: (props) => <CodeEditor {...props} />,\n icon: CodeBlockIcon,\n label: {\n id: 'components.Blocks.blocks.code',\n defaultMessage: 'Code block',\n },\n matchNode: (node) => node.type === 'code',\n isInBlocksSelector: true,\n handleConvert(editor) {\n baseHandleConvert<Block<'code'>>(editor, { type: 'code', language: 'plaintext' });\n },\n handleEnterKey(editor) {\n pressEnterTwiceToExit(editor);\n },\n snippets: ['```'],\n plugin: withCode,\n },\n};\n\nexport { codeBlocks };\n"],"names":["decorateCode","node","path","ranges","Element","isElement","type","text","Node","string","language","codeLanguages","find","lang","value","decorateKey","decorate","selectedLanguage","Prism","languages","tokens","tokenize","start","token","length","end","push","anchor","offset","focus","className","CodeBlock","styled","pre","theme","borderRadius","colors","neutral100","spaces","neutral800","CodeEditor","props","editor","useBlocksEditorContext","editorIsFocused","useFocused","imageIsSelected","useSelected","formatMessage","useIntl","isSelectOpen","setIsSelectOpen","React","useState","shouldDisplayLanguageSelect","_jsxs","Box","position","width","_jsx","attributes","code","children","background","borderColor","borderStyle","borderWidth","shadow","top","marginTop","right","padding","hasRadius","SingleSelect","onChange","open","Transforms","setNodes","toString","match","Editor","isEditor","element","onOpenChange","ReactEditor","onCloseAutoFocus","e","preventDefault","aria-label","id","defaultMessage","map","label","SingleSelectOption","withCode","insertData","data","pastedText","getData","selection","codeBlockEntry","above","insertText","codeBlocks","renderElement","icon","CodeBlockIcon","matchNode","isInBlocksSelector","handleConvert","baseHandleConvert","handleEnterKey","pressEnterTwiceToExit","snippets","plugin"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqEO,MAAMA,YAAAA,GAAe,CAAC,CAACC,MAAMC,IAAAA,CAAgB,GAAA;AAClD,IAAA,MAAMC,SAA4B,EAAE;;IAGpC,IAAI,CAACC,QAAQC,SAAS,CAACJ,SAASA,IAAAA,CAAKK,IAAI,KAAK,MAAA,EAAQ,OAAOH,MAAAA;;IAE7D,MAAMI,IAAAA,GAAOC,IAAAA,CAAKC,MAAM,CAACR,IAAAA,CAAAA;IACzB,MAAMS,QAAAA,GAAWC,aAAAA,CAAcC,IAAI,CAAC,CAACC,OAASA,IAAAA,CAAKC,KAAK,KAAKb,IAAAA,CAAKS,QAAQ,CAAA;IAC1E,MAAMK,WAAAA,GAAcL,QAAAA,EAAUM,QAAAA,IAAYN,QAAAA,EAAUI,KAAAA;AAEpD,IAAA,MAAMG,gBAAAA,GAAmBC,KAAAA,CAAMC,SAAS,CAACJ,eAAe,WAAA,CAAY;;AAGpE,IAAA,MAAMK,MAAAA,GAASF,KAAAA,CAAMG,QAAQ,CAACd,IAAAA,EAAMU,gBAAAA,CAAAA;AACpC,IAAA,IAAIK,KAAAA,GAAQ,CAAA;IACZ,KAAK,MAAMC,SAASH,MAAAA,CAAQ;QAC1B,MAAMI,MAAAA,GAASD,MAAMC,MAAM;AAC3B,QAAA,MAAMC,MAAMH,KAAAA,GAAQE,MAAAA;QACpB,IAAI,OAAOD,UAAU,QAAA,EAAU;AAC7BpB,YAAAA,MAAAA,CAAOuB,IAAI,CAAC;gBACVC,MAAAA,EAAQ;AAAEzB,oBAAAA,IAAAA;oBAAM0B,MAAAA,EAAQN;AAAM,iBAAA;gBAC9BO,KAAAA,EAAO;AAAE3B,oBAAAA,IAAAA;oBAAM0B,MAAAA,EAAQH;AAAI,iBAAA;AAC3BK,gBAAAA,SAAAA,EAAW,CAAC,MAAM,EAAEP,KAAAA,CAAMjB,IAAI,CAAA;AAChC,aAAA,CAAA;AACF,QAAA;QACAgB,KAAAA,GAAQG,GAAAA;AACV,IAAA;;IAGA,OAAOtB,MAAAA;AACT;AAEA,MAAM4B,SAAAA,GAAYC,MAAAA,CAAOC,GAAG;AACX,iBAAA,EAAE,CAAC,EAAEC,KAAK,EAAE,GAAKA,KAAAA,CAAMC,YAAY,CAAC;oBACjC,EAAE,CAAC,EAAED,KAAK,EAAE,GAAKA,KAAAA,CAAME,MAAM,CAACC,UAAU,CAAC;;;AAGlD,WAAA,EAAE,CAAC,EAAEH,KAAK,EAAE,GAAK,CAAA,EAAGA,MAAMI,MAAM,CAAC,CAAA,CAAE,CAAC,CAAC,EAAEJ,KAAAA,CAAMI,MAAM,CAAC,CAAA,CAAE,EAAE,CAAC;;;;;;WAMzD,EAAE,CAAC,EAAEJ,KAAK,EAAE,GAAKA,KAAAA,CAAME,MAAM,CAACG,UAAU,CAAC;;;;AAIpD,CAAC;AAED,MAAMC,aAAa,CAACC,KAAAA,GAAAA;AAClB,IAAA,MAAM,EAAEC,MAAM,EAAE,GAAGC,sBAAAA,CAAuB,aAAA,CAAA;AAC1C,IAAA,MAAMC,eAAAA,GAAkBC,UAAAA,EAAAA;AACxB,IAAA,MAAMC,eAAAA,GAAkBC,WAAAA,EAAAA;IACxB,MAAM,EAAEC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;AAC1B,IAAA,MAAM,CAACC,YAAAA,EAAcC,eAAAA,CAAgB,GAAGC,KAAAA,CAAMC,QAAQ,CAAC,KAAA,CAAA;IACvD,MAAMC,2BAAAA,GAA8B,eAACV,IAAmBE,eAAAA,IAAoBI,YAAAA;AAE5E,IAAA,qBACEK,IAAA,CAACC,GAAAA,EAAAA;QAAIC,QAAAA,EAAS,UAAA;QAAWC,KAAAA,EAAM,MAAA;;0BAC7BC,GAAA,CAAC5B,SAAAA,EAAAA;AAAW,gBAAA,GAAGU,MAAMmB,UAAU;AAC7B,gBAAA,QAAA,gBAAAD,GAAA,CAACE,MAAAA,EAAAA;AAAMpB,oBAAAA,QAAAA,EAAAA,KAAAA,CAAMqB;;;AAEdR,YAAAA,2BAAAA,kBACCK,GAAA,CAACH,GAAAA,EAAAA;gBACCC,QAAAA,EAAS,UAAA;gBACTM,UAAAA,EAAW,UAAA;gBACXC,WAAAA,EAAY,YAAA;gBACZC,WAAAA,EAAY,OAAA;gBACZC,WAAAA,EAAY,OAAA;gBACZC,MAAAA,EAAO,aAAA;gBACPC,GAAAA,EAAI,MAAA;gBACJC,SAAAA,EAAW,CAAA;gBACXC,KAAAA,EAAO,CAAA;gBACPC,OAAAA,EAAS,CAAA;gBACTC,SAAS,EAAA,IAAA;AAET,gBAAA,QAAA,gBAAAb,GAAA,CAACc,YAAAA,EAAAA;AACCC,oBAAAA,QAAAA,EAAU,CAACC,IAAAA,GAAAA;wBACTC,UAAAA,CAAWC,QAAQ,CACjBnC,MAAAA,EACA;AAAEhC,4BAAAA,QAAAA,EAAUiE,KAAKG,QAAQ;yBAAG,EAC5B;4BAAEC,KAAAA,EAAO,CAAC9E,OAAS,CAAC+E,MAAAA,CAAOC,QAAQ,CAAChF,IAAAA,CAAAA,IAASA,IAAAA,CAAKK,IAAI,KAAK;AAAO,yBAAA,CAAA;AAEtE,oBAAA,CAAA;oBACAQ,KAAAA,EAAQ2B,KAAAA,CAAMyC,OAAO,CAAC5E,IAAI,KAAK,MAAA,IAAUmC,KAAAA,CAAMyC,OAAO,CAACxE,QAAQ,IAAK,WAAA;AACpEyE,oBAAAA,YAAAA,EAAc,CAACR,IAAAA,GAAAA;wBACbxB,eAAAA,CAAgBwB,IAAAA,CAAAA;;AAGhB,wBAAA,IAAI,CAACA,IAAAA,EAAM;AACTS,4BAAAA,WAAAA,CAAYvD,KAAK,CAACa,MAAAA,CAAAA;AACpB,wBAAA;AACF,oBAAA,CAAA;oBACA2C,gBAAAA,EAAkB,CAACC,CAAAA,GAAMA,CAAAA,CAAEC,cAAc,EAAA;AACzCC,oBAAAA,YAAAA,EAAYxC,aAAAA,CAAc;wBACxByC,EAAAA,EAAI,6CAAA;wBACJC,cAAAA,EAAgB;AAClB,qBAAA,CAAA;8BAEC/E,aAAAA,CAAcgF,GAAG,CAAC,CAAC,EAAE7E,KAAK,EAAE8E,KAAK,EAAE,iBAClCjC,GAAA,CAACkC,kBAAAA,EAAAA;4BAAmB/E,KAAAA,EAAOA,KAAAA;AACxB8E,4BAAAA,QAAAA,EAAAA;AADoC9E,yBAAAA,EAAAA,KAAAA,CAAAA;;;;;AASrD,CAAA;AAEA,MAAMgF,WAAW,CAACpD,MAAAA,GAAAA;IAChB,MAAM,EAAEqD,UAAU,EAAE,GAAGrD,MAAAA;IAEvBA,MAAAA,CAAOqD,UAAU,GAAG,CAACC,IAAAA,GAAAA;QACnB,MAAMC,UAAAA,GAAaD,IAAAA,CAAKE,OAAO,CAAC,YAAA,CAAA;QAEhC,IAAID,UAAAA,IAAcvD,MAAAA,CAAOyD,SAAS,EAAE;;AAElC,YAAA,MAAMC,cAAAA,GAAiBpB,MAAAA,CAAOqB,KAAK,CAAC3D,MAAAA,EAAQ;gBAC1CqC,KAAAA,EAAO,CAAC9E,OAAS,CAAC+E,MAAAA,CAAOC,QAAQ,CAAChF,IAAAA,CAAAA,IAASA,IAAAA,CAAKK,IAAI,KAAK;AAC3D,aAAA,CAAA;AAEA,YAAA,IAAI8F,cAAAA,EAAgB;;;gBAGlBxB,UAAAA,CAAW0B,UAAU,CAAC5D,MAAAA,EAAQuD,UAAAA,CAAAA;AAC9B,gBAAA;AACF,YAAA;AACF,QAAA;;QAGAF,UAAAA,CAAWC,IAAAA,CAAAA;AACb,IAAA,CAAA;IAEA,OAAOtD,MAAAA;AACT,CAAA;AAEA,MAAM6D,UAAAA,GAAwC;IAC5C1C,IAAAA,EAAM;QACJ2C,aAAAA,EAAe,CAAC/D,sBAAUkB,GAAA,CAACnB,UAAAA,EAAAA;AAAY,gBAAA,GAAGC;;QAC1CgE,IAAAA,EAAMC,WAAAA;QACNd,KAAAA,EAAO;YACLH,EAAAA,EAAI,+BAAA;YACJC,cAAAA,EAAgB;AAClB,SAAA;AACAiB,QAAAA,SAAAA,EAAW,CAAC1G,IAAAA,GAASA,IAAAA,CAAKK,IAAI,KAAK,MAAA;QACnCsG,kBAAAA,EAAoB,IAAA;AACpBC,QAAAA,aAAAA,CAAAA,CAAcnE,MAAM,EAAA;AAClBoE,YAAAA,iBAAAA,CAAiCpE,MAAAA,EAAQ;gBAAEpC,IAAAA,EAAM,MAAA;gBAAQI,QAAAA,EAAU;AAAY,aAAA,CAAA;AACjF,QAAA,CAAA;AACAqG,QAAAA,cAAAA,CAAAA,CAAerE,MAAM,EAAA;YACnBsE,qBAAAA,CAAsBtE,MAAAA,CAAAA;AACxB,QAAA,CAAA;QACAuE,QAAAA,EAAU;AAAC,YAAA;AAAM,SAAA;QACjBC,MAAAA,EAAQpB;AACV;AACF;;;;"}
|
|
1
|
+
{"version":3,"file":"Code.mjs","sources":["../../../../../../../../admin/src/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, SingleSelect, SingleSelectOption } from '@strapi/design-system';\nimport { CodeBlock as CodeBlockIcon } from '@strapi/icons';\nimport * as PrismModule from 'prismjs';\nimport { useIntl } from 'react-intl';\nimport { BaseRange, Element, Editor, Node, NodeEntry, Transforms } from 'slate';\nimport { useSelected, type RenderElementProps, useFocused, ReactEditor } from 'slate-react';\nimport { styled } from 'styled-components';\n\nimport { useBlocksEditorContext, type BlocksStore } from '../BlocksEditor';\nimport { codeLanguages } from '../utils/constants';\nimport { baseHandleConvert } from '../utils/conversions';\nimport { pressEnterTwiceToExit } from '../utils/enterKey';\nimport { type Block } from '../utils/types';\n\nimport 'prismjs/themes/prism-solarizedlight.css';\nimport 'prismjs/components/prism-asmatmel';\nimport 'prismjs/components/prism-bash';\nimport 'prismjs/components/prism-basic';\nimport 'prismjs/components/prism-c';\nimport 'prismjs/components/prism-clojure';\nimport 'prismjs/components/prism-cobol';\nimport 'prismjs/components/prism-cpp';\nimport 'prismjs/components/prism-csharp';\nimport 'prismjs/components/prism-dart';\nimport 'prismjs/components/prism-docker';\nimport 'prismjs/components/prism-elixir';\nimport 'prismjs/components/prism-erlang';\nimport 'prismjs/components/prism-fortran';\nimport 'prismjs/components/prism-fsharp';\nimport 'prismjs/components/prism-go';\nimport 'prismjs/components/prism-graphql';\nimport 'prismjs/components/prism-groovy';\nimport 'prismjs/components/prism-haskell';\nimport 'prismjs/components/prism-haxe';\nimport 'prismjs/components/prism-ini';\nimport 'prismjs/components/prism-java';\nimport 'prismjs/components/prism-javascript';\nimport 'prismjs/components/prism-jsx';\nimport 'prismjs/components/prism-json';\nimport 'prismjs/components/prism-julia';\nimport 'prismjs/components/prism-kotlin';\nimport 'prismjs/components/prism-latex';\nimport 'prismjs/components/prism-lua';\nimport 'prismjs/components/prism-markdown';\nimport 'prismjs/components/prism-matlab';\nimport 'prismjs/components/prism-makefile';\nimport 'prismjs/components/prism-objectivec';\nimport 'prismjs/components/prism-perl';\nimport 'prismjs/components/prism-php';\nimport 'prismjs/components/prism-powershell';\nimport 'prismjs/components/prism-python';\nimport 'prismjs/components/prism-r';\nimport 'prismjs/components/prism-ruby';\nimport 'prismjs/components/prism-rust';\nimport 'prismjs/components/prism-sas';\nimport 'prismjs/components/prism-scala';\nimport 'prismjs/components/prism-scheme';\nimport 'prismjs/components/prism-sql';\nimport 'prismjs/components/prism-stata';\nimport 'prismjs/components/prism-swift';\nimport 'prismjs/components/prism-typescript';\nimport 'prismjs/components/prism-tsx';\nimport 'prismjs/components/prism-vbnet';\nimport 'prismjs/components/prism-yaml';\n\n/**\n * prismjs is UMD and may not expose a namespace when bundled by Vite; the content-manager\n * index preloads it so `window.Prism` is set. Use that when the module import is empty.\n */\nfunction resolvePrism(): typeof PrismModule | undefined {\n if (typeof PrismModule !== 'undefined' && PrismModule?.languages) {\n return PrismModule;\n }\n\n if (typeof window === 'undefined') {\n return undefined;\n }\n\n const globalPrism = (window as Window & { Prism?: typeof PrismModule }).Prism;\n return globalPrism;\n}\n\nconst Prism = resolvePrism();\n\ntype BaseRangeCustom = BaseRange & { className: string };\n\nexport const decorateCode = ([node, path]: NodeEntry) => {\n const ranges: BaseRangeCustom[] = [];\n\n // Prism can be undefined when the UMD bundle doesn't expose a namespace and window.Prism\n // isn't set yet (e.g. this chunk ran before the content-manager preload). Skip decoration.\n if (!Prism?.languages) return ranges;\n\n // make sure it is an Slate Element\n if (!Element.isElement(node) || node.type !== 'code') return ranges;\n // transform the Element into a string\n const text = Node.string(node);\n const language = codeLanguages.find((lang) => lang.value === node.language);\n const decorateKey = language?.decorate ?? language?.value;\n\n const selectedLanguage = Prism.languages[decorateKey || 'plaintext'];\n\n // create \"tokens\" with \"prismjs\" and put them in \"ranges\"\n const tokens = Prism.tokenize(text, selectedLanguage);\n let start = 0;\n for (const token of tokens) {\n const length = token.length;\n const end = start + length;\n if (typeof token !== 'string') {\n ranges.push({\n anchor: { path, offset: start },\n focus: { path, offset: end },\n className: `token ${token.type}`,\n });\n }\n start = end;\n }\n\n // these will be found in \"renderLeaf\" in \"leaf\" and their \"className\" will be applied\n return ranges;\n};\n\nconst CodeBlock = styled.pre`\n border-radius: ${({ theme }) => theme.borderRadius};\n background-color: ${({ theme }) => theme.colors.neutral100};\n max-width: 100%;\n overflow: auto;\n padding: ${({ theme }) => `${theme.spaces[3]} ${theme.spaces[4]}`};\n flex-shrink: 1;\n\n & > code {\n font-family: 'SF Mono', SFMono-Regular, ui-monospace, 'DejaVu Sans Mono', Menlo, Consolas,\n monospace;\n color: ${({ theme }) => theme.colors.neutral800};\n overflow: auto;\n max-width: 100%;\n }\n`;\n\nconst CodeEditor = (props: RenderElementProps) => {\n const { editor } = useBlocksEditorContext('ImageDialog');\n const editorIsFocused = useFocused();\n const imageIsSelected = useSelected();\n const { formatMessage } = useIntl();\n const [isSelectOpen, setIsSelectOpen] = React.useState(false);\n const shouldDisplayLanguageSelect = (editorIsFocused && imageIsSelected) || isSelectOpen;\n\n return (\n <Box position=\"relative\" width=\"100%\">\n <CodeBlock {...props.attributes}>\n <code>{props.children}</code>\n </CodeBlock>\n {shouldDisplayLanguageSelect && (\n <Box\n position=\"absolute\"\n background=\"neutral0\"\n borderColor=\"neutral150\"\n borderStyle=\"solid\"\n borderWidth=\"0.5px\"\n shadow=\"tableShadow\"\n top=\"100%\"\n marginTop={1}\n right={0}\n padding={1}\n hasRadius\n >\n <SingleSelect\n onChange={(open) => {\n Transforms.setNodes(\n editor,\n { language: open.toString() },\n { match: (node) => !Editor.isEditor(node) && node.type === 'code' }\n );\n }}\n value={(props.element.type === 'code' && props.element.language) || 'plaintext'}\n onOpenChange={(open) => {\n setIsSelectOpen(open);\n\n // Focus the editor again when closing the select so the user can continue typing\n if (!open) {\n ReactEditor.focus(editor);\n }\n }}\n onCloseAutoFocus={(e) => e.preventDefault()}\n aria-label={formatMessage({\n id: 'components.Blocks.blocks.code.languageLabel',\n defaultMessage: 'Select a language',\n })}\n >\n {codeLanguages.map(({ value, label }) => (\n <SingleSelectOption value={value} key={value}>\n {label}\n </SingleSelectOption>\n ))}\n </SingleSelect>\n </Box>\n )}\n </Box>\n );\n};\n\nconst withCode = (editor: Editor) => {\n const { insertData } = editor;\n\n editor.insertData = (data) => {\n const pastedText = data.getData('text/plain');\n\n if (pastedText && editor.selection) {\n // Check if we're currently inside a code block\n const codeBlockEntry = Editor.above(editor, {\n match: (node) => !Editor.isEditor(node) && node.type === 'code',\n });\n\n if (codeBlockEntry) {\n // We're inside a code block, handle the paste specially\n // Replace the selected content with the pasted text, preserving newlines\n Transforms.insertText(editor, pastedText);\n return;\n }\n }\n\n // For non-code blocks, use the default behavior\n insertData(data);\n };\n\n return editor;\n};\n\nconst codeBlocks: Pick<BlocksStore, 'code'> = {\n code: {\n renderElement: (props) => <CodeEditor {...props} />,\n icon: CodeBlockIcon,\n label: {\n id: 'components.Blocks.blocks.code',\n defaultMessage: 'Code block',\n },\n matchNode: (node) => node.type === 'code',\n isInBlocksSelector: true,\n handleConvert(editor) {\n baseHandleConvert<Block<'code'>>(editor, { type: 'code', language: 'plaintext' });\n },\n handleEnterKey(editor) {\n pressEnterTwiceToExit(editor);\n },\n snippets: ['```'],\n plugin: withCode,\n },\n};\n\nexport { codeBlocks };\n"],"names":["resolvePrism","PrismModule","languages","window","undefined","globalPrism","Prism","decorateCode","node","path","ranges","Element","isElement","type","text","Node","string","language","codeLanguages","find","lang","value","decorateKey","decorate","selectedLanguage","tokens","tokenize","start","token","length","end","push","anchor","offset","focus","className","CodeBlock","styled","pre","theme","borderRadius","colors","neutral100","spaces","neutral800","CodeEditor","props","editor","useBlocksEditorContext","editorIsFocused","useFocused","imageIsSelected","useSelected","formatMessage","useIntl","isSelectOpen","setIsSelectOpen","React","useState","shouldDisplayLanguageSelect","_jsxs","Box","position","width","_jsx","attributes","code","children","background","borderColor","borderStyle","borderWidth","shadow","top","marginTop","right","padding","hasRadius","SingleSelect","onChange","open","Transforms","setNodes","toString","match","Editor","isEditor","element","onOpenChange","ReactEditor","onCloseAutoFocus","e","preventDefault","aria-label","id","defaultMessage","map","label","SingleSelectOption","withCode","insertData","data","pastedText","getData","selection","codeBlockEntry","above","insertText","codeBlocks","renderElement","icon","CodeBlockIcon","matchNode","isInBlocksSelector","handleConvert","baseHandleConvert","handleEnterKey","pressEnterTwiceToExit","snippets","plugin"],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import { jsx, jsxs } from 'react/jsx-runtime';
|
|
|
2
2
|
import * as React from 'react';
|
|
3
3
|
import { Box, Button, Popover, Flex, Field } from '@strapi/design-system';
|
|
4
4
|
import { useIntl } from 'react-intl';
|
|
5
|
-
import { Editor,
|
|
5
|
+
import { Editor, Transforms, Range, Path, Point, Element, Node } from 'slate';
|
|
6
6
|
import { ReactEditor } from 'slate-react';
|
|
7
7
|
import { styled } from 'styled-components';
|
|
8
8
|
import { useBlocksEditorContext } from '../BlocksEditor.mjs';
|
|
@@ -291,8 +291,11 @@ const baseRenderLeaf = (props, modifiers)=>{
|
|
|
291
291
|
};
|
|
292
292
|
const baseRenderElement = ({ props, blocks, editor, dragDirection, setDragDirection, isMobile })=>{
|
|
293
293
|
const { element } = props;
|
|
294
|
-
const blockMatch = Object.values(blocks).find((block)=>block
|
|
294
|
+
const blockMatch = Object.values(blocks).find((block)=>block?.matchNode(element));
|
|
295
295
|
const block = blockMatch || blocks.paragraph;
|
|
296
|
+
if (!block) {
|
|
297
|
+
return /*#__PURE__*/ jsxRuntime.jsx(jsxRuntime.Fragment, {});
|
|
298
|
+
}
|
|
296
299
|
const nodePath = slateReact.ReactEditor.findPath(editor, element);
|
|
297
300
|
const isDraggable = block.isDraggable?.(element) ?? true;
|
|
298
301
|
if (!isDraggable || isMobile) {
|
|
@@ -379,7 +382,7 @@ const BlocksContent = ({ placeholder, ariaLabelId })=>{
|
|
|
379
382
|
}
|
|
380
383
|
// Check if the text node starts with a known snippet
|
|
381
384
|
const blockMatchingSnippet = Object.values(blocks).find((block)=>{
|
|
382
|
-
return block
|
|
385
|
+
return block?.snippets?.includes(textNode.text);
|
|
383
386
|
});
|
|
384
387
|
if (blockMatchingSnippet?.handleConvert) {
|
|
385
388
|
// Prevent the space from being created and delete the snippet
|
|
@@ -399,7 +402,7 @@ const BlocksContent = ({ placeholder, ariaLabelId })=>{
|
|
|
399
402
|
return;
|
|
400
403
|
}
|
|
401
404
|
const selectedNode = editor.children[editor.selection.anchor.path[0]];
|
|
402
|
-
const selectedBlock = Object.values(blocks).find((block)=>block
|
|
405
|
+
const selectedBlock = Object.values(blocks).find((block)=>block?.matchNode(selectedNode));
|
|
403
406
|
if (!selectedBlock) {
|
|
404
407
|
return;
|
|
405
408
|
}
|
|
@@ -412,7 +415,7 @@ const BlocksContent = ({ placeholder, ariaLabelId })=>{
|
|
|
412
415
|
if (selectedBlock.handleEnterKey) {
|
|
413
416
|
selectedBlock.handleEnterKey(editor);
|
|
414
417
|
} else {
|
|
415
|
-
blocks.paragraph
|
|
418
|
+
blocks.paragraph?.handleEnterKey(editor);
|
|
416
419
|
}
|
|
417
420
|
};
|
|
418
421
|
const handleBackspaceEvent = (event)=>{
|
|
@@ -420,7 +423,7 @@ const BlocksContent = ({ placeholder, ariaLabelId })=>{
|
|
|
420
423
|
return;
|
|
421
424
|
}
|
|
422
425
|
const selectedNode = editor.children[editor.selection.anchor.path[0]];
|
|
423
|
-
const selectedBlock = Object.values(blocks).find((block)=>block
|
|
426
|
+
const selectedBlock = Object.values(blocks).find((block)=>block?.matchNode(selectedNode));
|
|
424
427
|
if (!selectedBlock) {
|
|
425
428
|
return;
|
|
426
429
|
}
|
|
@@ -433,7 +436,7 @@ const BlocksContent = ({ placeholder, ariaLabelId })=>{
|
|
|
433
436
|
return;
|
|
434
437
|
}
|
|
435
438
|
const selectedNode = editor.children[editor.selection.anchor.path[0]];
|
|
436
|
-
const selectedBlock = Object.values(blocks).find((block)=>block
|
|
439
|
+
const selectedBlock = Object.values(blocks).find((block)=>block?.matchNode(selectedNode));
|
|
437
440
|
if (!selectedBlock) {
|
|
438
441
|
return;
|
|
439
442
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BlocksContent.js","sources":["../../../../../../../admin/src/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useIsMobile } from '@strapi/admin/strapi-admin';\nimport {\n Box,\n BoxComponent,\n Flex,\n FlexComponent,\n IconButton,\n IconButtonComponent,\n useComposedRefs,\n} from '@strapi/design-system';\nimport { Drag } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { Editor, Range, Transforms } from 'slate';\nimport { ReactEditor, type RenderElementProps, type RenderLeafProps, Editable } from 'slate-react';\nimport { styled, CSSProperties, css } from 'styled-components';\n\nimport { ItemTypes } from '../../../../../constants/dragAndDrop';\nimport { useDragAndDrop, DIRECTIONS } from '../../../../../hooks/useDragAndDrop';\nimport { getTranslation } from '../../../../../utils/translations';\n\nimport { decorateCode } from './Blocks/Code';\nimport { type BlocksStore, useBlocksEditorContext } from './BlocksEditor';\nimport { useConversionModal } from './BlocksToolbar';\nimport { type ModifiersStore } from './Modifiers';\nimport { getEntries } from './utils/types';\n\nconst StyledEditable = styled(Editable)<{ $isExpandedMode: boolean }>`\n // The outline style is set on the wrapper with :focus-within\n outline: none;\n display: flex;\n flex-direction: column;\n gap: ${({ theme }) => theme.spaces[3]};\n height: 100%;\n // For fullscreen align input in the center with fixed width\n width: ${(props) => (props.$isExpandedMode ? '512px' : '100%')};\n margin: auto;\n font-size: 1.6rem;\n\n ${({ theme }) => theme.breakpoints.medium} {\n font-size: 1.4rem;\n }\n > *:last-child {\n padding-bottom: ${({ theme }) => theme.spaces[3]};\n }\n`;\n\nconst Wrapper = styled<BoxComponent>(Box)<{ $isOverDropTarget: boolean }>`\n position: ${({ $isOverDropTarget }) => $isOverDropTarget && 'relative'};\n`;\n\ntype DragDirection = (typeof DIRECTIONS)[keyof typeof DIRECTIONS];\n\nconst DropPlaceholder = styled<BoxComponent>(Box)<{\n dragDirection: DragDirection | null;\n placeholderMargin: 1 | 2;\n}>`\n position: absolute;\n right: 0;\n\n // Show drop placeholder 8px above or below the drop target\n ${({ dragDirection, theme, placeholderMargin }) => css`\n top: ${dragDirection === DIRECTIONS.UPWARD && `-${theme.spaces[placeholderMargin]}`};\n bottom: ${dragDirection === DIRECTIONS.DOWNWARD && `-${theme.spaces[placeholderMargin]}`};\n `}\n`;\n\nconst DragItem = styled<FlexComponent>(Flex)<{ $dragVisibility: CSSProperties['visibility'] }>`\n // Style each block rendered using renderElement()\n & > [data-slate-node='element'] {\n width: 100%;\n opacity: inherit;\n }\n\n // Set the visibility of drag button\n [role='button'] {\n visibility: ${(props) => props.$dragVisibility};\n opacity: inherit;\n }\n &[aria-disabled='true'] {\n user-drag: none;\n }\n`;\n\nconst DragIconButton = styled<IconButtonComponent<'div'>>(IconButton)<{\n $dragHandleTopMargin?: CSSProperties['marginTop'];\n}>`\n user-select: none;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n border-radius: ${({ theme }) => theme.borderRadius};\n padding-left: ${({ theme }) => theme.spaces[0]};\n padding-right: ${({ theme }) => theme.spaces[0]};\n padding-top: ${({ theme }) => theme.spaces[1]};\n padding-bottom: ${({ theme }) => theme.spaces[1]};\n visibility: hidden;\n cursor: grab;\n opacity: inherit;\n margin-top: ${(props) => props.$dragHandleTopMargin ?? 0};\n\n &:hover {\n background: ${({ theme }) => theme.colors.neutral100};\n }\n &:active {\n cursor: grabbing;\n background: ${({ theme }) => theme.colors.neutral150};\n }\n &[aria-disabled='true'] {\n visibility: hidden;\n }\n svg {\n min-width: ${({ theme }) => theme.spaces[3]};\n\n path {\n fill: ${({ theme }) => theme.colors.neutral500};\n }\n }\n`;\n\ntype Direction = {\n setDragDirection: (direction: DragDirection) => void;\n dragDirection: DragDirection | null;\n};\n\ntype DragAndDropElementProps = Direction & {\n children: RenderElementProps['children'];\n index: Array<number>;\n dragHandleTopMargin?: CSSProperties['marginTop'];\n};\n\nconst DragAndDropElement = ({\n children,\n index,\n setDragDirection,\n dragDirection,\n dragHandleTopMargin,\n}: DragAndDropElementProps) => {\n const { editor, disabled, name, setLiveText } = useBlocksEditorContext('DragAndDropElement');\n const { formatMessage } = useIntl();\n const [dragVisibility, setDragVisibility] = React.useState<CSSProperties['visibility']>('hidden');\n const isDragAndDropEnabled = !disabled;\n\n const handleMoveBlock = React.useCallback(\n (newIndex: Array<number>, currentIndex: Array<number>) => {\n Transforms.moveNodes(editor, {\n at: currentIndex,\n to: newIndex,\n });\n\n // Add 1 to the index for the live text message\n const currentIndexPosition = [currentIndex[0] + 1, ...currentIndex.slice(1)];\n const newIndexPosition = [newIndex[0] + 1, ...newIndex.slice(1)];\n\n setLiveText(\n formatMessage(\n {\n id: getTranslation('components.Blocks.dnd.reorder'),\n defaultMessage: '{item}, moved. New position in the editor: {position}.',\n },\n {\n item: `${name}.${currentIndexPosition.join(',')}`,\n position: `${newIndexPosition.join(',')} of ${editor.children.length}`,\n }\n )\n );\n },\n [editor, formatMessage, name, setLiveText]\n );\n\n const [{ handlerId, isDragging, isOverDropTarget, direction }, blockRef, dropRef, dragRef] =\n useDragAndDrop(isDragAndDropEnabled, {\n type: `${ItemTypes.BLOCKS}_${name}`,\n index,\n item: {\n index,\n displayedValue: children,\n },\n onDropItem(currentIndex, newIndex) {\n if (newIndex) handleMoveBlock(newIndex, currentIndex);\n },\n });\n\n const composedBoxRefs = useComposedRefs(blockRef, dropRef);\n\n // Set Drag direction before loosing state while dragging\n React.useEffect(() => {\n if (direction) {\n setDragDirection(direction);\n }\n }, [direction, setDragDirection]);\n\n // On selection change hide drag handle\n React.useEffect(() => {\n setDragVisibility('hidden');\n }, [editor.selection]);\n\n return (\n <Wrapper ref={composedBoxRefs} $isOverDropTarget={isOverDropTarget}>\n {isOverDropTarget && (\n <DropPlaceholder\n borderStyle=\"solid\"\n borderColor=\"secondary200\"\n borderWidth=\"2px\"\n width=\"calc(100% - 24px)\"\n marginLeft=\"auto\"\n dragDirection={dragDirection}\n // For list items placeholder reduce the margin around\n placeholderMargin={children.props.as && children.props.as === 'li' ? 1 : 2}\n />\n )}\n {isDragging ? (\n <CloneDragItem dragHandleTopMargin={dragHandleTopMargin}>{children}</CloneDragItem>\n ) : (\n <DragItem\n ref={dragRef}\n data-handler-id={handlerId}\n gap={2}\n paddingLeft={2}\n alignItems=\"start\"\n onDragStart={\n isDragAndDropEnabled\n ? (event) => {\n const target = event.target as HTMLElement;\n const currentTarget = event.currentTarget as HTMLElement;\n\n // Dragging action should only trigger drag event when button is dragged, however update styles on the whole dragItem.\n if (target.getAttribute('role') !== 'button') {\n event.preventDefault();\n } else {\n // Setting styles using dragging state is not working, so set it on current target element as nodes get dragged\n currentTarget.style.opacity = '0.5';\n }\n }\n : undefined\n }\n onDragEnd={\n isDragAndDropEnabled\n ? (event) => {\n const currentTarget = event.currentTarget as HTMLElement;\n currentTarget.style.opacity = '1';\n }\n : undefined\n }\n onMouseEnter={() => setDragVisibility('visible')}\n onFocusCapture={() => setDragVisibility('visible')}\n onBlurCapture={() => setDragVisibility('hidden')}\n onMouseLeave={() => setDragVisibility('hidden')}\n aria-disabled={disabled}\n $dragVisibility={dragVisibility}\n >\n <DragIconButton\n tag=\"div\"\n contentEditable={false}\n role=\"button\"\n tabIndex={0}\n withTooltip={false}\n label={formatMessage({\n id: getTranslation('components.DragHandle-label'),\n defaultMessage: 'Drag',\n })}\n onClick={(e: React.MouseEvent) => e.stopPropagation()}\n aria-disabled={disabled}\n disabled={disabled}\n draggable={isDragAndDropEnabled}\n // For some blocks top margin added to drag handle to align at the text level\n $dragHandleTopMargin={dragHandleTopMargin}\n >\n <Drag color=\"primary500\" />\n </DragIconButton>\n {children}\n </DragItem>\n )}\n </Wrapper>\n );\n};\n\ninterface CloneDragItemProps {\n children: RenderElementProps['children'];\n dragHandleTopMargin?: CSSProperties['marginTop'];\n}\n\n// To prevent applying opacity to the original item being dragged, display a cloned element without opacity.\nconst CloneDragItem = ({ children, dragHandleTopMargin }: CloneDragItemProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <DragItem gap={2} paddingLeft={2} alignItems=\"start\" $dragVisibility=\"visible\">\n <DragIconButton\n tag=\"div\"\n role=\"button\"\n withTooltip={false}\n label={formatMessage({\n id: getTranslation('components.DragHandle-label'),\n defaultMessage: 'Drag',\n })}\n $dragHandleTopMargin={dragHandleTopMargin}\n >\n <Drag color=\"neutral600\" />\n </DragIconButton>\n {children}\n </DragItem>\n );\n};\n\ninterface ExtendedRenderLeafProps extends RenderLeafProps {\n leaf: RenderLeafProps['leaf'] & { className?: string };\n}\n\nconst baseRenderLeaf = (props: ExtendedRenderLeafProps, modifiers: ModifiersStore) => {\n // Recursively wrap the children for each active modifier\n const wrappedChildren = getEntries(modifiers).reduce((currentChildren, modifierEntry) => {\n const [name, modifier] = modifierEntry;\n\n if (props.leaf[name]) {\n return modifier.renderLeaf(currentChildren);\n }\n\n return currentChildren;\n }, props.children);\n\n return (\n <span {...props.attributes} className={props.leaf.className}>\n {wrappedChildren}\n </span>\n );\n};\n\ntype BaseRenderElementProps = Direction & {\n props: RenderElementProps['children'];\n blocks: BlocksStore;\n editor: Editor;\n isMobile: boolean;\n};\n\nconst baseRenderElement = ({\n props,\n blocks,\n editor,\n dragDirection,\n setDragDirection,\n isMobile,\n}: BaseRenderElementProps) => {\n const { element } = props;\n\n const blockMatch = Object.values(blocks).find((block) => block.matchNode(element));\n const block = blockMatch || blocks.paragraph;\n const nodePath = ReactEditor.findPath(editor, element);\n\n const isDraggable = block.isDraggable?.(element) ?? true;\n\n if (!isDraggable || isMobile) {\n return block.renderElement(props);\n }\n\n return (\n <DragAndDropElement\n index={nodePath}\n setDragDirection={setDragDirection}\n dragDirection={dragDirection}\n dragHandleTopMargin={block.dragHandleTopMargin}\n >\n {block.renderElement(props)}\n </DragAndDropElement>\n );\n};\n\nconst dragNoop = () => true;\n\ninterface BlocksContentProps {\n placeholder?: string;\n ariaLabelId: string;\n}\n\nconst BlocksContent = ({ placeholder, ariaLabelId }: BlocksContentProps) => {\n const { editor, disabled, blocks, modifiers, setLiveText, isExpandedMode, flushPendingFormSync } =\n useBlocksEditorContext('BlocksContent');\n const isMobile = useIsMobile();\n const blocksRef = React.useRef<HTMLDivElement>(null);\n const { formatMessage } = useIntl();\n const [dragDirection, setDragDirection] = React.useState<DragDirection | null>(null);\n const { modalElement, handleConversionResult } = useConversionModal();\n\n // Create renderLeaf function based on the modifiers store\n const renderLeaf = React.useCallback(\n (props: ExtendedRenderLeafProps) => baseRenderLeaf(props, modifiers),\n [modifiers]\n );\n\n const handleMoveBlocks = (editor: Editor, event: React.KeyboardEvent<HTMLElement>) => {\n if (!editor.selection) return;\n\n const start = Range.start(editor.selection);\n const currentIndex = [start.path[0]];\n let newIndexPosition = 0;\n\n if (event.key === 'ArrowUp') {\n newIndexPosition = currentIndex[0] > 0 ? currentIndex[0] - 1 : currentIndex[0];\n } else {\n newIndexPosition =\n currentIndex[0] < editor.children.length - 1 ? currentIndex[0] + 1 : currentIndex[0];\n }\n\n const newIndex = [newIndexPosition];\n\n if (newIndexPosition !== currentIndex[0]) {\n Transforms.moveNodes(editor, {\n at: currentIndex,\n to: newIndex,\n });\n\n setLiveText(\n formatMessage(\n {\n id: getTranslation('components.Blocks.dnd.reorder'),\n defaultMessage: '{item}, moved. New position in the editor: {position}.',\n },\n {\n item: `${name}.${currentIndex[0] + 1}`,\n position: `${newIndex[0] + 1} of ${editor.children.length}`,\n }\n )\n );\n\n event.preventDefault();\n }\n };\n\n // Create renderElement function base on the blocks store\n const renderElement = React.useCallback(\n (props: RenderElementProps) =>\n baseRenderElement({ props, blocks, editor, dragDirection, setDragDirection, isMobile }),\n [blocks, editor, dragDirection, isMobile, setDragDirection]\n );\n\n const checkSnippet = (event: React.KeyboardEvent<HTMLElement>) => {\n // Get current text block\n if (!editor.selection) {\n return;\n }\n\n const [textNode, textNodePath] = Editor.node(editor, editor.selection.anchor.path);\n\n // Narrow the type to a text node\n if (Editor.isEditor(textNode) || textNode.type !== 'text') {\n return;\n }\n\n // Don't check for snippets if we're not at the start of a block\n if (textNodePath.at(-1) !== 0) {\n return;\n }\n\n // Check if the text node starts with a known snippet\n const blockMatchingSnippet = Object.values(blocks).find((block) => {\n return block.snippets?.includes(textNode.text);\n });\n\n if (blockMatchingSnippet?.handleConvert) {\n // Prevent the space from being created and delete the snippet\n event.preventDefault();\n Transforms.delete(editor, {\n distance: textNode.text.length,\n unit: 'character',\n reverse: true,\n });\n\n // Convert the selected block\n const maybeRenderModal = blockMatchingSnippet.handleConvert(editor);\n handleConversionResult(maybeRenderModal);\n }\n };\n\n const handleEnter = (event: React.KeyboardEvent<HTMLElement>) => {\n if (!editor.selection) {\n return;\n }\n\n const selectedNode = editor.children[editor.selection.anchor.path[0]];\n const selectedBlock = Object.values(blocks).find((block) => block.matchNode(selectedNode));\n if (!selectedBlock) {\n return;\n }\n\n // Allow forced line breaks when shift is pressed\n if (event.shiftKey && selectedNode.type !== 'image') {\n Transforms.insertText(editor, '\\n');\n return;\n }\n\n // Check if there's an enter handler for the selected block\n if (selectedBlock.handleEnterKey) {\n selectedBlock.handleEnterKey(editor);\n } else {\n blocks.paragraph.handleEnterKey!(editor);\n }\n };\n\n const handleBackspaceEvent = (event: React.KeyboardEvent<HTMLElement>) => {\n if (!editor.selection) {\n return;\n }\n\n const selectedNode = editor.children[editor.selection.anchor.path[0]];\n const selectedBlock = Object.values(blocks).find((block) => block.matchNode(selectedNode));\n\n if (!selectedBlock) {\n return;\n }\n\n if (selectedBlock.handleBackspaceKey) {\n selectedBlock.handleBackspaceKey(editor, event);\n }\n };\n\n const handleTab = (event: React.KeyboardEvent<HTMLElement>) => {\n if (!editor.selection) {\n return;\n }\n\n const selectedNode = editor.children[editor.selection.anchor.path[0]];\n const selectedBlock = Object.values(blocks).find((block) => block.matchNode(selectedNode));\n if (!selectedBlock) {\n return;\n }\n\n event.preventDefault();\n\n if (event.shiftKey && selectedBlock.handleShiftTab) {\n // Handle Shift+Tab (unindent)\n selectedBlock.handleShiftTab(editor);\n } else if (!event.shiftKey && selectedBlock.handleTab) {\n // Handle Tab (indent)\n selectedBlock.handleTab(editor);\n }\n };\n\n const handleKeyboardShortcuts = (event: React.KeyboardEvent<HTMLElement>) => {\n const isCtrlOrCmd = event.metaKey || event.ctrlKey;\n\n if (isCtrlOrCmd) {\n // Check if there's a modifier to toggle\n Object.values(modifiers).forEach((value) => {\n if (value.isValidEventKey(event)) {\n event.preventDefault();\n value.handleToggle(editor);\n return;\n }\n });\n if (event.shiftKey && ['ArrowUp', 'ArrowDown'].includes(event.key)) {\n handleMoveBlocks(editor, event);\n }\n }\n };\n\n const handleKeyDown: React.KeyboardEventHandler<HTMLElement> = (event) => {\n // Find the right block-specific handlers for enter and backspace key presses\n switch (event.key) {\n case 'Enter':\n event.preventDefault();\n return handleEnter(event);\n case 'Backspace':\n return handleBackspaceEvent(event);\n case 'Tab':\n return handleTab(event);\n case 'Escape':\n return ReactEditor.blur(editor);\n }\n handleKeyboardShortcuts(event);\n // Check if a snippet was triggered\n if (event.key === ' ') {\n checkSnippet(event);\n }\n };\n\n /**\n * scrollSelectionIntoView : Slate's default method to scroll a DOM selection into the view,\n * thats shifting layout for us when there is a overflowY:scroll on the viewport.\n * We are overriding it to check if the selection is not fully within the visible area of the editor,\n * we use scrollBy one line to the bottom\n */\n\n const handleScrollSelectionIntoView = React.useCallback(() => {\n if (!editor.selection || !blocksRef.current) {\n return;\n }\n\n const domRange = ReactEditor.toDOMRange(editor, editor.selection);\n const domRect = domRange.getBoundingClientRect();\n\n const editorRect = blocksRef.current.getBoundingClientRect();\n\n // Check if the selection is not fully within the visible area of the editor\n if (domRect.top < editorRect.top || domRect.bottom > editorRect.bottom) {\n // Scroll by one line to the bottom\n blocksRef.current.scrollBy({\n top: 28, // 20px is the line-height + 8px line gap\n behavior: 'smooth',\n });\n }\n }, [editor]);\n\n return (\n <Box\n ref={blocksRef}\n grow={1}\n width=\"100%\"\n overflow=\"auto\"\n fontSize={2}\n background=\"neutral0\"\n color=\"neutral800\"\n lineHeight={6}\n paddingLeft={{ initial: 4, medium: 0 }}\n paddingRight={7}\n paddingTop={6}\n paddingBottom={3}\n >\n <StyledEditable\n aria-labelledby={ariaLabelId}\n readOnly={disabled}\n placeholder={placeholder}\n $isExpandedMode={isExpandedMode}\n decorate={decorateCode}\n renderElement={renderElement}\n renderLeaf={renderLeaf}\n onKeyDown={handleKeyDown}\n scrollSelectionIntoView={handleScrollSelectionIntoView}\n onBlur={flushPendingFormSync}\n // As we have our own handler to drag and drop the elements returing true will skip slate's own event handler\n onDrop={dragNoop}\n onDragStart={dragNoop}\n />\n {modalElement}\n </Box>\n );\n};\n\nexport { BlocksContent, BlocksContentProps };\n"],"names":["StyledEditable","styled","Editable","theme","spaces","props","$isExpandedMode","breakpoints","medium","Wrapper","Box","$isOverDropTarget","DropPlaceholder","dragDirection","placeholderMargin","css","DIRECTIONS","UPWARD","DOWNWARD","DragItem","Flex","$dragVisibility","DragIconButton","IconButton","borderRadius","$dragHandleTopMargin","colors","neutral100","neutral150","neutral500","DragAndDropElement","children","index","setDragDirection","dragHandleTopMargin","editor","disabled","name","setLiveText","useBlocksEditorContext","formatMessage","useIntl","dragVisibility","setDragVisibility","React","useState","isDragAndDropEnabled","handleMoveBlock","useCallback","newIndex","currentIndex","Transforms","moveNodes","at","to","currentIndexPosition","slice","newIndexPosition","id","getTranslation","defaultMessage","item","join","position","length","handlerId","isDragging","isOverDropTarget","direction","blockRef","dropRef","dragRef","useDragAndDrop","type","ItemTypes","BLOCKS","displayedValue","onDropItem","composedBoxRefs","useComposedRefs","useEffect","selection","_jsxs","ref","_jsx","borderStyle","borderColor","borderWidth","width","marginLeft","as","CloneDragItem","data-handler-id","gap","paddingLeft","alignItems","onDragStart","event","target","currentTarget","getAttribute","preventDefault","style","opacity","undefined","onDragEnd","onMouseEnter","onFocusCapture","onBlurCapture","onMouseLeave","aria-disabled","tag","contentEditable","role","tabIndex","withTooltip","label","onClick","e","stopPropagation","draggable","Drag","color","baseRenderLeaf","modifiers","wrappedChildren","getEntries","reduce","currentChildren","modifierEntry","modifier","leaf","renderLeaf","span","attributes","className","baseRenderElement","blocks","isMobile","element","blockMatch","Object","values","find","block","matchNode","paragraph","nodePath","ReactEditor","findPath","isDraggable","renderElement","dragNoop","BlocksContent","placeholder","ariaLabelId","isExpandedMode","flushPendingFormSync","useIsMobile","blocksRef","useRef","modalElement","handleConversionResult","useConversionModal","handleMoveBlocks","start","Range","path","key","checkSnippet","textNode","textNodePath","Editor","node","anchor","isEditor","blockMatchingSnippet","snippets","includes","text","handleConvert","delete","distance","unit","reverse","maybeRenderModal","handleEnter","selectedNode","selectedBlock","shiftKey","insertText","handleEnterKey","handleBackspaceEvent","handleBackspaceKey","handleTab","handleShiftTab","handleKeyboardShortcuts","isCtrlOrCmd","metaKey","ctrlKey","forEach","value","isValidEventKey","handleToggle","handleKeyDown","blur","handleScrollSelectionIntoView","current","domRange","toDOMRange","domRect","getBoundingClientRect","editorRect","top","bottom","scrollBy","behavior","grow","overflow","fontSize","background","lineHeight","initial","paddingRight","paddingTop","paddingBottom","aria-labelledby","readOnly","decorate","decorateCode","onKeyDown","scrollSelectionIntoView","onBlur","onDrop"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BlocksContent.js","sources":["../../../../../../../admin/src/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useIsMobile } from '@strapi/admin/strapi-admin';\nimport {\n Box,\n BoxComponent,\n Flex,\n FlexComponent,\n IconButton,\n IconButtonComponent,\n useComposedRefs,\n} from '@strapi/design-system';\nimport { Drag } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { Editor, Range, Transforms } from 'slate';\nimport { ReactEditor, type RenderElementProps, type RenderLeafProps, Editable } from 'slate-react';\nimport { styled, CSSProperties, css } from 'styled-components';\n\nimport { ItemTypes } from '../../../../../constants/dragAndDrop';\nimport { useDragAndDrop, DIRECTIONS } from '../../../../../hooks/useDragAndDrop';\nimport { getTranslation } from '../../../../../utils/translations';\n\nimport { decorateCode } from './Blocks/Code';\nimport { type BlocksStore, useBlocksEditorContext } from './BlocksEditor';\nimport { useConversionModal } from './BlocksToolbar';\nimport { type ModifiersStore } from './Modifiers';\nimport { getEntries } from './utils/types';\n\nconst StyledEditable = styled(Editable)<{ $isExpandedMode: boolean }>`\n // The outline style is set on the wrapper with :focus-within\n outline: none;\n display: flex;\n flex-direction: column;\n gap: ${({ theme }) => theme.spaces[3]};\n height: 100%;\n // For fullscreen align input in the center with fixed width\n width: ${(props) => (props.$isExpandedMode ? '512px' : '100%')};\n margin: auto;\n font-size: 1.6rem;\n\n ${({ theme }) => theme.breakpoints.medium} {\n font-size: 1.4rem;\n }\n > *:last-child {\n padding-bottom: ${({ theme }) => theme.spaces[3]};\n }\n`;\n\nconst Wrapper = styled<BoxComponent>(Box)<{ $isOverDropTarget: boolean }>`\n position: ${({ $isOverDropTarget }) => $isOverDropTarget && 'relative'};\n`;\n\ntype DragDirection = (typeof DIRECTIONS)[keyof typeof DIRECTIONS];\n\nconst DropPlaceholder = styled<BoxComponent>(Box)<{\n dragDirection: DragDirection | null;\n placeholderMargin: 1 | 2;\n}>`\n position: absolute;\n right: 0;\n\n // Show drop placeholder 8px above or below the drop target\n ${({ dragDirection, theme, placeholderMargin }) => css`\n top: ${dragDirection === DIRECTIONS.UPWARD && `-${theme.spaces[placeholderMargin]}`};\n bottom: ${dragDirection === DIRECTIONS.DOWNWARD && `-${theme.spaces[placeholderMargin]}`};\n `}\n`;\n\nconst DragItem = styled<FlexComponent>(Flex)<{ $dragVisibility: CSSProperties['visibility'] }>`\n // Style each block rendered using renderElement()\n & > [data-slate-node='element'] {\n width: 100%;\n opacity: inherit;\n }\n\n // Set the visibility of drag button\n [role='button'] {\n visibility: ${(props) => props.$dragVisibility};\n opacity: inherit;\n }\n &[aria-disabled='true'] {\n user-drag: none;\n }\n`;\n\nconst DragIconButton = styled<IconButtonComponent<'div'>>(IconButton)<{\n $dragHandleTopMargin?: CSSProperties['marginTop'];\n}>`\n user-select: none;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n border-radius: ${({ theme }) => theme.borderRadius};\n padding-left: ${({ theme }) => theme.spaces[0]};\n padding-right: ${({ theme }) => theme.spaces[0]};\n padding-top: ${({ theme }) => theme.spaces[1]};\n padding-bottom: ${({ theme }) => theme.spaces[1]};\n visibility: hidden;\n cursor: grab;\n opacity: inherit;\n margin-top: ${(props) => props.$dragHandleTopMargin ?? 0};\n\n &:hover {\n background: ${({ theme }) => theme.colors.neutral100};\n }\n &:active {\n cursor: grabbing;\n background: ${({ theme }) => theme.colors.neutral150};\n }\n &[aria-disabled='true'] {\n visibility: hidden;\n }\n svg {\n min-width: ${({ theme }) => theme.spaces[3]};\n\n path {\n fill: ${({ theme }) => theme.colors.neutral500};\n }\n }\n`;\n\ntype Direction = {\n setDragDirection: (direction: DragDirection) => void;\n dragDirection: DragDirection | null;\n};\n\ntype DragAndDropElementProps = Direction & {\n children: RenderElementProps['children'];\n index: Array<number>;\n dragHandleTopMargin?: CSSProperties['marginTop'];\n};\n\nconst DragAndDropElement = ({\n children,\n index,\n setDragDirection,\n dragDirection,\n dragHandleTopMargin,\n}: DragAndDropElementProps) => {\n const { editor, disabled, name, setLiveText } = useBlocksEditorContext('DragAndDropElement');\n const { formatMessage } = useIntl();\n const [dragVisibility, setDragVisibility] = React.useState<CSSProperties['visibility']>('hidden');\n const isDragAndDropEnabled = !disabled;\n\n const handleMoveBlock = React.useCallback(\n (newIndex: Array<number>, currentIndex: Array<number>) => {\n Transforms.moveNodes(editor, {\n at: currentIndex,\n to: newIndex,\n });\n\n // Add 1 to the index for the live text message\n const currentIndexPosition = [currentIndex[0] + 1, ...currentIndex.slice(1)];\n const newIndexPosition = [newIndex[0] + 1, ...newIndex.slice(1)];\n\n setLiveText(\n formatMessage(\n {\n id: getTranslation('components.Blocks.dnd.reorder'),\n defaultMessage: '{item}, moved. New position in the editor: {position}.',\n },\n {\n item: `${name}.${currentIndexPosition.join(',')}`,\n position: `${newIndexPosition.join(',')} of ${editor.children.length}`,\n }\n )\n );\n },\n [editor, formatMessage, name, setLiveText]\n );\n\n const [{ handlerId, isDragging, isOverDropTarget, direction }, blockRef, dropRef, dragRef] =\n useDragAndDrop(isDragAndDropEnabled, {\n type: `${ItemTypes.BLOCKS}_${name}`,\n index,\n item: {\n index,\n displayedValue: children,\n },\n onDropItem(currentIndex, newIndex) {\n if (newIndex) handleMoveBlock(newIndex, currentIndex);\n },\n });\n\n const composedBoxRefs = useComposedRefs(blockRef, dropRef);\n\n // Set Drag direction before loosing state while dragging\n React.useEffect(() => {\n if (direction) {\n setDragDirection(direction);\n }\n }, [direction, setDragDirection]);\n\n // On selection change hide drag handle\n React.useEffect(() => {\n setDragVisibility('hidden');\n }, [editor.selection]);\n\n return (\n <Wrapper ref={composedBoxRefs} $isOverDropTarget={isOverDropTarget}>\n {isOverDropTarget && (\n <DropPlaceholder\n borderStyle=\"solid\"\n borderColor=\"secondary200\"\n borderWidth=\"2px\"\n width=\"calc(100% - 24px)\"\n marginLeft=\"auto\"\n dragDirection={dragDirection}\n // For list items placeholder reduce the margin around\n placeholderMargin={children.props.as && children.props.as === 'li' ? 1 : 2}\n />\n )}\n {isDragging ? (\n <CloneDragItem dragHandleTopMargin={dragHandleTopMargin}>{children}</CloneDragItem>\n ) : (\n <DragItem\n ref={dragRef}\n data-handler-id={handlerId}\n gap={2}\n paddingLeft={2}\n alignItems=\"start\"\n onDragStart={\n isDragAndDropEnabled\n ? (event) => {\n const target = event.target as HTMLElement;\n const currentTarget = event.currentTarget as HTMLElement;\n\n // Dragging action should only trigger drag event when button is dragged, however update styles on the whole dragItem.\n if (target.getAttribute('role') !== 'button') {\n event.preventDefault();\n } else {\n // Setting styles using dragging state is not working, so set it on current target element as nodes get dragged\n currentTarget.style.opacity = '0.5';\n }\n }\n : undefined\n }\n onDragEnd={\n isDragAndDropEnabled\n ? (event) => {\n const currentTarget = event.currentTarget as HTMLElement;\n currentTarget.style.opacity = '1';\n }\n : undefined\n }\n onMouseEnter={() => setDragVisibility('visible')}\n onFocusCapture={() => setDragVisibility('visible')}\n onBlurCapture={() => setDragVisibility('hidden')}\n onMouseLeave={() => setDragVisibility('hidden')}\n aria-disabled={disabled}\n $dragVisibility={dragVisibility}\n >\n <DragIconButton\n tag=\"div\"\n contentEditable={false}\n role=\"button\"\n tabIndex={0}\n withTooltip={false}\n label={formatMessage({\n id: getTranslation('components.DragHandle-label'),\n defaultMessage: 'Drag',\n })}\n onClick={(e: React.MouseEvent) => e.stopPropagation()}\n aria-disabled={disabled}\n disabled={disabled}\n draggable={isDragAndDropEnabled}\n // For some blocks top margin added to drag handle to align at the text level\n $dragHandleTopMargin={dragHandleTopMargin}\n >\n <Drag color=\"primary500\" />\n </DragIconButton>\n {children}\n </DragItem>\n )}\n </Wrapper>\n );\n};\n\ninterface CloneDragItemProps {\n children: RenderElementProps['children'];\n dragHandleTopMargin?: CSSProperties['marginTop'];\n}\n\n// To prevent applying opacity to the original item being dragged, display a cloned element without opacity.\nconst CloneDragItem = ({ children, dragHandleTopMargin }: CloneDragItemProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <DragItem gap={2} paddingLeft={2} alignItems=\"start\" $dragVisibility=\"visible\">\n <DragIconButton\n tag=\"div\"\n role=\"button\"\n withTooltip={false}\n label={formatMessage({\n id: getTranslation('components.DragHandle-label'),\n defaultMessage: 'Drag',\n })}\n $dragHandleTopMargin={dragHandleTopMargin}\n >\n <Drag color=\"neutral600\" />\n </DragIconButton>\n {children}\n </DragItem>\n );\n};\n\ninterface ExtendedRenderLeafProps extends RenderLeafProps {\n leaf: RenderLeafProps['leaf'] & { className?: string };\n}\n\nconst baseRenderLeaf = (props: ExtendedRenderLeafProps, modifiers: ModifiersStore) => {\n // Recursively wrap the children for each active modifier\n const wrappedChildren = getEntries(modifiers).reduce((currentChildren, modifierEntry) => {\n const [name, modifier] = modifierEntry;\n\n if (props.leaf[name]) {\n return modifier.renderLeaf(currentChildren);\n }\n\n return currentChildren;\n }, props.children);\n\n return (\n <span {...props.attributes} className={props.leaf.className}>\n {wrappedChildren}\n </span>\n );\n};\n\ntype BaseRenderElementProps = Direction & {\n props: RenderElementProps['children'];\n blocks: Partial<BlocksStore>;\n editor: Editor;\n isMobile: boolean;\n};\n\nconst baseRenderElement = ({\n props,\n blocks,\n editor,\n dragDirection,\n setDragDirection,\n isMobile,\n}: BaseRenderElementProps) => {\n const { element } = props;\n\n const blockMatch = Object.values(blocks).find((block) => block?.matchNode(element));\n const block = blockMatch || blocks.paragraph;\n\n if (!block) {\n return <></>;\n }\n\n const nodePath = ReactEditor.findPath(editor, element);\n\n const isDraggable = block.isDraggable?.(element) ?? true;\n\n if (!isDraggable || isMobile) {\n return block.renderElement(props);\n }\n\n return (\n <DragAndDropElement\n index={nodePath}\n setDragDirection={setDragDirection}\n dragDirection={dragDirection}\n dragHandleTopMargin={block.dragHandleTopMargin}\n >\n {block.renderElement(props)}\n </DragAndDropElement>\n );\n};\n\nconst dragNoop = () => true;\n\ninterface BlocksContentProps {\n placeholder?: string;\n ariaLabelId: string;\n}\n\nconst BlocksContent = ({ placeholder, ariaLabelId }: BlocksContentProps) => {\n const { editor, disabled, blocks, modifiers, setLiveText, isExpandedMode, flushPendingFormSync } =\n useBlocksEditorContext('BlocksContent');\n const isMobile = useIsMobile();\n const blocksRef = React.useRef<HTMLDivElement>(null);\n const { formatMessage } = useIntl();\n const [dragDirection, setDragDirection] = React.useState<DragDirection | null>(null);\n const { modalElement, handleConversionResult } = useConversionModal();\n\n // Create renderLeaf function based on the modifiers store\n const renderLeaf = React.useCallback(\n (props: ExtendedRenderLeafProps) => baseRenderLeaf(props, modifiers),\n [modifiers]\n );\n\n const handleMoveBlocks = (editor: Editor, event: React.KeyboardEvent<HTMLElement>) => {\n if (!editor.selection) return;\n\n const start = Range.start(editor.selection);\n const currentIndex = [start.path[0]];\n let newIndexPosition = 0;\n\n if (event.key === 'ArrowUp') {\n newIndexPosition = currentIndex[0] > 0 ? currentIndex[0] - 1 : currentIndex[0];\n } else {\n newIndexPosition =\n currentIndex[0] < editor.children.length - 1 ? currentIndex[0] + 1 : currentIndex[0];\n }\n\n const newIndex = [newIndexPosition];\n\n if (newIndexPosition !== currentIndex[0]) {\n Transforms.moveNodes(editor, {\n at: currentIndex,\n to: newIndex,\n });\n\n setLiveText(\n formatMessage(\n {\n id: getTranslation('components.Blocks.dnd.reorder'),\n defaultMessage: '{item}, moved. New position in the editor: {position}.',\n },\n {\n item: `${name}.${currentIndex[0] + 1}`,\n position: `${newIndex[0] + 1} of ${editor.children.length}`,\n }\n )\n );\n\n event.preventDefault();\n }\n };\n\n // Create renderElement function base on the blocks store\n const renderElement = React.useCallback(\n (props: RenderElementProps) =>\n baseRenderElement({ props, blocks, editor, dragDirection, setDragDirection, isMobile }),\n [blocks, editor, dragDirection, isMobile, setDragDirection]\n );\n\n const checkSnippet = (event: React.KeyboardEvent<HTMLElement>) => {\n // Get current text block\n if (!editor.selection) {\n return;\n }\n\n const [textNode, textNodePath] = Editor.node(editor, editor.selection.anchor.path);\n\n // Narrow the type to a text node\n if (Editor.isEditor(textNode) || textNode.type !== 'text') {\n return;\n }\n\n // Don't check for snippets if we're not at the start of a block\n if (textNodePath.at(-1) !== 0) {\n return;\n }\n\n // Check if the text node starts with a known snippet\n const blockMatchingSnippet = Object.values(blocks).find((block) => {\n return block?.snippets?.includes(textNode.text);\n });\n\n if (blockMatchingSnippet?.handleConvert) {\n // Prevent the space from being created and delete the snippet\n event.preventDefault();\n Transforms.delete(editor, {\n distance: textNode.text.length,\n unit: 'character',\n reverse: true,\n });\n\n // Convert the selected block\n const maybeRenderModal = blockMatchingSnippet.handleConvert(editor);\n handleConversionResult(maybeRenderModal);\n }\n };\n\n const handleEnter = (event: React.KeyboardEvent<HTMLElement>) => {\n if (!editor.selection) {\n return;\n }\n\n const selectedNode = editor.children[editor.selection.anchor.path[0]];\n const selectedBlock = Object.values(blocks).find((block) => block?.matchNode(selectedNode));\n if (!selectedBlock) {\n return;\n }\n\n // Allow forced line breaks when shift is pressed\n if (event.shiftKey && selectedNode.type !== 'image') {\n Transforms.insertText(editor, '\\n');\n return;\n }\n\n // Check if there's an enter handler for the selected block\n if (selectedBlock.handleEnterKey) {\n selectedBlock.handleEnterKey(editor);\n } else {\n blocks.paragraph?.handleEnterKey!(editor);\n }\n };\n\n const handleBackspaceEvent = (event: React.KeyboardEvent<HTMLElement>) => {\n if (!editor.selection) {\n return;\n }\n\n const selectedNode = editor.children[editor.selection.anchor.path[0]];\n const selectedBlock = Object.values(blocks).find((block) => block?.matchNode(selectedNode));\n\n if (!selectedBlock) {\n return;\n }\n\n if (selectedBlock.handleBackspaceKey) {\n selectedBlock.handleBackspaceKey(editor, event);\n }\n };\n\n const handleTab = (event: React.KeyboardEvent<HTMLElement>) => {\n if (!editor.selection) {\n return;\n }\n\n const selectedNode = editor.children[editor.selection.anchor.path[0]];\n const selectedBlock = Object.values(blocks).find((block) => block?.matchNode(selectedNode));\n if (!selectedBlock) {\n return;\n }\n\n event.preventDefault();\n\n if (event.shiftKey && selectedBlock.handleShiftTab) {\n // Handle Shift+Tab (unindent)\n selectedBlock.handleShiftTab(editor);\n } else if (!event.shiftKey && selectedBlock.handleTab) {\n // Handle Tab (indent)\n selectedBlock.handleTab(editor);\n }\n };\n\n const handleKeyboardShortcuts = (event: React.KeyboardEvent<HTMLElement>) => {\n const isCtrlOrCmd = event.metaKey || event.ctrlKey;\n\n if (isCtrlOrCmd) {\n // Check if there's a modifier to toggle\n Object.values(modifiers).forEach((value) => {\n if (value.isValidEventKey(event)) {\n event.preventDefault();\n value.handleToggle(editor);\n return;\n }\n });\n if (event.shiftKey && ['ArrowUp', 'ArrowDown'].includes(event.key)) {\n handleMoveBlocks(editor, event);\n }\n }\n };\n\n const handleKeyDown: React.KeyboardEventHandler<HTMLElement> = (event) => {\n // Find the right block-specific handlers for enter and backspace key presses\n switch (event.key) {\n case 'Enter':\n event.preventDefault();\n return handleEnter(event);\n case 'Backspace':\n return handleBackspaceEvent(event);\n case 'Tab':\n return handleTab(event);\n case 'Escape':\n return ReactEditor.blur(editor);\n }\n handleKeyboardShortcuts(event);\n // Check if a snippet was triggered\n if (event.key === ' ') {\n checkSnippet(event);\n }\n };\n\n /**\n * scrollSelectionIntoView : Slate's default method to scroll a DOM selection into the view,\n * thats shifting layout for us when there is a overflowY:scroll on the viewport.\n * We are overriding it to check if the selection is not fully within the visible area of the editor,\n * we use scrollBy one line to the bottom\n */\n\n const handleScrollSelectionIntoView = React.useCallback(() => {\n if (!editor.selection || !blocksRef.current) {\n return;\n }\n\n const domRange = ReactEditor.toDOMRange(editor, editor.selection);\n const domRect = domRange.getBoundingClientRect();\n\n const editorRect = blocksRef.current.getBoundingClientRect();\n\n // Check if the selection is not fully within the visible area of the editor\n if (domRect.top < editorRect.top || domRect.bottom > editorRect.bottom) {\n // Scroll by one line to the bottom\n blocksRef.current.scrollBy({\n top: 28, // 20px is the line-height + 8px line gap\n behavior: 'smooth',\n });\n }\n }, [editor]);\n\n return (\n <Box\n ref={blocksRef}\n grow={1}\n width=\"100%\"\n overflow=\"auto\"\n fontSize={2}\n background=\"neutral0\"\n color=\"neutral800\"\n lineHeight={6}\n paddingLeft={{ initial: 4, medium: 0 }}\n paddingRight={7}\n paddingTop={6}\n paddingBottom={3}\n >\n <StyledEditable\n aria-labelledby={ariaLabelId}\n readOnly={disabled}\n placeholder={placeholder}\n $isExpandedMode={isExpandedMode}\n decorate={decorateCode}\n renderElement={renderElement}\n renderLeaf={renderLeaf}\n onKeyDown={handleKeyDown}\n scrollSelectionIntoView={handleScrollSelectionIntoView}\n onBlur={flushPendingFormSync}\n // As we have our own handler to drag and drop the elements returing true will skip slate's own event handler\n onDrop={dragNoop}\n onDragStart={dragNoop}\n />\n {modalElement}\n </Box>\n );\n};\n\nexport { BlocksContent, BlocksContentProps };\n"],"names":["StyledEditable","styled","Editable","theme","spaces","props","$isExpandedMode","breakpoints","medium","Wrapper","Box","$isOverDropTarget","DropPlaceholder","dragDirection","placeholderMargin","css","DIRECTIONS","UPWARD","DOWNWARD","DragItem","Flex","$dragVisibility","DragIconButton","IconButton","borderRadius","$dragHandleTopMargin","colors","neutral100","neutral150","neutral500","DragAndDropElement","children","index","setDragDirection","dragHandleTopMargin","editor","disabled","name","setLiveText","useBlocksEditorContext","formatMessage","useIntl","dragVisibility","setDragVisibility","React","useState","isDragAndDropEnabled","handleMoveBlock","useCallback","newIndex","currentIndex","Transforms","moveNodes","at","to","currentIndexPosition","slice","newIndexPosition","id","getTranslation","defaultMessage","item","join","position","length","handlerId","isDragging","isOverDropTarget","direction","blockRef","dropRef","dragRef","useDragAndDrop","type","ItemTypes","BLOCKS","displayedValue","onDropItem","composedBoxRefs","useComposedRefs","useEffect","selection","_jsxs","ref","_jsx","borderStyle","borderColor","borderWidth","width","marginLeft","as","CloneDragItem","data-handler-id","gap","paddingLeft","alignItems","onDragStart","event","target","currentTarget","getAttribute","preventDefault","style","opacity","undefined","onDragEnd","onMouseEnter","onFocusCapture","onBlurCapture","onMouseLeave","aria-disabled","tag","contentEditable","role","tabIndex","withTooltip","label","onClick","e","stopPropagation","draggable","Drag","color","baseRenderLeaf","modifiers","wrappedChildren","getEntries","reduce","currentChildren","modifierEntry","modifier","leaf","renderLeaf","span","attributes","className","baseRenderElement","blocks","isMobile","element","blockMatch","Object","values","find","block","matchNode","paragraph","_Fragment","nodePath","ReactEditor","findPath","isDraggable","renderElement","dragNoop","BlocksContent","placeholder","ariaLabelId","isExpandedMode","flushPendingFormSync","useIsMobile","blocksRef","useRef","modalElement","handleConversionResult","useConversionModal","handleMoveBlocks","start","Range","path","key","checkSnippet","textNode","textNodePath","Editor","node","anchor","isEditor","blockMatchingSnippet","snippets","includes","text","handleConvert","delete","distance","unit","reverse","maybeRenderModal","handleEnter","selectedNode","selectedBlock","shiftKey","insertText","handleEnterKey","handleBackspaceEvent","handleBackspaceKey","handleTab","handleShiftTab","handleKeyboardShortcuts","isCtrlOrCmd","metaKey","ctrlKey","forEach","value","isValidEventKey","handleToggle","handleKeyDown","blur","handleScrollSelectionIntoView","current","domRange","toDOMRange","domRect","getBoundingClientRect","editorRect","top","bottom","scrollBy","behavior","grow","overflow","fontSize","background","lineHeight","initial","paddingRight","paddingTop","paddingBottom","aria-labelledby","readOnly","decorate","decorateCode","onKeyDown","scrollSelectionIntoView","onBlur","onDrop"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
1
|
+
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
2
2
|
import * as React from 'react';
|
|
3
3
|
import { useIsMobile } from '@strapi/admin/strapi-admin';
|
|
4
4
|
import { Box, Flex, IconButton, useComposedRefs } from '@strapi/design-system';
|
|
@@ -270,8 +270,11 @@ const baseRenderLeaf = (props, modifiers)=>{
|
|
|
270
270
|
};
|
|
271
271
|
const baseRenderElement = ({ props, blocks, editor, dragDirection, setDragDirection, isMobile })=>{
|
|
272
272
|
const { element } = props;
|
|
273
|
-
const blockMatch = Object.values(blocks).find((block)=>block
|
|
273
|
+
const blockMatch = Object.values(blocks).find((block)=>block?.matchNode(element));
|
|
274
274
|
const block = blockMatch || blocks.paragraph;
|
|
275
|
+
if (!block) {
|
|
276
|
+
return /*#__PURE__*/ jsx(Fragment, {});
|
|
277
|
+
}
|
|
275
278
|
const nodePath = ReactEditor.findPath(editor, element);
|
|
276
279
|
const isDraggable = block.isDraggable?.(element) ?? true;
|
|
277
280
|
if (!isDraggable || isMobile) {
|
|
@@ -358,7 +361,7 @@ const BlocksContent = ({ placeholder, ariaLabelId })=>{
|
|
|
358
361
|
}
|
|
359
362
|
// Check if the text node starts with a known snippet
|
|
360
363
|
const blockMatchingSnippet = Object.values(blocks).find((block)=>{
|
|
361
|
-
return block
|
|
364
|
+
return block?.snippets?.includes(textNode.text);
|
|
362
365
|
});
|
|
363
366
|
if (blockMatchingSnippet?.handleConvert) {
|
|
364
367
|
// Prevent the space from being created and delete the snippet
|
|
@@ -378,7 +381,7 @@ const BlocksContent = ({ placeholder, ariaLabelId })=>{
|
|
|
378
381
|
return;
|
|
379
382
|
}
|
|
380
383
|
const selectedNode = editor.children[editor.selection.anchor.path[0]];
|
|
381
|
-
const selectedBlock = Object.values(blocks).find((block)=>block
|
|
384
|
+
const selectedBlock = Object.values(blocks).find((block)=>block?.matchNode(selectedNode));
|
|
382
385
|
if (!selectedBlock) {
|
|
383
386
|
return;
|
|
384
387
|
}
|
|
@@ -391,7 +394,7 @@ const BlocksContent = ({ placeholder, ariaLabelId })=>{
|
|
|
391
394
|
if (selectedBlock.handleEnterKey) {
|
|
392
395
|
selectedBlock.handleEnterKey(editor);
|
|
393
396
|
} else {
|
|
394
|
-
blocks.paragraph
|
|
397
|
+
blocks.paragraph?.handleEnterKey(editor);
|
|
395
398
|
}
|
|
396
399
|
};
|
|
397
400
|
const handleBackspaceEvent = (event)=>{
|
|
@@ -399,7 +402,7 @@ const BlocksContent = ({ placeholder, ariaLabelId })=>{
|
|
|
399
402
|
return;
|
|
400
403
|
}
|
|
401
404
|
const selectedNode = editor.children[editor.selection.anchor.path[0]];
|
|
402
|
-
const selectedBlock = Object.values(blocks).find((block)=>block
|
|
405
|
+
const selectedBlock = Object.values(blocks).find((block)=>block?.matchNode(selectedNode));
|
|
403
406
|
if (!selectedBlock) {
|
|
404
407
|
return;
|
|
405
408
|
}
|
|
@@ -412,7 +415,7 @@ const BlocksContent = ({ placeholder, ariaLabelId })=>{
|
|
|
412
415
|
return;
|
|
413
416
|
}
|
|
414
417
|
const selectedNode = editor.children[editor.selection.anchor.path[0]];
|
|
415
|
-
const selectedBlock = Object.values(blocks).find((block)=>block
|
|
418
|
+
const selectedBlock = Object.values(blocks).find((block)=>block?.matchNode(selectedNode));
|
|
416
419
|
if (!selectedBlock) {
|
|
417
420
|
return;
|
|
418
421
|
}
|