← All templates

Color Picker Chrome extension

Pick any colour on screen with the native eyedropper and copy the HEX value instantly.

How to install

  1. Download and unzip the file.
  2. Open chrome://extensions and turn on Developer mode.
  3. Click "Load unpacked" and pick the unzipped folder.

Source code (6 files)

manifest.json
{
  "manifest_version": 3,
  "name": "Color Picker",
  "version": "1.0.0",
  "description": "Pick any colour on screen with the native eyedropper and copy the HEX value instantly.",
  "icons": {
    "16": "icons/icon.svg",
    "48": "icons/icon.svg",
    "128": "icons/icon.svg"
  },
  "action": {
    "default_popup": "popup.html",
    "default_title": "Color Picker",
    "default_icon": {
      "128": "icons/icon.svg"
    }
  },
  "permissions": [
    "storage"
  ]
}
popup.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>Color Picker</title>
<link rel="stylesheet" href="popup.css" />
</head>
<body>
<header><h1>Color Picker</h1><p class="sub">Built with ManifestGo</p></header>
<main>
<button class="primary" id="pick">Pick a colour</button>
  <div class="big" id="value">#000000</div>
  <ul id="history"></ul>
</main>
<script src="popup.js"></script>
</body>
</html>
popup.css
:root { color-scheme: dark; }
* { box-sizing: border-box; }
body {
  margin: 0;
  width: 320px;
  font-family: Inter, -apple-system, "Segoe UI", Roboto, sans-serif;
  background: #1b1b1b;
  color: #f2efe9;
}
header { padding: 14px 16px 8px; }
h1 { margin: 0; font-size: 14px; font-weight: 600; letter-spacing: -0.01em; }
p.sub { margin: 4px 0 0; font-size: 11px; color: #9a958d; }
main { padding: 10px 16px 16px; display: grid; gap: 10px; }
button {
  font: inherit; font-size: 12px; font-weight: 600; cursor: pointer;
  border: 1px solid #ffffff1f; background: #ffffff0d; color: #f2efe9;
  border-radius: 10px; padding: 9px 12px; transition: background .15s ease;
}
button:hover { background: #ffffff17; }
button.primary { background: #22c55e; border-color: #22c55e; color: #101010; }
button.primary:hover { filter: brightness(1.08); }
input, select, textarea {
  font: inherit; font-size: 12px; width: 100%; padding: 9px 10px; border-radius: 10px;
  border: 1px solid #ffffff1f; background: #ffffff08; color: #f2efe9; outline: none;
}
input:focus, textarea:focus { border-color: #22c55e; }
ul { list-style: none; margin: 0; padding: 0; display: grid; gap: 6px; max-height: 260px; overflow: auto; }
li { display: flex; align-items: center; gap: 8px; font-size: 12px; padding: 8px 10px; border-radius: 10px; background: #ffffff08; }
li span { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.row { display: flex; gap: 8px; }
.row > * { flex: 1; }
.big { font-size: 34px; font-weight: 700; text-align: center; letter-spacing: -0.02em; font-variant-numeric: tabular-nums; }
.muted { font-size: 11px; color: #9a958d; }
popup.js
const value = document.getElementById("value");
const history = document.getElementById("history");

function render(colors) {
  history.innerHTML = "";
  colors.forEach((c) => {
    const li = document.createElement("li");
    const dot = document.createElement("span");
    dot.style.cssText = "flex:0 0 16px;height:16px;border-radius:5px;background:" + c;
    const label = document.createElement("span");
    label.textContent = c;
    const copy = document.createElement("button");
    copy.textContent = "Copy";
    copy.addEventListener("click", () => navigator.clipboard.writeText(c));
    li.append(dot, label, copy);
    history.appendChild(li);
  });
}

chrome.storage.local.get({ colors: [] }, ({ colors }) => render(colors));

document.getElementById("pick").addEventListener("click", async () => {
  if (!window.EyeDropper) { value.textContent = "Unsupported"; return; }
  try {
    const { sRGBHex } = await new EyeDropper().open();
    value.textContent = sRGBHex;
    value.style.color = sRGBHex;
    await navigator.clipboard.writeText(sRGBHex);
    chrome.storage.local.get({ colors: [] }, ({ colors }) => {
      const next = [sRGBHex, ...colors.filter((c) => c !== sRGBHex)].slice(0, 8);
      chrome.storage.local.set({ colors: next });
      render(next);
    });
  } catch { /* cancelled */ }
});
icons/icon.svg
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" width="128" height="128"><rect width="128" height="128" rx="26" fill="#22c55e"/><text x="64" y="90" font-family="Inter, Arial, sans-serif" font-size="66" font-weight="700" text-anchor="middle" fill="#ffffff">C</text></svg>
README.md
# Color Picker

Pick any colour on screen with the native eyedropper and copy the HEX value instantly.

## Install (unpacked)
1. Open `chrome://extensions`.
2. Enable **Developer mode**.
3. Click **Load unpacked** and select this folder.

## Files
- `manifest.json` — Manifest V3 configuration
- `popup.html` / `popup.css` / `popup.js` — toolbar popup UI and logic
- `icons/icon.svg` — source icon (rasterized to PNG on download)

More free templates