{"id":233911,"date":"2023-02-26T12:27:00","date_gmt":"2023-02-26T09:27:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233911"},"modified":"2023-02-26T12:28:04","modified_gmt":"2023-02-26T09:28:04","slug":"como-agregar-configuraciones-de-color-a-su-bloque-de-gutenberg-personalizado","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/como-agregar-configuraciones-de-color-a-su-bloque-de-gutenberg-personalizado\/","title":{"rendered":"C\u00f3mo agregar configuraciones de color a su bloque de Gutenberg personalizado"},"content":{"rendered":"\n<p>Esta publicaci\u00f3n profundizar\u00e1 en c\u00f3mo agregar configuraciones de color a su bloque personalizado de WordPress Gutenberg. Aprenderemos c\u00f3mo agregar el mismo componente de configuraci\u00f3n de color, que presenta la elecci\u00f3n de colores de paleta y color personalizado, como usan muchos de los bloques predeterminados de WordPress.<\/p>\n<p>Esto es lo que agregaremos a nuestro bloque personalizado:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151572-61e4cc69ead10.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151572-61e4cc69ead10.png\" alt=\"C\u00f3mo agregar configuraciones de color a su bloque de Gutenberg personalizado\"><\/a><\/p>\n<p>Al usar los componentes de Gutenberg, podemos implementar muy f\u00e1cilmente esta paleta\/secci\u00f3n de color en nuestro propio bloque personalizado. Puede definir la configuraci\u00f3n de color para afectar cualquier color que desee; fondo, color de texto, color de borde o cualquier otra cosa. Tambi\u00e9n puede agregar tantas configuraciones de color como desee dentro de este panel.<\/p>\n<p>Antes de sumergirnos en el c\u00f3digo, hay algunas cosas que debe tener en cuenta. No salte al c\u00f3digo, ya que la siguiente secci\u00f3n explicar\u00e1 mucho por qu\u00e9 el c\u00f3digo debe hacerlo como lo hace.<\/p>\n<h2>Lo que necesitas saber primero<\/h2>\n<p>Los componentes para implementar configuraciones de paleta\/color son <code>PanelColorSettings<\/code>y <code>withColors<\/code>del <code>wp.blockEditor<\/code>paquete. El componente <code>withColors<\/code>es un llamado componente de orden superior y debe implementarse de manera un poco diferente a la simple salida de un componente normal. Voy a entrar en un poco m\u00e1s de detalle m\u00e1s adelante. Pero primero debemos ser conscientes de los conceptos b\u00e1sicos sobre c\u00f3mo Gutenberg maneja la configuraci\u00f3n de color de bloque.<\/p>\n<h3>C\u00f3mo los bloques de Gutenberg manejan la configuraci\u00f3n de color<\/h3>\n<p>Hay ciertas reglas sobre c\u00f3mo Gutenberg maneja la configuraci\u00f3n de color en bloques. Si alguna vez ha dise\u00f1ado un tema compatible con Gutenberg antes, probablemente ya est\u00e9 familiarizado con estas reglas. Sin embargo, los revisaremos r\u00e1pidamente porque tenemos que manejar esto en nuestro c\u00f3digo de bloque.<\/p>\n<ul>\n<li>Cuando se elige un color de paleta, el elemento del bloque de nodos obtendr\u00e1 una clase de un patr\u00f3n determinado. La clase comienza con &quot; <code>has-<\/code>&quot;, y luego viene el slug de la paleta. El final depende de qu\u00e9 elemento debe afectar el color. Para el color del texto, termina con &quot; <code>-color<\/code>&quot;. Para el color de fondo, termina con &quot; <code>-background-color<\/code>&quot;. Como ejemplo, un bloque con un color de paleta &quot;rojo&quot; elegido como color de fondo obtendr\u00e1 la clase &quot; <code>has-red-background-color<\/code>&quot;.<\/li>\n<li>Cuando se elige un color personalizado (del selector de color), el elemento del bloque de nodos obtendr\u00e1 un estilo en l\u00ednea con el c\u00f3digo hexadecimal. Por ejemplo, un color personalizado #DD0000 elegido como color de fondo obtendr\u00e1 el atributo &quot; <code>style=\"background-color: #DD0000;<\/code>&quot;.<\/li>\n<\/ul>\n<p>Cuando implementemos la configuraci\u00f3n de color para nuestro bloque, necesitaremos implementar la clase correcta y el estilo en l\u00ednea. Lo haremos al final de este tutorial.<\/p>\n<h3>como trabajar con<code>withColors<\/code><\/h3>\n<p>Como se mencion\u00f3 anteriormente <code>withColors<\/code>, es un <a href=\"https:\/\/reactjs.org\/docs\/higher-order-components.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">componente de orden superior<\/a>. B\u00e1sicamente, eso significa que es un componente que toma un componente y devuelve un nuevo componente. En el componente devuelto, obtenemos accesorios \u00fatiles del componente de orden superior. En pocas palabras, utilizaremos <code>withColors<\/code>para devolver nuestro propio componente para nuestro bloque personalizado. Nuestro componente de bloque obtiene los accesorios necesarios para trabajar con colores de <code>withColors<\/code>.<\/p>\n<p>El componente <code>withColors<\/code>maneja el estado y mucha funcionalidad para trabajar con colores. Y obtenemos mucha automatizaci\u00f3n en este proceso. Esto es muy \u00fatil para averiguar si el color elegido es un color de paleta (necesitamos agregar una clase) o un color personalizado (necesitamos agregar un estilo en l\u00ednea). <code>withColors<\/code>simplificar mucho el proceso de almacenar el color elegido, cualquiera que sea, en los atributos de nuestro bloque. Hablando de atributos..<\/p>\n<h3>Atributos y<code>withColors<\/code><\/h3>\n<p>Obviamente, su bloque necesita atributos para almacenar el color elegido. Para beneficiarse de la automatizaci\u00f3n de withColor para almacenar el color correcto, en realidad necesita definir dos atributos para cada configuraci\u00f3n de color. Uno para almacenar el slug del color de la paleta y otro para almacenar el c\u00f3digo hexadecimal. Sin embargo, hay algunas reglas.<\/p>\n<p>Supongamos que desea agregar una configuraci\u00f3n de color para el color del texto del bloque, por lo que decide definir un atributo llamado &quot; <code>textColor<\/code>&quot;. Luego deber\u00e1 definir otro atributo en el patr\u00f3n &quot; <code>customYourOriginalAttribute<\/code>&quot;. En este ejemplo, el segundo atributo deber\u00e1 llamarse &quot; <code>customTextColor<\/code>&quot;. Cuidado con camelCase (may\u00fasculas) aqu\u00ed. Siguiendo este patr\u00f3n <code>withColors<\/code>autom\u00e1ticamente:<\/p>\n<ul>\n<li>Si se ha elegido un color de paleta, el atributo \u00bb <code>textColor<\/code>&quot; contendr\u00e1 el slug de la paleta.<\/li>\n<li>Si se ha elegido un color personalizado, \u00bb <code>customTextColor<\/code>\u00bb se completar\u00e1 con el c\u00f3digo hexadecimal.<\/li>\n<\/ul>\n<p>Estos dos trabajan en t\u00e1ndem. Si se elige un color personalizado, <code>textColor<\/code>autom\u00e1ticamente ser\u00e1 <code>undefined<\/code>, y viceversa.<\/p>\n<p>Y finalmente, una \u00faltima cosa para recordar: <strong>\u00a1no necesitar\u00e1 usar <code>setAttributes()<\/code>para actualizar sus atributos de color<\/strong>! Los accesorios provistos <code>withColors<\/code>incluyen una funci\u00f3n que actualiza autom\u00e1ticamente sus atributos por usted. Todo lo que necesita hacer es pasar esta funci\u00f3n al <code>onChange<\/code>evento al <code>PanelColorSettings<\/code>componente, y sus atributos se actualizar\u00e1n autom\u00e1ticamente.<\/p>\n<p>Ok, \u00a1es hora de ver todo esto en la pr\u00e1ctica!<\/p>\n<h2>Implementaci\u00f3n de configuraciones de color en un bloque personalizado<\/h2>\n<p>Para empezar, tengo un bloque personalizado bastante in\u00fatil que no hace nada m\u00e1s que mostrar un texto codificado. Esto solo facilita la separaci\u00f3n de lo que necesitamos codificar para agregar configuraciones de color. Tengo una <a href=\"https:\/\/wordpress.mediadoma.com\/es\/como-crear-un-bloque-gutenberg-de-wordpress-personalizado-serie-de-tutoriales\/\" title=\"serie de tutoriales sobre c\u00f3mo crear sus propios bloques personalizados\">serie de tutoriales sobre c\u00f3mo crear sus propios bloques personalizados<\/a> si est\u00e1 interesado en obtener m\u00e1s informaci\u00f3n.<\/p>\n<p>Nota: Estoy escribiendo todo el c\u00f3digo en ES6\/ESNext. Esto incluye funciones de flecha que requieren un cuidado especial en la configuraci\u00f3n de Babel\/webpack. Si recibe errores en algunos de los c\u00f3digos a continuaci\u00f3n, siga mi <a href=\"https:\/\/wordpress.mediadoma.com\/es\/guia-completa-para-configurar-un-entorno-de-desarrollo-para-gutenberg\/\" title=\"gu\u00eda sobre c\u00f3mo configurar Webpack y Babel para ES6\/ESNext\">gu\u00eda sobre c\u00f3mo configurar Webpack y Babel para ES6\/ESNext<\/a> o ajuste el c\u00f3digo para que no use &quot;sintaxis experimentales&quot;.<\/p>\n<p>Este es mi bloque personalizado b\u00e1sico antes de hacer nada con la configuraci\u00f3n de color:<\/p>\n<pre><code>const { registerBlockType } = wp.blocks;\nconst { __ } = wp.i18n;\n\u00a0\nconst BlockWithColorSettings = (props) =&gt; {\n    return(\n        &lt;div&gt;\n            PanelColorSettings Demo\n        &lt;\/div&gt;\n    );\n}\n\u00a0\nregisterBlockType('awp\/colorsettings', {\n    title: __('Color Settings Demo'),\n    icon: 'carrot',\n    category: 'common',\n    edit: BlockWithColorSettings,\n    save: (props) =&gt; { \n        return(\n            &lt;div&gt;\n                PanelColorSettings Demo\n            &lt;\/div&gt;\n        );\n    }\n});<\/code><\/pre>\n<p>Es bastante b\u00e1sico. Tenga en cuenta que la <code>edit<\/code>funci\u00f3n simplemente se refiere a un componente separado <code>BlockWithColorSettings<\/code>, en lugar de escribirlo en l\u00ednea. Esto hace que sea m\u00e1s f\u00e1cil de implementar <code>withColors<\/code>m\u00e1s adelante.<\/p>\n<p>\u00a1Bien, es hora de implementar la configuraci\u00f3n de color en nuestro bloque! Como ejemplo, quiero configurar el color del texto.<\/p>\n<h3>Agregar atributos<\/h3>\n<p>Como se mencion\u00f3 anteriormente, necesitamos definir dos atributos para cada configuraci\u00f3n de color. Y tenemos que tener mucho cuidado en su nombramiento. Quiero agregar un atributo de color de texto, as\u00ed que estoy nombrando el atributo <code>textColor<\/code>. Lo que significa que tambi\u00e9n agregar\u00e9 un atributo <code>customTextColor<\/code>. Ambos deben ser de tipo cadena.<\/p>\n<pre><code>...\nregisterBlockType('awp\/colorsettings', {\n    title: __('Color Settings Demo'),\n    icon: 'carrot',\n    category: 'common',\n    attributes: {\n        textColor: {\n            type: 'string'\n        },\n        customTextColor: {\n            type: 'string'\n        },\n    },\n    edit: BlockWithColorSettings,\n    save: (props) =&gt; { \n    ...<\/code><\/pre>\n<p>Nuestros atributos est\u00e1n listos para almacenar la configuraci\u00f3n de color del texto del bloque. Ahora es el momento de implementar <code>withColors<\/code>y <code>PanelColorSettings<\/code>.<\/p>\n<h3>Implementar<code>withColors<\/code><\/h3>\n<p>Como se mencion\u00f3 anteriormente <code>withColors<\/code>, es un componente de orden superior que debe tomar un componente para regresar. Obviamente queremos que devuelva nuestro componente de edici\u00f3n, <code>BlockWithColorSettings<\/code>. Pero como par\u00e1metro <code>withColors<\/code>proporcionamos un objeto.<\/p>\n<p>En el objeto pasado <code>withColors<\/code>, debemos indicar <code>withColors<\/code>qu\u00e9 atributo queremos usar para almacenar el color y qu\u00e9 tipo de elemento colorear\u00e1 (en nuestro caso, color de texto, que significa &quot;color&quot; de la regla CSS). Informar sobre la regla CSS asegura que los nombres de clase devueltos sean correctos. Debido a que este es el color del texto, queremos nombres de clase como &quot;has\u2013color&quot;.<\/p>\n<p>Primero algo de desestructuraci\u00f3n en la parte superior. <code>withColors<\/code>reside en el <code>wp.blockEditor<\/code>paquete.<\/p>\n<pre><code>const { withColors } = wp.blockEditor;<\/code><\/pre>\n<p>Cambiaremos la <code>edit<\/code>funci\u00f3n a:<\/p>\n<pre><code>    ...\n    attributes: {\n        ...\n    },\n    edit: withColors({textColor: 'color'})(BlockWithColorSettings),\n    save: (props) =&gt; { \n        ...<\/code><\/pre>\n<p>Con este c\u00f3digo, nuestro componente <code>BlockWithColorSettings<\/code>recibir\u00e1 algunos accesorios adicionales:<\/p>\n<ul>\n<li><code>props.textColor<\/code>: Es un objeto que consta de toda la informaci\u00f3n sobre el color elegido. Si se eligi\u00f3 un color de paleta, almacenar\u00e1 propiedades para c\u00f3digo hexadecimal, slug de paleta, nombre de clase y m\u00e1s. Si se eligi\u00f3 un color personalizado, el objeto contendr\u00e1 el c\u00f3digo hexadecimal. El c\u00f3digo hexadecimal siempre se encuentra en la propiedad <code>color<\/code>. Y el nombre de la clase (solo si se eligi\u00f3 un color de paleta) se establecer\u00e1 en la propiedad <code>class<\/code>.<\/li>\n<li><code>props.setTextColor<\/code>: Una funci\u00f3n que actualizar\u00e1 nuestros atributos por nosotros. Proporcionamos esto para el <code>onChange<\/code>evento de configuraci\u00f3n de color como veremos m\u00e1s adelante. La funci\u00f3n actualizar\u00e1 los atributos <code>textColor<\/code>y. <code>customTextColor<\/code>Debido a que seguimos las reglas de nomenclatura, se actualizar\u00e1 autom\u00e1ticamente <code>customTextColor<\/code>a pesar de que nunca proporcionamos este nombre de atributo.<\/li>\n<\/ul>\n<p>Tenga en cuenta que la funci\u00f3n &quot;establecer&quot; proporcionada como prop seguir\u00e1 la regla: &quot; <code>setYourAttributeName<\/code>&quot;. Debido a que proporcionamos <code>textColor<\/code>, la funci\u00f3n se nombra <code>setTextColor<\/code>. Si, en cambio, nombramos nuestro atributo <code>awesomeColor<\/code>y lo proporcionamos en el <code>withColors<\/code>objeto, la funci\u00f3n de conjunto se llamar\u00eda <code>setAwesomeColor()<\/code>.<\/p>\n<h3>Implementar<code>PanelColorSettings<\/code><\/h3>\n<p>El siguiente paso es implementar la secci\u00f3n Inspector real. Para ello a\u00f1adimos <code>PanelColorSettings<\/code>dentro un <code>InspectorControls<\/code>componente. Debido a que React requiere que todo est\u00e9 dentro de un nodo ra\u00edz, tambi\u00e9n usamos <code>Fragment<\/code>(from <code>wp.elements<\/code>) para envolver todo dentro.<\/p>\n<p>Primero algo de desestructuraci\u00f3n en la parte superior del archivo:<\/p>\n<pre><code>const { Fragment } = wp.element;\nconst { InspectorControls, PanelColorSettings, withColors } = wp.blockEditor;<\/code><\/pre>\n<p>Y actualizamos nuestro <code>BlockWithColorSettings<\/code>componente en algo como esto:<\/p>\n<pre><code>const BlockWithColorSettings = (props) =&gt; {\n    const { textColor, setTextColor } = props;  \/\/ Props received from withColors\n    return(\n        &lt;Fragment&gt;\n            &lt;InspectorControls&gt;\n                &lt;PanelColorSettings \n                    title={__('Color settings')}\n                    colorSettings={[\n                        {\n                            value: textColor.color,\n                            onChange: setTextColor,\n                            label: __('Text color')\n                        },\n                    ]}\n                \/&gt;\n            &lt;\/InspectorControls&gt;\n            &lt;div&gt;\n                PanelColorSettings Demo\n            &lt;\/div&gt;\n        &lt;\/Fragment&gt;\n    );\n}<\/code><\/pre>\n<p>Como puede ver en la l\u00ednea <code>#2<\/code>, desestructuramos los accesorios recibidos de <code>withColors<\/code>, <code>textColor<\/code>y <code>setTextColor<\/code>. Tenga en cuenta que <code>props.textColor<\/code>es el objeto recibido de <code>withColors<\/code>, y <code>props.attributes.textColor<\/code>es el atributo. Sin embargo, no tenemos necesidad de referirnos al atributo.<\/p>\n<p>Como accesorios para el componente <code>PanelColorSettings<\/code>, podemos proporcionar un t\u00edtulo para la secci\u00f3n (t\u00edtulo en el cuadro plegable en Inspector). Lo importante aqu\u00ed es el accesorio <code>colorSettings<\/code>donde necesitamos proporcionar una variedad de objetos de configuraci\u00f3n de color. Para cada configuraci\u00f3n de color (actualmente solo tenemos una) necesitamos proporcionar algunas propiedades. La propiedad <code>value<\/code>espera el c\u00f3digo hexadecimal elegido actualmente (aunque se haya elegido un color de paleta). Esto se proporciona para nosotros en el <code>textColor<\/code>prop, dentro de la propiedad <code>color<\/code>. Para la <code>onChange<\/code>propiedad, simplemente proporcionamos la funci\u00f3n &quot;establecer&quot; proporcionada por <code>withColors<\/code>, <code>setTextColor<\/code>. Y por \u00faltimo deber\u00edamos dar a <code>label<\/code>para que el usuario sepa a qu\u00e9 elemento afectar\u00e1 este color. Aparecer\u00e1 justo encima del \u00e1rea de elecci\u00f3n de un color.<\/p>\n<p>As\u00ed es como aparece nuestro componente en el editor de Gutenberg ahora mismo:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151572-61e4cc6b47b23.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151572-61e4cc6b47b23.png\" alt=\"C\u00f3mo agregar configuraciones de color a su bloque de Gutenberg personalizado\"><\/a><\/p>\n<p>Ahora est\u00e1 actualizando con \u00e9xito nuestros atributos al elegir colores. Puede ver que recuerda su elecci\u00f3n de color al guardar la publicaci\u00f3n.<\/p>\n<p>Sin embargo, no sucede nada visualmente cuando cambias de color. La elecci\u00f3n de color se almacena en los atributos, pero no se produce ning\u00fan cambio de color en el editor, ni al obtener una vista previa de la publicaci\u00f3n. Esto se debe a que necesitamos agregar c\u00f3digo para las clases y estilos del bloque. Necesitamos hacer esto tanto para la <code>edit<\/code>funci\u00f3n (que es para el editor) como para la <code>save<\/code>funci\u00f3n (interfaz). Ese es el siguiente paso.<\/p>\n<h3>Manejo de clases y estilos en l\u00ednea en<code>edit<\/code><\/h3>\n<p>Necesitamos construir la clase de nodo y los atributos de estilo del bloque de acuerdo con la configuraci\u00f3n de color elegida. Afortunadamente <code>withColors<\/code>, conseguimos algo de automatizaci\u00f3n en esto. Recuerda que <code>props.textColor<\/code>es un objeto que contiene toda la informaci\u00f3n que necesitamos, incluido el nombre de la clase.<\/p>\n<p>Podr\u00edamos hacer algo como esto:<\/p>\n<pre><code>...\nconst BlockWithColorSettings = (props) =&gt; {\n    const { textColor, setTextColor } = props;  \/\/ Props received from withColors\n    let divClass;\n    let divStyles = {};\n    if (textColor != undefined) {\n        if (textColor.class != undefined) {\n            divClass = textColor.class;\n        } else {\n            divStyles.color = textColor.color;\n        }\n    }\n    return(\n        &lt;Fragment&gt;\n            &lt;InspectorControls&gt;\n                ...\n            &lt;\/InspectorControls&gt;\n            &lt;div className={divClass} style={divStyles}&gt;\n                PanelColorSettings Demo\n            &lt;\/div&gt;\n            ...<\/code><\/pre>\n<p>En l\u00ednea <code>#20<\/code>, aplicamos la clase cr\u00edtica y el estilo en l\u00ednea al nodo ra\u00edz de nuestro bloque. Antes de eso, construimos la clase y el atributo de estilo en l\u00ednea al verificar el <code>props.textColor<\/code>objeto.<\/p>\n<p>Despu\u00e9s de este cambio, su bloque personalizado ahora deber\u00eda ser completamente funcional en el editor. Siempre que cambies de color, el bloque cambiar\u00e1 el color del texto. \u00a1Impresionante! El \u00faltimo paso es hacer esto tambi\u00e9n para la <code>save<\/code>funci\u00f3n, de modo que tambi\u00e9n obtengamos estas clases y estilos en la interfaz.<\/p>\n<h3>Manejo de clases y estilos en l\u00ednea en<code>save<\/code><\/h3>\n<p>El concepto de construir la clase y los estilos en l\u00ednea y aplicarlos al nodo ra\u00edz es el mismo <code>save<\/code>que en <code>edit<\/code>. Pero hay una diferencia crucial. En <code>save<\/code>no tenemos los accesorios proporcionados por <code>withColors<\/code>. Y no podemos agregar componentes de orden superior a la <code>save<\/code>funci\u00f3n. Entonces, en la <code>save<\/code>funci\u00f3n, toda la informaci\u00f3n que tenemos son los atributos.<\/p>\n<p>Es una buena regla general evitar codificar nombres de clase &quot;has-&quot;. \u00bfQu\u00e9 pasa si WordPress decide cambiar esta regla en el futuro? Afortunadamente, tenemos una funci\u00f3n que puede ayudarnos a generar los nombres de clase adecuados para nosotros: <code>getColorClassName()<\/code>.<\/p>\n<p>Antes de que olvidemos, vamos a desestructurarlo. Tambi\u00e9n est\u00e1 en el <code>wp.blockEditor<\/code>paquete.<\/p>\n<pre><code>const { InspectorControls, PanelColorSettings, withColors, getColorClassName } = wp.blockEditor;<\/code><\/pre>\n<p>El uso de la <code>getColorClassName()<\/code>funci\u00f3n requiere dos par\u00e1metros. Primero una cadena para la regla CSS. Debido a que nuestra configuraci\u00f3n de color es para el color del texto, proporcionamos &#8216; <code>color<\/code>&#8216;. Esto le dice a la funci\u00f3n que debe devolver un nombre de clase de &quot;tiene-algo-color&quot; y no &quot;tiene-algo-color-de-fondo&quot;, por ejemplo. Como segundo par\u00e1metro necesitamos proporcionar el valor del atributo.<\/p>\n<p>El atributo de estilo se crea simplemente configurando &quot;color&quot; en el valor del atributo <code>customTextColor<\/code>, si est\u00e1 definido.<\/p>\n<pre><code>save: (props) =&gt; { \n    const { textColor, customTextColor } = props.attributes;\n    let divClass;\n    let divStyles = {};\n    if (textColor != undefined) {\n        divClass = getColorClassName('color', textColor);\n    }\n    if (customTextColor != undefined) {\n        divStyles.color = customTextColor;\n    }\n    return(\n        &lt;div className={divClass} style={divStyles}&gt;\n            PanelColorSettings Demo\n        &lt;\/div&gt;\n    );\n}<\/code><\/pre>\n<p>Y, por supuesto, no olvide aplicar la clase y el estilo en el nodo ra\u00edz de su bloque; como en linea <code>#12<\/code>.<\/p>\n<p>PD: si est\u00e1 probando su bloque en el editor mientras escribe este c\u00f3digo, ahora obtendr\u00e1 un error de bloque. Esto sucede porque ahora hemos cambiado la salida de la <code>save<\/code>funci\u00f3n y todo lo que haya guardado anteriormente est\u00e1 en conflicto. Deber\u00e1 eliminar el bloque y volver a agregarlo.<\/p>\n<p>Despu\u00e9s de este cambio, su bloque ahora tambi\u00e9n deber\u00eda aplicar correctamente el color de texto elegido en la interfaz.<\/p>\n<p>\u00a1Y eso es! Ahora ha implementado con \u00e9xito la configuraci\u00f3n de color en su bloque. Si est\u00e1 interesado en agregar varias configuraciones de color (no solo el color del texto), siga leyendo.<\/p>\n<h2>Una nota sobre la configuraci\u00f3n de varios colores<\/h2>\n<p>A estas alturas, deber\u00eda poder implementar m\u00faltiples configuraciones de color. Es posible que desee agregar configuraciones para el color de fondo, el color del texto, el color del borde o cualquier otra cosa para su bloque. En esta secci\u00f3n, har\u00e9 una descripci\u00f3n general r\u00e1pida de lo que debemos hacer para implementar m\u00faltiples configuraciones de color.<\/p>\n<p>Supongamos que tambi\u00e9n quiero agregar color de fondo a mi bloque.<\/p>\n<p>Primero necesito definir un nuevo atributo llamado creativamente <code>backgroundColor<\/code>. Defino otro atributo <code>customBackgroundColor<\/code>tambi\u00e9n.<\/p>\n<p>En la <code>edit<\/code>funci\u00f3n cambio el objeto provisto <code>withColors<\/code>como tal:<\/p>\n<pre><code>withColors({textColor: 'color', backgroundColor: 'background-color'})<\/code><\/pre>\n<p>Esto indica <code>withColors<\/code>que mi <code>textColor<\/code>atributo es para la regla CSS &quot; <code>color<\/code>&quot; (para el color del texto), y el atributo <code>backgroundColor<\/code>es para la regla CSS &quot; <code>background-color<\/code>&quot;. <code>withColors<\/code>reconocer\u00e1 y actualizar\u00e1 autom\u00e1ticamente los atributos y tambi\u00e9n <code>customTextColor<\/code>.<code>customBackgroundColor<\/code><\/p>\n<p>En el <code>PanelColorSettings<\/code>componente, proporciono otro objeto a la matriz para el accesorio <code>colorSettings<\/code>. Al igual que:<\/p>\n<pre><code>&lt;PanelColorSettings \n    title={__('Color settings')}\n    colorSettings={[\n        {\n            value: textColor.color,\n            onChange: setTextColor,\n            label: __('Text color')\n        },\n        {\n            value: backgroundColor.color,\n            onChange: setBackgroundColor,\n            label: __('Background color')\n        },\n    ]}\n\/&gt;<\/code><\/pre>\n<p>Con esto, deber\u00eda obtener dos configuraciones de color separadas dentro del cuadro Inspector para la configuraci\u00f3n de color.<\/p>\n<p>El \u00faltimo paso es construir los nombres y estilos de clase apropiados en ambos <code>edit<\/code>y <code>save<\/code>. Este es un paso bastante simple, ya que solo se trata de construir una cadena o un objeto de estilo correctamente. Recuerde que el nombre de su clase debe admitir varias clases de color (por ejemplo, si se eligieron tanto el color del texto como el color de fondo). Simplemente agregue un espacio entre cada nombre de clase.<\/p>\n<p>PD: si necesita manejar muchos nombres de clase para su bloque, puede beneficiarse instalando el <code>classnames<\/code>paquete. Pr\u00e1cticamente todos los componentes de Gutenberg utilizan esta biblioteca para combinar nombres de clases m\u00e1s f\u00e1cilmente.<\/p>\n<h2>Conclusi\u00f3n y c\u00f3digo completo.<\/h2>\n<p>Ahora deber\u00eda haber aprendido c\u00f3mo implementar configuraciones de color en su bloque personalizado. \u00a1Espero que esto te haya servido de algo! Tuve que agregar esta caracter\u00edstica a mi proyecto, y realmente no pude encontrar ninguna informaci\u00f3n o buena documentaci\u00f3n. As\u00ed que este es el resultado de consolidar todo lo que aprend\u00ed sobre este tema, despu\u00e9s de mucho ensayo y error.<\/p>\n<p>Aqu\u00ed est\u00e1 el c\u00f3digo final, en conjunto, para el bloque personalizado de ejemplo con configuraci\u00f3n de color de texto:<\/p>\n<pre><code>const { registerBlockType } = wp.blocks;\nconst { __ } = wp.i18n;\nconst { Fragment } = wp.element;\nconst { InspectorControls, PanelColorSettings, withColors, getColorClassName } = wp.blockEditor;\n\u00a0\nconst BlockWithColorSettings = (props) =&gt; {\n    const { textColor, setTextColor } = props;  \/\/ Props received from withColors\n\u00a0\n    let divClass;\n    let divStyles = {};\n    if (textColor != undefined) {\n        if (textColor.class != undefined) {\n            divClass = textColor.class;\n        } else {\n            divStyles.color = textColor.color;\n        }\n    }\n    return(\n        &lt;Fragment&gt;\n            &lt;InspectorControls&gt;\n                &lt;PanelColorSettings \n                    title={__('Color settings')}\n                    colorSettings={[\n                        {\n                            value: textColor.color,\n                            onChange: setTextColor,\n                            label: __('Text color')\n                        },\n                    ]}\n                \/&gt;\n            &lt;\/InspectorControls&gt;\n            &lt;div className={divClass} style={divStyles}&gt;\n                PanelColorSettings Demo\n            &lt;\/div&gt;\n        &lt;\/Fragment&gt;\n    );\n}\n\u00a0\nregisterBlockType('awp\/colorsettings', {\n    title: __('Color Settings Demo'),\n    icon: 'carrot',\n    category: 'common',\n    attributes: {\n        textColor: {\n            type: 'string'\n        },\n        customTextColor: {\n            type: 'string'\n        },\n    },\n    edit: withColors({textColor: 'color'})(BlockWithColorSettings),\n    save: (props) =&gt; { \n        const { textColor, customTextColor } = props.attributes;\n        let divClass;\n        let divStyles = {};\n        if (textColor != undefined) {\n            divClass = getColorClassName('color', textColor);\n        }\n        if (customTextColor != undefined) {\n            divStyles.color = customTextColor;\n        }\n        return(\n            &lt;div className={divClass} style={divStyles}&gt;\n                PanelColorSettings Demo\n            &lt;\/div&gt;\n        );\n    }\n});<\/code><\/pre>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fuente de grabaci\u00f3n:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Esta publicaci\u00f3n profundiza en c\u00f3mo agregar configuraciones de color a su bloque personalizado de WordPress Gutenberg, de la manera correcta, tal como lo hacen los bloques de WordPress.<\/p>\n","protected":false},"author":1,"featured_media":151573,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[810,935,935,1110,800,800,810,840,840,861,861],"tags":[1172],"class_list":["post-233911","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-complementos","category-gutenberg-2","category-n-a","category-php-2","category-tutoriales","category-wordpress-2","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/233911","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/comments?post=233911"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/233911\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/151573"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=233911"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=233911"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=233911"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}