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)