UNPKG

@eeacms/volto-block-style

Version:
158 lines (142 loc) 4.4 kB
import React from 'react'; import { BlockStyleWrapperEdit, BlockStyleWrapperView, } from './BlockStyleWrapper'; import StyleSelectWidget from './Widgets/StyleSelect'; import AlignWidget from './Widgets/Align'; import StretchWidget from './Widgets/Stretch'; import TextAlignWidget from './Widgets/TextAlign'; import SliderWidget from './Widgets/Slider'; import SizeWidget from './Widgets/Size'; import SimpleColorPicker from './Widgets/SimpleColorPicker'; import QuadSizeWidget from './Widgets/QuadSize'; import './styles.less'; /** * Given a block's config object, it wrapps the view and edit in style wrappers */ export const applyStyleWrapperToBlock = (blockConfig) => { const BaseEditComponent = blockConfig.edit; let EditComponent = BaseEditComponent; if (EditComponent && !EditComponent._styleWrapped) { EditComponent = (props) => ( <BlockStyleWrapperEdit {...props}> <BaseEditComponent {...props} /> </BlockStyleWrapperEdit> ); EditComponent.displayName = `<EditBlockWithStyleWrapperFor(${blockConfig.id})>`; EditComponent._styleWrapped = true; } const BaseViewComponent = blockConfig.view; let ViewComponent = BaseViewComponent; if (ViewComponent && !ViewComponent._styleWrapped) { ViewComponent = (props) => ( <BlockStyleWrapperView {...props}> <BaseViewComponent {...props} /> </BlockStyleWrapperView> ); ViewComponent.displayName = `<ViewBlockWithStyleWrapperFor(${blockConfig.id})>`; ViewComponent._styleWrapped = true; } return { ...blockConfig, view: ViewComponent, edit: EditComponent, }; }; const applyConfig = (config) => { const { settings } = config; const whitelist = settings.pluggableStylesBlocksWhitelist; const blacklist = settings.pluggableStylesBlocksBlacklist; const { blocksConfig } = config.blocks; const okBlocks = Object.keys(blocksConfig).filter( (name) => (blacklist ? !blacklist.includes(name) : true) && (whitelist ? whitelist.includes(name) : true), ); okBlocks.forEach((name) => { blocksConfig[name] = applyStyleWrapperToBlock(blocksConfig[name]); }); config.settings.integratesBlockStyles = [ ...(config.settings.integratesBlockStyles || []), 'slate', ]; config.widgets.widget.style_select = StyleSelectWidget; config.widgets.widget.style_align = AlignWidget; // avoid conflict for now config.widgets.widget.style_stretch = StretchWidget; // Make stretch widget config.widgets.widget.style_text_align = TextAlignWidget; // avoid conflict for now config.widgets.widget.style_size = SizeWidget; // avoid conflict for now config.widgets.widget.style_simple_color = SimpleColorPicker; config.widgets.widget.slider = SliderWidget; config.widgets.widget.quad_size = QuadSizeWidget; // types of blocks that natively integrate with the volto-block-style and // allow passing the style as a prop; config.settings.integratesBlockStyles = [ ...(config.settings.integratesBlockStyles || []), ]; // Restrict block settings to Layout if (config.settings.layoutOnlyBlockStyles === undefined) { config.settings.layoutOnlyBlockStyles = false; } config.settings.available_colors = [ '#bbdbec', '#9dc6d4', '#5a93aa', '#005d7b', '#003d53', '#ebefc6', '#bdd494', '#6bb535', '#1e8339', '#025e37', '#464b0b', '#b5c234', '#777b1a', '#f4f1bc', '#e1e070', '#0070ae', '#fce6dc', '#f39a86', '#e73d5c', '#b92f47', '#8e1206', '#fff6a6', '#ffe525', '#f7a600', '#b94b19', '#8d4107', '#000000', '#6f6f6e', '#929291', '#bcbcbc', '#e3e3e3', '#ffffff', ]; return config; }; export default applyConfig; export const installDemoStyles = (config) => { config.settings.pluggableStyles = [ ...(config.settings.pluggableStyles || []), { id: 'greenBox', title: 'Green box', cssClass: 'green-demo-box', }, { id: 'blueShade', title: 'Blue Shade', cssClass: 'blue-demo-box', previewComponent: (props) => ( <div className={`${props.className} preview-blue-demo-box`}> {props.children} </div> ), viewComponent: (props) => ( <div className="blue-demo-box">{props.children}</div> ), // TODO: support also editComponent ? }, ]; return config; };