openvibers/openvibe.live Commits

Faint white tints follow the theme (surfaces and borders vanished on light looks) (#515)

OP OpenVibers committed 12 days ago · 111c174a28 · 13 files, +135 −135

135 backgrounds and borders that lightened a surface with rgba(255,255,255,.02-.12) are now tints of the theme's
text colour (color-mix with var(--text-primary, #fff)), made with tools/design-lint/tint-colors.js: the same on dark
themes, a faint dark tint on light ones, where white on white had vanished. Left as they were: rules that paint their
own dark surface (glass panels, scrims), the media player, the kiosk and the OBS scenes.

Changes

ddiff --git a/public/banned.html b/public/banned.html
iindex 69d6abf0..e84f0871 100644
---- a/public/banned.html
++++ b/public/banned.html
@@@ -40,7 +40,7 @@
/* What happened — lines land one after another like messages */
.story { display: grid; gap: 10px; max-width: 640px; margin: 0 auto 24px; text-align: left; }
-- .msg { position: relative; padding: 12px 16px; border-radius: 16px 16px 16px 4px; background: rgba(255,255,255,0.06); border: 1px solid rgba(255,255,255,0.1); color: #f3efec; font-size: clamp(1rem, 2.8vw, 1.15rem); line-height: 1.45; font-weight: 600;
++ .msg { position: relative; padding: 12px 16px; border-radius: 16px 16px 16px 4px; background: color-mix(in srgb, var(--text-primary, #fff) 6%, transparent); border: 1px solid color-mix(in srgb, var(--text-primary, #fff) 10%, transparent); color: #f3efec; font-size: clamp(1rem, 2.8vw, 1.15rem); line-height: 1.45; font-weight: 600;
opacity: 0; transform: translateX(-24px) scale(0.98); animation: land var(--ov-dur-4, 0.55s) var(--ov-ease-out, cubic-bezier(.2,.9,.3,1.2)) forwards; animation-delay: var(--d); }
.msg.hot { background: rgba(231,76,60,0.16); border-color: rgba(231,76,60,0.55); color: #fff; }
.msg.hot::before { content: ''; position: absolute; inset: -1px; border-radius: inherit; animation: ring 1.6s var(--ov-ease-out, ease-out) 1; animation-delay: calc(var(--d) + 0.3s); pointer-events: none; }
ddiff --git a/public/css/broadcast.css b/public/css/broadcast.css
iindex 6beec1f6..9819d9e5 100644
---- a/public/css/broadcast.css
++++ b/public/css/broadcast.css
@@@ -14,8 +14,8 @@
.broadcast-page-tabs-nav {
position: relative;
padding: 0 16px;
-- border-bottom: 1px solid rgba(255,255,255,0.08);
-- background: rgba(255,255,255,0.02);
++ border-bottom: 1px solid color-mix(in srgb, var(--text-primary, #fff) 8%, transparent);
++ background: color-mix(in srgb, var(--text-primary, #fff) 2%, transparent);
}
.broadcast-page-tab-btn {
@@@ -59,7 +59,7 @@
.bc-tab-header {
margin-bottom: 24px;
padding-bottom: 16px;
-- border-bottom: 1px solid rgba(255,255,255,0.08);
++ border-bottom: 1px solid color-mix(in srgb, var(--text-primary, #fff) 8%, transparent);
}
.bc-tab-header h2 {
@@@ -109,7 +109,7 @@
position: absolute;
top: 16px;
right: 16px;
-- background: rgba(255,255,255,0.1);
++ background: color-mix(in srgb, var(--text-primary, #fff) 10%, transparent);
border: none;
width: 40px;
height: 40px;
@@@ -336,7 +336,7 @@
padding: 14px;
border: 1px dashed var(--border);
border-radius: var(--radius);
-- background: rgba(255,255,255,0.02);
++ background: color-mix(in srgb, var(--text-primary, #fff) 2%, transparent);
}
/* ── Screen Capture Source Picker ────────────────────────────── */
@@@ -367,7 +367,7 @@
.bc-screen-advanced {
border: 1px solid var(--border);
border-radius: var(--radius, 8px);
-- background: rgba(255,255,255,0.02);
++ background: color-mix(in srgb, var(--text-primary, #fff) 2%, transparent);
padding: 0;
}
@@@ -548,8 +548,8 @@
text-align: left;
padding: 14px 16px;
border-radius: 18px;
-- border: 1px solid rgba(255,255,255,0.08);
-- background: rgba(255,255,255,0.04);
++ border: 1px solid color-mix(in srgb, var(--text-primary, #fff) 8%, transparent);
++ background: color-mix(in srgb, var(--text-primary, #fff) 4%, transparent);
color: var(--text-primary);
display: flex;
align-items: center;
@@@ -774,7 +774,7 @@
width: 100%;
height: 400px;
flex-shrink: 0;
-- border-top: 1px solid rgba(255,255,255,0.06);
++ border-top: 1px solid color-mix(in srgb, var(--text-primary, #fff) 6%, transparent);
border-left: none;
}
}
@@@ -807,7 +807,7 @@
width: 100%; height: 55vh;
max-height: 55vh;
max-height: 55dvh;
-- border-top: 1px solid rgba(255,255,255,0.06);
++ border-top: 1px solid color-mix(in srgb, var(--text-primary, #fff) 6%, transparent);
border-left: none;
background: var(--bg-secondary);
z-index: 1002;
@@@ -1220,7 +1220,7 @@
gap: 12px;
margin: 20px 0 14px;
padding-bottom: 10px;
-- border-bottom: 1px solid rgba(255,255,255,0.06);
++ border-bottom: 1px solid color-mix(in srgb, var(--text-primary, #fff) 6%, transparent);
}
.bc-step-header:first-of-type {
@@@ -1299,7 +1299,7 @@
color: var(--text-secondary);
margin-top: 6px;
padding-top: 6px;
-- border-top: 1px solid rgba(255,255,255,0.06);
++ border-top: 1px solid color-mix(in srgb, var(--text-primary, #fff) 6%, transparent);
line-height: 1.3;
}
@@@ -1358,7 +1358,7 @@
margin-top: 16px;
border: 1px solid var(--border);
border-radius: var(--radius);
-- background: var(--bg-tertiary, rgba(255,255,255,0.02));
++ background: var(--bg-tertiary, color-mix(in srgb, var(--text-primary, #fff) 2%, transparent));
overflow: hidden;
}
@@@ -1446,7 +1446,7 @@
font-size: 0.8rem;
color: var(--text-primary);
padding: 8px 10px;
-- background: rgba(255,255,255,0.03);
++ background: color-mix(in srgb, var(--text-primary, #fff) 3%, transparent);
border-radius: var(--radius-sm, 4px);
border-left: 3px solid var(--accent);
margin: 0;
@@@ -1461,7 +1461,7 @@
/* ── FAQ Items ───────────────────────────────────────────────── */
.bc-faq-item {
padding: 12px 0;
-- border-bottom: 1px solid rgba(255,255,255,0.04);
++ border-bottom: 1px solid color-mix(in srgb, var(--text-primary, #fff) 4%, transparent);
}
.bc-faq-item:last-child {
@@@ -1858,7 +1858,7 @@
.bc-perm-note i { margin-top: 2px; opacity: .8; flex-shrink: 0; }
.bc-perm-step span {
flex-shrink: 0; width: 21px; height: 21px; border-radius: 50%;
-- background: rgba(255,255,255,.09); display: grid; place-items: center;
++ background: color-mix(in srgb, var(--text-primary, #fff) 9%, transparent); display: grid; place-items: center;
font-size: .72rem; font-weight: 700;
}
.bc-perm-step p { margin: 0; font-size: .85rem; line-height: 1.45; color: var(--text-muted, #9aa3b2); }
ddiff --git a/public/css/features/broadcast.css b/public/css/features/broadcast.css
iindex 9e42bc41..18800db7 100644
---- a/public/css/features/broadcast.css
++++ b/public/css/features/broadcast.css
@@@ -441,8 +441,8 @@
}
.bc-settings-group {
-- background: rgba(255,255,255,0.02);
-- border: 1px solid rgba(255,255,255,0.08);
++ background: color-mix(in srgb, var(--text-primary, #fff) 2%, transparent);
++ border: 1px solid color-mix(in srgb, var(--text-primary, #fff) 8%, transparent);
border-radius: 12px;
padding: 20px;
}
@@@ -499,7 +499,7 @@
@keyframes bcStatsIn { from { opacity: 0; transform: translateY(-4px); } }
#bc-stats-overlay .bc-stats-head {
grid-column: 1 / -1; display: flex; align-items: center; gap: 8px; margin-bottom: 3px; padding-bottom: 8px;
-- border-bottom: 1px solid rgba(255, 255, 255, 0.1); font-weight: 700;
++ border-bottom: 1px solid color-mix(in srgb, var(--text-primary, #fff) 10%, transparent); font-weight: 700;
}
#bc-stats-overlay .bc-stats-title { flex: 1; }
#bc-stats-overlay .bc-stats-dot { width: 8px; height: 8px; border-radius: 50%; background: #9ca3af; }
@@@ -541,7 +541,7 @@
padding: 16px;
border: 1px dashed var(--border);
border-radius: var(--radius);
-- background: rgba(255,255,255,0.02);
++ background: color-mix(in srgb, var(--text-primary, #fff) 2%, transparent);
margin-bottom: 8px;
}
@@@ -570,7 +570,7 @@
align-items: center;
gap: 3px;
padding: 10px 6px 8px;
-- background: var(--surface, rgba(255,255,255,0.04));
++ background: var(--surface, color-mix(in srgb, var(--text-primary, #fff) 4%, transparent));
border: 2px solid var(--border);
border-radius: var(--radius, 8px);
color: var(--text-secondary);
@@@ -583,7 +583,7 @@
.bc-source-btn:hover {
border-color: var(--accent);
-- background: rgba(255,255,255,0.06);
++ background: color-mix(in srgb, var(--text-primary, #fff) 6%, transparent);
}
.bc-source-btn.selected {
@@@ -600,7 +600,7 @@
.bc-controls {
padding: 16px;
overflow-y: auto;
-- background: linear-gradient(180deg, rgba(255,255,255,0.02), transparent 65%);
++ background: linear-gradient(180deg, color-mix(in srgb, var(--text-primary, #fff) 2%, transparent), transparent 65%);
}
.bc-ctrl-buttons {
@@@ -675,15 +675,15 @@
justify-content: space-between;
gap: 16px;
padding: 18px 18px 14px;
-- border-bottom: 1px solid rgba(255,255,255,0.06);
++ border-bottom: 1px solid color-mix(in srgb, var(--text-primary, #fff) 6%, transparent);
}
.bc-camera-sheet-close {
width: 40px;
height: 40px;
border-radius: 999px;
-- border: 1px solid rgba(255,255,255,0.1);
-- background: rgba(255,255,255,0.04);
++ border: 1px solid color-mix(in srgb, var(--text-primary, #fff) 10%, transparent);
++ background: color-mix(in srgb, var(--text-primary, #fff) 4%, transparent);
color: var(--text-primary);
display: inline-flex;
align-items: center;
@@@ -693,7 +693,7 @@
}
.bc-camera-sheet-close:hover {
-- background: rgba(255,255,255,0.08);
++ background: color-mix(in srgb, var(--text-primary, #fff) 8%, transparent);
border-color: rgba(255,255,255,0.18);
}
@@@ -960,7 +960,7 @@
display: flex;
align-items: center;
padding: 8px 0;
-- border-bottom: 1px solid rgba(255, 255, 255, 0.04);
++ border-bottom: 1px solid color-mix(in srgb, var(--text-primary, #fff) 4%, transparent);
gap: 12px;
}
@@@ -2346,14 +2346,14 @@
}
.bc-perm-icon.is-blocked { background: linear-gradient(135deg, #ef4444, #b91c1c); }
.bc-perm-mock {
-- border: 1px solid var(--border, rgba(255,255,255,.10));
++ border: 1px solid var(--border, color-mix(in srgb, var(--text-primary, #fff) 10%, transparent));
border-radius: 10px; overflow: hidden; margin-bottom: 12px;
-- background: rgba(255,255,255,.03);
++ background: color-mix(in srgb, var(--text-primary, #fff) 3%, transparent);
}
.bc-perm-mock-bar {
display: flex; align-items: center; gap: 7px;
padding: 7px 10px; font-size: .78rem; color: var(--text-muted, #9aa3b2);
-- background: rgba(255,255,255,.05); border-bottom: 1px solid var(--border, rgba(255,255,255,.08));
++ background: color-mix(in srgb, var(--text-primary, #fff) 5%, transparent); border-bottom: 1px solid var(--border, color-mix(in srgb, var(--text-primary, #fff) 8%, transparent));
}
.bc-perm-mock-pop { padding: 12px 12px 13px; }
.bc-perm-mock-btns { display: flex; gap: 8px; justify-content: flex-end; }
@@@ -2376,7 +2376,7 @@
.bc-mic-meter-wrap { margin-top: 7px; }
.bc-mic-meter {
width: 100%; height: 22px; display: block;
-- border-radius: 5px; background: rgba(255,255,255,.05);
++ border-radius: 5px; background: color-mix(in srgb, var(--text-primary, #fff) 5%, transparent);
}
.bc-mic-meter-status { font-size: .76rem; color: var(--text-muted, #9aa3b2); margin-top: 4px; display: block; }
.bc-mic-meter-status.is-good { color: #22c55e; }
@@@ -2386,7 +2386,7 @@
.bc-cap-row {
display: flex; align-items: center; gap: 11px;
padding: 8px 11px; border-radius: 8px;
-- background: rgba(255,255,255,.035);
++ background: color-mix(in srgb, var(--text-primary, #fff) 3.5%, transparent);
border: 1px solid transparent;
}
.bc-cap-row.is-on { border-color: rgba(34,197,94,.28); background: rgba(34,197,94,.07); }
@@@ -2652,7 +2652,7 @@ body.bc-studio-on .toast-container { z-index: 1500; }
.bcs-cam {
display: flex; align-items: center; gap: 10px; min-height: 48px; padding: 0 14px; border-radius: 14px; text-align: left;
font: inherit; font-size: 0.92rem; font-weight: 700; color: #fff; cursor: pointer;
-- background: rgba(255, 255, 255, 0.07); border: 1px solid rgba(255, 255, 255, 0.12);
++ background: color-mix(in srgb, var(--text-primary, #fff) 7%, transparent); border: 1px solid color-mix(in srgb, var(--text-primary, #fff) 12%, transparent);
}
.bcs-cam span { flex: 1; }
.bcs-cam > i:first-child { width: 18px; text-align: center; color: rgba(255, 255, 255, 0.7); }
@@@ -2725,23 +2725,23 @@ body.bc-studio-on #bc-chat-messages .chat-conn-status { display: block !importan
.bcs-sheet-who { flex: 1; min-width: 0; display: grid; }
.bcs-sheet-who b { font-size: 1.02rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.bcs-sheet-who small, .bcs-row small, .bcs-tile small { color: var(--text-secondary, #a1a1aa); font-size: 0.76rem; }
--.bcs-x { width: 40px; height: 40px; flex: none; border-radius: 50%; border: 0; background: var(--surface-raised, rgba(255,255,255,0.08)); color: inherit; cursor: pointer; }
++.bcs-x { width: 40px; height: 40px; flex: none; border-radius: 50%; border: 0; background: var(--surface-raised, color-mix(in srgb, var(--text-primary, #fff) 8%, transparent)); color: inherit; cursor: pointer; }
.bcs-chip {
display: inline-flex; align-items: center; gap: 6px; min-height: 40px; padding: 0 14px; border-radius: 999px; cursor: pointer;
-- border: 1px solid var(--border, rgba(255,255,255,0.14)); background: var(--surface-raised, rgba(255,255,255,0.06));
++ border: 1px solid var(--border, rgba(255,255,255,0.14)); background: var(--surface-raised, color-mix(in srgb, var(--text-primary, #fff) 6%, transparent));
color: inherit; font: inherit; font-weight: 600; font-size: 0.88rem;
}
.bcs-chip-strong { background: var(--accent-strong, #2563eb); color: var(--on-accent-strong, #fff); border-color: transparent; }
.bcs-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 8px; }
.bcs-tile {
display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 6px; min-height: 82px; padding: 10px 6px;
-- border-radius: 14px; border: 1px solid var(--border, rgba(255,255,255,0.08)); background: var(--surface-raised, rgba(255,255,255,0.05));
++ border-radius: 14px; border: 1px solid var(--border, color-mix(in srgb, var(--text-primary, #fff) 8%, transparent)); background: var(--surface-raised, color-mix(in srgb, var(--text-primary, #fff) 5%, transparent));
color: inherit; font: inherit; font-size: 0.8rem; font-weight: 600; line-height: 1.2; text-align: center; cursor: pointer;
}
.bcs-tile i { font-size: 1.15rem; color: var(--accent, #60a5fa); }
.bcs-row {
display: flex; align-items: center; justify-content: space-between; gap: 10px; margin-top: 12px; padding: 12px;
-- border-radius: 14px; border: 1px solid var(--border, rgba(255,255,255,0.08));
++ border-radius: 14px; border: 1px solid var(--border, color-mix(in srgb, var(--text-primary, #fff) 8%, transparent));
}
.bcs-row > div:first-child { display: grid; gap: 2px; min-width: 0; }
.bcs-row-acts { display: flex; gap: 6px; flex: none; }
@@@ -2758,7 +2758,7 @@ body.bc-studio-on #bc-chat-messages .chat-conn-status { display: block !importan
.bcs-video-head { display: flex; align-items: baseline; justify-content: space-between; gap: 8px; margin-bottom: 8px; }
.bcs-video-head h3 { margin: 0; }
.bcs-video-now { color: var(--text-secondary, #a1a1aa); font-size: 0.76rem; font-variant-numeric: tabular-nums; text-align: right; }
--.bcs-seg { display: grid; grid-auto-flow: column; grid-auto-columns: minmax(0, 1fr); gap: 4px; padding: 4px; margin-bottom: 8px; border-radius: 12px; background: var(--surface-raised, rgba(255,255,255,0.05)); }
++.bcs-seg { display: grid; grid-auto-flow: column; grid-auto-columns: minmax(0, 1fr); gap: 4px; padding: 4px; margin-bottom: 8px; border-radius: 12px; background: var(--surface-raised, color-mix(in srgb, var(--text-primary, #fff) 5%, transparent)); }
.bcs-seg-b {
min-height: 40px; border: 0; border-radius: 9px; background: none; color: inherit; cursor: pointer;
font: inherit; font-size: 0.86rem; font-weight: 700;
@@@ -2768,7 +2768,7 @@ body.bc-studio-on #bc-chat-messages .chat-conn-status { display: block !importan
.bcs-video .bcs-row { margin-top: 4px; }
.bcs-switch {
position: relative; flex: none; width: 52px; height: 32px; padding: 0; border-radius: 999px; cursor: pointer;
-- border: 1px solid var(--border, rgba(255,255,255,0.18)); background: var(--surface-raised, rgba(255,255,255,0.1));
++ border: 1px solid var(--border, rgba(255,255,255,0.18)); background: var(--surface-raised, color-mix(in srgb, var(--text-primary, #fff) 10%, transparent));
}
.bcs-switch-k { position: absolute; top: 3px; left: 3px; width: 24px; height: 24px; border-radius: 50%; background: #fff; transition: transform var(--ov-dur-2, 0.15s); }
.bcs-switch[aria-checked="true"] { background: #16a34a; border-color: transparent; }
@@@ -2866,7 +2866,7 @@ body.bc-golive-dock-on #page-broadcast { padding-bottom: calc(104px + var(--ovna
.bc-clip-name-acts { display: flex; gap: 8px; justify-content: flex-end; }
.bc-clip-name-acts button {
min-height: 40px; padding: 0 16px; border-radius: 999px; cursor: pointer; font: inherit; font-weight: 700; font-size: 0.9rem;
-- border: 1px solid var(--border, rgba(255,255,255,0.16)); background: var(--surface-raised, rgba(255,255,255,0.06)); color: inherit;
++ border: 1px solid var(--border, rgba(255,255,255,0.16)); background: var(--surface-raised, color-mix(in srgb, var(--text-primary, #fff) 6%, transparent)); color: inherit;
}
.bc-clip-name-acts .bc-clip-name-save { background: var(--accent-strong, #2563eb); color: var(--on-accent-strong, #fff); border-color: transparent; }
.bc-clip-name-acts button:disabled { opacity: 0.6; cursor: default; }
@@@ -3119,7 +3119,7 @@ body.bc-golive-dock-on #page-broadcast { padding-bottom: calc(104px + var(--ovna
.bcs-gl-dot::after { content: ""; position: absolute; inset: -6px; border-radius: 50%; border: 2px solid var(--live-red, #ef4444); animation: bcs-gl-ping 1.4s var(--ov-ease-out, ease-out) infinite; }
@keyframes bcs-gl-ping { from { transform: scale(.5); opacity: .9; } to { transform: scale(1.6); opacity: 0; } }
.bcs-gl-x { all: unset; box-sizing: border-box; cursor: pointer; display: grid; place-items: center; width: 34px; height: 34px; border-radius: 10px; color: var(--text-secondary); }
--.bcs-gl-x:hover, .bcs-gl-x:focus-visible { background: rgba(255,255,255,.08); color: var(--text-primary); }
++.bcs-gl-x:hover, .bcs-gl-x:focus-visible { background: color-mix(in srgb, var(--text-primary, #fff) 8%, transparent); color: var(--text-primary); }
.bcs-gl-sub { margin: 6px 0 10px; font-size: .92rem; color: var(--text-secondary); }
.bcs-gl-link { display: flex; align-items: center; gap: 8px; padding: 6px 6px 6px 12px; border-radius: 14px; background: var(--bg-primary, #0a0f1c); border: 1px solid var(--border, #1f2d47); }
.bcs-gl-link code { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font: 700 1rem/1.3 ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; color: var(--text-primary); background: none; user-select: all; -webkit-user-select: all; }
@@@ -3129,8 +3129,8 @@ body.bc-golive-dock-on #page-broadcast { padding-bottom: calc(104px + var(--ovna
.bcs-gl-copy.is-copied, .bc-ctrl-btn.is-copied { background: var(--success, #16a34a); color: #fff; }
.bcs-gl-copy:focus-visible, .bcs-gl-share:focus-visible { outline: 2px solid var(--accent-light, #60a5fa); outline-offset: 2px; }
.bcs-gl-more { display: flex; justify-content: flex-end; margin-top: 8px; }
--.bcs-gl-share { height: 34px; background: rgba(255,255,255,.08); color: var(--text-primary); }
--.bcs-gl-bar { position: absolute; left: 0; right: 0; bottom: 0; height: 3px; background: rgba(255,255,255,.06); }
++.bcs-gl-share { height: 34px; background: color-mix(in srgb, var(--text-primary, #fff) 8%, transparent); color: var(--text-primary); }
++.bcs-gl-bar { position: absolute; left: 0; right: 0; bottom: 0; height: 3px; background: color-mix(in srgb, var(--text-primary, #fff) 6%, transparent); }
.bcs-gl-bar i { display: block; height: 100%; background: linear-gradient(90deg, var(--live-red, #ef4444), var(--accent, #3b82f6)); transform-origin: left; transition: transform var(--ov-dur-2, .2s) linear; }
.bcs-gl-burst { position: absolute; left: 22px; top: 21px; width: 0; height: 0; pointer-events: none; }
.bcs-gl-burst i { position: absolute; width: 5px; height: 5px; margin: -2.5px; border-radius: 50%; background: hsl(var(--a), 90%, 66%); opacity: 0; animation: bcs-gl-spark .9s var(--ov-ease-out, cubic-bezier(.2,.8,.3,1)) var(--d) forwards; }
ddiff --git a/public/css/features/channel.css b/public/css/features/channel.css
iindex 52341354..b7fd7d83 100644
---- a/public/css/features/channel.css
++++ b/public/css/features/channel.css
@@@ -118,8 +118,8 @@
position: absolute;
inset: -35%;
background:
-- radial-gradient(circle at 40% 40%, rgba(255,255,255,0.08), transparent 20%),
-- linear-gradient(130deg, transparent 22%, rgba(255,255,255,0.08) 48%, transparent 74%);
++ radial-gradient(circle at 40% 40%, color-mix(in srgb, var(--text-primary, #fff) 8%, transparent), transparent 20%),
++ linear-gradient(130deg, transparent 22%, color-mix(in srgb, var(--text-primary, #fff) 8%, transparent) 48%, transparent 74%);
opacity: 0.45;
animation: playerLoaderDrift 18s linear infinite;
}
@@@ -130,7 +130,7 @@
inset: 0;
background:
radial-gradient(circle at 50% 50%, color-mix(in srgb, var(--loader-c) 14%, transparent), transparent 58%),
-- radial-gradient(circle at 24% 76%, rgba(255, 255, 255, 0.06), transparent 24%);
++ radial-gradient(circle at 24% 76%, color-mix(in srgb, var(--text-primary, #fff) 6%, transparent), transparent 24%);
opacity: 0.78;
mix-blend-mode: screen;
pointer-events: none;
@@@ -271,7 +271,7 @@
.player-loader-core {
inset: 37%;
-- background: radial-gradient(circle at 50% 45%, color-mix(in srgb, var(--loader-c) 26%, rgba(255,255,255,0.55)), rgba(255,255,255,0.03) 46%, transparent 72%);
++ background: radial-gradient(circle at 50% 45%, color-mix(in srgb, var(--loader-c) 26%, rgba(255,255,255,0.55)), color-mix(in srgb, var(--text-primary, #fff) 3%, transparent) 46%, transparent 72%);
box-shadow:
0 0 46px color-mix(in srgb, var(--loader-a) 34%, transparent),
inset 0 0 18px rgba(255,255,255,0.06);
@@@ -290,7 +290,7 @@
.player-loader-sheen {
inset: -12%;
-- background: linear-gradient(120deg, transparent 30%, rgba(255,255,255,0.10) 48%, transparent 66%);
++ background: linear-gradient(120deg, transparent 30%, color-mix(in srgb, var(--text-primary, #fff) 10%, transparent) 48%, transparent 66%);
transform: translateX(-42%) rotate(12deg);
animation: playerLoaderSheen 4.6s var(--ov-ease-in-out, ease-in-out) infinite;
}
@@@ -416,8 +416,8 @@
}
.player-loader-action {
-- border: 1px solid rgba(255,255,255,0.12);
-- background: linear-gradient(135deg, color-mix(in srgb, var(--loader-a) 42%, rgba(255,255,255,0.06)), color-mix(in srgb, var(--loader-b) 36%, rgba(255,255,255,0.03)));
++ border: 1px solid color-mix(in srgb, var(--text-primary, #fff) 12%, transparent);
++ background: linear-gradient(135deg, color-mix(in srgb, var(--loader-a) 42%, color-mix(in srgb, var(--text-primary, #fff) 6%, transparent)), color-mix(in srgb, var(--loader-b) 36%, color-mix(in srgb, var(--text-primary, #fff) 3%, transparent)));
color: #fff;
border-radius: 12px;
padding: 10px 14px;
@@@ -437,13 +437,13 @@
}
.player-loader-action.secondary {
-- background: rgba(255,255,255,0.04);
++ background: color-mix(in srgb, var(--text-primary, #fff) 4%, transparent);
color: rgba(226,232,240,0.9);
}
.player-loader-diagnostics {
border-radius: 14px;
-- border: 1px solid rgba(255,255,255,0.12);
++ border: 1px solid color-mix(in srgb, var(--text-primary, #fff) 12%, transparent);
background: rgba(2, 6, 23, 0.48);
overflow: hidden;
}
@@@ -748,14 +748,14 @@ button.viewer-badge:focus-visible { outline: 2px solid #93c5fd; outline-offset:
.live-tab-badges {
font-size: 0.6rem; font-weight: 600;
color: var(--text-muted);
-- background: rgba(255,255,255,0.06);
++ background: color-mix(in srgb, var(--text-primary, #fff) 6%, transparent);
padding: 1px 6px; border-radius: 4px;
text-transform: uppercase; letter-spacing: 0.5px;
display: inline-flex; align-items: center; gap: 4px;
}
.live-tab.active .live-tab-badges {
color: rgba(255,255,255,0.55);
-- background: rgba(255,255,255,0.1);
++ background: color-mix(in srgb, var(--text-primary, #fff) 10%, transparent);
}
.live-tab-uptime {
font-size: 0.65rem; color: var(--text-muted);
@@@ -815,7 +815,7 @@ button.viewer-badge:focus-visible { outline: 2px solid #93c5fd; outline-offset:
text-decoration: none;
padding: 2px 8px; border-radius: 10px;
display: inline-flex; align-items: center; gap: 5px;
-- background: rgba(255, 255, 255, 0.06);
++ background: color-mix(in srgb, var(--text-primary, #fff) 6%, transparent);
transition: all var(--ov-dur-2, 0.15s);
}
.ch-share-stream {
@@@ -1000,13 +1000,13 @@ button.viewer-badge:focus-visible { outline: 2px solid #93c5fd; outline-offset:
.ch-weather-full {
max-width: 100%; width: 100%;
padding: 6px 16px 10px; margin: 0;
-- border-top: 1px solid var(--border, rgba(255,255,255,0.08));
++ border-top: 1px solid var(--border, color-mix(in srgb, var(--text-primary, #fff) 8%, transparent));
}
.ch-weather-full .weather-hourly-scroll { max-width: 100%; }
.ch-weather-full .weather-hourly-scroll { display: flex; gap: 8px; }
.ch-weather-full .weather-hour { flex: 1 1 0; min-width: 64px; }
.ch-weather-full .weather-tabs, .ch-weather-full .weather-daily { width: 100%; }
--.ssp-header { display:flex; align-items:center; justify-content:space-between; padding: 8px 12px; border-bottom: 1px solid rgba(255,255,255,0.1); font-weight: 600; }
++.ssp-header { display:flex; align-items:center; justify-content:space-between; padding: 8px 12px; border-bottom: 1px solid color-mix(in srgb, var(--text-primary, #fff) 10%, transparent); font-weight: 600; }
.ssp-close { background: none; border: none; color: #aaa; cursor: pointer; font-size: 0.95rem; padding: 2px 4px; }
.ssp-close:hover { color: #fff; }
.ssp-body { padding: 8px 12px; display: grid; grid-template-columns: auto 1fr; gap: 5px 12px; }
@@@ -1040,7 +1040,7 @@ button.viewer-badge:focus-visible { outline: 2px solid #93c5fd; outline-offset:
.weather-meta { font-size: 0.72rem; color: var(--text-muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.weather-unit-toggle {
border: 1px solid var(--border);
-- background: var(--bg-elevated, rgba(255, 255, 255, 0.06));
++ background: var(--bg-elevated, color-mix(in srgb, var(--text-primary, #fff) 6%, transparent));
color: var(--text-primary);
border-radius: 999px;
padding: 2px 8px;
@@@ -1154,7 +1154,7 @@ button.viewer-badge:focus-visible { outline: 2px solid #93c5fd; outline-offset:
border-bottom:1px solid var(--border,#333);
}
.analytics-table td { padding:8px 12px; border-bottom:1px solid var(--border,#222); color:var(--text,#ddd); }
--.analytics-table tbody tr:hover { background:rgba(255,255,255,0.03); }
++.analytics-table tbody tr:hover { background:color-mix(in srgb, var(--text-primary, #fff) 3%, transparent); }
.analytics-table tbody tr:last-child td { border-bottom:none; }
@media (max-width: 1180px) {
.stream-layout { flex-direction: column; height: auto; }
@@@ -1199,7 +1199,7 @@ button.viewer-badge:focus-visible { outline: 2px solid #93c5fd; outline-offset:
transition: all var(--ov-dur-2, 0.15s);
}
.ct-badge.ct-self { font-style: italic; }
--.ct-count { font-size: 0.72rem; opacity: 0.7; background: rgba(255,255,255,.08); border-radius: 999px; padding: 0 6px; }
++.ct-count { font-size: 0.72rem; opacity: 0.7; background: color-mix(in srgb, var(--text-primary, #fff) 8%, transparent); border-radius: 999px; padding: 0 6px; }
.ct-badge.active .ct-count { opacity: 0.95; }
.ch-panel-bar {
display: flex; align-items: center; gap: 8px 14px; flex-wrap: wrap;
@@@ -1233,15 +1233,15 @@ button.viewer-badge:focus-visible { outline: 2px solid #93c5fd; outline-offset:
.ai-tl-moment-thumb { width: 96px; height: 54px; object-fit: cover; border-radius: 6px; flex-shrink: 0; background: rgba(0,0,0,0.3); }
.ai-tl-stamp { align-self: flex-start; font-size: 0.75rem; font-weight: 700; color: var(--accent, #8b5cf6); background: color-mix(in srgb, var(--accent, #8b5cf6) 12%, transparent); padding: 2px 8px; border-radius: 8px; text-decoration: none; display: inline-flex; align-items: center; gap: 5px; }
.ai-tl-stamp:hover { filter: brightness(1.2); }
--.ai-tl-stamp--novod { color: var(--text-muted); background: rgba(255,255,255,0.05); }
++.ai-tl-stamp--novod { color: var(--text-muted); background: color-mix(in srgb, var(--text-primary, #fff) 5%, transparent); }
.ai-tl-moment-desc { color: var(--text-secondary); font-size: 0.88rem; line-height: 1.45; }
.ai-tl-tags { display: flex; flex-wrap: wrap; gap: 5px; }
--.ai-tl-tag { font-size: 0.68rem; color: var(--text-muted); background: rgba(255,255,255,0.05); padding: 1px 7px; border-radius: 6px; }
++.ai-tl-tag { font-size: 0.68rem; color: var(--text-muted); background: color-mix(in srgb, var(--text-primary, #fff) 5%, transparent); padding: 1px 7px; border-radius: 6px; }
.ai-tl-empty { text-align: center; padding: 48px 20px; color: var(--text-muted); }
@media (max-width: 560px) { .ai-tl-moment-thumb { width: 72px; height: 40px; } }
--.ai-tl-months { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; margin: 0 0 18px; padding-bottom: 12px; border-bottom: 1px solid var(--border, rgba(255,255,255,0.06)); }
++.ai-tl-months { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; margin: 0 0 18px; padding-bottom: 12px; border-bottom: 1px solid var(--border, color-mix(in srgb, var(--text-primary, #fff) 6%, transparent)); }
.ai-tl-months-label { font-size: 0.72rem; text-transform: uppercase; letter-spacing: 0.05em; color: var(--text-muted); font-weight: 700; margin-right: 4px; display: inline-flex; align-items: center; gap: 5px; }
--.ai-tl-month { font-size: 0.75rem; font-weight: 600; color: var(--text-secondary); background: var(--bg-elevated, rgba(255,255,255,0.04)); border: 1px solid var(--border, rgba(255,255,255,0.08)); border-radius: 999px; padding: 3px 11px; cursor: pointer; transition: all var(--ov-dur-2, .15s); }
++.ai-tl-month { font-size: 0.75rem; font-weight: 600; color: var(--text-secondary); background: var(--bg-elevated, color-mix(in srgb, var(--text-primary, #fff) 4%, transparent)); border: 1px solid var(--border, color-mix(in srgb, var(--text-primary, #fff) 8%, transparent)); border-radius: 999px; padding: 3px 11px; cursor: pointer; transition: all var(--ov-dur-2, .15s); }
.ai-tl-month:hover { color: var(--accent, #8b5cf6); border-color: color-mix(in srgb, var(--accent, #8b5cf6) 45%, transparent); background: color-mix(in srgb, var(--accent, #8b5cf6) 10%, transparent); }
.ai-tl-moments-toggle { margin-top: 8px; display: inline-flex; align-items: center; gap: 7px; font-size: 0.8rem; font-weight: 600; color: var(--accent, #8b5cf6); background: color-mix(in srgb, var(--accent, #8b5cf6) 9%, transparent); border: 1px solid color-mix(in srgb, var(--accent, #8b5cf6) 22%, transparent); border-radius: 8px; padding: 5px 11px; cursor: pointer; transition: all var(--ov-dur-2, .15s); }
.ai-tl-moments-toggle:hover { background: color-mix(in srgb, var(--accent, #8b5cf6) 16%, transparent); }
@@@ -1250,8 +1250,8 @@ button.viewer-badge:focus-visible { outline: 2px solid #93c5fd; outline-offset:
.ai-tl-moments { margin-top: 10px; }
.ai-tl-session-vodlink { margin: 3px 0 6px; font-size: 0.78rem; }
.ai-tl-session-actions { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 8px; }
--.ai-tl-transcript-toggle { border-color: color-mix(in srgb, var(--text-muted) 30%, transparent); color: var(--text-secondary); background: var(--bg-elevated, rgba(255,255,255,0.03)); }
--.ai-tl-transcript { margin-top: 10px; max-height: 340px; overflow-y: auto; border: 1px solid var(--border, rgba(255,255,255,0.07)); border-radius: 10px; padding: 8px 12px; background: var(--bg-elevated, rgba(255,255,255,0.02)); }
++.ai-tl-transcript-toggle { border-color: color-mix(in srgb, var(--text-muted) 30%, transparent); color: var(--text-secondary); background: var(--bg-elevated, color-mix(in srgb, var(--text-primary, #fff) 3%, transparent)); }
++.ai-tl-transcript { margin-top: 10px; max-height: 340px; overflow-y: auto; border: 1px solid var(--border, color-mix(in srgb, var(--text-primary, #fff) 7%, transparent)); border-radius: 10px; padding: 8px 12px; background: var(--bg-elevated, color-mix(in srgb, var(--text-primary, #fff) 2%, transparent)); }
.ai-tl-transcript[hidden] { display: none; }
.ai-tl-ts:hover { text-decoration: underline; }
.ai-tl-tr-text { color: var(--text-secondary); }
@@@ -1261,10 +1261,10 @@ button.viewer-badge:focus-visible { outline: 2px solid #93c5fd; outline-offset:
/* Wide screens: the tabs sit in the main column (app-channel.js _placeBelowFold) and use its full width. */
.channel-below-fold.is-in-main { padding: 4px 0 28px; }
.channel-below-fold.is-in-main > .container { max-width: none; width: auto; margin: 0; padding: 0 18px; }
--.ch-about-ai-toggle { display: flex; flex-direction: column; gap: 3px; margin-bottom: 12px; padding: 10px 12px; border-radius: 10px; background: var(--bg-elevated, rgba(255,255,255,0.03)); border: 1px solid var(--border, rgba(255,255,255,0.07)); }
++.ch-about-ai-toggle { display: flex; flex-direction: column; gap: 3px; margin-bottom: 12px; padding: 10px 12px; border-radius: 10px; background: var(--bg-elevated, color-mix(in srgb, var(--text-primary, #fff) 3%, transparent)); border: 1px solid var(--border, color-mix(in srgb, var(--text-primary, #fff) 7%, transparent)); }
.ch-about-ai-hint { font-size: 0.78rem; }
.ai-tl-side-label { font-size: 0.95rem; font-weight: 800; color: var(--text-primary); margin: 26px 0 14px; display: flex; align-items: center; gap: 9px; padding-bottom: 7px; border-bottom: 2px solid color-mix(in srgb, var(--accent, #8b5cf6) 30%, transparent); }
--.ai-tl-subtabs { display: flex; gap: 6px; margin: 14px 0 16px; border-bottom: 1px solid var(--border, rgba(255,255,255,0.08)); }
++.ai-tl-subtabs { display: flex; gap: 6px; margin: 14px 0 16px; border-bottom: 1px solid var(--border, color-mix(in srgb, var(--text-primary, #fff) 8%, transparent)); }
.ai-tl-subtab { font-size: 0.9rem; font-weight: 700; color: var(--text-muted); background: none; border: none; border-bottom: 2px solid transparent; padding: 8px 14px; cursor: pointer; display: inline-flex; align-items: center; gap: 7px; margin-bottom: -1px; transition: color var(--ov-dur-2, .15s); }
.ai-tl-pane--hidden { display: none; }
.ov-pip:hover { border-color: rgba(255, 255, 255, .38); }
@@@ -1298,9 +1298,9 @@ button.viewer-badge:focus-visible { outline: 2px solid #93c5fd; outline-offset:
.ov-pip-resize { width: 26px; height: 26px; opacity: .8; }
.ov-pip-bar { opacity: 1; pointer-events: auto; }
}
--.ai-tl-tr-bar { display: flex; align-items: center; justify-content: space-between; gap: 10px; flex-wrap: wrap; margin: 0 0 8px; padding-bottom: 8px; border-bottom: 1px solid var(--border, rgba(255,255,255,0.07)); }
++.ai-tl-tr-bar { display: flex; align-items: center; justify-content: space-between; gap: 10px; flex-wrap: wrap; margin: 0 0 8px; padding-bottom: 8px; border-bottom: 1px solid var(--border, color-mix(in srgb, var(--text-primary, #fff) 7%, transparent)); }
.ai-tl-tr-filter { display: inline-flex; gap: 4px; }
--.ai-tl-tr-filter button { padding: 4px 10px; border-radius: 999px; border: 1px solid var(--border, rgba(255,255,255,0.1)); background: transparent; color: var(--text-secondary); font-size: 0.75rem; cursor: pointer; display: inline-flex; align-items: center; gap: 5px; }
++.ai-tl-tr-filter button { padding: 4px 10px; border-radius: 999px; border: 1px solid var(--border, color-mix(in srgb, var(--text-primary, #fff) 10%, transparent)); background: transparent; color: var(--text-secondary); font-size: 0.75rem; cursor: pointer; display: inline-flex; align-items: center; gap: 5px; }
.ai-tl-tr-filter button span { font-size: 0.68rem; color: var(--text-muted); }
.ai-tl-tr-filter button.active { background: color-mix(in srgb, var(--accent, #8b5cf6) 18%, transparent); border-color: var(--accent, #8b5cf6); color: var(--text-primary); }
.ai-tl-tr-hint { font-size: 0.72rem; color: var(--text-muted); }
@@@ -1308,7 +1308,7 @@ button.viewer-badge:focus-visible { outline: 2px solid #93c5fd; outline-offset:
.ai-tl-tr-sounds { align-items: center; padding: 2px 0; }
.ai-tl-ts--sound { color: var(--text-muted); font-weight: 600; }
.ai-tl-sound-strip { display: flex; flex-wrap: wrap; gap: 4px; }
--.ai-tl-sound { display: inline-flex; align-items: center; gap: 5px; padding: 2px 8px; border-radius: 999px; font-size: 0.7rem; color: var(--text-secondary); background: var(--bg-elevated, rgba(255,255,255,0.04)); border: 1px solid var(--border, rgba(255,255,255,0.07)); }
++.ai-tl-sound { display: inline-flex; align-items: center; gap: 5px; padding: 2px 8px; border-radius: 999px; font-size: 0.7rem; color: var(--text-secondary); background: var(--bg-elevated, color-mix(in srgb, var(--text-primary, #fff) 4%, transparent)); border: 1px solid var(--border, color-mix(in srgb, var(--text-primary, #fff) 7%, transparent)); }
.ai-tl-transcript[data-filter="speech"] .ai-tl-tr-sounds { display: none; }
.ai-tl-transcript[data-filter="sounds"] .ai-tl-tr-speech { display: none; }
/* ── from i18n-star.css ── */
ddiff --git a/public/css/features/dashboard.css b/public/css/features/dashboard.css
iindex d692dfee..41e95474 100644
---- a/public/css/features/dashboard.css
++++ b/public/css/features/dashboard.css
@@@ -48,7 +48,7 @@
.pc-connecting-head { font-size: 0.98rem; font-weight: 600; color: var(--text); display: inline-flex; align-items: center; gap: 10px; }
.pc-manual { font-size: 0.82rem; color: var(--text-muted, #999); display: flex; align-items: center; gap: 8px; justify-content: center; flex-wrap: wrap; }
.pc-copy-btn {
-- background: rgba(255,255,255,0.06); border: 1px solid var(--border); color: var(--text-secondary);
++ background: color-mix(in srgb, var(--text-primary, #fff) 6%, transparent); border: 1px solid var(--border); color: var(--text-secondary);
border-radius: 6px; padding: 3px 9px; font-size: 0.78rem; cursor: pointer; display: inline-flex; align-items: center; gap: 5px;
transition: background var(--ov-dur-2, .15s), border-color var(--ov-dur-2, .15s);
}
@@@ -442,7 +442,7 @@
display: flex;
align-items: center;
padding: 10px 0;
-- border-bottom: 1px solid rgba(255, 255, 255, 0.04);
++ border-bottom: 1px solid color-mix(in srgb, var(--text-primary, #fff) 4%, transparent);
gap: 12px;
}
ddiff --git a/public/css/features/home.css b/public/css/features/home.css
iindex 68cd7551..283817a1 100644
---- a/public/css/features/home.css
++++ b/public/css/features/home.css
@@@ -312,7 +312,7 @@ body.egg-rainbow { animation: eggRainbow 2.6s linear; }
color: var(--text-muted);
white-space: nowrap;
}
--.home-about-toggle:hover { background: color-mix(in srgb, var(--accent) 26%, rgba(255,255,255,0.05)); border-color: var(--accent); }
++.home-about-toggle:hover { background: color-mix(in srgb, var(--accent) 26%, color-mix(in srgb, var(--text-primary, #fff) 5%, transparent)); border-color: var(--accent); }
.home-about-toggle:active { transform: translateY(1px); }
.home-cta-banner.about-collapsed .home-about-body { max-height: 0; opacity: 0; margin: 0; }
.home-about-toggle-more { display: none; align-items: center; gap: 8px; }
@@@ -356,8 +356,8 @@ body.egg-rainbow { animation: eggRainbow 2.6s linear; }
display: grid; grid-template-columns: repeat(3, 1fr); gap: 14px;
margin: 4px 0 24px; text-align: left;
}
--.home-cta-feature:hover { transform: translateY(-3px); background: rgba(255,255,255,0.06); border-color: color-mix(in srgb, var(--accent) 35%, transparent); box-shadow: 0 12px 28px rgba(0,0,0,0.35); }
--.home-cta-feature.feat-star { border-color: color-mix(in srgb, var(--accent) 30%, transparent); background: linear-gradient(180deg, color-mix(in srgb, var(--accent) 8%, transparent), rgba(255,255,255,0.02)); }
++.home-cta-feature:hover { transform: translateY(-3px); background: color-mix(in srgb, var(--text-primary, #fff) 6%, transparent); border-color: color-mix(in srgb, var(--accent) 35%, transparent); box-shadow: 0 12px 28px rgba(0,0,0,0.35); }
++.home-cta-feature.feat-star { border-color: color-mix(in srgb, var(--accent) 30%, transparent); background: linear-gradient(180deg, color-mix(in srgb, var(--accent) 8%, transparent), color-mix(in srgb, var(--text-primary, #fff) 2%, transparent)); }
.home-cta-feature.feat-star::before { content: ''; position: absolute; top: 12px; right: 13px; width: 0.7rem; height: 0.7rem; background-color: var(--accent); -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='%23000'%3E%3Cpath d='M12 3.2l2.6 5.4 5.9.7-4.4 4 1.2 5.9L12 16.3l-5.3 2.9 1.2-5.9-4.4-4 5.9-.7Z'/%3E%3C/svg%3E") center / contain no-repeat; mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='%23000'%3E%3Cpath d='M12 3.2l2.6 5.4 5.9.7-4.4 4 1.2 5.9L12 16.3l-5.3 2.9 1.2-5.9-4.4-4 5.9-.7Z'/%3E%3C/svg%3E") center / contain no-repeat; opacity: 0.8; } /* the OpenVibe star, solid at this size */
.home-cta-buttons { display: flex; gap: 12px; justify-content: center; flex-wrap: wrap; }
.cta-btn-glow::after {
@@@ -436,7 +436,7 @@ body.egg-rainbow { animation: eggRainbow 2.6s linear; }
}
.home-changelog {
-- background: var(--bg-secondary, rgba(255,255,255,0.03));
++ background: var(--bg-secondary, color-mix(in srgb, var(--text-primary, #fff) 3%, transparent));
border: 1px solid var(--border);
border-radius: 12px;
padding: 14px 16px 10px;
@@@ -743,7 +743,7 @@ body.egg-rainbow { animation: eggRainbow 2.6s linear; }
.home-cta-feature:hover > i:first-child { transform: scale(1.1) rotate(-5deg); background: color-mix(in srgb, var(--accent) 22%, transparent); }
.cta-method::before, .home-cta-feature::after {
content: ''; position: absolute; inset: 0; pointer-events: none; border-radius: inherit;
-- background: linear-gradient(105deg, transparent 40%, rgba(255,255,255,0.06) 50%, transparent 60%);
++ background: linear-gradient(105deg, transparent 40%, color-mix(in srgb, var(--text-primary, #fff) 6%, transparent) 50%, transparent 60%);
transform: translateX(-100%); opacity: 0;
}
.home-cta-feature { overflow: hidden; }
@@@ -1182,7 +1182,7 @@ body.egg-rainbow { animation: eggRainbow 2.6s linear; }
.cta-btn-primary { background: var(--accent-strong, var(--accent, #3472d8)); color: var(--on-accent-strong, var(--on-accent, #fff));
box-shadow: 0 10px 28px color-mix(in srgb, var(--accent, #3b82f6) 35%, transparent); }
.cta-btn-primary:hover { filter: brightness(1.1); }
--.cta-btn-ghost { color: #e8e6e3; background: rgba(255,255,255,0.04); border: 1px solid color-mix(in srgb, var(--accent, #3b82f6) 40%, transparent); }
++.cta-btn-ghost { color: #e8e6e3; background: color-mix(in srgb, var(--text-primary, #fff) 4%, transparent); border: 1px solid color-mix(in srgb, var(--accent, #3b82f6) 40%, transparent); }
.cta-btn-ghost:hover { background: color-mix(in srgb, var(--accent, #3b82f6) 14%, transparent); }
.cta-checks { display: flex; flex-wrap: wrap; justify-content: center; gap: 6px 16px; list-style: none; margin: 0 0 18px; padding: 0;
font-size: 0.86rem; color: #bcbab6; }
ddiff --git a/public/css/features/rundown.css b/public/css/features/rundown.css
iindex 3c27e07e..074403af 100644
---- a/public/css/features/rundown.css
++++ b/public/css/features/rundown.css
@@@ -232,7 +232,7 @@ a.rd-use:hover b { color: var(--accent); }
/* Topics (/rundown/topics): a card's summary is a four-line teaser, and the topics after the first dozen fold under
their count. */
.rd-what-clip { display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 4; line-clamp: 4; overflow: hidden; }
--.rd-more { margin-top: 14px; border-radius: 14px; border: 1px solid var(--border, rgba(255,255,255,.1)); }
++.rd-more { margin-top: 14px; border-radius: 14px; border: 1px solid var(--border, color-mix(in srgb, var(--text-primary, #fff) 10%, transparent)); }
.rd-more > summary { padding: 14px 16px; cursor: pointer; font-weight: 700; list-style: none; display: flex; align-items: center; gap: 10px; }
.rd-more > summary::-webkit-details-marker { display: none; }
.rd-more > summary::before { content: ''; width: 8px; height: 8px; border-right: 2px solid currentColor; border-bottom: 2px solid currentColor; transform: translateY(-2px) rotate(-45deg); transition: transform var(--ov-dur-2, .18s) var(--ov-ease-out, ease); }
ddiff --git a/public/css/features/viewer-places.css b/public/css/features/viewer-places.css
iindex fddc49c0..6bc770b9 100644
---- a/public/css/features/viewer-places.css
++++ b/public/css/features/viewer-places.css
@@@ -11,7 +11,7 @@
.ovp-head {
display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 0 14px 6px;
font-size: 0.74rem; font-weight: 700; letter-spacing: 0.04em; text-transform: uppercase; color: rgba(255, 255, 255, 0.65);
-- border-bottom: 1px solid rgba(255, 255, 255, 0.1);
++ border-bottom: 1px solid color-mix(in srgb, var(--text-primary, #fff) 10%, transparent);
}
.ovp-total { display: inline-flex; align-items: center; gap: 6px; font-size: 0.9rem; letter-spacing: 0; text-transform: none; color: #fff; }
.ovp-total b, .ovp-n { font-variant-numeric: tabular-nums; }
@@@ -29,7 +29,7 @@
.ovp-n.is-live { font-size: 0.72rem; font-weight: 700; color: #fca5a5; text-transform: uppercase; letter-spacing: 0.05em; }
@media (prefers-reduced-motion: reduce) { .ovp { animation: none; } }
/* A section under the places (the live studio's restreams): each with a state dot, and a way to manage them. */
--.ovp-extra { margin-top: 4px; padding-top: 4px; border-top: 1px solid rgba(255, 255, 255, 0.1); }
++.ovp-extra { margin-top: 4px; padding-top: 4px; border-top: 1px solid color-mix(in srgb, var(--text-primary, #fff) 10%, transparent); }
.ovp-extra[hidden] { display: none; }
.ovp-sub { padding: 4px 14px 0; font-size: 0.7rem; font-weight: 700; letter-spacing: 0.05em; text-transform: uppercase; color: rgba(255, 255, 255, 0.55); }
.ovp-sdot { width: 8px; height: 8px; border-radius: 50%; background: #9ca3af; }
@@@ -41,6 +41,6 @@
.ovp-action {
display: block; width: calc(100% - 20px); margin: 6px 10px 2px; min-height: 36px; border-radius: 10px; cursor: pointer;
font: inherit; font-size: 0.82rem; font-weight: 700; color: #fff;
-- background: rgba(255, 255, 255, 0.08); border: 1px solid rgba(255, 255, 255, 0.14);
++ background: color-mix(in srgb, var(--text-primary, #fff) 8%, transparent); border: 1px solid rgba(255, 255, 255, 0.14);
}
.ovp-action:hover, .ovp-action:focus-visible { background: rgba(255, 255, 255, 0.14); outline: none; }
ddiff --git a/public/css/home-fx.css b/public/css/home-fx.css
iindex 35dbad15..9905f07e 100644
---- a/public/css/home-fx.css
++++ b/public/css/home-fx.css
@@@ -50,7 +50,7 @@
font: inherit; font-weight: 700; font-size: clamp(0.88rem, 1.6vw, 0.98rem); letter-spacing: 0.01em;
color: var(--text-primary); text-decoration: none; cursor: pointer; overflow: hidden;
background:
-- linear-gradient(180deg, rgba(255,255,255,0.07), rgba(255,255,255,0) 46%),
++ linear-gradient(180deg, color-mix(in srgb, var(--text-primary, #fff) 7%, transparent), rgba(255,255,255,0) 46%),
color-mix(in srgb, var(--c) 10%, var(--bg-card));
border: 1px solid color-mix(in srgb, var(--c) 42%, var(--border));
box-shadow: 0 2px 0 0 color-mix(in srgb, var(--c) 22%, transparent), 0 8px 20px rgba(0,0,0,0.3), inset 0 1px 0 rgba(255,255,255,0.09);
ddiff --git a/public/css/home-tour.css b/public/css/home-tour.css
iindex 70125f09..9d41be77 100644
---- a/public/css/home-tour.css
++++ b/public/css/home-tour.css
@@@ -7,7 +7,7 @@
.tour {
position: relative; border-radius: 22px; padding: 24px 24px 22px; color: var(--text-primary); overflow: hidden;
background: color-mix(in srgb, var(--bg-card) 62%, transparent);
-- border: 1px solid rgba(255,255,255,0.08);
++ border: 1px solid color-mix(in srgb, var(--text-primary, #fff) 8%, transparent);
box-shadow: 0 24px 60px rgba(0,0,0,0.35), inset 0 1px 0 rgba(255,255,255,0.06);
/* No backdrop blur: it made this 1.2MP card its own layer re-blurring the page behind it. The
fill is opaque enough on its own. The blur was also the only thing making .tour a stacking
@@@ -116,7 +116,7 @@
.tour-features { display: flex; flex-wrap: wrap; justify-content: center; gap: 6px; margin: 20px 0 0; }
.tour-feat { display: inline-flex; align-items: center; gap: 6px; padding: 5px 11px; border-radius: 999px; font-size: 0.76rem; font-weight: 700; color: var(--text-secondary);
-- background: color-mix(in srgb, var(--bg-tertiary) 70%, transparent); border: 1px solid rgba(255,255,255,0.08); transition: color var(--ov-dur-2, 0.2s), border-color var(--ov-dur-2, 0.2s), transform var(--ov-dur-2, 0.2s);
++ background: color-mix(in srgb, var(--bg-tertiary) 70%, transparent); border: 1px solid color-mix(in srgb, var(--text-primary, #fff) 8%, transparent); transition: color var(--ov-dur-2, 0.2s), border-color var(--ov-dur-2, 0.2s), transform var(--ov-dur-2, 0.2s);
animation: tourPop var(--ov-dur-4, 0.5s) var(--ov-ease-spring, cubic-bezier(.2,1.5,.3,1)) both; animation-delay: calc(0.15s + var(--i, 0) * 55ms); }
.tour-feat i { color: var(--accent-light, var(--accent)); }
.tour-feat:hover { color: var(--text-primary); border-color: color-mix(in srgb, var(--accent) 50%, transparent); transform: translateY(-1px); }
@@@ -209,7 +209,7 @@
.ovg-quest-sheen {
position: absolute; top: 0; bottom: 0; left: -40%; width: 32%; z-index: 1; pointer-events: none;
-- background: linear-gradient(100deg, transparent, rgba(255,255,255,0.10), transparent);
++ background: linear-gradient(100deg, transparent, color-mix(in srgb, var(--text-primary, #fff) 10%, transparent), transparent);
animation: questSheen 7s var(--ov-ease-in-out, ease-in-out) infinite;
}
@keyframes questSheen { 0%, 58% { transform: translateX(0); } 100% { transform: translateX(440%); } }
ddiff --git a/public/css/messenger.css b/public/css/messenger.css
iindex db53bddf..4abe19cc 100644
---- a/public/css/messenger.css
++++ b/public/css/messenger.css
@@@ -672,7 +672,7 @@
white-space: nowrap;
}
.msg-thread-dropdown-item:hover {
-- background: var(--bg-hover, rgba(255,255,255,0.06));
++ background: var(--bg-hover, color-mix(in srgb, var(--text-primary, #fff) 6%, transparent));
}
.msg-thread-dropdown-item.danger {
color: #f38ba8;
ddiff --git a/public/css/style.css b/public/css/style.css
iindex 799b2d5a..74fda2a8 100644
---- a/public/css/style.css
++++ b/public/css/style.css
@@@ -169,7 +169,7 @@ html { -webkit-tap-highlight-color: transparent; }
position: fixed; top: 0; left: 0; right: 0; z-index: 1000;
height: var(--navbar-h);
background: var(--glass);
-- border-bottom: 1px solid rgba(255,255,255,0.06);
++ border-bottom: 1px solid color-mix(in srgb, var(--text-primary, #fff) 6%, transparent);
display: flex; align-items: center;
padding: 0 16px;
gap: 16px;
@@@ -235,8 +235,8 @@ body.ov-nav-overlay .navbar.ovnav-top {
text-decoration: none;
}
.nav-link:hover {
-- background: rgba(255,255,255,0.06);
-- border-color: rgba(255,255,255,0.08);
++ background: color-mix(in srgb, var(--text-primary, #fff) 6%, transparent);
++ border-color: color-mix(in srgb, var(--text-primary, #fff) 8%, transparent);
color: var(--text-primary);
}
.nav-link.active {
@@@ -499,7 +499,7 @@ body.ov-nav-overlay .navbar.ovnav-top {
font-size: 0.82rem; color: var(--text-secondary); margin: 3px 0 0;
}
.network-card:hover {
-- background: rgba(255,255,255,0.06);
++ background: color-mix(in srgb, var(--text-primary, #fff) 6%, transparent);
border-color: var(--accent-dark);
transform: translateY(-2px);
box-shadow: 0 4px 20px rgba(0,0,0,0.3);
@@@ -583,7 +583,7 @@ body.ov-nav-overlay .navbar.ovnav-top {
gap: 4px;
padding: 12px 14px;
border-radius: var(--radius);
-- background: linear-gradient(180deg, rgba(255,255,255,0.02), rgba(255,255,255,0.01));
++ background: linear-gradient(180deg, color-mix(in srgb, var(--text-primary, #fff) 2%, transparent), color-mix(in srgb, var(--text-primary, #fff) 1%, transparent));
border: 1px solid var(--border);
}
.openvibeapp-meta-label {
@@@ -706,7 +706,7 @@ body.ov-nav-overlay .navbar.ovnav-top {
padding: 12px 14px;
border: 1px solid var(--border);
border-radius: var(--radius-lg);
-- background: linear-gradient(180deg, rgba(255,255,255,0.02), rgba(255,255,255,0.01));
++ background: linear-gradient(180deg, color-mix(in srgb, var(--text-primary, #fff) 2%, transparent), color-mix(in srgb, var(--text-primary, #fff) 1%, transparent));
}
.media-filter-chip {
display: inline-flex;
@@@ -922,7 +922,7 @@ body.ov-nav-overlay .navbar.ovnav-top {
font-size: 0.65rem;
font-weight: 600;
vertical-align: middle;
-- background: rgba(255,255,255,.12);
++ background: color-mix(in srgb, var(--text-primary, #fff) 12%, transparent);
color: #fff;
}
/* On a thumbnail: a small round icon in the corner, not a purple label over the picture (owner, 2026-10-31: the
@@@ -1313,7 +1313,7 @@ a.pulse-card:hover { border-color: var(--accent); transform: translateY(-2px); }
.home-about-toggle {
display: inline-flex; align-items: center; gap: 8px;
margin: 6px auto 2px; padding: 9px 18px;
-- background: color-mix(in srgb, var(--accent) 16%, rgba(255,255,255,0.04));
++ background: color-mix(in srgb, var(--accent) 16%, color-mix(in srgb, var(--text-primary, #fff) 4%, transparent));
border: 1px solid color-mix(in srgb, var(--accent) 45%, transparent);
color: #f4f2ef; font-size: 0.86rem; font-weight: 700; letter-spacing: 0.01em;
border-radius: 999px; cursor: pointer;
@@@ -1369,7 +1369,7 @@ a.pulse-card:hover { border-color: var(--accent); transform: translateY(-2px); }
.home-cta-banner .cta-method span,
.home-cta-banner .home-cta-feature > span { color: #918f8b; }
.home-cta-banner .cta-method span b { color: #d6d4d0; }
--.home-cta-banner .btn-outline { color: #e8e6e3; border-color: color-mix(in srgb, var(--accent) 40%, transparent); background: rgba(255,255,255,0.03); }
++.home-cta-banner .btn-outline { color: #e8e6e3; border-color: color-mix(in srgb, var(--accent) 40%, transparent); background: color-mix(in srgb, var(--text-primary, #fff) 3%, transparent); }
.home-cta-banner .btn-outline:hover { background: color-mix(in srgb, var(--accent) 14%, transparent); border-color: var(--accent); color: #fff; }
/* Eyebrow */
@@@ -1409,8 +1409,8 @@ a.pulse-card:hover { border-color: var(--accent); transform: translateY(-2px); }
/* Three streaming methods */
.cta-method {
position: relative; padding: 18px 18px 16px; border-radius: 14px;
-- background: linear-gradient(180deg, rgba(255,255,255,0.045), rgba(255,255,255,0.015));
-- border: 1px solid rgba(255,255,255,0.08);
++ background: linear-gradient(180deg, color-mix(in srgb, var(--text-primary, #fff) 4.5%, transparent), color-mix(in srgb, var(--text-primary, #fff) 1.5%, transparent));
++ border: 1px solid color-mix(in srgb, var(--text-primary, #fff) 8%, transparent);
transition: transform var(--ov-dur-2, .18s) var(--ov-ease-out, ease), border-color var(--ov-dur-2, .18s) var(--ov-ease-out, ease), box-shadow var(--ov-dur-2, .18s) var(--ov-ease-out, ease);
overflow: hidden;
}
@@@ -1424,8 +1424,8 @@ a.pulse-card:hover { border-color: var(--accent); transform: translateY(-2px); }
.home-cta-feature {
position: relative; display: flex; flex-direction: column; gap: 5px;
padding: 16px 16px; border-radius: 13px;
-- background: rgba(255,255,255,0.028);
-- border: 1px solid rgba(255,255,255,0.07);
++ background: color-mix(in srgb, var(--text-primary, #fff) 2.8%, transparent);
++ border: 1px solid color-mix(in srgb, var(--text-primary, #fff) 7%, transparent);
transition: transform var(--ov-dur-2, .16s) var(--ov-ease-out, ease), background var(--ov-dur-2, .16s) var(--ov-ease-out, ease), border-color var(--ov-dur-2, .16s) var(--ov-ease-out, ease), box-shadow var(--ov-dur-2, .16s) var(--ov-ease-out, ease);
/* `both` holds the from-state (opacity 0) for the whole animation-delay, and a subtree whose
rendering is skipped or deferred can sit in that state indefinitely — which is how a card
@@@ -1672,7 +1672,7 @@ a.pulse-card:hover { border-color: var(--accent); transform: translateY(-2px); }
align-items: flex-start;
margin: 12px clamp(20px, 4vw, 42px) 0;
padding: 26px 28px;
-- border-top: 1px solid rgba(255,255,255,0.06);
++ border-top: 1px solid color-mix(in srgb, var(--text-primary, #fff) 6%, transparent);
margin-bottom: 0;
padding-bottom: clamp(28px, 5vw, 42px);
}
@@@ -1939,7 +1939,7 @@ a.pulse-card:hover { border-color: var(--accent); transform: translateY(-2px); }
height: 10px;
border-radius: 999px;
overflow: hidden;
-- background: rgba(255,255,255,0.07);
++ background: color-mix(in srgb, var(--text-primary, #fff) 7%, transparent);
box-shadow: inset 0 0 0 1px rgba(255,255,255,0.04);
}
@@@ -2007,7 +2007,7 @@ a.pulse-card:hover { border-color: var(--accent); transform: translateY(-2px); }
padding: 11px 14px;
font-size: 0.82rem;
color: rgba(226, 232, 240, 0.88);
-- border-bottom: 1px solid rgba(255,255,255,0.08);
++ border-bottom: 1px solid color-mix(in srgb, var(--text-primary, #fff) 8%, transparent);
}
.player-loader-diagnostics pre {
@@@ -2348,8 +2348,8 @@ a.pulse-card:hover { border-color: var(--accent); transform: translateY(-2px); }
box-shadow: 0 12px 28px rgba(0,0,0,0.35);
}
.fullscreen-chat-textarea {
-- background: rgba(255,255,255,0.08);
-- border-color: rgba(255,255,255,0.12);
++ background: color-mix(in srgb, var(--text-primary, #fff) 8%, transparent);
++ border-color: color-mix(in srgb, var(--text-primary, #fff) 12%, transparent);
color: #fff;
}
.fullscreen-chat-textarea::placeholder {
@@@ -2401,7 +2401,7 @@ a.pulse-card:hover { border-color: var(--accent); transform: translateY(-2px); }
.control-keybind {
position: absolute; top: 2px; right: 4px;
font-size: 0.55rem; font-weight: 700;
-- background: rgba(255,255,255,0.12); color: var(--text-secondary);
++ background: color-mix(in srgb, var(--text-primary, #fff) 12%, transparent); color: var(--text-secondary);
padding: 1px 4px; border-radius: 3px;
line-height: 1.2; pointer-events: none;
}
@@@ -2602,7 +2602,7 @@ a.pulse-card:hover { border-color: var(--accent); transform: translateY(-2px); }
/* Hide badges */
.chat-hide-badges .chat-badge { display: none !important; }
/* Alternating backgrounds */
--.chat-alt-bg .chat-msg:nth-child(even) { background: rgba(255,255,255,0.02); border-radius: 2px; padding: 2px 4px; }
++.chat-alt-bg .chat-msg:nth-child(even) { background: color-mix(in srgb, var(--text-primary, #fff) 2%, transparent); border-radius: 2px; padding: 2px 4px; }
/* Hide system messages */
.chat-hide-system .chat-msg.system { display: none !important; }
/* "Show All Chats Under This Streamer" off → hide other slots' messages */
@@@ -2746,7 +2746,7 @@ a.pulse-card:hover { border-color: var(--accent); transform: translateY(-2px); }
}
.chat-reply-bar-close:hover {
color: var(--text-primary, #fff);
-- background: rgba(255,255,255,0.08);
++ background: color-mix(in srgb, var(--text-primary, #fff) 8%, transparent);
}
/* ── Reply flash (scroll-to highlight) ───────────────────── */
@@@ -2831,7 +2831,7 @@ a.pulse-card:hover { border-color: var(--accent); transform: translateY(-2px); }
overflow: hidden;
border-radius: 12px;
background: rgba(0,0,0,0.24);
-- border: 1px solid rgba(255,255,255,0.08);
++ border: 1px solid color-mix(in srgb, var(--text-primary, #fff) 8%, transparent);
}
.gotti-card-media {
background: rgba(0,0,0,0.25);
@@@ -2901,7 +2901,7 @@ a.pulse-card:hover { border-color: var(--accent); transform: translateY(-2px); }
/* ── Cross-feed messages (global/other streams in stream chat) ── */
.chat-msg-crossfeed {
-- border-left: 2px solid rgba(255,255,255,0.08);
++ border-left: 2px solid color-mix(in srgb, var(--text-primary, #fff) 8%, transparent);
padding-left: 6px;
opacity: 0.85;
}
@@@ -3125,7 +3125,7 @@ a.pulse-card:hover { border-color: var(--accent); transform: translateY(-2px); }
text-overflow: ellipsis;
}
.ac-item:hover, .ac-item.ac-selected {
-- background: var(--bg-hover, rgba(255,255,255,0.08));
++ background: var(--bg-hover, color-mix(in srgb, var(--text-primary, #fff) 8%, transparent));
}
.ac-item.ac-selected {
background: color-mix(in srgb, var(--accent-dark, #7c3aed) 25%, var(--bg-card, #1e1e2e));
@@@ -3558,7 +3558,7 @@ a.pulse-card:hover { border-color: var(--accent); transform: translateY(-2px); }
.aiv-status { font-size: 0.75rem; font-weight: 600; padding: 2px 8px; border-radius: 999px; }
.aiv-status.ok { background: rgba(52,211,153,0.18); color: #34d399; }
.aiv-status.off { background: rgba(148,148,148,0.18); color: #b0b0b0; }
--.aiv-meter-bar { margin-top: 8px; height: 8px; border-radius: 999px; background: rgba(255,255,255,0.08); overflow: hidden; }
++.aiv-meter-bar { margin-top: 8px; height: 8px; border-radius: 999px; background: color-mix(in srgb, var(--text-primary, #fff) 8%, transparent); overflow: hidden; }
.aiv-meter-fill { height: 100%; background: linear-gradient(90deg, #4ecdc4, #60a5fa); transition: width var(--ov-dur-3, 0.3s); }
.aiv-meter-fill.over { background: linear-gradient(90deg, #fb923c, #ff6b6b); }
@@@ -4411,13 +4411,13 @@ body :is(.modal-overlay, .bc-ws-confirm-overlay, .bc-modal, .bc-perm-overlay, .b
}
.live-tab.active {
color: var(--text-primary); font-weight: 600;
-- background: rgba(255,255,255,0.03);
++ background: color-mix(in srgb, var(--text-primary, #fff) 3%, transparent);
border-bottom-color: var(--accent);
}
.live-tab-num {
font-size: 0.62rem; font-weight: 700;
color: var(--text-muted);
-- background: rgba(255,255,255,0.06);
++ background: color-mix(in srgb, var(--text-primary, #fff) 6%, transparent);
width: 18px; height: 18px; border-radius: 50%;
display: flex; align-items: center; justify-content: center;
flex-shrink: 0; line-height: 1;
@@@ -4461,7 +4461,7 @@ body :is(.modal-overlay, .bc-ws-confirm-overlay, .bc-modal, .bc-perm-overlay, .b
width: 58px;
height: 58px;
border-radius: 50%;
-- background: linear-gradient(140deg, color-mix(in srgb, var(--accent) 82%, white 8%), rgba(255,255,255,0.08));
++ background: linear-gradient(140deg, color-mix(in srgb, var(--accent) 82%, white 8%), color-mix(in srgb, var(--text-primary, #fff) 8%, transparent));
box-shadow:
0 0 0 1px rgba(255,255,255,0.1),
0 18px 32px rgba(0,0,0,0.3),
@@@ -4486,7 +4486,7 @@ body :is(.modal-overlay, .bc-ws-confirm-overlay, .bc-modal, .bc-perm-overlay, .b
}
.ch-hs-badge strong { font-weight: 800; }
.ch-hs-badge i { font-size: 0.7rem; }
--.ch-restream-badge:hover { background: rgba(255, 255, 255, 0.12); filter: brightness(1.3); }
++.ch-restream-badge:hover { background: color-mix(in srgb, var(--text-primary, #fff) 12%, transparent); filter: brightness(1.3); }
.ch-restream-badge i { font-size: 0.7rem; }
@keyframes pulse-live {
0%, 100% { opacity: 1; }
@@@ -4810,7 +4810,7 @@ button.uai-tl-more { background: none; border: none; cursor: pointer; padding: 0
/* "Also live:" hop bar above chat */
.chat-stream-hops {
display: flex; flex-wrap: wrap; align-items: center; gap: 6px;
-- padding: 6px 10px; border-bottom: 1px solid var(--border, rgba(255,255,255,0.1));
++ padding: 6px 10px; border-bottom: 1px solid var(--border, color-mix(in srgb, var(--text-primary, #fff) 10%, transparent));
background: color-mix(in srgb, var(--accent) 8%, transparent);
font-size: 0.78rem;
}
@@@ -4896,7 +4896,7 @@ button.uai-tl-more { background: none; border: none; cursor: pointer; padding: 0
.clip-time-display {
font-size: 1.15rem; font-weight: 700; font-variant-numeric: tabular-nums;
padding: 4px 10px; min-width: 60px; text-align: center;
-- background: rgba(255,255,255,0.05); border-radius: 8px;
++ background: color-mix(in srgb, var(--text-primary, #fff) 5%, transparent); border-radius: 8px;
}
/* Duration display */
@@@ -4933,7 +4933,7 @@ button.uai-tl-more { background: none; border: none; cursor: pointer; padding: 0
border-bottom: 1px solid var(--border);
transition: background var(--ov-dur-2, 0.15s) var(--ov-ease-out, ease);
}
--.comment-item:hover { background: rgba(255,255,255,0.02); }
++.comment-item:hover { background: color-mix(in srgb, var(--text-primary, #fff) 2%, transparent); }
.comment-item:last-child { border-bottom: none; }
.comment-avatar {
@@@ -5606,7 +5606,7 @@ body.theme-light .btn-outline:hover {
transition: background var(--ov-dur-1, 0.12s);
}
.call-peer-menu-item:hover {
-- background: var(--bg-tertiary, rgba(255,255,255,0.05));
++ background: var(--bg-tertiary, color-mix(in srgb, var(--text-primary, #fff) 5%, transparent));
}
.call-peer-menu-item i {
width: 16px;
@@@ -5858,7 +5858,7 @@ body.theme-light .btn-outline:hover {
margin-top: 8px;
font-size: 0.76rem;
color: var(--text-secondary, #aaa);
-- background: rgba(255,255,255,0.04);
++ background: color-mix(in srgb, var(--text-primary, #fff) 4%, transparent);
border: 1px solid var(--border);
border-radius: var(--radius);
padding: 6px 8px;
@@@ -5966,7 +5966,7 @@ body.theme-light .btn-outline:hover {
transition: background var(--ov-dur-2, 0.15s);
}
.update-entry:hover {
-- background: var(--bg-tertiary, rgba(255,255,255,0.04));
++ background: var(--bg-tertiary, color-mix(in srgb, var(--text-primary, #fff) 4%, transparent));
}
.update-hash {
font-family: 'JetBrains Mono', 'Fira Code', monospace;
@@@ -6694,7 +6694,7 @@ textarea.paste-textarea {
}
.screenshot-format-tag {
font-size: 0.7rem;
-- background: var(--bg-secondary, rgba(255,255,255,0.06));
++ background: var(--bg-secondary, color-mix(in srgb, var(--text-primary, #fff) 6%, transparent));
border: 1px solid var(--border);
border-radius: 6px;
padding: 2px 8px;
@@@ -6908,7 +6908,7 @@ textarea.paste-textarea {
cursor: not-allowed;
}
.vc-ctrl-btn:hover {
-- background: var(--bg-hover, rgba(255,255,255,0.1));
++ background: var(--bg-hover, color-mix(in srgb, var(--text-primary, #fff) 10%, transparent));
transform: scale(1.08);
}
.vc-ctrl-btn.active {
@@@ -7083,7 +7083,7 @@ textarea.paste-textarea {
align-items: center;
justify-content: center;
color: var(--text-secondary);
-- background: rgba(255, 255, 255, 0.08);
++ background: color-mix(in srgb, var(--text-primary, #fff) 8%, transparent);
}
.vc-call-heading {
margin-top: 16px;
@@@ -7181,7 +7181,7 @@ textarea.paste-textarea {
border-radius: 10px;
padding: 8px 10px;
font-weight: 600;
-- background: rgba(255, 255, 255, 0.08);
++ background: color-mix(in srgb, var(--text-primary, #fff) 8%, transparent);
color: var(--text-primary);
display: inline-flex;
align-items: center;
@@@ -7990,7 +7990,7 @@ body.fabs-tucked .messenger-toggle, body.fabs-tucked .floating-chat-fab, body.fa
justify-content: space-between;
gap: 10px;
padding: 8px 0;
-- border-bottom: 1px solid rgba(255, 255, 255, 0.05);
++ border-bottom: 1px solid color-mix(in srgb, var(--text-primary, #fff) 5%, transparent);
font-size: 0.86rem;
color: var(--text-secondary);
}
@@@ -8802,7 +8802,7 @@ body.fabs-tucked .messenger-toggle, body.fabs-tucked .floating-chat-fab, body.fa
.paste-ai-tags { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 8px; }
.paste-ai-tag {
font-size: 0.74rem; padding: 2px 9px; border-radius: 12px;
-- background: rgba(255,255,255,0.08); color: var(--text-secondary, #bbb);
++ background: color-mix(in srgb, var(--text-primary, #fff) 8%, transparent); color: var(--text-secondary, #bbb);
}
/* ═══ Stream header polish (avatar image, larger title/desc, link) ═══ */
@@@ -9158,7 +9158,7 @@ body.fabs-tucked .messenger-toggle, body.fabs-tucked .floating-chat-fab, body.fa
transition: transform var(--ov-dur-1, .12s) var(--ov-ease-out, ease), box-shadow var(--ov-dur-1, .12s) var(--ov-ease-out, ease);
}
.cgw-goal:hover { transform: translateY(-1px); box-shadow: 0 4px 14px rgba(0,0,0,.35); }
--.cgw-goal.has-img { border-color: rgba(255,255,255,.08); }
++.cgw-goal.has-img { border-color: color-mix(in srgb, var(--text-primary, #fff) 8%, transparent); }
.cgw-media {
position: absolute; inset: 0; width: 100%; height: 100%;
object-fit: cover; object-position: right center;
@@@ -9263,7 +9263,7 @@ body.fabs-tucked .messenger-toggle, body.fabs-tucked .floating-chat-fab, body.fa
.ai-tl-session-title a { color: var(--text-primary); text-decoration: none; }
.ai-tl-session-title a:hover { color: var(--accent, #8b5cf6); }
.ai-tl-session-meta i { opacity: 0.75; }
--.ai-tl-moment { display: flex; gap: 10px; padding: 8px; border-radius: 10px; background: var(--bg-elevated, rgba(255,255,255,0.03)); border: 1px solid var(--border, rgba(255,255,255,0.06)); }
++.ai-tl-moment { display: flex; gap: 10px; padding: 8px; border-radius: 10px; background: var(--bg-elevated, color-mix(in srgb, var(--text-primary, #fff) 3%, transparent)); border: 1px solid var(--border, color-mix(in srgb, var(--text-primary, #fff) 6%, transparent)); }
.ai-tl-moment-body { min-width: 0; display: flex; flex-direction: column; gap: 4px; }
.ai-tl-empty i { font-size: 2rem; color: color-mix(in srgb, var(--accent, #8b5cf6) 60%, transparent); margin-bottom: 12px; }
.ai-tl-empty p { margin: 4px 0; }
@@@ -9962,7 +9962,7 @@ body.ov-panel-open #floating-chat-fab { opacity: 0; pointer-events: none; transf
.openvibe-navbar.navbar {
position: fixed; top: 0; left: 0; right: 0; z-index: 1000;
height: var(--navbar-h); padding: 0 clamp(10px, 2vw, 16px); gap: clamp(6px, 1.2vw, 14px);
-- background: var(--glass); border-bottom: 1px solid rgba(255,255,255,0.06);
++ background: var(--glass); border-bottom: 1px solid color-mix(in srgb, var(--text-primary, #fff) 6%, transparent);
backdrop-filter: blur(18px); -webkit-backdrop-filter: blur(18px);
--ovnav-h: var(--navbar-h);
}
ddiff --git a/public/dmca.html b/public/dmca.html
iindex ac411918..25296d91 100644
---- a/public/dmca.html
++++ b/public/dmca.html
@@@ -169,7 +169,7 @@
font-size: 0.88rem;
}
.strike-table th {
-- background: rgba(255,255,255,0.04);
++ background: color-mix(in srgb, var(--text-primary, #fff) 4%, transparent);
color: var(--muted);
text-align: left;
padding: 8px 12px;