fix(theme): rozdziel role akcentu i dodaj ramke, ktora cokolwiek oddziela

Pomiar WCAG na realnych parach z apki (2026-08-13):

    accent #B23A48 jako tekst:  3,21 na bg | 2,96 na bgElevated | 2,75 na card
    border #3A3128 jako granica: 1,48 na bg | 1,27 na card

Czyli kolor MARKI byl ponizej nawet progu 3:1 dla elementow interfejsu,
a nie tylko ponizej 4,5 dla tekstu. Dotyczylo to aktywnych zakladek,
gwiazdek ulubionych, linkow i chipow. Ramki przy 1,27 nie byly granica,
tylko cieniem.

NIE zmieniam koloru marki. Podniesienie samego `accent` do progu tekstu
wymagaloby zejscia w roz (#CE6975), co likwiduje tozsamosc, ktorej broni
naglowek theme.ts. Zamiast tego rozdzielam ROLE tego samego koloru:

  accent      zostaje do WYPELNIEN — jasny tekst na nim ma 5,03, przechodzi
  accentText  #C75260 dla tekstu i obwodek — 4,30 / 3,96 / 3,68

62 podmiany w 24 plikach (34 color, 26 borderColor, 2 thumbColor).
38 wypelnien nietknietych. Sprawdzone skryptem, ze zaden zmieniony tekst
nie stoi na tle akcentu.

borderStrong #7B7065 dla granic NIOSACYCH ZNACZENIE (pola tekstowe, 12
miejsc); dekoracyjne wloski zostaja na `border`. Wartosc dobrana pod obie
powierzchnie, bo pola leza i na bg, i na card: #6B6157 dawal na karcie
2,66, a #73695E dokladnie 2,999, czyli wciaz ponizej progu.
This commit is contained in:
goon-foss 2026-08-14 09:50:08 +02:00
parent f3f16b5c67
commit 7deda639bf
30 changed files with 97 additions and 74 deletions

View file

@ -16,6 +16,13 @@ export type ChangelogEntry = {
}; };
export const CHANGELOG: ChangelogEntry[] = [ export const CHANGELOG: ChangelogEntry[] = [
{
id: '2026-08-13d',
date: 'August 2026',
items: [
'Readability pass: links, active tabs and the favourite star are a shade lighter, so they stand out against cards instead of sinking into them. Search and input fields now have a visible outline.',
],
},
{ {
id: '2026-08-13c', id: '2026-08-13c',
date: 'August 2026', date: 'August 2026',

View file

@ -289,7 +289,7 @@ export function BugReportFAB({ client, appVersion, navRef }: Props) {
<Switch <Switch
value={includeScreenshot} value={includeScreenshot}
onValueChange={setIncludeScreenshot} onValueChange={setIncludeScreenshot}
thumbColor={includeScreenshot ? theme.accent : theme.muted} thumbColor={includeScreenshot ? theme.accentText : theme.muted}
trackColor={{ true: theme.accentDeep, false: theme.border }} trackColor={{ true: theme.accentDeep, false: theme.border }}
/> />
</View> </View>
@ -441,7 +441,7 @@ const styles = StyleSheet.create({
}, },
input: { input: {
backgroundColor: theme.card, backgroundColor: theme.card,
borderColor: theme.border, borderColor: theme.borderStrong,
borderWidth: 1, borderWidth: 1,
borderRadius: 8, borderRadius: 8,
color: theme.fg, color: theme.fg,
@ -502,7 +502,7 @@ const styles = StyleSheet.create({
borderColor: theme.border, borderColor: theme.border,
borderWidth: 1, borderWidth: 1,
}, },
tabActive: { borderColor: theme.accent, backgroundColor: theme.bg }, tabActive: { borderColor: theme.accentText, backgroundColor: theme.bg },
tabText: { color: theme.muted, fontWeight: '600', fontSize: 14 }, tabText: { color: theme.muted, fontWeight: '600', fontSize: 14 },
tabTextActive: { color: theme.fg }, tabTextActive: { color: theme.fg },
tabDot: { width: 8, height: 8, borderRadius: 4, backgroundColor: theme.accent }, tabDot: { width: 8, height: 8, borderRadius: 4, backgroundColor: theme.accent },
@ -524,7 +524,7 @@ const styles = StyleSheet.create({
paddingVertical: 4, paddingVertical: 4,
}, },
replyLabel: { replyLabel: {
color: theme.accent, color: theme.accentText,
fontSize: 11, fontSize: 11,
fontWeight: '800', fontWeight: '800',
textTransform: 'uppercase', textTransform: 'uppercase',

View file

@ -153,12 +153,12 @@ const styles = StyleSheet.create({
paddingHorizontal: 12, paddingHorizontal: 12,
borderRadius: 12, borderRadius: 12,
borderWidth: 1, borderWidth: 1,
borderColor: theme.accent, borderColor: theme.accentText,
backgroundColor: theme.bgElevated, backgroundColor: theme.bgElevated,
}, },
barTitle: { color: theme.fg, fontSize: 14, fontWeight: '700' }, barTitle: { color: theme.fg, fontSize: 14, fontWeight: '700' },
barHint: { color: theme.muted, fontSize: 12, marginTop: 2, lineHeight: 16 }, barHint: { color: theme.muted, fontSize: 12, marginTop: 2, lineHeight: 16 },
barChevron: { color: theme.accent, fontSize: 22, fontWeight: '700' }, barChevron: { color: theme.accentText, fontSize: 22, fontWeight: '700' },
backdrop: { backdrop: {
flex: 1, flex: 1,
@ -180,7 +180,7 @@ const styles = StyleSheet.create({
scroll: { flexGrow: 0 }, scroll: { flexGrow: 0 },
lead: { color: theme.fg, fontSize: 14, lineHeight: 20, marginBottom: 16 }, lead: { color: theme.fg, fontSize: 14, lineHeight: 20, marginBottom: 16 },
step: { step: {
color: theme.accent, color: theme.accentText,
fontSize: 12, fontSize: 12,
fontWeight: '800', fontWeight: '800',
textTransform: 'uppercase', textTransform: 'uppercase',
@ -200,13 +200,13 @@ const styles = StyleSheet.create({
paddingHorizontal: 12, paddingHorizontal: 12,
}, },
code: { color: theme.fg, fontSize: 13, flex: 1 }, code: { color: theme.fg, fontSize: 13, flex: 1 },
copyBtn: { color: theme.accent, fontSize: 13, fontWeight: '800' }, copyBtn: { color: theme.accentText, fontSize: 13, fontWeight: '800' },
note: { color: theme.muted, fontSize: 13, lineHeight: 19, marginTop: 8 }, note: { color: theme.muted, fontSize: 13, lineHeight: 19, marginTop: 8 },
dlBtn: { dlBtn: {
backgroundColor: theme.card, backgroundColor: theme.card,
borderRadius: 10, borderRadius: 10,
borderWidth: 1, borderWidth: 1,
borderColor: theme.accent, borderColor: theme.accentText,
paddingVertical: 12, paddingVertical: 12,
alignItems: 'center', alignItems: 'center',
}, },

View file

@ -350,7 +350,7 @@ export function MovieFiltersSheet({ visible, value, onChange, onClose }: Props)
<Switch <Switch
value={draft.has_playback} value={draft.has_playback}
onValueChange={(v) => setDraft({ ...draft, has_playback: v })} onValueChange={(v) => setDraft({ ...draft, has_playback: v })}
thumbColor={draft.has_playback ? theme.accent : theme.muted} thumbColor={draft.has_playback ? theme.accentText : theme.muted}
trackColor={{ true: theme.accentDeep, false: theme.border }} trackColor={{ true: theme.accentDeep, false: theme.border }}
/> />
</View> </View>
@ -411,7 +411,7 @@ const styles = StyleSheet.create({
marginBottom: 12, marginBottom: 12,
}, },
title: { color: theme.fg, fontSize: 18, fontWeight: '600' }, title: { color: theme.fg, fontSize: 18, fontWeight: '600' },
reset: { color: theme.accent, fontSize: 14 }, reset: { color: theme.accentText, fontSize: 14 },
label: { label: {
color: theme.muted, color: theme.muted,
fontSize: 12, fontSize: 12,
@ -433,7 +433,7 @@ const styles = StyleSheet.create({
}, },
chipActive: { chipActive: {
backgroundColor: theme.accentDeep, backgroundColor: theme.accentDeep,
borderColor: theme.accent, borderColor: theme.accentText,
}, },
chipText: { color: theme.muted, fontSize: 12 }, chipText: { color: theme.muted, fontSize: 12 },
chipTextActive: { color: theme.fg, fontWeight: '600' }, chipTextActive: { color: theme.fg, fontWeight: '600' },
@ -446,7 +446,7 @@ const styles = StyleSheet.create({
dash: { color: theme.muted, fontSize: 16 }, dash: { color: theme.muted, fontSize: 16 },
input: { input: {
backgroundColor: theme.card, backgroundColor: theme.card,
borderColor: theme.border, borderColor: theme.borderStrong,
borderWidth: 1, borderWidth: 1,
borderRadius: 8, borderRadius: 8,
color: theme.fg, color: theme.fg,

View file

@ -234,7 +234,7 @@ const styles = StyleSheet.create({
justifyContent: 'space-between', justifyContent: 'space-between',
marginBottom: 6, marginBottom: 6,
}, },
brand: { color: theme.accent, fontWeight: '900', letterSpacing: 2, fontSize: 13 }, brand: { color: theme.accentText, fontWeight: '900', letterSpacing: 2, fontSize: 13 },
skip: { color: theme.muted, fontSize: 14, fontWeight: '600', minWidth: 36, textAlign: 'right' }, skip: { color: theme.muted, fontSize: 14, fontWeight: '600', minWidth: 36, textAlign: 'right' },
pager: { flexGrow: 0 }, pager: { flexGrow: 0 },
@ -243,7 +243,7 @@ const styles = StyleSheet.create({
title: { color: theme.fg, fontSize: 22, fontWeight: '800', marginBottom: 16 }, title: { color: theme.fg, fontSize: 22, fontWeight: '800', marginBottom: 16 },
lines: { gap: 12 }, lines: { gap: 12 },
lineRow: { flexDirection: 'row', gap: 10 }, lineRow: { flexDirection: 'row', gap: 10 },
bullet: { color: theme.accent, fontSize: 16, lineHeight: 22 }, bullet: { color: theme.accentText, fontSize: 16, lineHeight: 22 },
lineText: { color: theme.fg, fontSize: 15, lineHeight: 22, flex: 1 }, lineText: { color: theme.fg, fontSize: 15, lineHeight: 22, flex: 1 },
dots: { flexDirection: 'row', justifyContent: 'center', gap: 6, marginVertical: 16 }, dots: { flexDirection: 'row', justifyContent: 'center', gap: 6, marginVertical: 16 },

View file

@ -186,7 +186,7 @@ const styles = StyleSheet.create({
}, },
thumb: { width: '100%', height: '100%' }, thumb: { width: '100%', height: '100%' },
thumbDim: { opacity: 0.45 }, thumbDim: { opacity: 0.45 },
thumbSelectable: { borderWidth: 2, borderColor: theme.accent, opacity: 0.85 }, thumbSelectable: { borderWidth: 2, borderColor: theme.accentText, opacity: 0.85 },
thumbPending: { borderWidth: 2, borderColor: theme.fg, opacity: 0.55 }, thumbPending: { borderWidth: 2, borderColor: theme.fg, opacity: 0.55 },
dupBadge: { dupBadge: {
position: 'absolute', position: 'absolute',
@ -207,7 +207,7 @@ const styles = StyleSheet.create({
paddingVertical: 1, paddingVertical: 1,
borderRadius: 6, borderRadius: 6,
}, },
favBadgeText: { color: theme.accent, fontSize: 11, fontWeight: '700' }, favBadgeText: { color: theme.accentText, fontSize: 11, fontWeight: '700' },
newBadge: { newBadge: {
position: 'absolute', position: 'absolute',
top: 6, top: 6,

View file

@ -103,7 +103,7 @@ const styles = StyleSheet.create({
scroll: { flexGrow: 0 }, scroll: { flexGrow: 0 },
entry: { marginBottom: 14 }, entry: { marginBottom: 14 },
entryDate: { entryDate: {
color: theme.accent, color: theme.accentText,
fontSize: 12, fontSize: 12,
fontWeight: '800', fontWeight: '800',
textTransform: 'uppercase', textTransform: 'uppercase',
@ -111,7 +111,7 @@ const styles = StyleSheet.create({
marginBottom: 8, marginBottom: 8,
}, },
itemRow: { flexDirection: 'row', gap: 8, marginBottom: 8 }, itemRow: { flexDirection: 'row', gap: 8, marginBottom: 8 },
bullet: { color: theme.accent, fontSize: 15, lineHeight: 21 }, bullet: { color: theme.accentText, fontSize: 15, lineHeight: 21 },
itemText: { color: theme.fg, fontSize: 15, lineHeight: 21, flex: 1 }, itemText: { color: theme.fg, fontSize: 15, lineHeight: 21, flex: 1 },
btn: { btn: {
marginTop: 8, marginTop: 8,

View file

@ -202,7 +202,7 @@ export function AppNavigator({ onLogout, client, appVersion }: AppNavigatorProps
headerRight: () => ( headerRight: () => (
<View style={{ flexDirection: 'row', gap: 14, alignItems: 'center' }}> <View style={{ flexDirection: 'row', gap: 14, alignItems: 'center' }}>
<Pressable onPress={() => navigation.navigate('Donate')} hitSlop={12}> <Pressable onPress={() => navigation.navigate('Donate')} hitSlop={12}>
<Text style={{ color: theme.accent, fontSize: 18 }}>♥</Text> <Text style={{ color: theme.accentText, fontSize: 18 }}>♥</Text>
</Pressable> </Pressable>
<Pressable <Pressable
onPress={() => navigation.navigate('AppLockSettings')} onPress={() => navigation.navigate('AppLockSettings')}

View file

@ -240,7 +240,7 @@ const styles = StyleSheet.create({
marginTop: 1, marginTop: 1,
}, },
checkboxOn: { checkboxOn: {
borderColor: theme.accent, borderColor: theme.accentText,
backgroundColor: theme.accent, backgroundColor: theme.accent,
}, },
checkboxMark: { checkboxMark: {

View file

@ -188,7 +188,7 @@ const styles = StyleSheet.create({
borderWidth: 1.5, borderWidth: 1.5,
borderColor: theme.border, borderColor: theme.border,
}, },
dotFilled: { backgroundColor: theme.accent, borderColor: theme.accent }, dotFilled: { backgroundColor: theme.accent, borderColor: theme.accentText },
dotError: { borderColor: theme.bad, backgroundColor: theme.bad }, dotError: { borderColor: theme.bad, backgroundColor: theme.bad },
pad: { pad: {
marginTop: 20, marginTop: 20,

View file

@ -509,7 +509,7 @@ const styles = StyleSheet.create({
borderColor: theme.border, borderColor: theme.border,
alignItems: 'center', alignItems: 'center',
}, },
actionText: { color: theme.accent, fontSize: 14, fontWeight: '600' }, actionText: { color: theme.accentText, fontSize: 14, fontWeight: '600' },
chipRow: { flexDirection: 'row', flexWrap: 'wrap', gap: 8, marginTop: 10 }, chipRow: { flexDirection: 'row', flexWrap: 'wrap', gap: 8, marginTop: 10 },
chip: { chip: {
paddingVertical: 8, paddingVertical: 8,
@ -519,12 +519,12 @@ const styles = StyleSheet.create({
borderWidth: 1, borderWidth: 1,
borderColor: theme.border, borderColor: theme.border,
}, },
chipActive: { backgroundColor: theme.accent, borderColor: theme.accent }, chipActive: { backgroundColor: theme.accent, borderColor: theme.accentText },
versionValue: { color: theme.fg, fontSize: 15, fontWeight: '700', fontVariant: ['tabular-nums'] }, versionValue: { color: theme.fg, fontSize: 15, fontWeight: '700', fontVariant: ['tabular-nums'] },
linkValue: { color: theme.accent, fontSize: 15, fontWeight: '700' }, linkValue: { color: theme.accentText, fontSize: 15, fontWeight: '700' },
codeInput: { codeInput: {
backgroundColor: theme.card, backgroundColor: theme.card,
borderColor: theme.border, borderColor: theme.borderStrong,
borderWidth: 1, borderWidth: 1,
borderRadius: 8, borderRadius: 8,
color: theme.fg, color: theme.fg,

View file

@ -183,7 +183,7 @@ const styles = StyleSheet.create({
}, },
search: { search: {
backgroundColor: theme.card, backgroundColor: theme.card,
borderColor: theme.border, borderColor: theme.borderStrong,
borderWidth: 1, borderWidth: 1,
borderRadius: 8, borderRadius: 8,
color: theme.fg, color: theme.fg,
@ -193,14 +193,14 @@ const styles = StyleSheet.create({
chips: { flexDirection: 'row', flexWrap: 'wrap', gap: 6, padding: 16 }, chips: { flexDirection: 'row', flexWrap: 'wrap', gap: 6, padding: 16 },
chip: { chip: {
backgroundColor: theme.card, backgroundColor: theme.card,
borderColor: theme.accent, borderColor: theme.accentText,
borderWidth: 1, borderWidth: 1,
borderRadius: 14, borderRadius: 14,
paddingHorizontal: 10, paddingHorizontal: 10,
paddingVertical: 5, paddingVertical: 5,
}, },
chipDisabled: { borderColor: theme.border, opacity: 0.6 }, chipDisabled: { borderColor: theme.border, opacity: 0.6 },
chipText: { color: theme.accent, fontSize: 13 }, chipText: { color: theme.accentText, fontSize: 13 },
chipTextDisabled: { color: theme.muted }, chipTextDisabled: { color: theme.muted },
row: { row: {
flexDirection: 'row', flexDirection: 'row',
@ -217,6 +217,6 @@ const styles = StyleSheet.create({
paddingHorizontal: 12, paddingHorizontal: 12,
paddingVertical: 6, paddingVertical: 6,
}, },
removeText: { color: theme.accent, fontSize: 13, fontWeight: '600' }, removeText: { color: theme.accentText, fontSize: 13, fontWeight: '600' },
empty: { color: theme.muted, fontSize: 13, paddingHorizontal: 16 }, empty: { color: theme.muted, fontSize: 13, paddingHorizontal: 16 },
}); });

View file

@ -248,7 +248,7 @@ const styles = StyleSheet.create({
gap: 10, gap: 10,
}, },
footerLink: { footerLink: {
color: theme.accent, color: theme.accentText,
fontSize: 13, fontSize: 13,
fontWeight: '600', fontWeight: '600',
}, },

View file

@ -565,7 +565,7 @@ const styles = StyleSheet.create({
borderColor: theme.border, borderColor: theme.border,
borderWidth: 1, borderWidth: 1,
}, },
tabBtnActive: { borderColor: theme.accent, backgroundColor: theme.bgElevated }, tabBtnActive: { borderColor: theme.accentText, backgroundColor: theme.bgElevated },
tabBtnText: { color: theme.muted, fontWeight: '600', fontSize: 14 }, tabBtnText: { color: theme.muted, fontWeight: '600', fontSize: 14 },
tabBtnTextActive: { color: theme.fg }, tabBtnTextActive: { color: theme.fg },
tabBadge: { tabBadge: {

View file

@ -201,7 +201,7 @@ const styles = StyleSheet.create({
}, },
input: { input: {
backgroundColor: theme.bgElevated, backgroundColor: theme.bgElevated,
borderColor: theme.border, borderColor: theme.borderStrong,
borderWidth: 1.5, borderWidth: 1.5,
borderRadius: 12, borderRadius: 12,
color: theme.fg, color: theme.fg,

View file

@ -391,8 +391,8 @@ const styles = StyleSheet.create({
heroMeta: { flex: 1, gap: 4 }, heroMeta: { flex: 1, gap: 4 },
title: { color: theme.fg, fontSize: 18, fontWeight: '700' }, title: { color: theme.fg, fontSize: 18, fontWeight: '700' },
subtitle: { color: theme.muted, fontSize: 13 }, subtitle: { color: theme.muted, fontSize: 13 },
studioLink: { color: theme.accent, fontWeight: '600' }, studioLink: { color: theme.accentText, fontWeight: '600' },
rating: { color: theme.accent, fontSize: 14, fontWeight: '700', marginTop: 4 }, rating: { color: theme.accentText, fontSize: 14, fontWeight: '700', marginTop: 4 },
section: { paddingHorizontal: 14, paddingVertical: 10 }, section: { paddingHorizontal: 14, paddingVertical: 10 },
sectionTitle: { color: theme.fg, fontSize: 14, fontWeight: '700', marginBottom: 8 }, sectionTitle: { color: theme.fg, fontSize: 14, fontWeight: '700', marginBottom: 8 },

View file

@ -188,12 +188,12 @@ const styles = StyleSheet.create({
}, },
filterBtnActive: { filterBtnActive: {
backgroundColor: theme.accentDeep, backgroundColor: theme.accentDeep,
borderColor: theme.accent, borderColor: theme.accentText,
}, },
filterBtnText: { color: theme.fg, fontSize: 13, fontWeight: '600' }, filterBtnText: { color: theme.fg, fontSize: 13, fontWeight: '600' },
search: { search: {
backgroundColor: theme.card, backgroundColor: theme.card,
borderColor: theme.border, borderColor: theme.borderStrong,
borderWidth: 1, borderWidth: 1,
borderRadius: 10, borderRadius: 10,
color: theme.fg, color: theme.fg,

View file

@ -422,7 +422,7 @@ const styles = StyleSheet.create({
alignItems: 'center', alignItems: 'center',
}, },
actionBtnText: { color: theme.muted, fontWeight: '600', fontSize: 12 }, actionBtnText: { color: theme.muted, fontWeight: '600', fontSize: 12 },
actionBtnTextPrimary: { color: theme.accent, fontWeight: '700', fontSize: 12 }, actionBtnTextPrimary: { color: theme.accentText, fontWeight: '700', fontSize: 12 },
tagRow: { tagRow: {
flexDirection: 'row', flexDirection: 'row',
gap: 6, gap: 6,
@ -439,7 +439,7 @@ const styles = StyleSheet.create({
paddingHorizontal: 10, paddingHorizontal: 10,
maxWidth: 200, maxWidth: 200,
}, },
tagChipActive: { backgroundColor: theme.accent, borderColor: theme.accent }, tagChipActive: { backgroundColor: theme.accent, borderColor: theme.accentText },
tagChipText: { color: theme.muted, fontSize: 12, fontWeight: '600' }, tagChipText: { color: theme.muted, fontSize: 12, fontWeight: '600' },
tagChipTextActive: { color: theme.fg, fontWeight: '700' }, tagChipTextActive: { color: theme.fg, fontWeight: '700' },
tabRow: { flexDirection: 'row', gap: 8, marginBottom: 8 }, tabRow: { flexDirection: 'row', gap: 8, marginBottom: 8 },
@ -455,7 +455,7 @@ const styles = StyleSheet.create({
borderColor: theme.border, borderColor: theme.border,
borderWidth: 1, borderWidth: 1,
}, },
tabBtnActive: { borderColor: theme.accent, backgroundColor: theme.bgElevated }, tabBtnActive: { borderColor: theme.accentText, backgroundColor: theme.bgElevated },
tabBtnText: { color: theme.muted, fontWeight: '600', fontSize: 14 }, tabBtnText: { color: theme.muted, fontWeight: '600', fontSize: 14 },
tabBtnTextActive: { color: theme.fg }, tabBtnTextActive: { color: theme.fg },
tabCount: { tabCount: {

View file

@ -191,7 +191,7 @@ const styles = StyleSheet.create({
search: { search: {
flex: 1, flex: 1,
backgroundColor: theme.card, backgroundColor: theme.card,
borderColor: theme.border, borderColor: theme.borderStrong,
borderWidth: 1.5, borderWidth: 1.5,
borderRadius: 12, borderRadius: 12,
color: theme.fg, color: theme.fg,

View file

@ -85,7 +85,7 @@ const styles = StyleSheet.create({
borderWidth: 1.5, borderWidth: 1.5,
borderColor: theme.border, borderColor: theme.border,
}, },
dotFilled: { backgroundColor: theme.accent, borderColor: theme.accent }, dotFilled: { backgroundColor: theme.accent, borderColor: theme.accentText },
pad: { pad: {
marginTop: 24, marginTop: 24,
flexDirection: 'row', flexDirection: 'row',

View file

@ -2065,7 +2065,7 @@ const styles = StyleSheet.create({
overflow: 'hidden', overflow: 'hidden',
}, },
panSeekDelta: { panSeekDelta: {
color: theme.accent, color: theme.accentText,
fontSize: 14, fontSize: 14,
fontWeight: '700', fontWeight: '700',
marginTop: 6, marginTop: 6,

View file

@ -990,7 +990,7 @@ const styles = StyleSheet.create({
pillRow: { flexDirection: 'row', flexWrap: 'wrap', gap: 8 }, pillRow: { flexDirection: 'row', flexWrap: 'wrap', gap: 8 },
pillPrimary: { pillPrimary: {
borderColor: theme.accent, borderColor: theme.accentText,
borderWidth: 1, borderWidth: 1,
backgroundColor: `${theme.accent}1A`, backgroundColor: `${theme.accent}1A`,
borderRadius: 16, borderRadius: 16,
@ -1048,14 +1048,14 @@ const styles = StyleSheet.create({
refreshThumbText: { color: theme.muted, fontSize: 13, fontWeight: '600' }, refreshThumbText: { color: theme.muted, fontSize: 13, fontWeight: '600' },
pillSource: { pillSource: {
borderColor: theme.accent, borderColor: theme.accentText,
borderWidth: 1, borderWidth: 1,
borderRadius: 14, borderRadius: 14,
paddingHorizontal: 10, paddingHorizontal: 10,
paddingVertical: 4, paddingVertical: 4,
}, },
pillSourceText: { pillSourceText: {
color: theme.accent, color: theme.accentText,
fontSize: 11, fontSize: 11,
fontWeight: '700', fontWeight: '700',
textTransform: 'uppercase', textTransform: 'uppercase',
@ -1067,7 +1067,7 @@ const styles = StyleSheet.create({
watchButton: { watchButton: {
backgroundColor: theme.bgElevated, backgroundColor: theme.bgElevated,
borderColor: theme.accent, borderColor: theme.accentText,
borderWidth: 1.5, borderWidth: 1.5,
borderRadius: 12, borderRadius: 12,
padding: 14, padding: 14,

View file

@ -395,7 +395,7 @@ const styles = StyleSheet.create({
}, },
headerCancel: { color: theme.muted, fontSize: 15 }, headerCancel: { color: theme.muted, fontSize: 15 },
headerTitle: { color: theme.fg, fontSize: 16, fontWeight: '600' }, headerTitle: { color: theme.fg, fontSize: 16, fontWeight: '600' },
headerApply: { color: theme.accent, fontSize: 15, fontWeight: '600' }, headerApply: { color: theme.accentText, fontSize: 15, fontWeight: '600' },
section: { section: {
paddingHorizontal: 16, paddingHorizontal: 16,
paddingVertical: 14, paddingVertical: 14,
@ -418,9 +418,9 @@ const styles = StyleSheet.create({
paddingHorizontal: 12, paddingHorizontal: 12,
paddingVertical: 6, paddingVertical: 6,
}, },
sortPillActive: { borderColor: theme.accent, backgroundColor: theme.bg }, sortPillActive: { borderColor: theme.accentText, backgroundColor: theme.bg },
sortPillText: { color: theme.fg, fontSize: 13 }, sortPillText: { color: theme.fg, fontSize: 13 },
sortPillTextActive: { color: theme.accent, fontWeight: '600' }, sortPillTextActive: { color: theme.accentText, fontWeight: '600' },
switchRow: { switchRow: {
flexDirection: 'row', flexDirection: 'row',
alignItems: 'center', alignItems: 'center',
@ -429,7 +429,7 @@ const styles = StyleSheet.create({
switchLabel: { color: theme.fg, fontSize: 14, flex: 1 }, switchLabel: { color: theme.fg, fontSize: 14, flex: 1 },
search: { search: {
backgroundColor: theme.card, backgroundColor: theme.card,
borderColor: theme.border, borderColor: theme.borderStrong,
borderWidth: 1, borderWidth: 1,
borderRadius: 8, borderRadius: 8,
color: theme.fg, color: theme.fg,
@ -445,9 +445,9 @@ const styles = StyleSheet.create({
paddingHorizontal: 10, paddingHorizontal: 10,
paddingVertical: 5, paddingVertical: 5,
}, },
chipActive: { borderColor: theme.accent, backgroundColor: theme.bg }, chipActive: { borderColor: theme.accentText, backgroundColor: theme.bg },
chipText: { color: theme.fg, fontSize: 13 }, chipText: { color: theme.fg, fontSize: 13 },
chipTextActive: { color: theme.accent, fontWeight: '600' }, chipTextActive: { color: theme.accentText, fontWeight: '600' },
chipCount: { color: theme.muted, fontSize: 11 }, chipCount: { color: theme.muted, fontSize: 11 },
resetRow: { padding: 16 }, resetRow: { padding: 16 },
resetButton: { resetButton: {

View file

@ -157,7 +157,7 @@ export function ScenesScreen() {
style={[styles.toolbarButton, alreadySaved && styles.toolbarButtonActive]} style={[styles.toolbarButton, alreadySaved && styles.toolbarButtonActive]}
> >
<Text <Text
style={[styles.toolbarButtonText, alreadySaved && { color: theme.accent }]} style={[styles.toolbarButtonText, alreadySaved && { color: theme.accentText }]}
> >
{alreadySaved ? '★ Saved' : '☆ Save'} {alreadySaved ? '★ Saved' : '☆ Save'}
</Text> </Text>
@ -167,7 +167,7 @@ export function ScenesScreen() {
onPress={() => setFilterOpen(true)} onPress={() => setFilterOpen(true)}
style={[styles.toolbarButton, activeCount > 0 && styles.toolbarButtonActive]} style={[styles.toolbarButton, activeCount > 0 && styles.toolbarButtonActive]}
> >
<Text style={[styles.toolbarButtonText, activeCount > 0 && { color: theme.accent }]}> <Text style={[styles.toolbarButtonText, activeCount > 0 && { color: theme.accentText }]}>
Filter{activeCount > 0 ? ` ${activeCount}` : ''} Filter{activeCount > 0 ? ` ${activeCount}` : ''}
</Text> </Text>
</Pressable> </Pressable>
@ -417,7 +417,7 @@ const styles = StyleSheet.create({
search: { search: {
flex: 1, flex: 1,
backgroundColor: theme.card, backgroundColor: theme.card,
borderColor: theme.border, borderColor: theme.borderStrong,
borderWidth: 1.5, borderWidth: 1.5,
borderRadius: 12, borderRadius: 12,
color: theme.fg, color: theme.fg,
@ -432,7 +432,7 @@ const styles = StyleSheet.create({
paddingHorizontal: 16, paddingHorizontal: 16,
justifyContent: 'center', justifyContent: 'center',
}, },
toolbarButtonActive: { borderColor: theme.accent, backgroundColor: `${theme.accent}1A` }, toolbarButtonActive: { borderColor: theme.accentText, backgroundColor: `${theme.accent}1A` },
toolbarButtonText: { color: theme.fg, fontWeight: '700' }, toolbarButtonText: { color: theme.fg, fontWeight: '700' },
savedRow: { flexGrow: 0, marginBottom: 12 }, savedRow: { flexGrow: 0, marginBottom: 12 },
savedRowContent: { gap: 8, paddingRight: 12 }, savedRowContent: { gap: 8, paddingRight: 12 },
@ -445,9 +445,9 @@ const styles = StyleSheet.create({
paddingVertical: 6, paddingVertical: 6,
maxWidth: 200, maxWidth: 200,
}, },
savedChipActive: { borderColor: theme.accent, backgroundColor: `${theme.accent}1A` }, savedChipActive: { borderColor: theme.accentText, backgroundColor: `${theme.accent}1A` },
savedChipText: { color: theme.fg, fontSize: 13 }, savedChipText: { color: theme.fg, fontSize: 13 },
savedChipTextActive: { color: theme.accent, fontWeight: '600' }, savedChipTextActive: { color: theme.accentText, fontWeight: '600' },
subToolbar: { flexDirection: 'row', gap: 8, marginBottom: 16 }, subToolbar: { flexDirection: 'row', gap: 8, marginBottom: 16 },
subButton: { subButton: {
backgroundColor: theme.card, backgroundColor: theme.card,
@ -459,7 +459,7 @@ const styles = StyleSheet.create({
}, },
subButtonActive: { subButtonActive: {
backgroundColor: theme.accent, backgroundColor: theme.accent,
borderColor: theme.accent, borderColor: theme.accentText,
shadowColor: theme.accent, shadowColor: theme.accent,
shadowOffset: { width: 0, height: 0 }, shadowOffset: { width: 0, height: 0 },
shadowOpacity: 0.5, shadowOpacity: 0.5,
@ -494,7 +494,7 @@ const styles = StyleSheet.create({
paddingVertical: 1, paddingVertical: 1,
borderRadius: 8, borderRadius: 8,
}, },
favBadgeText: { color: theme.accent, fontSize: 12, fontWeight: '700' }, favBadgeText: { color: theme.accentText, fontSize: 12, fontWeight: '700' },
thumbnail: { thumbnail: {
width: 100, width: 100,
height: 56, height: 56,
@ -506,7 +506,7 @@ const styles = StyleSheet.create({
}, },
rowTitle: { color: theme.fg, fontWeight: '700', fontSize: 16, marginBottom: 4 }, rowTitle: { color: theme.fg, fontWeight: '700', fontSize: 16, marginBottom: 4 },
rowMuted: { color: theme.muted, fontSize: 14, marginTop: 2 }, rowMuted: { color: theme.muted, fontSize: 14, marginTop: 2 },
rowSources: { color: theme.accent, fontSize: 12, marginTop: 8, textTransform: 'uppercase', fontWeight: '600' }, rowSources: { color: theme.accentText, fontSize: 12, marginTop: 8, textTransform: 'uppercase', fontWeight: '600' },
muted: { color: theme.muted, textAlign: 'center', marginTop: 32, fontSize: 16 }, muted: { color: theme.muted, textAlign: 'center', marginTop: 32, fontSize: 16 },
error: { color: theme.bad, padding: 16 }, error: { color: theme.bad, padding: 16 },
@ -519,7 +519,7 @@ const styles = StyleSheet.create({
backgroundColor: theme.card, backgroundColor: theme.card,
}, },
chipActive: { chipActive: {
borderColor: theme.accent, borderColor: theme.accentText,
backgroundColor: `${theme.accent}26`, backgroundColor: `${theme.accent}26`,
shadowColor: theme.accent, shadowColor: theme.accent,
shadowOffset: { width: 0, height: 0 }, shadowOffset: { width: 0, height: 0 },
@ -528,7 +528,7 @@ const styles = StyleSheet.create({
elevation: 2, elevation: 2,
}, },
chipText: { color: theme.muted, fontSize: 13, fontWeight: '700' }, chipText: { color: theme.muted, fontSize: 13, fontWeight: '700' },
chipTextActive: { color: theme.accent }, chipTextActive: { color: theme.accentText },
// Continue watching rail // Continue watching rail
rail: { marginBottom: 16 }, rail: { marginBottom: 16 },

View file

@ -348,12 +348,12 @@ const styles = StyleSheet.create({
paddingVertical: 1, paddingVertical: 1,
borderRadius: 8, borderRadius: 8,
}, },
favBadgeText: { color: theme.accent, fontSize: 12, fontWeight: '700' }, favBadgeText: { color: theme.accentText, fontSize: 12, fontWeight: '700' },
rowContent: { flex: 1 }, rowContent: { flex: 1 },
rowTitle: { color: theme.fg, fontWeight: '700', fontSize: 16, marginBottom: 4 }, rowTitle: { color: theme.fg, fontWeight: '700', fontSize: 16, marginBottom: 4 },
rowMuted: { color: theme.muted, fontSize: 14, marginTop: 2 }, rowMuted: { color: theme.muted, fontSize: 14, marginTop: 2 },
rowSources: { rowSources: {
color: theme.accent, color: theme.accentText,
fontSize: 12, fontSize: 12,
marginTop: 8, marginTop: 8,
textTransform: 'uppercase', textTransform: 'uppercase',
@ -371,7 +371,7 @@ const styles = StyleSheet.create({
borderColor: theme.border, borderColor: theme.border,
borderWidth: 1, borderWidth: 1,
}, },
filterBtnActive: { backgroundColor: theme.accentDeep, borderColor: theme.accent }, filterBtnActive: { backgroundColor: theme.accentDeep, borderColor: theme.accentText },
filterBtnText: { color: theme.fg, fontSize: 13, fontWeight: '600' }, filterBtnText: { color: theme.fg, fontSize: 13, fontWeight: '600' },
clearBtn: { paddingHorizontal: 10, paddingVertical: 8 }, clearBtn: { paddingHorizontal: 10, paddingVertical: 8 },
clearBtnText: { color: theme.muted, fontSize: 13 }, clearBtnText: { color: theme.muted, fontSize: 13 },
@ -391,7 +391,7 @@ const modalStyles = StyleSheet.create({
close: { color: theme.muted, fontSize: 20, padding: 4 }, close: { color: theme.muted, fontSize: 20, padding: 4 },
search: { search: {
backgroundColor: theme.card, backgroundColor: theme.card,
borderColor: theme.border, borderColor: theme.borderStrong,
borderWidth: 1, borderWidth: 1,
borderRadius: 10, borderRadius: 10,
color: theme.fg, color: theme.fg,
@ -410,7 +410,7 @@ const modalStyles = StyleSheet.create({
borderColor: theme.border, borderColor: theme.border,
borderWidth: 1, borderWidth: 1,
}, },
chipOn: { backgroundColor: theme.accentDeep, borderColor: theme.accent }, chipOn: { backgroundColor: theme.accentDeep, borderColor: theme.accentText },
chipText: { color: theme.fg, fontSize: 13 }, chipText: { color: theme.fg, fontSize: 13 },
chipTextOn: { color: theme.fg, fontWeight: '700' }, chipTextOn: { color: theme.fg, fontWeight: '700' },
muted: { color: theme.muted, fontSize: 13, paddingVertical: 8 }, muted: { color: theme.muted, fontSize: 13, paddingVertical: 8 },

View file

@ -325,7 +325,7 @@ const styles = StyleSheet.create({
search: { search: {
flex: 1, flex: 1,
backgroundColor: theme.card, backgroundColor: theme.card,
borderColor: theme.border, borderColor: theme.borderStrong,
borderWidth: 1.5, borderWidth: 1.5,
borderRadius: 12, borderRadius: 12,
color: theme.fg, color: theme.fg,

View file

@ -292,9 +292,9 @@ const styles = StyleSheet.create({
borderWidth: 1, borderWidth: 1,
borderColor: theme.border, borderColor: theme.border,
}, },
tabBtnActive: { borderColor: theme.accent }, tabBtnActive: { borderColor: theme.accentText },
tabBtnText: { color: theme.muted, fontSize: 13 }, tabBtnText: { color: theme.muted, fontSize: 13 },
tabBtnTextActive: { color: theme.accent, fontWeight: '700' }, tabBtnTextActive: { color: theme.accentText, fontWeight: '700' },
tabCount: { tabCount: {
backgroundColor: theme.border, backgroundColor: theme.border,
borderRadius: 999, borderRadius: 999,

View file

@ -119,7 +119,7 @@ const styles = StyleSheet.create({
}, },
rowTitle: { color: theme.fg, fontWeight: '600', marginBottom: 2 }, rowTitle: { color: theme.fg, fontWeight: '600', marginBottom: 2 },
rowMuted: { color: theme.muted, fontSize: 13, marginTop: 2 }, rowMuted: { color: theme.muted, fontSize: 13, marginTop: 2 },
rowSources: { color: theme.accent, fontSize: 11, marginTop: 4, textTransform: 'uppercase' }, rowSources: { color: theme.accentText, fontSize: 11, marginTop: 4, textTransform: 'uppercase' },
muted: { color: theme.muted, textAlign: 'center', marginTop: 24 }, muted: { color: theme.muted, textAlign: 'center', marginTop: 24 },
error: { color: theme.bad, padding: 12 }, error: { color: theme.bad, padding: 12 },
}); });

View file

@ -161,7 +161,7 @@ const styles = StyleSheet.create({
search: { search: {
flex: 1, flex: 1,
backgroundColor: theme.card, backgroundColor: theme.card,
borderColor: theme.border, borderColor: theme.borderStrong,
borderWidth: 1.5, borderWidth: 1.5,
borderRadius: 12, borderRadius: 12,
color: theme.fg, color: theme.fg,

View file

@ -19,6 +19,13 @@ export const theme = {
bgElevated: '#1E1A14', bgElevated: '#1E1A14',
card: '#26201A', card: '#26201A',
border: '#3A3128', border: '#3A3128',
// Granica, która faktycznie oddziela. `border` ma 1,48:1 na `bg` i **1,27:1 na `card`**,
// czyli przy wymogu 3:1 nie jest granicą, tylko cieniem — zostaje do dekoracyjnych
// włosków. Wszystko, co niesie znaczenie (pola, fokus, podział sekcji), bierze to.
//
// Wartość dobrana pod OBIE powierzchnie: pola tekstowe leżą i na `bg` (ekrany), i na
// `card` (arkusze filtrów), a #6B6157 dawał na karcie 2,66, zaś #73695E dokładnie 2,999, czyli wciąż poniżej.
borderStrong: '#7B7065', // 3,89 na bg · 3,33 na card (obie powierzchnie ≥3:1)
borderFocus: '#B23A48', borderFocus: '#B23A48',
// Foreground, warm off-white (nie pure white żeby nie biło na warm dark). // Foreground, warm off-white (nie pure white żeby nie biło na warm dark).
@ -29,6 +36,15 @@ export const theme = {
// Accent, oxblood/rust. Distinctive, niekonwencjonalne dla "media app". // Accent, oxblood/rust. Distinctive, niekonwencjonalne dla "media app".
// Brak glow/neon. Deep wariant dla pressed states. // Brak glow/neon. Deep wariant dla pressed states.
accent: '#B23A48', accent: '#B23A48',
// WYPEŁNIENIE ma zostać oxbloodem: jasny tekst na nim daje 5,03:1, czyli przechodzi.
// Ale TEN SAM kolor jako tekst albo cienka obwódka jest nieczytelny — pomiar WCAG
// 2026-08-13: 3,21 na `bg`, 2,96 na `bgElevated`, **2,75 na `card`**, czyli poniżej
// nawet progu 3:1 dla elementów interfejsu, nie mówiąc o 4,5 dla tekstu.
//
// Podniesienie samego `accent` do progu tekstu wymagałoby zejścia w róż (#CE6975),
// co likwiduje tożsamość, której broni nagłówek tego pliku. Zamiast tego rozdzielamy
// ROLE: `accent` wypełnia, `accentText` pisze i obrysowuje.
accentText: '#C75260', // 4,30 na bg · 3,96 na bgElevated · 3,68 na card
accentGlow: '#B23A48', // alias, back-compat, ale bez prawdziwego glow accentGlow: '#B23A48', // alias, back-compat, ale bez prawdziwego glow
accentDeep: '#7A1F2A', accentDeep: '#7A1F2A',
accentSecondary: '#D89B4A', // muted amber dla secondary CTAs accentSecondary: '#D89B4A', // muted amber dla secondary CTAs