Vercel/src/photo/color/client.ts
Sam Becker 59f5c74269
Chromatic sorting (#284)
* Test color palette extraction

* Fix import

* Add hex <> oklch conversions

* Add 'hue' storage to photos

* Consolidate color modules

* Add chromatic config, track missing color data

* Bump deps

* Fix lens text test

* Finalize color storage

* Refactor color imports

* Hide form color data when disabled

* Store all average oklch color components

* Finalize color-config language

* Optimize photo syncing for color data

* Only update color data when syncing if possible

* Build out all color sorts

* Debug image colors

* Improve color debugging

* Improve color logging

* Simplify color sorting

* Bump deps

* Fix color sync logic

* Switch to sort params: ascending, descending

* Fix commandk sort menu

* Update tr-tr sorting language

* Add color capture to all photo extractions

* Add color visualization to photo form

* Standardize photo update language

* Create global debug color update function

* Improve color data capture logging

* Update maximum function duration for admin photos

* Add note to remove maxDuration

* Use AI to generate sorting color

* Conditionally use AI to analyze colors

* Manage AI color analysis batched requests

* Fix color reporting in admin photo table

* Only update color where AI fields are missing

* Temporarily upgrade admin/photos timeout

* Fix pro-based max duration

* Standardize color sorting foundations

* Update color sorting language

* Refactor color calculations

* Restore max duration time

* Update color-based sort menu labels

* Finalize color documentation

* Clean up color test actions

* Round color sort values before submitting to db

* Consolidate color server actions
2025-08-03 19:31:02 -05:00

44 lines
981 B
TypeScript

export interface Oklch {
l: number
c: number
h: number
}
export interface PhotoColorData {
ai?: Oklch
average: Oklch
colors: Oklch[]
}
export const convertJsonStringToOklch = (jsonString = '') => {
const matches = jsonString
.match(/`*{ *l: *([0-9\.]+), *c: *([0-9\.]+), *h: *([0-9\.]+) *}`*/);
if (matches &&
matches[1] &&
matches[2] &&
matches[3]
) {
return {
l: parseFloat(matches[1]),
c: parseFloat(matches[2]),
h: parseInt(matches[3]),
} as Oklch;
}
};
export const convertOklchToCss = (oklch: Oklch) =>
`oklch(${oklch.l} ${oklch.c} ${oklch.h})`;
export const logOklch = (oklch: Oklch) =>
`L:${oklch.l.toFixed(2)} C:${oklch.c.toFixed(2)} H:${oklch.h.toFixed(2)}`;
export const generateColorDataFromString = (colorData?: string) => {
if (colorData) {
try {
return JSON.parse(colorData) as PhotoColorData;
} catch (error) {
console.log('Error parsing color data', error);
}
}
};