feat: statuses and ticket types take any colour from a colour picker

Settings shows a native colour picker (the palette as suggestions)
instead of the list of eleven names. The API takes a palette name, as
before, or any #rrggbb; picking a palette colour still saves its name,
so it keeps its hand-made dark version. A free colour gets one variant
per theme, computed with the `color` library (moved towards white or
black until it contrasts 3:1 with the surface) and applied with
light-dark(): a pale yellow darkens on white, a navy lightens on dark.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-17 16:08:47 +02:00
parent 034704e46f
commit 33c593521e
19 changed files with 379 additions and 115 deletions

View File

@@ -1982,8 +1982,6 @@ export interface components {
};
/** @enum {string} */
StatusCategory: "TODO" | "IN_PROGRESS" | "QA" | "DONE" | "CANCELLED";
/** @enum {string} */
SettingColor: "slate" | "stone" | "violet" | "blue" | "sky" | "teal" | "green" | "amber" | "orange" | "red" | "pink";
WorkflowStatusDto: {
/**
* @description Stable id on tickets
@@ -1993,7 +1991,11 @@ export interface components {
/** @example En revisión */
name: string;
category: components["schemas"]["StatusCategory"];
color: components["schemas"]["SettingColor"];
/**
* @description A palette colour (follows the theme) or #rrggbb
* @example violet
*/
color: string;
/** @description Entering it needs a reason */
requiresReason: boolean;
/** @description No new tickets or transitions into it */
@@ -2024,7 +2026,11 @@ export interface components {
/** @example Bug */
name: string;
icon: components["schemas"]["TypeIcon"];
color: components["schemas"]["SettingColor"];
/**
* @description A palette colour (follows the theme) or #rrggbb
* @example violet
*/
color: string;
archived: boolean;
/** @description What a new ticket of the type starts with */
template?: components["schemas"]["IssueTemplateDto"];
@@ -2153,7 +2159,11 @@ export interface components {
/** @example En revisión */
name: string;
category: components["schemas"]["StatusCategory"];
color: components["schemas"]["SettingColor"];
/**
* @description A palette colour (slate, stone, violet, blue, sky, teal, green, amber, orange, red, pink), which follows the theme, or any #rrggbb
* @example #7c3aed
*/
color: string;
/** @default false */
requiresReason: boolean;
/** @default false */
@@ -2182,7 +2192,11 @@ export interface components {
/** @example Spike */
name: string;
icon: components["schemas"]["TypeIcon"];
color: components["schemas"]["SettingColor"];
/**
* @description A palette colour (slate, stone, violet, blue, sky, teal, green, amber, orange, red, pink), which follows the theme, or any #rrggbb
* @example #7c3aed
*/
color: string;
/** @default false */
archived: boolean;
/** @description What a new ticket of the type starts with */