System kolorów i markowe palety
1) Dlaczego sformalizować kolor
Kolor nie jest zbiorem „dobrych odcieni”, ale możliwym do opanowania systemem dla:- świadomość marki i spójność wizualna,
- czytelność i dostępność (WCAG),
- interfejsy skalowania (tematy, platformy, lokalizacje),
- przewidywalne eksperymenty A/B (kontrast, CTR, błędy).
2) Fundamenty systemowe: modele i metryki
OKLCH (zalecany): jednolity percepcyjnie, wygodnie jest kontrolować lekkość 'L' i nasycenie' C', zachowując odcień 'H'.
Lab/LCH: również pasuje; OKLCH jest bardziej stabilny w percepcji.
sRGB: skończona przestrzeń wyświetlania; sumy są zawsze zatwierdzane w sRGB i WCAG.
Kontrast (WCAG 2. 2): tekst podstawowy ≥ 4. 5:1, duże ≥ 3:1; powiadomienia krytyczne - w miarę możliwości cel dla AAA (7:1).
3) Warstwy systemu: od marki po semantykę
1. Rdzeń marki: 1-2 odcienie marki (+ akcent nośny).
2. Semantyka interfejsu: role („podstawowe”, „wtórne”, „sukces”, „ostrzeżenie”, „niebezpieczeństwo”, „informacje”, „neutralne”).
3. Waga tonalna: stopnie lekkości (np. 25/50/100...900).
4. Тера: 'light '/' dark' (+ high-contrast, AMOLED).
5. Stany: „domyślnie/zawisnąć/aktywny/ostrość/wyłączony”.
6. Kontekst: powierzchnie („bg/base”, „bg/subtelne”, „bg/elevated”) i tekst („fg/primary”, „fg/secondary”, „fg/muted”).
7. Wizualizacja danych: oddzielne dyskretne i ciągłe palety.
4) Rdzeń marki: wybory i ograniczenia
Wybierz odcień i zdefiniuj roboczą lekkość dla marki w jasnych i ciemnych motywach (często 'L-0. 60–0. 70 'do napełniania przycisków w świetle i' L-0. 70–0. 80 'dla tekstu/ikon w ciemności).
Limit chrome 'C': high 'C' jest piękny na banerach, ale łamie czytelność w interfejsie użytkownika - zachowaj 2 wersje: „marketing” (bogaty) i „spożywczy” (bardziej powściągliwy).
Naprawić zmienne: główne ("marka/podstawowa"), alternatywne ("marka/alt') i neutralne wsparcie (" neutralne ").
5) Wagi tonalne
Celem jest uzyskanie jednolitych kroków lekkości z kontrolowanym nasyceniem:- W przypadku OKLCH przesuń kroki 'L' (np. 0. 98→0. 90→0. 80→…→0. 18) oraz „C” nieznacznie zmniejszają się do krawędzi skali, aby uniknąć „brudu” w świetle i „mętności” w ciemności.
- Naprawić punkty kontrolne: „50/100/300/500 (klucz )/700/900”.
- Na każdym kroku sprawdź kontrast pary z podstawowym tłem i z oczekiwanym kolorem tekstu.
Przykład marki/skali podstawowej (OKLCH, przybliżony)
brand.primary.50 = oklch(0.98 0.03 230)
brand.primary.100 = oklch(0.94 0.05 230)
brand.primary.300 = oklch(0.86 0.08 230)
brand.primary.500 = oklch(0.74 0.10 230) # ключевой тон brand.primary.700 = oklch(0.56 0.09 230)
brand.primary.900 = oklch(0.32 0.07 230)
6) Role semantyczne i odwzorowanie
Oddzielna marka i semantyka: „sukces” nie musi być zielony.
role.primary.bg -> brand.primary.500 role.primary.text -> fg.on-primary # ≥ 4.5:1 к role.primary.bg role.success.bg -> green.500 role.warning.bg -> amber.500 role.danger.bg -> red.500 role.info.bg -> blue.500 role.neutral.bg -> gray.200/700 (light/dark)
Teksty 'on-' są obliczane automatycznie (patrz § 10).
7) Jasne/ciemne motywy i powierzchnie
Zdefiniuj skalę bazową dla powierzchni i tekstu:
light:
bg/base = oklch(0.98 0.01 260)
bg/subtle = oklch(0.96 0.01 260)
bg/elevated = oklch(0.93 0.01 260)
fg/primary = oklch(0.18 0.03 260) # ≈7:1 к bg/base fg/secondary = oklch(0.32 0.03 260) # ≥4.5:1 border = oklch(0.80 0.02 260)
dark:
bg/base = oklch(0.16 0.01 260)
bg/subtle = oklch(0.20 0.01 260)
bg/elevated = oklch(0.24 0.01 260)
fg/primary = oklch(0.90 0.02 260)
fg/secondary = oklch(0.78 0.02 260)
border = oklch(0.34 0.02 260)
Utrzymanie równych celów kontrastowych w obu dziedzinach; unikać „oślepiania” białego na czystej czerni - podnieść powierzchnię do ~ 0. 16.
8) Państwa i interaktywność
Dla każdej roli należy ustawić stany kontrolowane jako „Na L” i „Na C”:
button/primary:
default.bg = brand.primary.500 hover.bg = brand.primary.500 with +ΔC(0.01) -ΔL(0.02)
active.bg = brand.primary.700 focus.ring = brand.primary.300 # контраст кольца ≥ 3:1 к окружению disabled.bg= neutral.200 (light) / neutral.700 (dark)
text.on = auto-contrast(default.bg) # ≥ 4.5:1
9) Odpowiedzialność i WCAG
Podstawowe teksty i ikony w sterownikach to ≥ 4. 5:1.
Kluczowe powiadomienia systemowe (KYC/AML, 18 +, błędy płatności) - cel AAA (7:1).
Pole stanów i granic - co najmniej 3:1.
Odróżnić linki nie tylko przez kolor (underscore/focus-style).
10) Tekst kontrastu auto-fit („on-”)
Logika: przy wyborze wypełnienia elementu należy obliczyć „na kolorze”:1. Według OKLCH, określić predlag. tekst „L _ on 'so that” (L_text vs L_bg) ≥ 4. 5:1`.
2. Jeśli chrom jest wysoki, dolny 'C _ text' do 0. 01–0. 03.
3. Dla ciemnego tematu podnieś 'L _ on' kolejne 0. 02–0. 04, aby zrównoważyć blask.
Token pseudo:
fg.on(colorX) = auto(colorX, targetContrast=4.5)
11) Wizualizacja danych
Kategoryczne palety: 8-12 kolorów odpornych na ślepotę kolorów (unikać czerwono-zielonych par bez alternatywnych znaków).
Ciągłe: od 'bg/elevated' do akcentu z kontrolą kontrastu podpisów.
Dodaj wzory/markery dla zauważalności bez koloru.
12) Kontekst międzynarodowy (stowarzyszenia kulturalne)
Rozważmy lokalne konotacje (np. czerwony - niebezpieczeństwo/uwaga; złoto - wygrana/nagroda).
Dla iGaming: Unikaj konfliktów sukcesu/zagrożenia z markowymi akcentami na jednym ekranie; ikonografia i podpis są ważniejsze niż „jasność”.
13) Integracja z systemem projektowania
13. 1 Nazywanie żetonów
color.{theme}.{role surface brand}.{state step}
примеры color.light.brand.primary.500 color.dark.role.success.bg color.light.surface.bg.base color.light.fg.on-primary
13. 2 Żetony (JSON/Słownik stylu)
json
{
"color": {
"light": {
"surface": { "bg": { "base": "oklch(0.98 0.01 260)"} },
"brand": { "primary": { "500": "oklch(0.74 0.10 230)" } },
"role": { "primary": { "bg": "{color.light.brand.primary.500}" },
"danger": { "bg": "oklch(0.62 0.12 25)" } },
"fg": { "primary": "oklch(0.18 0.03 260)",
"on-primary": "auto({color.light.role.primary.bg},4.5)" }
}
}
}
13. 3 zmienne CSS (warstwa tematyczna)
css
:root[data-theme="light"] {
--bg-base: oklch(0.98 0.01 260);
--brand-primary-500: oklch(0.74 0.10 230);
--fg-primary: oklch(0.18 0.03 260);
--on-primary: color-contrast(var(--brand-primary-500)); / автоподбор /
}
[data-theme="dark"] {
--bg-base: oklch(0.16 0.01 260);
--brand-primary-500: oklch(0.74 0.10 230);
--fg-primary: oklch(0.90 0.02 260);
--on-primary: color-contrast(var(--brand-primary-500));
}
13. 4 Figma/dokumentacja
Elementy używają tylko żetonów, bezpośrednie HEX/SRGB są zabronione przez liniowców.
W bibliotece - strona „Matryca kontrastu”: tabela 'fg × bg' z rzeczywistymi współczynnikami.
14) Procesy kontroli jakości
W projekcie: kontrola kontrastu na tablicach artystycznych (oba tryby), oddzielne ustawienia wstępne dla ślepoty kolorów.
W kodzie: pomocnicy jednostki obliczają kontrast i upadają w naruszeniach; migawki wizualne dla krytycznych ekranów.
W CI/CD: sprawdzanie wszystkich par żetonów i stanów, raportowanie ze składnikiem, motywem i rzeczywistą wartością.
15) Specyfika iGaming
Promocje i turnieje: Użyj nakładki i ograniczenia 'C' na tle, aby zapobiec „zatonięciu” tekstu.
Odpowiedzialne powiadomienia (limity, 18 +, ryzyko) - szczerze AAA.
Mierniki/tabele: Rozróżnić liczby i oznaki zmian (wg kształtu i kontrastu, nie tylko kolor.
16) Lista kontrolna wdrażania
- Definiuje się odcienie marki i ich wagi tonalne (OKLCH).
- Role, stany i powierzchnie są ustawione dla dwóch tematów.
- Automatyczna generacja „on-” z kontrastem docelowym.
- matryca „fg × bg” i testy WCAG w CI.
- Poszczególne palety dla dataviz (z obsługą ślepoty kolorowej).
- Style Lintera zabraniają „surowych” kolorów.
- Wyjątki i powody strony w wytycznych.
17) Anty-wzory
Wymieszaj nacisk marki z sukcesem/błędem w jednym sygnale UX.
Polegaj tylko na nasyceniu dla hierarchii.
Nie synchronizować światła/ciemności (kontrast „lewy” w jednym z tematów).
Twardy HEX bez żetonów → niekontrolowany dryf interfejsu.
Krótkie podsumowanie
Zbuduj paletę od góry do dołu: rdzeń marki → role semantyczne → wagi tonalne → motywy → stany. Praca w OKLCH, tokeny szpilkowe, automatyczne 'on-' i kontrole WCAG. Osobno wpisz palety dla dataviz. Zapewni to spójność marki, czytelność i skalowalność produktu.