Recent colours
On by default, and empty until something is committed, so it costs nothing until it has something to show.
That keeps a list for the session, per picker. A colour joins it when it iscommitted (a pointer release, a preset click, a hex entry, leaving a slider), not on every value a drag passes through. Dragging the hue slider across the spectrum records one colour, not forty.
Repeats move to the front rather than appearing twice, and the list is capped at maxRecents (8 by default).
Storing them yourself
To keep them in a backend, or share them between pickers, pass the list in and take the updates, using the same controlled shape value andonChange already use:
const [recents, setRecents] = useState(loadFromServer);
<ColourPicker
value={colour}
onChange={setColour}
recents={recents}
onRecentsChange={(next) => {
setRecents(next);
save(next);
}}
/><ColourPicker
v-model="colour"
:recents="recents"
@recents-change="onRecentsChange"
/><ColourPicker bind:value={colour} bind:recents={recents} /><ColourPicker
value={colour()}
onChange={setColour}
recents={recents()}
onRecentsChange={setRecents}
/><oklch-colour-picker
[value]="colour()"
(valueChange)="colour.set($event)"
[recents]="recents()"
(recentsChange)="recents.set($event)"
/><ColourPicker
value={colour.value}
onChange$={$((c: string) => (colour.value = c))}
recents={recents.value}
onRecentsChange$={$((r: string[]) => (recents.value = r))}
/>---
import "@oklch-picker/core/styles.css";
---
<oklch-picker value="oklch(0.7 0.15 255)"></oklch-picker>
<script>
import "oklch-picker/register";
const picker = document.querySelector("oklch-picker");
picker.addEventListener("recentschange", (event) => {
localStorage.setItem("recents", JSON.stringify(event.detail.recents));
});
<\/script>const picker = document.querySelector("oklch-picker");
picker.recents = loadFromServer();
picker.addEventListener("recentschange", (event) => {
save(event.detail.recents);
});addRecent is exported for callers doing their own bookkeeping, and parts={{ recents: false }}removes the row.