Skip to content

Color Picker & InspectorControls

Konsep InspectorControls

InspectorControls menambahkan panel pengaturan di sidebar kanan editor (bukan di toolbar atas block). Cocok untuk opsi yang tidak perlu selalu terlihat.


Import yang Diperlukan

js
import { InspectorControls } from "@wordpress/block-editor";
import { PanelBody, PanelRow, ColorPalette } from "@wordpress/components";
import { getColorObjectByColorValue } from "@wordpress/block-editor";

Implementasi Color Picker

Definisi Warna

Buat file terpisah inc/ourColors.js:

js
// inc/ourColors.js
const ourColors = [
  { name: "Blue", color: "#0d3b66" },
  { name: "Orange", color: "#f4a259" },
  { name: "Dark Orange", color: "#bc6c25" }
];

export default ourColors;

Import di Block File

js
import ourColors from "../inc/ourColors";

Keuntungan: Satu sumber warna untuk semua block — cukup edit di satu tempat.


js
function EditComponent(props) {
  // Dapatkan nama warna dari hex code
  const currentColorValue = cycleColors();
  
  function handleColorChange(colorCode) {
    // Konversi hex → nama warna (abstraction layer)
    const colorObject = getColorObjectByColorValue(ourColors, colorCode);
    props.setAttributes({ colorName: colorObject.name });
  }

  return (
    <>
      <InspectorControls>
        <PanelBody title="Color" initialOpen={true}>
          <PanelRow>
            <ColorPalette
              colors={ourColors}
              value={currentColorValue}
              onChange={handleColorChange}
              disableCustomColors={true}
              clearable={false}
            />
          </PanelRow>
        </PanelBody>
      </InspectorControls>

      {/* ... RichText dan komponen lainnya */}
    </>
  );
}

Hierarki Komponen Sidebar

<InspectorControls>           ← Masuk ke sidebar kanan
  <PanelBody title="Color">   ← Panel yang bisa collapse
    <PanelRow>                 ← Baris dalam panel
      <ColorPalette />         ← Picker warna
    </PanelRow>
  </PanelBody>
</InspectorControls>

Props ColorPalette

PropNilaiFungsi
colorsourColors arrayDaftar warna yang tersedia
valueHex code aktifWarna yang sedang dipilih
onChangeHandler functionDipanggil saat warna berubah
disableCustomColorstrueNonaktifkan input hex manual
clearablefalseNonaktifkan tombol clear/hapus warna

Abstraction Layer: Nama vs Hex Code

Masalah

Menyimpan hex code (#0d3b66) langsung di database tidak fleksibel. Jika suatu saat warna biru diubah, semua block yang sudah tersimpan tetap menggunakan hex lama.

Solusi

Simpan nama warna ("Blue") di attribute, bukan hex code. Dengan getColorObjectByColorValue:

js
import { getColorObjectByColorValue } from "@wordpress/block-editor";

// Konversi hex → object warna (yang berisi name)
const colorObject = getColorObjectByColorValue(ourColors, "#0d3b66");
// colorObject.name = "Blue"

// Simpan nama, bukan hex
props.setAttributes({ colorName: colorObject.name });

Manfaat

MenyimpanContohFleksibilitas
Hex code#0d3b66❌ Kaku — berubah = semua block rusak
Nama warna"Blue"✅ Fleksibel — tinggal update definisi warna

Attribute colorName

js
attributes: {
  colorName: { type: "string", default: "blue" }
}

Penggunaan di className

js
// Class CSS menggunakan nama warna
className={`btn btn--${props.attributes.size} btn--${props.attributes.colorName.toLowerCase().replace(/ /g, "-")}`}

Output: btn btn--large btn--blue atau btn btn--medium btn--dark-orange


File inc/ourColors.js — Satu Sumber Kebenaran

fictional-block-theme/
├── inc/
│   └── ourColors.js        ← Definisi warna terpusat
├── our-blocks/
│   ├── generic-button.js   ← import ourColors
│   ├── banner.js           ← import ourColors (jika perlu)
│   └── ...

Semua block yang butuh color picker cukup import ourColors from "../inc/ourColors".


Kesimpulan

KonsepPenjelasan
InspectorControlsMenambahkan panel di sidebar kanan editor
PanelBodyPanel collapsible dengan judul
PanelRowBaris konten dalam panel
ColorPaletteUI pemilih warna
getColorObjectByColorValueKonversi hex → objek warna (untuk abstraction)
Abstraction layerSimpan nama warna, bukan hex code
inc/ourColors.jsFile terpusat untuk definisi warna (export default)