{"id":233982,"date":"2023-02-26T11:58:00","date_gmt":"2023-02-26T08:58:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233982"},"modified":"2023-02-26T12:09:15","modified_gmt":"2023-02-26T09:09:15","slug":"como-adicionar-configuracoes-de-cores-ao-seu-bloco-gutenberg-personalizado","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/como-adicionar-configuracoes-de-cores-ao-seu-bloco-gutenberg-personalizado\/","title":{"rendered":"Como adicionar configura\u00e7\u00f5es de cores ao seu bloco Gutenberg personalizado"},"content":{"rendered":"\n<p>Este post se aprofundar\u00e1 em como adicionar configura\u00e7\u00f5es de cores ao seu bloco WordPress Gutenberg personalizado. Aprenderemos como adicionar o mesmo componente de configura\u00e7\u00f5es de cores, que apresenta a escolha de cores da paleta e cores personalizadas, como muitos dos blocos padr\u00e3o do WordPress usam.<\/p>\n<p>Isto \u00e9 o que adicionaremos ao nosso bloco 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=\"Como adicionar configura\u00e7\u00f5es de cores ao seu bloco Gutenberg personalizado\"><\/a><\/p>\n<p>Ao usar os componentes do Gutenberg, podemos facilmente implementar esta paleta\/se\u00e7\u00e3o de cores em nosso pr\u00f3prio bloco personalizado. Voc\u00ea pode definir as configura\u00e7\u00f5es de cor para afetar qualquer cor desejada; fundo, cor do texto, cor da borda ou qualquer outra coisa. Voc\u00ea tamb\u00e9m pode adicionar quantas configura\u00e7\u00f5es de cores desejar dentro deste painel.<\/p>\n<p>Antes de mergulharmos no c\u00f3digo, h\u00e1 algumas coisas que voc\u00ea precisa estar ciente. N\u00e3o pule para o c\u00f3digo, pois a pr\u00f3xima se\u00e7\u00e3o explicar\u00e1 muito por que o c\u00f3digo precisa fazer isso como faz.<\/p>\n<h2>O que voc\u00ea precisa saber primeiro<\/h2>\n<p>Os componentes para implementar as configura\u00e7\u00f5es de paleta\/cor s\u00e3o <code>PanelColorSettings<\/code>e <code>withColors<\/code>do <code>wp.blockEditor<\/code>pacote. O componente <code>withColors<\/code>\u00e9 chamado de componente de ordem superior e precisa ser implementado de forma um pouco diferente do que simplesmente gerar um componente normal. Entrarei em um pouco mais de detalhes mais adiante. Mas primeiro precisamos estar cientes do b\u00e1sico sobre como o Gutenberg lida com as configura\u00e7\u00f5es de cores de bloco.<\/p>\n<h3>Como os blocos Gutenberg lidam com as configura\u00e7\u00f5es de cores<\/h3>\n<p>Existem certas regras sobre como o Gutenberg lida com as configura\u00e7\u00f5es de cores em blocos. Se voc\u00ea j\u00e1 estilizou um tema compat\u00edvel com Gutenberg antes, provavelmente j\u00e1 est\u00e1 familiarizado com essas regras. N\u00f3s vamos passar por eles rapidamente, no entanto, porque temos que lidar com isso em nosso c\u00f3digo de bloco.<\/p>\n<ul>\n<li>Quando uma cor de paleta \u00e9 escolhida, o elemento do bloco de n\u00f3s receber\u00e1 uma classe de um determinado padr\u00e3o. A classe come\u00e7a com &#8221; <code>has-<\/code>&#8220;, e depois vem o slug da paleta. O final depende de qual elemento a cor deve afetar. Para cor de texto termina com &#8221; <code>-color<\/code>&#8220;. Para cor de fundo, termina com &#8221; <code>-background-color<\/code>&#8220;. Como exemplo, um bloco com a cor da paleta &#8220;vermelho&quot; escolhida como cor de fundo receber\u00e1 a classe &#8221; <code>has-red-background-color<\/code>&#8220;.<\/li>\n<li>Quando uma cor personalizada \u00e9 escolhida (no seletor de cores), o elemento do bloco de n\u00f3 obter\u00e1 um estilo embutido com o c\u00f3digo hexadecimal. Por exemplo, uma cor personalizada #DD0000 escolhida para a cor de fundo receber\u00e1 o atributo &#8221; <code>style=\"background-color: #DD0000;<\/code>&#8220;.<\/li>\n<\/ul>\n<p>Quando implementarmos as configura\u00e7\u00f5es de cores para o nosso bloco, precisaremos implementar a classe e o estilo inline corretos. Faremos isso no final deste tutorial.<\/p>\n<h3>Como trabalhar com<code>withColors<\/code><\/h3>\n<p>Como mencionado anteriormente <code>withColors<\/code>, \u00e9 um <a href=\"https:\/\/reactjs.org\/docs\/higher-order-components.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">componente de ordem superior<\/a>. O que isso basicamente significa que \u00e9 um componente que recebe um componente e retorna um novo componente. No componente retornado, obtemos props \u00fateis do componente de ordem superior. Simplificando, usaremos <code>withColors<\/code>para retornar nosso pr\u00f3prio componente para nosso bloco personalizado. Nosso componente de bloco obt\u00e9m os adere\u00e7os necess\u00e1rios para trabalhar com cores do <code>withColors<\/code>.<\/p>\n<p>O componente <code>withColors<\/code>lida com o estado e muitas funcionalidades para trabalhar com cores. E temos muita automa\u00e7\u00e3o nesse processo. Isso \u00e9 muito \u00fatil para descobrir se a cor escolhida \u00e9 uma cor de paleta (precisamos adicionar uma classe) ou uma cor personalizada (precisamos adicionar um estilo embutido). <code>withColors<\/code>simplificar muito o processo de armazenamento da cor escolhida, seja ela qual for, nos atributos do nosso bloco. Falando em atributos..<\/p>\n<h3>Atributos e<code>withColors<\/code><\/h3>\n<p>Obviamente seu bloco precisa de atributos para armazenar a cor escolhida. Para se beneficiar da automa\u00e7\u00e3o do withColor para armazenar a cor correta, voc\u00ea precisa definir dois atributos para cada configura\u00e7\u00e3o de cor. Um para armazenar o slug da cor da paleta e outro para armazenar o c\u00f3digo hexadecimal. Existem algumas regras embora.<\/p>\n<p>Digamos que voc\u00ea queira adicionar uma configura\u00e7\u00e3o de cor para a cor do texto do bloco \u2013 ent\u00e3o voc\u00ea decide definir um atributo apropriadamente chamado &#8221; <code>textColor<\/code>&#8220;. Voc\u00ea precisar\u00e1 ent\u00e3o definir outro atributo no padr\u00e3o &#8221; <code>customYourOriginalAttribute<\/code>&#8220;. Neste exemplo, o segundo atributo precisar\u00e1 ser nomeado &#8221; <code>customTextColor<\/code>&#8220;. Lembre-se do camelCase (capitaliza\u00e7\u00e3o) aqui. Seguir este padr\u00e3o <code>withColors<\/code>ir\u00e1 automaticamente:<\/p>\n<ul>\n<li>Se uma cor de paleta foi escolhida, o atributo &#8221; <code>textColor<\/code>&#8221; conter\u00e1 o slug da paleta.<\/li>\n<li>Se uma cor personalizada foi escolhida, &#8221; <code>customTextColor<\/code>&#8221; ser\u00e1 preenchido com o c\u00f3digo hexadecimal.<\/li>\n<\/ul>\n<p>Esses dois trabalham em conjunto. Se uma cor personalizada for escolhida, <code>textColor<\/code>ser\u00e1 automaticamente <code>undefined<\/code>e vice-versa.<\/p>\n<p>E, finalmente, uma \u00faltima coisa a lembrar: <strong>voc\u00ea n\u00e3o precisar\u00e1 usar <code>setAttributes()<\/code>para atualizar seus atributos de cor<\/strong>! Os adere\u00e7os fornecidos <code>withColors<\/code>incluem uma fun\u00e7\u00e3o que atualiza automaticamente seus atributos para voc\u00ea. Tudo que voc\u00ea precisa fazer \u00e9 passar esta fun\u00e7\u00e3o para o <code>onChange<\/code>evento para o <code>PanelColorSettings<\/code>componente, e seus atributos ser\u00e3o atualizados automaticamente.<\/p>\n<p>Ok, \u00e9 hora de ver tudo isso na pr\u00e1tica!<\/p>\n<h2>Implementando configura\u00e7\u00f5es de cores em um bloco personalizado<\/h2>\n<p>Para come\u00e7ar, tenho um bloco personalizado bastante in\u00fatil que n\u00e3o faz nada al\u00e9m de exibir um texto codificado. Isso apenas facilita a separa\u00e7\u00e3o do que precisamos codificar para adicionar configura\u00e7\u00f5es de cores. Eu tenho uma <a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/como-criar-um-bloco-personalizado-do-wordpress-gutenberg-serie-de-tutoriais\/\" title=\"s\u00e9rie de tutoriais sobre como criar seus pr\u00f3prios blocos personalizados\">s\u00e9rie de tutoriais sobre como criar seus pr\u00f3prios blocos personalizados<\/a> se voc\u00ea estiver interessado em aprender mais.<\/p>\n<p>Nota: estou escrevendo todo o c\u00f3digo em ES6\/ESNext. Isso inclui fun\u00e7\u00f5es de seta que requerem cuidados especiais na configura\u00e7\u00e3o do seu Babel\/webpack. Se voc\u00ea estiver recebendo erros em alguns dos c\u00f3digos abaixo, siga meu <a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/guia-completo-em-configurando-um-ambiente-de-desenvolvimento-para-gutenberg\/\" title=\"guia sobre como configurar o Webpack e o Babel para ES6\/ESNext\">guia sobre como configurar o Webpack e o Babel para ES6\/ESNext<\/a> ou ajuste o c\u00f3digo para n\u00e3o usar &#8220;sintaxes experimentais&#8221;.<\/p>\n<p>Este \u00e9 o meu bloco personalizado b\u00e1sico antes de fazer qualquer coisa com as configura\u00e7\u00f5es de cores:<\/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>\u00c9 bem b\u00e1sico. Observe que a <code>edit<\/code>fun\u00e7\u00e3o est\u00e1 simplesmente se referindo a um componente separado, <code>BlockWithColorSettings<\/code>, em vez de escrev\u00ea-lo embutido. Isso facilita a implementa\u00e7\u00e3o <code>withColors<\/code>posterior.<\/p>\n<p>Ok, hora de implementar as configura\u00e7\u00f5es de cores em nosso bloco! Como exemplo, quero configurar a cor do texto.<\/p>\n<h3>Adicionando atributos<\/h3>\n<p>Como mencionado anteriormente, precisamos definir dois atributos para cada configura\u00e7\u00e3o de cor. E precisamos ter um cuidado extra em sua nomenclatura. Eu quero adicionar um atributo de cor de texto, ent\u00e3o estou nomeando o atributo <code>textColor<\/code>. O que significa que tamb\u00e9m adicionarei um atributo <code>customTextColor<\/code>. Ambos devem ser do tipo string.<\/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>Nossos atributos est\u00e3o prontos para armazenar a configura\u00e7\u00e3o de cor do texto do bloco. Agora \u00e9 hora de implementar <code>withColors<\/code>e <code>PanelColorSettings<\/code>.<\/p>\n<h3>Implementa\u00e7\u00e3o<code>withColors<\/code><\/h3>\n<p>Como mencionado anteriormente <code>withColors<\/code>, \u00e9 um componente de ordem superior que deve receber um componente para retornar. Obviamente, queremos que ele retorne nosso componente de edi\u00e7\u00e3o, <code>BlockWithColorSettings<\/code>. Mas como par\u00e2metro para <code>withColors<\/code>n\u00f3s fornecemos um objeto.<\/p>\n<p>No objeto passado <code>withColors<\/code>precisamos dizer <code>withColors<\/code>qual atributo queremos usar para armazenar a cor e que tipo de elemento ele ir\u00e1 colorir (no nosso caso text color, que significa a regra CSS &#8220;color&#8221;). Informar sobre a regra CSS garante que os nomes das classes retornados estejam corretos. Como esta \u00e9 a cor do texto, queremos nomes de classe como &#8220;has\u2013color&#8221;.<\/p>\n<p>Primeiro alguma desestrutura\u00e7\u00e3o no topo. <code>withColors<\/code>reside no <code>wp.blockEditor<\/code>pacote.<\/p>\n<pre><code>const { withColors } = wp.blockEditor;<\/code><\/pre>\n<p>Vamos mudar a <code>edit<\/code>fun\u00e7\u00e3o para:<\/p>\n<pre><code>    ...\n    attributes: {\n        ...\n    },\n    edit: withColors({textColor: 'color'})(BlockWithColorSettings),\n    save: (props) =&gt; { \n        ...<\/code><\/pre>\n<p>Com este c\u00f3digo nosso componente <code>BlockWithColorSettings<\/code>receber\u00e1 alguns adere\u00e7os adicionais:<\/p>\n<ul>\n<li><code>props.textColor<\/code>: \u00c9 um objeto que consiste em todas as informa\u00e7\u00f5es sobre a cor escolhida. Se uma cor de paleta foi escolhida, ela armazenar\u00e1 propriedades para c\u00f3digo hexadecimal, slug de paleta, nome de classe e muito mais. Se uma cor personalizada foi escolhida, o objeto conter\u00e1 o c\u00f3digo hexadecimal. O c\u00f3digo hexadecimal \u00e9 sempre encontrado na propriedade <code>color<\/code>. E o nome da classe, (somente se for escolhida a cor da paleta) ser\u00e1 definido na propriedade <code>class<\/code>.<\/li>\n<li><code>props.setTextColor<\/code>: Uma fun\u00e7\u00e3o que atualizar\u00e1 nossos atributos para n\u00f3s. Fornecemos isso para o <code>onChange<\/code>evento das configura\u00e7\u00f5es de cores, como veremos mais adiante. A fun\u00e7\u00e3o atualizar\u00e1 os atributos <code>textColor<\/code>e. <code>customTextColor<\/code>Como seguimos as regras de nomenclatura, ele ser\u00e1 atualizado automaticamente, <code>customTextColor<\/code>mesmo que nunca tenhamos fornecido esse nome de atributo.<\/li>\n<\/ul>\n<p>Observe que a fun\u00e7\u00e3o &#8220;set&#8221; fornecida como prop seguir\u00e1 a regra: &#8221; <code>setYourAttributeName<\/code>&#8220;. Como fornecemos <code>textColor<\/code>, a fun\u00e7\u00e3o \u00e9 denominada <code>setTextColor<\/code>. Se, em vez disso, nomeamos nosso atributo <code>awesomeColor<\/code>e fornecemos isso no <code>withColors<\/code>objeto, a fun\u00e7\u00e3o set seria nomeada <code>setAwesomeColor()<\/code>.<\/p>\n<h3>Implementa\u00e7\u00e3o<code>PanelColorSettings<\/code><\/h3>\n<p>A pr\u00f3xima etapa \u00e9 implementar a se\u00e7\u00e3o Inspetor real. Para fazer isso, adicionamos <code>PanelColorSettings<\/code>dentro de um <code>InspectorControls<\/code>componente. Como o React requer que tudo esteja dentro de um n\u00f3 raiz, tamb\u00e9m usamos <code>Fragment<\/code>(from <code>wp.elements<\/code>) para envolver tudo dentro.<\/p>\n<p>Primeiro alguma desestrutura\u00e7\u00e3o no topo do arquivo:<\/p>\n<pre><code>const { Fragment } = wp.element;\nconst { InspectorControls, PanelColorSettings, withColors } = wp.blockEditor;<\/code><\/pre>\n<p>E atualizamos nosso <code>BlockWithColorSettings<\/code>componente para algo assim:<\/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 voc\u00ea pode ver na linha <code>#2<\/code>, desestruturamos os adere\u00e7os recebidos de <code>withColors<\/code>, <code>textColor<\/code>e <code>setTextColor<\/code>. Tenha em mente que <code>props.textColor<\/code>\u00e9 o objeto recebido de <code>withColors<\/code>, e <code>props.attributes.textColor<\/code>\u00e9 o atributo. No entanto, n\u00e3o precisamos nos referir ao atributo.<\/p>\n<p>Como adere\u00e7os para o componente <code>PanelColorSettings<\/code>, podemos fornecer um t\u00edtulo para a se\u00e7\u00e3o (t\u00edtulo na caixa recolh\u00edvel no Inspector). O importante aqui \u00e9 o prop <code>colorSettings<\/code>onde precisamos fornecer uma matriz de objetos de configura\u00e7\u00e3o de cores. Para cada configura\u00e7\u00e3o de cor (atualmente temos apenas uma), precisamos fornecer algumas propriedades. A propriedade <code>value<\/code>espera o c\u00f3digo hexadecimal escolhido no momento (mesmo que uma cor de paleta tenha sido escolhida). Isso \u00e9 fornecido para n\u00f3s no <code>textColor<\/code>prop, dentro da propriedade <code>color<\/code>. Para a <code>onChange<\/code>propriedade, simplesmente fornecemos a fun\u00e7\u00e3o &#8220;set&#8221; fornecida por <code>withColors<\/code>, <code>setTextColor<\/code>. E finalmente devemos dar um <code>label<\/code>para que o usu\u00e1rio saiba qual elemento essa cor afetar\u00e1. Ele aparecer\u00e1 logo acima da \u00e1rea de escolha de uma cor.<\/p>\n<p>\u00c9 assim que nosso componente aparece no editor Gutenberg agora:<\/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=\"Como adicionar configura\u00e7\u00f5es de cores ao seu bloco Gutenberg personalizado\"><\/a><\/p>\n<p>Agora est\u00e1 atualizando com sucesso nossos atributos ao escolher as cores. Voc\u00ea pode ver que ele lembra sua escolha de cor ao salvar a postagem.<\/p>\n<p>No entanto, nada acontece visualmente quando voc\u00ea altera as cores. A escolha da cor \u00e9 armazenada nos atributos, mas nenhuma mudan\u00e7a de cor acontece no editor, nem na visualiza\u00e7\u00e3o do post. Isso ocorre porque precisamos adicionar c\u00f3digo para as classes e estilos do bloco. Precisamos fazer isso tanto para a <code>edit<\/code>fun\u00e7\u00e3o (que \u00e9 para o editor) quanto para a <code>save<\/code>fun\u00e7\u00e3o (frontend). Esse \u00e9 o pr\u00f3ximo passo.<\/p>\n<h3>Manipulando classes e estilos embutidos em<code>edit<\/code><\/h3>\n<p>Precisamos construir a classe de n\u00f3 do bloco e os atributos de estilo de acordo com a configura\u00e7\u00e3o de cor escolhida. Felizmente <code>withColors<\/code>, temos alguma automa\u00e7\u00e3o nisso. Lembre-se que <code>props.textColor<\/code>\u00e9 um objeto que cont\u00e9m todas as informa\u00e7\u00f5es que precisamos, incluindo o nome da classe.<\/p>\n<p>Poder\u00edamos fazer algo assim:<\/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>Na linha <code>#20<\/code>, aplicamos a classe cr\u00edtica e o estilo inline ao n\u00f3 raiz do nosso bloco. Antes disso, constru\u00edmos a classe e o atributo de estilo inline verificando o <code>props.textColor<\/code>objeto.<\/p>\n<p>Ap\u00f3s essa altera\u00e7\u00e3o, seu bloco personalizado agora deve estar totalmente funcional no editor. Sempre que voc\u00ea mudar de cor, o bloco mudar\u00e1 a cor do texto. Incr\u00edvel! A etapa final \u00e9 fazer isso <code>save<\/code>tamb\u00e9m para a fun\u00e7\u00e3o, para que possamos obter essas classes e estilos no frontend tamb\u00e9m.<\/p>\n<h3>Manipulando classes e estilos embutidos em<code>save<\/code><\/h3>\n<p>O conceito de construir a classe e os estilos embutidos e aplic\u00e1-los ao n\u00f3 raiz \u00e9 o mesmo <code>save<\/code>no <code>edit<\/code>. Mas h\u00e1 uma diferen\u00e7a crucial. Em <code>save<\/code>n\u00e3o temos os adere\u00e7os fornecidos pelo <code>withColors<\/code>. E n\u00e3o podemos adicionar componentes de ordem superior \u00e0 <code>save<\/code>fun\u00e7\u00e3o. Ent\u00e3o na <code>save<\/code>fun\u00e7\u00e3o todas as informa\u00e7\u00f5es que temos s\u00e3o os atributos.<\/p>\n<p>\u00c9 uma boa regra geral evitar codificar nomes de classe &#8220;tem-&#8220;. E se o WordPress decidir mudar essa regra no futuro? Felizmente, temos uma fun\u00e7\u00e3o que pode nos ajudar a gerar os nomes de classe apropriados para n\u00f3s: <code>getColorClassName()<\/code>.<\/p>\n<p>Antes que esque\u00e7amos, vamos desestruturar. Tamb\u00e9m est\u00e1 no <code>wp.blockEditor<\/code>pacote.<\/p>\n<pre><code>const { InspectorControls, PanelColorSettings, withColors, getColorClassName } = wp.blockEditor;<\/code><\/pre>\n<p>Usar a <code>getColorClassName()<\/code>fun\u00e7\u00e3o requer dois par\u00e2metros. Primeiro uma string para a regra CSS. Como nossa configura\u00e7\u00e3o de cor \u00e9 para a cor do texto, fornecemos &#8216; <code>color<\/code>&#8216;. Isso diz \u00e0 fun\u00e7\u00e3o que ela deve retornar um nome de classe de &#8220;tem-algo-cor&#8221; e n\u00e3o &#8220;tem-algo-cor de fundo&#8221; por exemplo. Como segundo par\u00e2metro, precisamos fornecer o valor do atributo.<\/p>\n<p>O atributo style \u00e9 constru\u00eddo simplesmente definindo &#8220;color&#8221; para o valor do atributo <code>customTextColor<\/code>, se estiver 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>E, claro, n\u00e3o se esque\u00e7a de aplicar a classe e o estilo no n\u00f3 raiz do seu bloco; como na linha <code>#12<\/code>.<\/p>\n<p>PS: Se voc\u00ea estiver testando seu bloco no editor enquanto escreve este c\u00f3digo, agora receber\u00e1 um erro de bloco. Isso acontece porque agora alteramos a sa\u00edda da <code>save<\/code>fun\u00e7\u00e3o e tudo o que voc\u00ea salvou anteriormente est\u00e1 em conflito. Voc\u00ea ter\u00e1 que remover o bloco e adicion\u00e1-lo novamente.<\/p>\n<p>Ap\u00f3s essa altera\u00e7\u00e3o, seu bloco agora deve aplicar corretamente a cor de texto escolhida no frontend tamb\u00e9m.<\/p>\n<p>E \u00e9 isso! Voc\u00ea agora implementou com sucesso as configura\u00e7\u00f5es de cores para o seu bloco. Se voc\u00ea estiver interessado em adicionar v\u00e1rias configura\u00e7\u00f5es de cores (n\u00e3o apenas a cor do texto), continue lendo.<\/p>\n<h2>Uma nota sobre v\u00e1rias configura\u00e7\u00f5es de cores<\/h2>\n<p>At\u00e9 agora voc\u00ea deve ser capaz de implementar v\u00e1rias configura\u00e7\u00f5es de cores. Voc\u00ea pode querer adicionar configura\u00e7\u00f5es para cor de fundo, cor do texto, cor da borda ou qualquer outra coisa para o seu bloco. Nesta se\u00e7\u00e3o, farei uma r\u00e1pida vis\u00e3o geral do que precisamos fazer para implementar v\u00e1rias configura\u00e7\u00f5es de cores.<\/p>\n<p>Vamos supor que eu queira adicionar cor de fundo ao meu bloco tamb\u00e9m.<\/p>\n<p>Primeiro eu preciso definir um novo atributo chamado <code>backgroundColor<\/code>. Eu defino outro atributo <code>customBackgroundColor<\/code>tamb\u00e9m.<\/p>\n<p>Na <code>edit<\/code>fun\u00e7\u00e3o eu mudo o objeto fornecido <code>withColors<\/code>como tal:<\/p>\n<pre><code>withColors({textColor: 'color', backgroundColor: 'background-color'})<\/code><\/pre>\n<p>Isso informa <code>withColors<\/code>que meu <code>textColor<\/code>atributo \u00e9 para a regra CSS &#8221; <code>color<\/code>&#8221; (para cor do texto), e o atributo <code>backgroundColor<\/code>\u00e9 para a regra CSS &#8221; <code>background-color<\/code>&#8220;. <code>withColors<\/code>reconhecer\u00e1 e atualizar\u00e1 automaticamente os atributos <code>customTextColor<\/code>e tamb\u00e9m.<code>customBackgroundColor<\/code><\/p>\n<p>No <code>PanelColorSettings<\/code>componente, forne\u00e7o outro objeto ao array para o prop <code>colorSettings<\/code>. Igual a:<\/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>Com isso, voc\u00ea deve obter duas configura\u00e7\u00f5es de cores separadas dentro da caixa Inspetor para configura\u00e7\u00f5es de cores.<\/p>\n<p>A \u00faltima etapa \u00e9 construir os nomes e estilos de classe apropriados em ambos <code>edit<\/code>e <code>save<\/code>. Este \u00e9 um passo bem simples, pois est\u00e1 apenas construindo uma string ou objeto de estilo corretamente. Lembre-se de que o nome da sua classe deve suportar v\u00e1rias classes de cores (por exemplo, se a cor do texto e a cor de fundo foram escolhidas). Basta adicionar um espa\u00e7o entre cada nome de classe.<\/p>\n<p>PS: Se voc\u00ea precisar lidar com muitos nomes de classe para o seu bloco, poder\u00e1 se beneficiar da instala\u00e7\u00e3o do <code>classnames<\/code>pacote. Praticamente todos os componentes do Gutenberg usam essa biblioteca para combinar nomes de classe mais facilmente.<\/p>\n<h2>Conclus\u00e3o e c\u00f3digo completo<\/h2>\n<p>Agora voc\u00ea deve ter aprendido como implementar configura\u00e7\u00f5es de cores em seu bloco personalizado. Espero que isso tenha sido de alguma utilidade para voc\u00ea! Eu tive que adicionar esse recurso ao meu projeto e realmente n\u00e3o consegui encontrar nenhuma informa\u00e7\u00e3o ou boa documenta\u00e7\u00e3o. Ent\u00e3o esse \u00e9 o resultado de consolidar tudo o que aprendi sobre esse tema, depois de muita tentativa e erro.<\/p>\n<p>Aqui est\u00e1 o c\u00f3digo final, ao todo, para o exemplo de bloco personalizado com configura\u00e7\u00e3o de cor do 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\">Fonte de grava\u00e7\u00e3o:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Este post se aprofunda em como adicionar configura\u00e7\u00f5es de cores ao seu bloco WordPress Gutenberg personalizado, da maneira correta &#8211; assim como os blocos do WordPress fazem isso.<\/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":[941,941,1110,806,806,816,816,846,846,867,867],"tags":[1170],"class_list":["post-233982","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-gutenberg-8","category-n-a","category-php-8","category-plug-ins","category-tutoriais","category-wordpress-8","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/233982","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/comments?post=233982"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/233982\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/151573"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=233982"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=233982"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=233982"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}