openvibers/openvibe.live Commits
Reward words and relay badges read on light themes (#530)
Changes
@@@ -275,7 +275,7 @@gap: 6px;}--.coins-color { color: #b388ff !important; }++.coins-color { color: color-mix(in srgb, #b388ff 55%, var(--text-primary)) !important; }.dash-rewards-grid {display: flex; flex-direction: column; gap: 8px;}@@@ -2953,7 +2953,7 @@ a.pulse-card:hover { border-color: var(--accent); transform: translateY(-2px); }/* VIP member badge (OpenVibe.VIP): a short text label, so it is a pill rather than an icon square. */.chat-vip-badge { width: auto; padding: 0 5px; font-size: 0.62rem; font-weight: 700; letter-spacing: 0.02em; white-space: nowrap; color: var(--accent-light, var(--accent)); background: color-mix(in srgb, var(--accent) 22%, transparent); border-color: color-mix(in srgb, var(--accent) 50%, transparent); }/* Relay platform badge — colour driven by --relay-color (per platform). */--.chat-relay-badge { color: var(--relay-color, #888); background: color-mix(in srgb, var(--relay-color, #888) 20%, transparent); border-color: color-mix(in srgb, var(--relay-color, #888) 45%, transparent); }++.chat-relay-badge { color: color-mix(in srgb, var(--relay-color, #888) 55%, var(--text-primary)); background: color-mix(in srgb, var(--relay-color, #888) 20%, transparent); border-color: color-mix(in srgb, var(--relay-color, #888) 45%, transparent); }.chat-relay-badge i { font-size: 0.6rem; }/* Animated tooltip (shared by any [data-tip] badge — chat, user list, context menu) */@@@ -5162,7 +5162,7 @@ body.theme-light .btn-outline:hover {padding: 4px 10px; border-radius: 12px;background: linear-gradient(135deg, #1a0e2a, #0f0818);border: 1px solid #6c3fb5;-- color: #b388ff; font-size: 0.85rem; font-weight: 600;++ color: color-mix(in srgb, #b388ff 55%, var(--text-primary)); font-size: 0.85rem; font-weight: 600;cursor: pointer;}.nav-coins:hover { border-color: #9c6eff; }@@@ -5172,7 +5172,7 @@ body.theme-light .btn-outline:hover {flex-shrink: 0;padding: 6px 8px; background: transparent;border: 1px solid #6c3fb5; border-radius: var(--radius);-- color: #b388ff; font-size: 0.85rem; cursor: pointer;++ color: color-mix(in srgb, #b388ff 55%, var(--text-primary)); font-size: 0.85rem; cursor: pointer;transition: color var(--ov-dur-2, 0.15s), border-color var(--ov-dur-2, 0.15s), background var(--ov-dur-2, 0.15s);line-height: 1;}@@@ -5191,7 +5191,7 @@ body.theme-light .btn-outline:hover {display: flex; justify-content: space-between; align-items: center;padding: 8px 12px;font-size: 0.85rem; font-weight: 600;-- color: #b388ff;++ color: color-mix(in srgb, #b388ff 55%, var(--text-primary));border-bottom: 1px solid var(--border);}.rewards-coin-bal {@@@ -5220,7 +5220,7 @@ body.theme-light .btn-outline:hover {}.reward-btn i {font-size: 1.2rem;-- color: var(--reward-color, #b388ff);++ color: color-mix(in srgb, var(--reward-color, #b388ff) 60%, var(--text-primary));}.reward-title {font-weight: 500; line-height: 1.2;@@@ -5228,7 +5228,7 @@ body.theme-light .btn-outline:hover {text-overflow: ellipsis; white-space: nowrap;}.reward-cost {-- font-size: 0.7rem; color: #b388ff;++ font-size: 0.7rem; color: color-mix(in srgb, #b388ff 55%, var(--text-primary));font-weight: 600;}@@@ -5250,7 +5250,7 @@ body.theme-light .btn-outline:hover {}.dash-reward-icon {font-size: 1.4rem;-- color: var(--reward-color, #b388ff);++ color: color-mix(in srgb, var(--reward-color, #b388ff) 60%, var(--text-primary));width: 36px; text-align: center;}.dash-reward-info {@@@ -45,4 +45,9 @@ assert.match(focus[1], /background: var\(--bg-input\)/);// The channel's language chip mixes its gold with the theme's text instead of a pale fixed gold.const channel = fs.readFileSync(path.join(root, 'css', 'features', 'channel.css'), 'utf8');assert.match(channel, /\.ch-lang-chip \{[^}]*color: color-mix\(in srgb, #f59e0b 35%, var\(--text-primary\)\)/);++// Violet reward words and platform-coloured relay badges are mixed with the theme's text: the fixed #b388ff and++// Kick's #53fc18 were pale on light themes.++const allCss = files.filter((f) => f.endsWith('.css')).map((f) => fs.readFileSync(f, 'utf8')).join('\n');++assert.ok(!/(^|[^-\w])color:\s*(#b388ff|var\(--reward-color, #b388ff\))/m.test(allCss), 'no fixed pale violet text');++assert.match(style, /\.chat-relay-badge \{ color: color-mix\(in srgb, var\(--relay-color, #888\) 55%, var\(--text-primary\)\)/);console.log('theme tokens defined: all checks passed');
@@ -275,7 +275,7 @@
@@ -275,7 +275,7 @@
gap: 6px;
gap: 6px;
}
}
-.coins-color { color: #b388ff !important; }
+.coins-color { color: color-mix(in srgb, #b388ff 55%, var(--text-primary)) !important; }
.dash-rewards-grid {
.dash-rewards-grid {
display: flex; flex-direction: column; gap: 8px;
display: flex; flex-direction: column; gap: 8px;
}
}
@@ -2953,7 +2953,7 @@ a.pulse-card:hover { border-color: var(--accent); transform: translateY(-2px); }
@@ -2953,7 +2953,7 @@ a.pulse-card:hover { border-color: var(--accent); transform: translateY(-2px); }
/* VIP member badge (OpenVibe.VIP): a short text label, so it is a pill rather than an icon square. */
/* VIP member badge (OpenVibe.VIP): a short text label, so it is a pill rather than an icon square. */
.chat-vip-badge { width: auto; padding: 0 5px; font-size: 0.62rem; font-weight: 700; letter-spacing: 0.02em; white-space: nowrap; color: var(--accent-light, var(--accent)); background: color-mix(in srgb, var(--accent) 22%, transparent); border-color: color-mix(in srgb, var(--accent) 50%, transparent); }
.chat-vip-badge { width: auto; padding: 0 5px; font-size: 0.62rem; font-weight: 700; letter-spacing: 0.02em; white-space: nowrap; color: var(--accent-light, var(--accent)); background: color-mix(in srgb, var(--accent) 22%, transparent); border-color: color-mix(in srgb, var(--accent) 50%, transparent); }
/* Relay platform badge — colour driven by --relay-color (per platform). */
/* Relay platform badge — colour driven by --relay-color (per platform). */
-.chat-relay-badge { color: var(--relay-color, #888); background: color-mix(in srgb, var(--relay-color, #888) 20%, transparent); border-color: color-mix(in srgb, var(--relay-color, #888) 45%, transparent); }
+.chat-relay-badge { color: color-mix(in srgb, var(--relay-color, #888) 55%, var(--text-primary)); background: color-mix(in srgb, var(--relay-color, #888) 20%, transparent); border-color: color-mix(in srgb, var(--relay-color, #888) 45%, transparent); }
.chat-relay-badge i { font-size: 0.6rem; }
.chat-relay-badge i { font-size: 0.6rem; }
/* Animated tooltip (shared by any [data-tip] badge — chat, user list, context menu) */
/* Animated tooltip (shared by any [data-tip] badge — chat, user list, context menu) */
@@ -5162,7 +5162,7 @@ body.theme-light .btn-outline:hover {
@@ -5162,7 +5162,7 @@ body.theme-light .btn-outline:hover {
padding: 4px 10px; border-radius: 12px;
padding: 4px 10px; border-radius: 12px;
background: linear-gradient(135deg, #1a0e2a, #0f0818);
background: linear-gradient(135deg, #1a0e2a, #0f0818);
border: 1px solid #6c3fb5;
border: 1px solid #6c3fb5;
- color: #b388ff; font-size: 0.85rem; font-weight: 600;
+ color: color-mix(in srgb, #b388ff 55%, var(--text-primary)); font-size: 0.85rem; font-weight: 600;
cursor: pointer;
cursor: pointer;
}
}
.nav-coins:hover { border-color: #9c6eff; }
.nav-coins:hover { border-color: #9c6eff; }
@@ -5172,7 +5172,7 @@ body.theme-light .btn-outline:hover {
@@ -5172,7 +5172,7 @@ body.theme-light .btn-outline:hover {
flex-shrink: 0;
flex-shrink: 0;
padding: 6px 8px; background: transparent;
padding: 6px 8px; background: transparent;
border: 1px solid #6c3fb5; border-radius: var(--radius);
border: 1px solid #6c3fb5; border-radius: var(--radius);
- color: #b388ff; font-size: 0.85rem; cursor: pointer;
+ color: color-mix(in srgb, #b388ff 55%, var(--text-primary)); font-size: 0.85rem; cursor: pointer;
transition: color var(--ov-dur-2, 0.15s), border-color var(--ov-dur-2, 0.15s), background var(--ov-dur-2, 0.15s);
transition: color var(--ov-dur-2, 0.15s), border-color var(--ov-dur-2, 0.15s), background var(--ov-dur-2, 0.15s);
line-height: 1;
line-height: 1;
}
}
@@ -5191,7 +5191,7 @@ body.theme-light .btn-outline:hover {
@@ -5191,7 +5191,7 @@ body.theme-light .btn-outline:hover {
display: flex; justify-content: space-between; align-items: center;
display: flex; justify-content: space-between; align-items: center;
padding: 8px 12px;
padding: 8px 12px;
font-size: 0.85rem; font-weight: 600;
font-size: 0.85rem; font-weight: 600;
- color: #b388ff;
+ color: color-mix(in srgb, #b388ff 55%, var(--text-primary));
border-bottom: 1px solid var(--border);
border-bottom: 1px solid var(--border);
}
}
.rewards-coin-bal {
.rewards-coin-bal {
@@ -5220,7 +5220,7 @@ body.theme-light .btn-outline:hover {
@@ -5220,7 +5220,7 @@ body.theme-light .btn-outline:hover {
}
}
.reward-btn i {
.reward-btn i {
font-size: 1.2rem;
font-size: 1.2rem;
- color: var(--reward-color, #b388ff);
+ color: color-mix(in srgb, var(--reward-color, #b388ff) 60%, var(--text-primary));
}
}
.reward-title {
.reward-title {
font-weight: 500; line-height: 1.2;
font-weight: 500; line-height: 1.2;
@@ -5228,7 +5228,7 @@ body.theme-light .btn-outline:hover {
@@ -5228,7 +5228,7 @@ body.theme-light .btn-outline:hover {
text-overflow: ellipsis; white-space: nowrap;
text-overflow: ellipsis; white-space: nowrap;
}
}
.reward-cost {
.reward-cost {
- font-size: 0.7rem; color: #b388ff;
+ font-size: 0.7rem; color: color-mix(in srgb, #b388ff 55%, var(--text-primary));
font-weight: 600;
font-weight: 600;
}
}
@@ -5250,7 +5250,7 @@ body.theme-light .btn-outline:hover {
@@ -5250,7 +5250,7 @@ body.theme-light .btn-outline:hover {
}
}
.dash-reward-icon {
.dash-reward-icon {
font-size: 1.4rem;
font-size: 1.4rem;
- color: var(--reward-color, #b388ff);
+ color: color-mix(in srgb, var(--reward-color, #b388ff) 60%, var(--text-primary));
width: 36px; text-align: center;
width: 36px; text-align: center;
}
}
.dash-reward-info {
.dash-reward-info {
@@ -45,4 +45,9 @@ assert.match(focus[1], /background: var\(--bg-input\)/);
@@ -45,4 +45,9 @@ assert.match(focus[1], /background: var\(--bg-input\)/);
// The channel's language chip mixes its gold with the theme's text instead of a pale fixed gold.
// The channel's language chip mixes its gold with the theme's text instead of a pale fixed gold.
const channel = fs.readFileSync(path.join(root, 'css', 'features', 'channel.css'), 'utf8');
const channel = fs.readFileSync(path.join(root, 'css', 'features', 'channel.css'), 'utf8');
assert.match(channel, /\.ch-lang-chip \{[^}]*color: color-mix\(in srgb, #f59e0b 35%, var\(--text-primary\)\)/);
assert.match(channel, /\.ch-lang-chip \{[^}]*color: color-mix\(in srgb, #f59e0b 35%, var\(--text-primary\)\)/);
+// Violet reward words and platform-coloured relay badges are mixed with the theme's text: the fixed #b388ff and
+// Kick's #53fc18 were pale on light themes.
+const allCss = files.filter((f) => f.endsWith('.css')).map((f) => fs.readFileSync(f, 'utf8')).join('\n');
+assert.ok(!/(^|[^-\w])color:\s*(#b388ff|var\(--reward-color, #b388ff\))/m.test(allCss), 'no fixed pale violet text');
+assert.match(style, /\.chat-relay-badge \{ color: color-mix\(in srgb, var\(--relay-color, #888\) 55%, var\(--text-primary\)\)/);
console.log('theme tokens defined: all checks passed');
console.log('theme tokens defined: all checks passed');