Files
tutorialvault/src/styles/player.css
Your Name c0a8eca955 fix: WCAG AAA contrast compliance, speed menu z-index, custom app icon
- Fix all text colors to meet WCAG 2.2 AAA 7:1 contrast ratios against
  dark backgrounds (--textMuted, --textDim, hover states across playlist,
  player, panels, tooltips)
- Fix speed menu rendering behind seek bar by correcting z-index stacking
  context (.controls z-index:10, .miniCtl z-index:3, .seek z-index:2)
- Replace default Tauri icons with custom TutorialVault icon across all
  required sizes (32-512px PNGs, ICO, ICNS, Windows Square logos)
- Update README: Fraunces → Bricolage Grotesque font reference
- Add collapsible dock pane persistence and keyboard-adjustable dividers
2026-02-19 18:23:38 +02:00

304 lines
13 KiB
CSS

.videoWrap{position:relative; background:#000; flex:0 0 auto; overflow:hidden;}
video{width:100%; height:auto; display:block; background:#000; aspect-ratio:16/9; outline:none; cursor:pointer;}
video::cue{
background:transparent;
color:#fff;
font-family:var(--sans);
font-size:1.1em;
font-weight:600;
text-shadow:
-1px -1px 0 #000,
1px -1px 0 #000,
-1px 1px 0 #000,
1px 1px 0 #000,
-2px 0 0 #000,
2px 0 0 #000,
0 -2px 0 #000,
0 2px 0 #000;
}
.videoOverlay{
position:absolute;
inset:0;
display:flex;
align-items:center;
justify-content:center;
pointer-events:none;
z-index:5;
}
.overlayIcon{
position:relative;
width:100px;
height:100px;
display:flex;
align-items:center;
justify-content:center;
opacity:0;
transition:opacity 0.8s var(--ease-spring), transform .3s var(--ease-bounce);
border-radius:50%;
background:rgba(15,17,23,.55);
border:none;
}
.overlayIcon.show{
opacity:1;
}
.overlayIcon.pulse{
animation:overlayPulse 0.4s var(--ease-bounce);
}
@keyframes overlayPulse{
0%{transform:scale(1);}
50%{transform:scale(1.18);}
100%{transform:scale(1);}
}
.overlayIcon::before{display:none;}
.overlayIcon.show:hover{
background:rgba(15,17,23,.65);
transform:scale(1.08);
}
.overlayIcon i{
font-size:36px;
color:rgba(255,255,255,.92)!important;
filter:drop-shadow(0 2px 10px rgba(0,0,0,.6));
position:relative;
z-index:2;
transition:transform 0.3s var(--ease-bounce), color 0.3s ease;
margin-left:4px;
}
.overlayIcon.pause i{
margin-left:0;
}
.overlayIcon.show:hover i{
transform:scale(1.15);
color:rgba(255,255,255,1)!important;
}
.controls{display:flex; flex-direction:column; gap:10px; padding:12px; border-top:1px solid rgba(140,160,210,.04); flex:0 0 auto; position:relative; z-index:10;}
.controlsStrip{
display:flex; align-items:center; justify-content:space-between; gap:8px; flex-wrap:wrap;
padding:5px 6px;
border:none;
background:transparent;
}
.controlsStrip::after{display:none;}
.stripDivider{width:1px; height:22px; background:rgba(140,160,210,.06); flex:0 0 auto; transition:background .2s ease, height .2s ease;}
.controlsStrip:hover .stripDivider{height:24px;}
.group{display:flex; align-items:center; gap:8px; flex-wrap:wrap;}
.controlsStrip .iconBtn{box-shadow:none;}
.controlsStrip .miniCtl{box-shadow:none;}
.controlsStrip .timeChip{box-shadow:none;}
.iconBtn{
width:40px; height:36px;
border-radius:var(--r2);
border:none;
background:var(--surface-2);
box-shadow:var(--shadow3);
display:inline-flex; align-items:center; justify-content:center;
cursor:pointer; user-select:none;
transition:all .2s var(--ease-bounce);
}
.iconBtn:hover{
background:var(--surface-3);
transform:translateY(-2px);
}
.iconBtn:active{
transform:scale(.9) translateY(0);
transition-duration:.08s;
}
.iconBtn.primary{
background:rgba(136,164,196,.10);
}
.iconBtn.primary:hover{
background:rgba(136,164,196,.16);
box-shadow:0 0 12px rgba(136,164,196,.10);
}
.iconBtn .fa{font-size:15px; color:var(--iconStrong)!important; opacity:.9; transition:transform .2s var(--ease-bounce), opacity .15s ease;}
.iconBtn:hover .fa{transform:scale(1.15); opacity:1;}
.timeChip{display:inline-flex; align-items:center; gap:8px; padding:6px 9px; border-radius:var(--r2); border:none; background:var(--surface-2); box-shadow:var(--shadow3); font-family:var(--mono); font-size:12px; color:var(--text); letter-spacing:.02em; font-variant-numeric:tabular-nums; transition:background .2s ease;}
.timeChip:hover{background:var(--surface-3);}
.timeDot{width:8px; height:8px; border-radius:999px; background:rgba(136,164,196,.60); opacity:.95; transition:transform .3s ease, background .3s ease; animation:pulse 2s ease-in-out infinite;}
@keyframes pulse{0%,100%{transform:scale(1);opacity:.95;} 50%{transform:scale(1.2);opacity:1;}}
.seekWrap{display:flex; align-items:center; gap:10px; width:100%; position:relative;}
.seekTrack{
position:absolute;
left:0; right:0; top:50%;
height:10px;
transform:translateY(-50%);
border-radius:999px;
background:rgba(140,165,220,.04);
border:1px solid rgba(140,165,220,.06);
box-shadow:var(--shadowInset);
overflow:hidden;
pointer-events:none;
transition:height .2s var(--ease-bounce), border-color .2s ease;
}
.seekWrap:hover .seekTrack{height:12px; border-color:rgba(140,165,220,.09);}
.seekFill{
height:100%;
width:0%;
background:rgba(136,164,196,.50);
border-radius:999px 0 0 999px;
transition:width .1s linear, background .2s ease;
}
.seekWrap:hover .seekFill{background:rgba(136,164,196,.62);}
.seek{-webkit-appearance:none; appearance:none; width:100%; height:18px; border-radius:999px; background:transparent; border:none; box-shadow:none; outline:none; position:relative; z-index:2; cursor:pointer; margin:0;}
.seek::-webkit-slider-runnable-track{background:transparent; height:18px;}
.seek::-webkit-slider-thumb{-webkit-appearance:none; appearance:none; width:16px; height:16px; border-radius:999px; border:2px solid rgba(200,210,230,.28); background:rgba(220,228,240,.88); box-shadow:0 2px 6px rgba(0,0,0,.30); cursor:pointer; transition:transform .2s var(--ease-bounce), box-shadow .2s ease, border-color .2s ease; margin-top:0;}
.seek:hover::-webkit-slider-thumb{transform:scale(1.2); box-shadow:0 2px 8px rgba(0,0,0,.35), 0 0 10px rgba(136,164,196,.15); border-color:rgba(200,210,230,.40);}
.seek:active::-webkit-slider-thumb{transform:scale(1.05); transition-duration:.08s;}
.seek::-moz-range-track{background:transparent; height:18px;}
.seek::-moz-range-thumb{width:16px; height:16px; border-radius:999px; border:2px solid rgba(200,210,230,.28); background:rgba(220,228,240,.88); box-shadow:0 2px 6px rgba(0,0,0,.30); cursor:pointer;}
.miniCtl{display:flex; align-items:center; gap:8px; padding:6px 9px; border-radius:var(--r2); border:none; background:var(--surface-2); box-shadow:var(--shadow3); position:relative; z-index:3; transition:all .2s var(--ease-bounce);}
.miniCtl:hover{background:var(--surface-3); transform:translateY(-1px);}
.miniCtl:active{transform:scale(.97) translateY(0); transition-duration:.08s;}
.miniCtl .fa{font-size:14px; color:var(--iconStrong)!important; opacity:.95; flex:0 0 auto; transition:transform .2s var(--ease-bounce), opacity .15s ease;}
.miniCtl:hover .fa{transform:scale(1.1); opacity:1;}
.volWrap{position:relative; width:120px; height:14px; display:flex; align-items:center;}
.volTrack{
position:absolute;
left:0; right:0; top:50%;
height:6px;
transform:translateY(-50%);
border-radius:999px;
background:rgba(140,165,220,.04);
border:1px solid rgba(140,165,220,.06);
overflow:hidden;
pointer-events:none;
transition:height .2s var(--ease-bounce), border-color .2s ease;
}
.volWrap:hover .volTrack{height:8px; border-color:rgba(140,165,220,.09);}
.volFill{
height:100%;
width:100%;
background:rgba(136,164,196,.40);
border-radius:999px 0 0 999px;
transition:width .05s linear, background .2s ease;
}
.volWrap:hover .volFill{background:rgba(136,164,196,.55);}
.vol{-webkit-appearance:none; appearance:none; width:100%; height:14px; border-radius:999px; background:transparent; border:none; outline:none; position:relative; z-index:2; cursor:pointer; margin:0;}
.vol::-webkit-slider-runnable-track{background:transparent; height:14px;}
.vol::-webkit-slider-thumb{-webkit-appearance:none; appearance:none; width:14px; height:14px; border-radius:999px; border:2px solid rgba(200,210,230,.28); background:rgba(220,228,240,.88); box-shadow:0 1px 4px rgba(0,0,0,.25); cursor:pointer; transition:transform .2s var(--ease-bounce), box-shadow .2s ease;}
.vol:hover::-webkit-slider-thumb{transform:scale(1.25); box-shadow:0 1px 6px rgba(0,0,0,.30), 0 0 8px rgba(136,164,196,.12);}
.vol::-moz-range-track{background:transparent; height:14px;}
.vol::-moz-range-thumb{width:14px; height:14px; border-radius:999px; border:2px solid rgba(200,210,230,.28); background:rgba(220,228,240,.88); box-shadow:0 1px 4px rgba(0,0,0,.25); cursor:pointer;}
.volTooltip{
position:absolute;
bottom:calc(100% + 12px);
left:0;
padding:8px 12px;
border-radius:var(--r2);
background:rgba(18,21,30,.95);
border:1px solid rgba(140,160,210,.10);
color:#fff;
font-family:var(--mono);
font-size:13px;
font-weight:400;
letter-spacing:.02em;
white-space:nowrap;
pointer-events:none;
opacity:0;
transform:translateX(-50%) translateY(4px) scale(.95);
transition:opacity .2s ease, transform .25s var(--ease-bounce), left .05s linear;
box-shadow:var(--shadow2);
z-index:100;
}
.volTooltip::before{display:none;}
.volTooltip::after{
content:"";
position:absolute;
top:100%;
left:50%;
transform:translateX(-50%);
border:6px solid transparent;
border-top-color:rgba(18,21,30,.95);
}
.volTooltip.show{
opacity:1;
transform:translateX(-50%) translateY(0) scale(1);
}
.speedBox{display:flex; align-items:center; gap:10px; position:relative;}
.speedBtn{border:none; outline:none; background:transparent; color:var(--text); font-family:var(--mono); font-size:12px; letter-spacing:0; padding:0 2px; cursor:pointer; line-height:1; display:inline-flex; align-items:center; gap:8px; transition:color .15s ease, transform .15s ease;}
.speedBtn span:first-child{min-width:3.5ch; text-align:right; transition:transform .15s var(--ease-bounce);}
.speedBtn:hover{color:rgba(235,240,250,1);}
.speedBtn:hover span:first-child{transform:scale(1.05);}
.speedBtn:active{transform:scale(.95); transition-duration:.08s;}
.speedCaret .fa{font-size:12px; opacity:.85; color:var(--icon)!important; transition:transform .25s var(--ease-bounce);}
.speedBtn:hover .speedCaret .fa{transform:translateY(3px) rotate(180deg);}
.progressPill{flex:0 0 auto; display:flex; align-items:center; gap:8px; padding:6px 10px; border-radius:var(--r2); border:none; background:var(--surface-2); box-shadow:var(--shadow3); min-width:220px; transition:background .2s ease;}
.progressPill:hover{background:var(--surface-3);}
.progressLabel{font-size:11px; font-weight:700; letter-spacing:.08em; text-transform:uppercase; color:var(--textMuted); margin-right:2px; transition:color .2s ease;}
.progressPill:hover .progressLabel{color:var(--textMuted);}
.progressBar{width:120px; height:8px; border-radius:999px; border:none; background:rgba(140,165,220,.04); overflow:hidden; transition:height .2s var(--ease-bounce);}
.progressPill:hover .progressBar{height:10px;}
.progressBar>div{height:100%; width:0%; background:rgba(136,164,196,.75); transition:width .4s var(--ease-spring);}
.progressPct{font-family:var(--mono); font-size:12px; color:var(--text); font-variant-numeric:tabular-nums; letter-spacing:.02em; min-width:58px; text-align:right; transition:color .2s ease;}
.progressPill:hover .progressPct{color:rgba(235,240,252,.98);}
.timeSep{color:rgba(175,185,210,.78);}
.seek:focus-visible::-webkit-slider-thumb{box-shadow:0 0 0 3px rgba(136,164,196,.45), 0 2px 6px rgba(0,0,0,.30);}
.vol:focus-visible::-webkit-slider-thumb{box-shadow:0 0 0 3px rgba(136,164,196,.45), 0 1px 4px rgba(0,0,0,.25);}
.seek:focus-visible::-moz-range-thumb{box-shadow:0 0 0 3px rgba(136,164,196,.45), 0 2px 6px rgba(0,0,0,.30);}
.vol:focus-visible::-moz-range-thumb{box-shadow:0 0 0 3px rgba(136,164,196,.45), 0 1px 4px rgba(0,0,0,.25);}
/* Mute button */
.volMuteBtn{border:none; background:transparent; padding:0; margin:0; cursor:pointer; display:flex; align-items:center; justify-content:center; width:14px; height:14px; flex:0 0 auto;}
.volMuteBtn .fa{font-size:14px; color:var(--iconStrong)!important; opacity:.95; transition:transform .2s var(--ease-bounce), opacity .15s ease;}
.volMuteBtn:hover .fa{transform:scale(1.15); opacity:1;}
.volMuteBtn:focus-visible{outline:2px solid rgba(136,164,196,.45); outline-offset:2px; border-radius:3px;}
.miniCtl.muted{opacity:.5;}
.miniCtl.muted .volFill{opacity:.3;}
/* Seek feedback overlay */
.seekFeedback{
position:absolute;
top:50%; left:50%;
transform:translate(-50%,-50%);
font-family:var(--mono);
font-size:28px;
font-weight:700;
color:#fff;
text-shadow:0 2px 8px rgba(0,0,0,.7);
opacity:0;
transition:opacity .15s ease;
pointer-events:none;
z-index:6;
}
.seekFeedback.show{opacity:1;}
/* Error overlay */
.errorOverlay{
position:absolute;
inset:0;
display:flex;
flex-direction:column;
align-items:center;
justify-content:center;
gap:16px;
background:rgba(15,17,23,.88);
z-index:10;
}
.errorOverlay>.fa{font-size:42px; color:rgba(255,180,100,.85);}
.errorMsg{font-size:14px; color:rgba(218,225,240,.85); text-align:center; line-height:1.5; max-width:320px;}
.errorNextBtn{
border:none;
background:var(--surface-3);
color:var(--text);
padding:10px 20px;
border-radius:var(--r2);
font-size:13px;
font-weight:600;
cursor:pointer;
min-width:44px;
min-height:44px;
transition:background .2s ease;
}
.errorNextBtn:hover{background:var(--surface-4);}
.errorNextBtn:focus-visible{outline:2px solid rgba(136,164,196,.45); outline-offset:2px;}