ci: add ruff linting and mypy type checking

Add ruff and mypy to dev dependencies with configuration in pyproject.toml.
Add a lint CI job that runs ruff check, ruff format --check, and mypy.
Auto-fix import sorting and formatting across the codebase. Exclude
alembic/versions from linting (auto-generated migrations). Ignore B008
(FastAPI Depends pattern) and RUF001 (unicode in user-facing strings).

21 ruff lint errors and 50 mypy errors remain for manual review.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Justin Visser 2026-02-26 22:11:41 +01:00
parent 399276ea69
commit bf04c77aa9
137 changed files with 3066 additions and 1900 deletions

View file

@ -0,0 +1,313 @@
export default {
"id": "deutan-blue-75",
"label": "Deutan Colorblind - Blue",
"description": "Colorblind-oriented theme with blue-led emphasis and deutan-safer state separation.",
"modes": {
"light": {
"scale": {
"brand": {
"50": "#f3f7ff",
"100": "#e6efff",
"200": "#c9dbff",
"300": "#a6c1ff",
"400": "#7ea2f5",
"500": "#5f84dc",
"600": "#4a6bc0",
"700": "#3e589b",
"800": "#35497d",
"900": "#2e3f68",
"950": "#1d2742"
},
"info": {
"50": "#f0f7fa",
"100": "#dcedf4",
"200": "#bcd9e8",
"300": "#93bfd8",
"400": "#669fc4",
"500": "#4b82a8",
"600": "#3b6887",
"700": "#31546d",
"800": "#2b465a",
"900": "#253b4c",
"950": "#16242f"
},
"success": {
"50": "#f2f8ff",
"100": "#deefff",
"200": "#bddfff",
"300": "#93c9ff",
"400": "#62acef",
"500": "#3e8fd1",
"600": "#2f72ad",
"700": "#285c8c",
"800": "#244d73",
"900": "#213f5d",
"950": "#15273a"
},
"warning": {
"50": "#fff8ef",
"100": "#ffedd2",
"200": "#ffd7a3",
"300": "#ffbb6b",
"400": "#f49c38",
"500": "#db7f1d",
"600": "#b86516",
"700": "#945013",
"800": "#784214",
"900": "#633814",
"950": "#381d0a"
},
"danger": {
"50": "#fcf4fb",
"100": "#f7e6f5",
"200": "#efcdea",
"300": "#e2a7d8",
"400": "#ce79bf",
"500": "#b856a4",
"600": "#9b3f89",
"700": "#7f3470",
"800": "#692e5d",
"900": "#57294d",
"950": "#311428"
}
},
"surface": {
"app": "#f4f7fb",
"nav": "#ffffff",
"nav_active": "#dce9ff",
"card": "#ffffff",
"card_muted": "#edf3fb",
"table": "#ffffff",
"table_header": "#f4f7fb",
"input": "#ffffff",
"overlay": "#1c2430"
},
"text": {
"primary": "#1f2937",
"secondary": "#41536b",
"muted": "#6a7a8f",
"inverse": "#ffffff",
"link": "#3e589b"
},
"border": {
"default": "#d8e2ee",
"strong": "#bccbdb",
"subtle": "#edf3fb",
"interactive": "#7ea2f5"
},
"focus": {
"ring": "#5f84dc",
"ring_offset": "#f4f7fb"
},
"action": {
"primary": {
"bg": "#5f84dc",
"border": "#5f84dc",
"text": "#ffffff",
"hover_bg": "#4a6bc0",
"hover_border": "#4a6bc0",
"hover_text": "#ffffff"
},
"secondary": {
"bg": "#edf3fb",
"border": "#d8e2ee",
"text": "#1f2937",
"hover_bg": "#dce9ff",
"hover_border": "#bccbdb",
"hover_text": "#111827"
},
"ghost": {
"bg": "#f4f7fb",
"border": "#d8e2ee",
"text": "#3e589b",
"hover_bg": "#edf3fb",
"hover_border": "#bccbdb",
"hover_text": "#2e3f68"
},
"danger": {
"bg": "#f7e6f5",
"border": "#efcdea",
"text": "#7f3470",
"hover_bg": "#efcdea",
"hover_border": "#e2a7d8",
"hover_text": "#692e5d"
}
},
"state": {
"info": {
"bg": "#dcedf4",
"border": "#bcd9e8",
"text": "#31546d"
},
"success": {
"bg": "#deefff",
"border": "#bddfff",
"text": "#285c8c"
},
"warning": {
"bg": "#ffedd2",
"border": "#ffd7a3",
"text": "#945013"
},
"danger": {
"bg": "#f7e6f5",
"border": "#efcdea",
"text": "#7f3470"
}
}
},
"dark": {
"scale": {
"brand": {
"50": "#f3f7ff",
"100": "#e6efff",
"200": "#c9dbff",
"300": "#a6c1ff",
"400": "#7ea2f5",
"500": "#5f84dc",
"600": "#4a6bc0",
"700": "#3e589b",
"800": "#35497d",
"900": "#2e3f68",
"950": "#1d2742"
},
"info": {
"50": "#f0f7fa",
"100": "#dcedf4",
"200": "#bcd9e8",
"300": "#93bfd8",
"400": "#669fc4",
"500": "#4b82a8",
"600": "#3b6887",
"700": "#31546d",
"800": "#2b465a",
"900": "#253b4c",
"950": "#16242f"
},
"success": {
"50": "#f2f8ff",
"100": "#deefff",
"200": "#bddfff",
"300": "#93c9ff",
"400": "#62acef",
"500": "#3e8fd1",
"600": "#2f72ad",
"700": "#285c8c",
"800": "#244d73",
"900": "#213f5d",
"950": "#15273a"
},
"warning": {
"50": "#fff8ef",
"100": "#ffedd2",
"200": "#ffd7a3",
"300": "#ffbb6b",
"400": "#f49c38",
"500": "#db7f1d",
"600": "#b86516",
"700": "#945013",
"800": "#784214",
"900": "#633814",
"950": "#381d0a"
},
"danger": {
"50": "#fcf4fb",
"100": "#f7e6f5",
"200": "#efcdea",
"300": "#e2a7d8",
"400": "#ce79bf",
"500": "#b856a4",
"600": "#9b3f89",
"700": "#7f3470",
"800": "#692e5d",
"900": "#57294d",
"950": "#311428"
}
},
"surface": {
"app": "#111827",
"nav": "#172131",
"nav_active": "#3e589b",
"card": "#172131",
"card_muted": "#1d2a3d",
"table": "#172131",
"table_header": "#1d2a3d",
"input": "#0d1522",
"overlay": "#05070b"
},
"text": {
"primary": "#e8eef7",
"secondary": "#bfd0e6",
"muted": "#8ea1ba",
"inverse": "#111827",
"link": "#a6c1ff"
},
"border": {
"default": "#27364b",
"strong": "#334760",
"subtle": "#1d2a3d",
"interactive": "#5f84dc"
},
"focus": {
"ring": "#7ea2f5",
"ring_offset": "#111827"
},
"action": {
"primary": {
"bg": "#5f84dc",
"border": "#5f84dc",
"text": "#0b1020",
"hover_bg": "#7ea2f5",
"hover_border": "#7ea2f5",
"hover_text": "#0b1020"
},
"secondary": {
"bg": "#1d2a3d",
"border": "#334760",
"text": "#e8eef7",
"hover_bg": "#27364b",
"hover_border": "#41536b",
"hover_text": "#ffffff"
},
"ghost": {
"bg": "#111827",
"border": "#27364b",
"text": "#bfd0e6",
"hover_bg": "#1d2a3d",
"hover_border": "#334760",
"hover_text": "#ffffff"
},
"danger": {
"bg": "#311428",
"border": "#7f3470",
"text": "#efcdea",
"hover_bg": "#421b35",
"hover_border": "#9b3f89",
"hover_text": "#f7e6f5"
}
},
"state": {
"info": {
"bg": "#253b4c",
"border": "#31546d",
"text": "#dcedf4"
},
"success": {
"bg": "#213f5d",
"border": "#285c8c",
"text": "#deefff"
},
"warning": {
"bg": "#633814",
"border": "#945013",
"text": "#ffd7a3"
},
"danger": {
"bg": "#311428",
"border": "#7f3470",
"text": "#efcdea"
}
}
}
}
};