47 lines
1.8 KiB
TypeScript
47 lines
1.8 KiB
TypeScript
/** Palette inspirée de Google Calendar. */
|
|
export const AGENDA_COLOR_PALETTE: { value: string; label: string }[] = [
|
|
{ value: "#039be5", label: "Paon" },
|
|
{ value: "#7986cb", label: "Lavande" },
|
|
{ value: "#33b679", label: "Sauge" },
|
|
{ value: "#8e24aa", label: "Raisin" },
|
|
{ value: "#e67c73", label: "Flamant rose" },
|
|
{ value: "#f6bf26", label: "Banane" },
|
|
{ value: "#f4511e", label: "Mandarine" },
|
|
{ value: "#616161", label: "Graphite" },
|
|
{ value: "#3f51b5", label: "Myrtille" },
|
|
{ value: "#0b8043", label: "Basilic" },
|
|
{ value: "#d50000", label: "Tomate" },
|
|
]
|
|
|
|
export const AGENDA_DEFAULT_COLOR = AGENDA_COLOR_PALETTE[0].value
|
|
|
|
/** Normalise une couleur DAV (`#RRGGBBAA` Nextcloud → `#RRGGBB`). */
|
|
export function normalizeAgendaColor(color: string | undefined | null): string {
|
|
const c = (color ?? "").trim()
|
|
if (/^#[0-9a-fA-F]{8}$/.test(c)) return c.slice(0, 7).toLowerCase()
|
|
if (/^#[0-9a-fA-F]{6}$/.test(c)) return c.toLowerCase()
|
|
if (/^#[0-9a-fA-F]{3}$/.test(c)) {
|
|
return `#${c[1]}${c[1]}${c[2]}${c[2]}${c[3]}${c[3]}`.toLowerCase()
|
|
}
|
|
return ""
|
|
}
|
|
|
|
/** Couleur par défaut stable pour un agenda sans couleur. */
|
|
export function fallbackCalendarColor(calendarId: string): string {
|
|
let hash = 0
|
|
for (let i = 0; i < calendarId.length; i++) {
|
|
hash = (hash * 31 + calendarId.charCodeAt(i)) | 0
|
|
}
|
|
return AGENDA_COLOR_PALETTE[Math.abs(hash) % AGENDA_COLOR_PALETTE.length].value
|
|
}
|
|
|
|
/** Couleur de texte lisible (blanc/noir) sur un fond hex. */
|
|
export function readableTextColor(hex: string): string {
|
|
const c = normalizeAgendaColor(hex)
|
|
if (!c) return "#fff"
|
|
const r = parseInt(c.slice(1, 3), 16)
|
|
const g = parseInt(c.slice(3, 5), 16)
|
|
const b = parseInt(c.slice(5, 7), 16)
|
|
return (r * 299 + g * 587 + b * 114) / 1000 > 150 ? "#1f1f1f" : "#fff"
|
|
}
|