UNPKG

@wordpress/block-editor

Version:
363 lines (361 loc) 13.5 kB
"use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // packages/block-editor/src/hooks/color.js var color_exports = {}; __export(color_exports, { COLOR_SUPPORT_KEY: () => COLOR_SUPPORT_KEY, ColorEdit: () => ColorEdit, addSaveProps: () => addSaveProps, addTransforms: () => addTransforms, default: () => color_default }); module.exports = __toCommonJS(color_exports); var import_clsx = __toESM(require("clsx")); var import_hooks = require("@wordpress/hooks"); var import_blocks = require("@wordpress/blocks"); var import_element = require("@wordpress/element"); var import_data = require("@wordpress/data"); var import_colors = require("../components/colors"); var import_gradients = require("../components/gradients"); var import_utils = require("./utils"); var import_background = require("./background"); var import_use_settings = require("../components/use-settings"); var import_inspector_controls = __toESM(require("../components/inspector-controls")); var import_color_panel = __toESM(require("../components/global-styles/color-panel")); var import_contrast_checker = __toESM(require("./contrast-checker")); var import_store = require("../store"); var import_jsx_runtime = require("react/jsx-runtime"); var COLOR_SUPPORT_KEY = "color"; var hasColorSupport = (blockNameOrType) => { const colorSupport = (0, import_blocks.getBlockSupport)(blockNameOrType, COLOR_SUPPORT_KEY); return colorSupport && (colorSupport.link === true || colorSupport.gradient === true || colorSupport.background !== false || colorSupport.text !== false); }; var hasLinkColorSupport = (blockType) => { if (import_element.Platform.OS !== "web") { return false; } const colorSupport = (0, import_blocks.getBlockSupport)(blockType, COLOR_SUPPORT_KEY); return colorSupport !== null && typeof colorSupport === "object" && !!colorSupport.link; }; var hasGradientSupport = (blockNameOrType) => { const colorSupport = (0, import_blocks.getBlockSupport)(blockNameOrType, COLOR_SUPPORT_KEY); return colorSupport !== null && typeof colorSupport === "object" && !!colorSupport.gradients; }; var hasBackgroundColorSupport = (blockType) => { const colorSupport = (0, import_blocks.getBlockSupport)(blockType, COLOR_SUPPORT_KEY); return colorSupport && colorSupport.background !== false; }; var hasTextColorSupport = (blockType) => { const colorSupport = (0, import_blocks.getBlockSupport)(blockType, COLOR_SUPPORT_KEY); return colorSupport && colorSupport.text !== false; }; function addAttributes(settings) { if (!hasColorSupport(settings)) { return settings; } if (!settings.attributes.backgroundColor) { Object.assign(settings.attributes, { backgroundColor: { type: "string" } }); } if (!settings.attributes.textColor) { Object.assign(settings.attributes, { textColor: { type: "string" } }); } if (hasGradientSupport(settings) && !settings.attributes.gradient) { Object.assign(settings.attributes, { gradient: { type: "string" } }); } return settings; } function addSaveProps(props, blockNameOrType, attributes) { if (!hasColorSupport(blockNameOrType) || (0, import_utils.shouldSkipSerialization)(blockNameOrType, COLOR_SUPPORT_KEY)) { return props; } const hasGradient = hasGradientSupport(blockNameOrType); const { backgroundColor, textColor, gradient, style } = attributes; const shouldSerialize = (feature) => !(0, import_utils.shouldSkipSerialization)( blockNameOrType, COLOR_SUPPORT_KEY, feature ); const textClass = shouldSerialize("text") ? (0, import_colors.getColorClassName)("color", textColor) : void 0; const gradientClass = shouldSerialize("gradients") ? (0, import_gradients.__experimentalGetGradientClass)(gradient) : void 0; const backgroundClass = shouldSerialize("background") ? (0, import_colors.getColorClassName)("background-color", backgroundColor) : void 0; const serializeHasBackground = shouldSerialize("background") || shouldSerialize("gradients"); const hasBackground = backgroundColor || style?.color?.background || hasGradient && (gradient || style?.color?.gradient); const newClassName = (0, import_clsx.default)(props.className, textClass, gradientClass, { // Don't apply the background class if there's a custom gradient. [backgroundClass]: (!hasGradient || !style?.color?.gradient) && !!backgroundClass, "has-text-color": shouldSerialize("text") && (textColor || style?.color?.text), "has-background": serializeHasBackground && hasBackground, "has-link-color": shouldSerialize("link") && style?.elements?.link?.color }); props.className = newClassName ? newClassName : void 0; return props; } function styleToAttributes(style) { const textColorValue = style?.color?.text; const textColorSlug = textColorValue?.startsWith("var:preset|color|") ? textColorValue.substring("var:preset|color|".length) : void 0; const backgroundColorValue = style?.color?.background; const backgroundColorSlug = backgroundColorValue?.startsWith( "var:preset|color|" ) ? backgroundColorValue.substring("var:preset|color|".length) : void 0; const gradientValue = style?.color?.gradient; const gradientSlug = gradientValue?.startsWith("var:preset|gradient|") ? gradientValue.substring("var:preset|gradient|".length) : void 0; const updatedStyle = { ...style }; updatedStyle.color = { ...updatedStyle.color, text: textColorSlug ? void 0 : textColorValue, background: backgroundColorSlug ? void 0 : backgroundColorValue, gradient: gradientSlug ? void 0 : gradientValue }; return { style: (0, import_utils.cleanEmptyObject)(updatedStyle), textColor: textColorSlug, backgroundColor: backgroundColorSlug, gradient: gradientSlug }; } function attributesToStyle(attributes) { return { ...attributes.style, color: { ...attributes.style?.color, text: attributes.textColor ? "var:preset|color|" + attributes.textColor : attributes.style?.color?.text, background: attributes.backgroundColor ? "var:preset|color|" + attributes.backgroundColor : attributes.style?.color?.background, gradient: attributes.gradient ? "var:preset|gradient|" + attributes.gradient : attributes.style?.color?.gradient } }; } function ColorInspectorControl({ children, resetAllFilter }) { const attributesResetAllFilter = (0, import_element.useCallback)( (attributes) => { const existingStyle = attributesToStyle(attributes); const updatedStyle = resetAllFilter(existingStyle); return { ...attributes, ...styleToAttributes(updatedStyle) }; }, [resetAllFilter] ); return /* @__PURE__ */ (0, import_jsx_runtime.jsx)( import_inspector_controls.default, { group: "color", resetAllFilter: attributesResetAllFilter, children } ); } function ColorEdit({ clientId, name, setAttributes, settings, asWrapper, label, defaultControls }) { const isEnabled = (0, import_color_panel.useHasColorPanel)(settings); const { style, textColor, backgroundColor, gradient } = (0, import_data.useSelect)( (select) => { if (!isEnabled) { return {}; } const { style: _style, textColor: _textColor, backgroundColor: _backgroundColor, gradient: _gradient } = select(import_store.store).getBlockAttributes(clientId) || {}; return { style: _style, textColor: _textColor, backgroundColor: _backgroundColor, gradient: _gradient }; }, [clientId, isEnabled] ); const value = (0, import_element.useMemo)(() => { return attributesToStyle({ style, textColor, backgroundColor, gradient }); }, [style, textColor, backgroundColor, gradient]); const onChange = (newStyle) => { setAttributes(styleToAttributes(newStyle)); }; if (!isEnabled) { return null; } defaultControls = defaultControls ? defaultControls : (0, import_blocks.getBlockSupport)(name, [ COLOR_SUPPORT_KEY, "__experimentalDefaultControls" ]); const enableContrastChecking = import_element.Platform.OS === "web" && !value?.color?.gradient && (settings?.color?.text || settings?.color?.link) && // Contrast checking is enabled by default. // Deactivating it requires `enableContrastChecker` to have // an explicit value of `false`. false !== (0, import_blocks.getBlockSupport)(name, [ COLOR_SUPPORT_KEY, "enableContrastChecker" ]); const Wrapper = asWrapper || ColorInspectorControl; return /* @__PURE__ */ (0, import_jsx_runtime.jsx)( import_color_panel.default, { as: Wrapper, panelId: clientId, settings, value, onChange, defaultControls, label, enableContrastChecker: false !== (0, import_blocks.getBlockSupport)(name, [ COLOR_SUPPORT_KEY, "enableContrastChecker" ]), children: enableContrastChecking && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_contrast_checker.default, { clientId }) } ); } function useBlockProps({ name, backgroundColor, textColor, gradient, style }) { const [userPalette, themePalette, defaultPalette] = (0, import_use_settings.useSettings)( "color.palette.custom", "color.palette.theme", "color.palette.default" ); const colors = (0, import_element.useMemo)( () => [ ...userPalette || [], ...themePalette || [], ...defaultPalette || [] ], [userPalette, themePalette, defaultPalette] ); if (!hasColorSupport(name) || (0, import_utils.shouldSkipSerialization)(name, COLOR_SUPPORT_KEY)) { return {}; } const extraStyles = {}; if (textColor && !(0, import_utils.shouldSkipSerialization)(name, COLOR_SUPPORT_KEY, "text")) { extraStyles.color = (0, import_colors.getColorObjectByAttributeValues)( colors, textColor )?.color; } if (backgroundColor && !(0, import_utils.shouldSkipSerialization)(name, COLOR_SUPPORT_KEY, "background")) { extraStyles.backgroundColor = (0, import_colors.getColorObjectByAttributeValues)( colors, backgroundColor )?.color; } const saveProps = addSaveProps({ style: extraStyles }, name, { textColor, backgroundColor, gradient, style }); const hasBackgroundValue = backgroundColor || style?.color?.background || gradient || style?.color?.gradient; return { ...saveProps, className: (0, import_clsx.default)( saveProps.className, // Add background image classes in the editor, if not already handled by background color values. !hasBackgroundValue && (0, import_background.getBackgroundImageClasses)(style) ) }; } var color_default = { useBlockProps, addSaveProps, attributeKeys: ["backgroundColor", "textColor", "gradient", "style"], hasSupport: hasColorSupport }; var MIGRATION_PATHS = { linkColor: [["style", "elements", "link", "color", "text"]], textColor: [["textColor"], ["style", "color", "text"]], backgroundColor: [ ["backgroundColor"], ["style", "color", "background"] ], gradient: [["gradient"], ["style", "color", "gradient"]] }; function addTransforms(result, source, index, results) { const destinationBlockType = result.name; const activeSupports = { linkColor: hasLinkColorSupport(destinationBlockType), textColor: hasTextColorSupport(destinationBlockType), backgroundColor: hasBackgroundColorSupport(destinationBlockType), gradient: hasGradientSupport(destinationBlockType) }; return (0, import_utils.transformStyles)( activeSupports, MIGRATION_PATHS, result, source, index, results ); } (0, import_hooks.addFilter)( "blocks.registerBlockType", "core/color/addAttribute", addAttributes ); (0, import_hooks.addFilter)( "blocks.switchToBlockType.transformedBlock", "core/color/addTransforms", addTransforms ); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { COLOR_SUPPORT_KEY, ColorEdit, addSaveProps, addTransforms }); //# sourceMappingURL=color.js.map