diff --git a/packages/volto-blocks/locales/en/LC_MESSAGES/volto.po b/packages/volto-blocks/locales/en/LC_MESSAGES/volto.po index 5d52915..04fc619 100644 --- a/packages/volto-blocks/locales/en/LC_MESSAGES/volto.po +++ b/packages/volto-blocks/locales/en/LC_MESSAGES/volto.po @@ -16,6 +16,16 @@ msgstr "" msgid "Alignment" msgstr "" +#. Default: "Box" +#: components/blocks/ImageAndTextBox/schema +msgid "Box" +msgstr "" + +#. Default: "Boxes" +#: components/blocks/ImageAndTextBox/schema +msgid "Boxes" +msgstr "" + #. Default: "Link Title" #: components/blocks/extenders/cta msgid "Link title" @@ -28,6 +38,9 @@ msgstr "" #. Default: "Text" #: components/blocks/Accordion/EditItem +#: components/blocks/ImageAndTextBox/Edit +#: components/blocks/ImageAndTextBox/EditItem +#: components/blocks/ImageAndTextBox/schema #: components/blocks/Testimonials/Edit #: components/blocks/Testimonials/schema #: components/blocks/Text1/Edit @@ -41,6 +54,9 @@ msgstr "" #: components/blocks/Accordion/Edit #: components/blocks/Accordion/EditItem #: components/blocks/Accordion/schema +#: components/blocks/ImageAndTextBox/Edit +#: components/blocks/ImageAndTextBox/EditItem +#: components/blocks/ImageAndTextBox/schema #: components/blocks/Testimonials/Edit #: components/blocks/Testimonials/schema #: components/blocks/Text1/Edit @@ -52,6 +68,11 @@ msgstr "" msgid "Title" msgstr "" +#. Default: "Add column" +#: components/blocks/ImageAndTextBox/schema +msgid "addColumn" +msgstr "" + #. Default: "Columns" #: components/blocks/Accordion/schema msgid "redturtle__volto-blocks__accordion_columns_title" @@ -131,3 +152,13 @@ msgstr "" #: components/blocks/Text7/schema msgid "redturtle__volto-blocks__text7_title" msgstr "" + +#. Default: "Image" +#: components/blocks/ImageAndTextBox/schema +msgid "redturtle__volto-blocks_imageandtext_image_title" +msgstr "" + +#. Default: "Image and Text Boxes" +#: components/blocks/ImageAndTextBox/schema +msgid "redturtle__volto-blocks_imageandtext_title" +msgstr "" diff --git a/packages/volto-blocks/locales/it/LC_MESSAGES/volto.po b/packages/volto-blocks/locales/it/LC_MESSAGES/volto.po index 8330a77..e87e565 100644 --- a/packages/volto-blocks/locales/it/LC_MESSAGES/volto.po +++ b/packages/volto-blocks/locales/it/LC_MESSAGES/volto.po @@ -16,6 +16,16 @@ msgstr "" msgid "Alignment" msgstr "" +#. Default: "Box" +#: components/blocks/ImageAndTextBox/schema +msgid "Box" +msgstr "" + +#. Default: "Boxes" +#: components/blocks/ImageAndTextBox/schema +msgid "Boxes" +msgstr "" + #. Default: "Link Title" #: components/blocks/extenders/cta msgid "Link title" @@ -28,6 +38,9 @@ msgstr "" #. Default: "Text" #: components/blocks/Accordion/EditItem +#: components/blocks/ImageAndTextBox/Edit +#: components/blocks/ImageAndTextBox/EditItem +#: components/blocks/ImageAndTextBox/schema #: components/blocks/Testimonials/Edit #: components/blocks/Testimonials/schema #: components/blocks/Text1/Edit @@ -41,6 +54,9 @@ msgstr "Testo" #: components/blocks/Accordion/Edit #: components/blocks/Accordion/EditItem #: components/blocks/Accordion/schema +#: components/blocks/ImageAndTextBox/Edit +#: components/blocks/ImageAndTextBox/EditItem +#: components/blocks/ImageAndTextBox/schema #: components/blocks/Testimonials/Edit #: components/blocks/Testimonials/schema #: components/blocks/Text1/Edit @@ -52,6 +68,11 @@ msgstr "Testo" msgid "Title" msgstr "Titolo" +#. Default: "Add column" +#: components/blocks/ImageAndTextBox/schema +msgid "addColumn" +msgstr "" + #. Default: "Columns" #: components/blocks/Accordion/schema msgid "redturtle__volto-blocks__accordion_columns_title" @@ -131,3 +152,13 @@ msgstr "" #: components/blocks/Text7/schema msgid "redturtle__volto-blocks__text7_title" msgstr "" + +#. Default: "Image" +#: components/blocks/ImageAndTextBox/schema +msgid "redturtle__volto-blocks_imageandtext_image_title" +msgstr "" + +#. Default: "Image and Text Boxes" +#: components/blocks/ImageAndTextBox/schema +msgid "redturtle__volto-blocks_imageandtext_title" +msgstr "" diff --git a/packages/volto-blocks/locales/volto.pot b/packages/volto-blocks/locales/volto.pot index 4618aa8..a5b6ceb 100644 --- a/packages/volto-blocks/locales/volto.pot +++ b/packages/volto-blocks/locales/volto.pot @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: Plone\n" -"POT-Creation-Date: 2024-08-20T08:35:27.767Z\n" +"POT-Creation-Date: 2024-09-04T14:09:42.065Z\n" "Last-Translator: Plone i18n \n" "Language-Team: Plone i18n \n" "Content-Type: text/plain; charset=utf-8\n" @@ -18,6 +18,16 @@ msgstr "" msgid "Alignment" msgstr "" +#. Default: "Box" +#: components/blocks/ImageAndTextBox/schema +msgid "Box" +msgstr "" + +#. Default: "Boxes" +#: components/blocks/ImageAndTextBox/schema +msgid "Boxes" +msgstr "" + #. Default: "Link Title" #: components/blocks/extenders/cta msgid "Link title" @@ -30,6 +40,9 @@ msgstr "" #. Default: "Text" #: components/blocks/Accordion/EditItem +#: components/blocks/ImageAndTextBox/Edit +#: components/blocks/ImageAndTextBox/EditItem +#: components/blocks/ImageAndTextBox/schema #: components/blocks/Testimonials/Edit #: components/blocks/Testimonials/schema #: components/blocks/Text1/Edit @@ -43,6 +56,9 @@ msgstr "" #: components/blocks/Accordion/Edit #: components/blocks/Accordion/EditItem #: components/blocks/Accordion/schema +#: components/blocks/ImageAndTextBox/Edit +#: components/blocks/ImageAndTextBox/EditItem +#: components/blocks/ImageAndTextBox/schema #: components/blocks/Testimonials/Edit #: components/blocks/Testimonials/schema #: components/blocks/Text1/Edit @@ -54,6 +70,11 @@ msgstr "" msgid "Title" msgstr "" +#. Default: "Add column" +#: components/blocks/ImageAndTextBox/schema +msgid "addColumn" +msgstr "" + #. Default: "Columns" #: components/blocks/Accordion/schema msgid "redturtle__volto-blocks__accordion_columns_title" @@ -133,3 +154,13 @@ msgstr "" #: components/blocks/Text7/schema msgid "redturtle__volto-blocks__text7_title" msgstr "" + +#. Default: "Image" +#: components/blocks/ImageAndTextBox/schema +msgid "redturtle__volto-blocks_imageandtext_image_title" +msgstr "" + +#. Default: "Image and Text Boxes" +#: components/blocks/ImageAndTextBox/schema +msgid "redturtle__volto-blocks_imageandtext_title" +msgstr "" diff --git a/packages/volto-blocks/src/components/blocks/ImageAndTextBox/Edit.tsx b/packages/volto-blocks/src/components/blocks/ImageAndTextBox/Edit.tsx new file mode 100644 index 0000000..220060e --- /dev/null +++ b/packages/volto-blocks/src/components/blocks/ImageAndTextBox/Edit.tsx @@ -0,0 +1,174 @@ +import type { BlockEditProps } from '@plone/types'; +import { Icon, SidebarPortal, UniversalLink } from '@plone/volto/components'; +import { BlockDataForm } from '@plone/volto/components/manage/Form'; +import cx from 'classnames'; +import { defineMessages, useIntl } from 'react-intl'; +import placeholder from './placeholder.png'; + +import type { ImageAndTextBoxData } from '@redturtle/volto-blocks/components/blocks/ImageAndTextBox/schema'; +import styles from '@redturtle/volto-blocks/components/blocks/ImageAndTextBox/styles.module.css'; +import { + TextEditorWidget, + useHandleDetachedBlockFocus, +} from '@redturtle/volto-rt-slate'; + +import config from '@plone/registry'; +import EditItem from './EditItem'; + +type ImageAndTextBoxEditProps = Omit & { + data: ImageAndTextBoxData; +}; + +export default function Edit(props: ImageAndTextBoxEditProps) { + const { + data, + selected, + block, + onChangeBlock, + blocksConfig, + blocksErrors, + onFocusPreviousBlock, + onFocusNextBlock, + } = props; + const intl = useIntl(); + + const { selectedField, setSelectedField } = useHandleDetachedBlockFocus( + props, + 'title', + ); + + const schema = blocksConfig[data['@type']].blockSchema({ + data, + intl, + }); + + if (__SERVER__) { + return
; + } + + const Container = config.getComponent('Container').component || 'div'; + const Image = config.getComponent('Image').component; + + return ( + <> +
+ {data.image ? ( + + ) : ( + + )} + +
+ { + setSelectedField('text'); + }} + showToolbar={false} + placeholder={intl.formatMessage(messages.title)} + onFocusPreviousBlock={onFocusPreviousBlock} + onFocusNextBlock={onFocusNextBlock} + /> + { + setSelectedField('title'); + }} + placeholder={intl.formatMessage(messages.text)} + onFocusPreviousBlock={onFocusPreviousBlock} + onFocusNextBlock={onFocusNextBlock} + /> +
+ {data.boxes?.length > 0 && + data.boxes.map((item) => ( + { + onChangeBlock(block, { + ...data, + boxes: data.boxes.map((i) => + i['@id'] === id ? { ...i, [field]: value } : i, + ), + }); + }} + // @ts-expect-error TODO fix type in @plone/types + selected={selected} + /> + ))} +
+ {data.linkHref?.[0] && ( +
+ ) => { + e.preventDefault(); + }} + > + {data.linkTitle} + +
+ )} +
+
+
+ {/* @ts-expect-error TODO */} + + {schema && ( + } + schema={schema} + title={schema.title} + onChangeField={(id: string, value: unknown) => { + onChangeBlock(block, { + ...data, + [id]: value, + }); + }} + onChangeBlock={onChangeBlock} + formData={data} + block={block} + errors={blocksErrors} + /> + )} + + + ); +} + +const messages = defineMessages({ + title: { + id: 'Title', + defaultMessage: 'Title', + }, + text: { + id: 'Text', + defaultMessage: 'Text', + }, +}); diff --git a/packages/volto-blocks/src/components/blocks/ImageAndTextBox/EditItem.tsx b/packages/volto-blocks/src/components/blocks/ImageAndTextBox/EditItem.tsx new file mode 100644 index 0000000..c5526e9 --- /dev/null +++ b/packages/volto-blocks/src/components/blocks/ImageAndTextBox/EditItem.tsx @@ -0,0 +1,69 @@ +import cx from 'classnames'; +import { defineMessages, useIntl } from 'react-intl'; + +import type { ArrayElement } from '@plone/types'; + +import type { ImageAndTextBoxData } from '@redturtle/volto-blocks/components/blocks/ImageAndTextBox/schema'; +import styles from '@redturtle/volto-blocks/components/blocks/ImageAndTextBox/styles.module.css'; +import { TextEditorWidget } from '@redturtle/volto-rt-slate'; + +type Props = { + data: ArrayElement; + focusOn: string; + setFocusOn: Function; + onChange: (id: string, field: string, value: unknown) => void; + selected: boolean; +}; + +export default function EditItem({ + data, + focusOn, + setFocusOn, + onChange, + selected, +}: Props) { + const intl = useIntl(); + + return ( +
+ setFocusOn('title' + data['@id'])} + onChangeBlock={(id: string, value: { title: string }) => { + onChange(id, 'title', value.title); + }} + showToolbar={false} + placeholder={intl.formatMessage(messages.title)} + /> + setFocusOn('text' + data['@id'])} + onChangeBlock={(id: string, value: { text: string }) => { + onChange(id, 'text', value.text); + }} + placeholder={intl.formatMessage(messages.text)} + /> +
+ ); +} + +const messages = defineMessages({ + title: { + id: 'Title', + defaultMessage: 'Title', + }, + text: { + id: 'Text', + defaultMessage: 'Text', + }, +}); diff --git a/packages/volto-blocks/src/components/blocks/ImageAndTextBox/View.tsx b/packages/volto-blocks/src/components/blocks/ImageAndTextBox/View.tsx new file mode 100644 index 0000000..38397ab --- /dev/null +++ b/packages/volto-blocks/src/components/blocks/ImageAndTextBox/View.tsx @@ -0,0 +1,85 @@ +import type { BlockViewProps } from '@plone/types'; +import { UniversalLink } from '@plone/volto/components'; +import { flattenToAppURL } from '@plone/volto/helpers'; +import cx from 'classnames'; + +import { TextBlockView } from '@plone/volto-slate/blocks/Text'; +import type { ImageAndTextBoxData } from '@redturtle/volto-blocks/components/blocks/ImageAndTextBox/schema'; +import styles from '@redturtle/volto-blocks/components/blocks/ImageAndTextBox/styles.module.css'; +import ViewItem from '@redturtle/volto-blocks/components/blocks/ImageAndTextBox/ViewItem'; +import placeholder from './placeholder.png'; + +import config from '@plone/registry'; + +type Props = Omit & { + data: ImageAndTextBoxData; +}; + +export default function View({ data, className, style }: Props) { + const Container = config.getComponent('Container').component || 'div'; + const Image = config.getComponent('Image').component; + + return ( +
+ {data.image ? ( + + ) : ( + + )} + +
+ {data.title && ( +

+ {data.title} +

+ )} + {data.text && ( +
+ +
+ )} +
+
+ {data.boxes?.length > 0 && + data.boxes.map((item) => ( + + ))} +
+ {data.linkHref?.[0] && ( +
+ + {data.linkTitle} + +
+ )} +
+
+ ); +} diff --git a/packages/volto-blocks/src/components/blocks/ImageAndTextBox/ViewItem.tsx b/packages/volto-blocks/src/components/blocks/ImageAndTextBox/ViewItem.tsx new file mode 100644 index 0000000..70cc768 --- /dev/null +++ b/packages/volto-blocks/src/components/blocks/ImageAndTextBox/ViewItem.tsx @@ -0,0 +1,31 @@ +import cx from 'classnames'; + +import type { ArrayElement } from '@plone/types'; +import { TextBlockView } from '@plone/volto-slate/blocks/Text'; +import type { ImageAndTextBoxData } from '@redturtle/volto-blocks/components/blocks/ImageAndTextBox/schema'; +import styles from '@redturtle/volto-blocks/components/blocks/ImageAndTextBox/styles.module.css'; + +type Props = { + data: ArrayElement; +}; + +export default function ViewItem({ data }: Props) { + return ( +
+ {data.title && ( +
+ {data.title && ( +

+ {data.title} +

+ )} +
+ )} + {data.text && ( +
+ +
+ )} +
+ ); +} diff --git a/packages/volto-blocks/src/components/blocks/ImageAndTextBox/index.ts b/packages/volto-blocks/src/components/blocks/ImageAndTextBox/index.ts new file mode 100644 index 0000000..e332e1a --- /dev/null +++ b/packages/volto-blocks/src/components/blocks/ImageAndTextBox/index.ts @@ -0,0 +1,5 @@ +import loadable from '@loadable/component'; + +export const ImageAndTextBoxEdit = loadable( + () => import(/* webpackChunkName: "redturtle__volto-blocks" */ './Edit'), +); diff --git a/packages/volto-blocks/src/components/blocks/ImageAndTextBox/placeholder.png b/packages/volto-blocks/src/components/blocks/ImageAndTextBox/placeholder.png new file mode 100644 index 0000000..d57c4b6 Binary files /dev/null and b/packages/volto-blocks/src/components/blocks/ImageAndTextBox/placeholder.png differ diff --git a/packages/volto-blocks/src/components/blocks/ImageAndTextBox/schema.ts b/packages/volto-blocks/src/components/blocks/ImageAndTextBox/schema.ts new file mode 100644 index 0000000..57e5fde --- /dev/null +++ b/packages/volto-blocks/src/components/blocks/ImageAndTextBox/schema.ts @@ -0,0 +1,101 @@ +import type { BlockConfigBase, JSONSchema } from '@plone/types'; +import { + addCtaFieldset, + type CtaBlockExtender, +} from '@redturtle/volto-blocks/components/blocks/extenders/cta'; +import { defineMessages, type IntlShape } from 'react-intl'; +export interface ImageAndTextBoxData extends CtaBlockExtender { + '@type': 'imageandtextbox'; + image: string; + title: string; + text?: object; + boxes?: Array<{ title: string; text: object }>; +} + +const messages = defineMessages({ + title: { + id: 'redturtle__volto-blocks_imageandtext_title', + defaultMessage: 'Image and Text Boxes', + }, + image_title: { + id: 'redturtle__volto-blocks_imageandtext_image_title', + defaultMessage: 'Image', + }, + title_title: { + id: 'Title', + defaultMessage: 'Title', + }, + text_title: { + id: 'Text', + defaultMessage: 'Text', + }, + boxes_title: { + id: 'Boxes', + defaultMessage: 'Boxes', + }, + box_title: { + id: 'Box', + defaultMessage: 'Box', + }, + addColumn: { + id: 'addColumn', + defaultMessage: 'Add column', + }, +}); + +export const ImageAndTextBoxSchema = ({ + data, + intl, +}: { + data: ImageAndTextBoxData; + intl: IntlShape; +}): JSONSchema => { + const schema = { + title: intl.formatMessage(messages.title), + fieldsets: [ + { + id: 'default', + title: 'Default', + fields: ['title', 'image', 'boxes'], + }, + ], + properties: { + title: { + title: intl.formatMessage(messages.title_title), + }, + image: { + title: intl.formatMessage(messages.image_title), + widget: 'image', + }, + boxes: { + title: intl.formatMessage(messages.boxes_title), + addMessage: intl.formatMessage(messages.addColumn), + widget: 'object_list', + schema: { + title: intl.formatMessage(messages.box_title), + fieldsets: [ + { + id: 'default', + title: 'Default', + fields: ['title'], + }, + ], + properties: { + title: { + title: intl.formatMessage(messages.box_title), + }, + }, + required: ['title'], + }, + }, + }, + required: ['title'], + }; + addCtaFieldset({ schema, intl }); + return schema; +}; + +export interface ImageAndTextBoxConfig + extends Omit { + blockSchema: typeof ImageAndTextBoxSchema; +} diff --git a/packages/volto-blocks/src/components/blocks/ImageAndTextBox/styles.module.css b/packages/volto-blocks/src/components/blocks/ImageAndTextBox/styles.module.css new file mode 100644 index 0000000..2171445 --- /dev/null +++ b/packages/volto-blocks/src/components/blocks/ImageAndTextBox/styles.module.css @@ -0,0 +1,73 @@ +.imageandtextbox { + position: relative; + display: flex; + width: 100%; + min-height: 300px; + align-items: center; + justify-content: flex-end; +} +.imageandtextbox img { + position: absolute; + z-index: 0; + top: 0; + left: 0; + width: 100%; + height: 100%; + object-fit: cover; +} + +.block-imageandtextbox-container { + position: relative; + z-index: 1; + width: 40%; + height: 80%; + padding: 1em; + border-radius: 5px; + margin-top: 10%; + margin-right: 3%; + margin-bottom: 10%; + background-color: #ffffff; +} + +.boxes { + display: flex; + flex-wrap: wrap; +} + +.block-imageandtextbox-box { + box-sizing: border-box; /* Include padding and border in width calculation */ + flex: 1 1 33%; /* Flex-grow, flex-shrink, and flex-basis */ + padding: 10px; +} + +.block-imageandtextbox-box h3 { + border-bottom: 1px solid #ddd; +} + +.block-imageandtextbox-cta { + margin-top: 1em; + text-align: center; +} + +@media screen and (max-width: 1200px) { + .block-imageandtextbox-container { + width: 60%; + } +} + +@media screen and (max-width: 769px) { + .block-imageandtextbox-container { + width: 94%; + } +} + +@media screen and (max-width: 480px) { + .block-imageandtextbox-container { + width: 94%; + } + .block-imageandtextbox-box { + box-sizing: border-box; /* Include padding and border in width calculation */ + flex: 1 1 100%; /* Flex-grow, flex-shrink, and flex-basis */ + padding: 10px; + } +} diff --git a/packages/volto-blocks/src/config/blocks.ts b/packages/volto-blocks/src/config/blocks.ts index fada3ec..108e134 100644 --- a/packages/volto-blocks/src/config/blocks.ts +++ b/packages/volto-blocks/src/config/blocks.ts @@ -3,44 +3,50 @@ import type { BlocksConfigData } from '@plone/types'; import BlockSettingsSchema from '@plone/volto/components/manage/Blocks/Block/Schema'; import accordionSVG from '@plone/volto/icons/list-arrows.svg'; -import AccordionView from '@redturtle/volto-blocks/components/blocks/Accordion/View'; import { AccordionEdit } from '@redturtle/volto-blocks/components/blocks/Accordion'; import { AccordionSchema, type AccordionConfig, } from '@redturtle/volto-blocks/components/blocks/Accordion/schema'; +import AccordionView from '@redturtle/volto-blocks/components/blocks/Accordion/View'; -import text1SVG from '@redturtle/volto-blocks/icons/text1.svg'; -import Text1View from '@redturtle/volto-blocks/components/blocks/Text1/View'; import { Text1Edit } from '@redturtle/volto-blocks/components/blocks/Text1'; import { Text1Schema, type Text1Config, } from '@redturtle/volto-blocks/components/blocks/Text1/schema'; +import Text1View from '@redturtle/volto-blocks/components/blocks/Text1/View'; +import text1SVG from '@redturtle/volto-blocks/icons/text1.svg'; -import text6SVG from '@redturtle/volto-blocks/icons/text6.svg'; -import Text6View from '@redturtle/volto-blocks/components/blocks/Text6/View'; import { Text6Edit } from '@redturtle/volto-blocks/components/blocks/Text6'; import { Text6Schema, type Text6Config, } from '@redturtle/volto-blocks/components/blocks/Text6/schema'; +import Text6View from '@redturtle/volto-blocks/components/blocks/Text6/View'; +import text6SVG from '@redturtle/volto-blocks/icons/text6.svg'; -import text7SVG from '@redturtle/volto-blocks/icons/text7.svg'; -import Text7View from '@redturtle/volto-blocks/components/blocks/Text7/View'; import { Text7Edit } from '@redturtle/volto-blocks/components/blocks/Text7'; import { Text7Schema, type Text7Config, } from '@redturtle/volto-blocks/components/blocks/Text7/schema'; +import Text7View from '@redturtle/volto-blocks/components/blocks/Text7/View'; +import text7SVG from '@redturtle/volto-blocks/icons/text7.svg'; -import TestimonialsView from '@redturtle/volto-blocks/components/blocks/Testimonials/View'; import { TestimonialsEdit } from '@redturtle/volto-blocks/components/blocks/Testimonials'; import { TestimonialsSchema, type TestimonialsConfig, } from '@redturtle/volto-blocks/components/blocks/Testimonials/schema'; +import TestimonialsView from '@redturtle/volto-blocks/components/blocks/Testimonials/View'; +import { ImageAndTextBoxEdit } from '@redturtle/volto-blocks/components/blocks/ImageAndTextBox'; +import { + ImageAndTextBoxSchema, + type ImageAndTextBoxConfig, +} from '@redturtle/volto-blocks/components/blocks/ImageAndTextBox/schema'; +import ImageAndTextBoxView from '@redturtle/volto-blocks/components/blocks/ImageAndTextBox/View'; declare module '@plone/types' { interface BlocksConfigData { accordion: AccordionConfig; @@ -48,12 +54,13 @@ declare module '@plone/types' { text6: Text6Config; text7: Text7Config; testimonials: TestimonialsConfig; + imageandtextbox: ImageAndTextBoxConfig; } } type RtBlocksConfig = Pick< BlocksConfigData, - 'accordion' | 'text1' | 'text6' | 'text7' | 'testimonials' + 'accordion' | 'text1' | 'text6' | 'text7' | 'testimonials' | 'imageandtextbox' >; const defaultBlocksConfig = { @@ -124,4 +131,16 @@ export const blocks: RtBlocksConfig = { blockHasOwnFocusManagement: true, blockSchema: TestimonialsSchema, }, + imageandtextbox: { + ...defaultBlocksConfig, + id: 'imageandtextbox', + title: 'Image and text box', + icon: accordionSVG, + group: 'text', + mostUsed: true, + view: ImageAndTextBoxView, + edit: ImageAndTextBoxEdit, + blockHasOwnFocusManagement: true, + blockSchema: ImageAndTextBoxSchema, + }, } as const;