mirror of
https://github.com/SoPat712/videospeed.git
synced 2026-04-21 04:42:35 -04:00
304 lines
6.1 KiB
CSS
304 lines
6.1 KiB
CSS
* {
|
||
line-height: 1.9em;
|
||
font-family: sans-serif;
|
||
font-size: 13px;
|
||
}
|
||
|
||
/* Global * uses 1.9em line-height; without this, every node inside #controller
|
||
(including svg) keeps a tall line box and the bar grows + content rides high. */
|
||
#controller * {
|
||
line-height: 1;
|
||
}
|
||
|
||
/* Show extra buttons on hover or keyboard :focus-visible only. Plain :focus-within
|
||
after a mouse click kept #controls visible while hover-only rules (e.g. draggable
|
||
margin) turned off when the pointer left the bar. */
|
||
#controller:hover #controls,
|
||
#controller:focus-within:has(:focus-visible) #controls,
|
||
:host(:hover) #controls {
|
||
display: inline-flex;
|
||
vertical-align: middle;
|
||
}
|
||
|
||
#controller {
|
||
position: absolute;
|
||
top: 0;
|
||
left: 0;
|
||
transform: translate(0, 0);
|
||
pointer-events: auto;
|
||
|
||
background: black;
|
||
color: white;
|
||
|
||
border-radius: 5px;
|
||
padding: 5px;
|
||
margin: 0;
|
||
|
||
cursor: default;
|
||
/* Stay above the local video surface without overtaking page-level dialogs. */
|
||
z-index: 1;
|
||
transition: top 160ms ease, left 160ms ease, transform 160ms ease,
|
||
opacity 160ms ease;
|
||
/* Insets are baked into left/top; bar must not wrap when narrow. Hover controls
|
||
extend into the inset area (past “logical” margin). */
|
||
white-space: nowrap;
|
||
overflow: visible;
|
||
max-width: none;
|
||
}
|
||
|
||
#controller:hover {
|
||
opacity: 0.7;
|
||
}
|
||
|
||
/* Space between speed readout and hover buttons — tweak this value (px) as you like */
|
||
#controller:hover > .draggable {
|
||
margin-right: 5px;
|
||
}
|
||
|
||
/* Center presets: midpoint between left- and right-preset inset lines; center bar on that X. */
|
||
#controller[data-location="top-center"]:not([data-position-mode="manual"]) {
|
||
transform: translate(-50%, 0) !important;
|
||
}
|
||
|
||
#controller[data-location="bottom-center"]:not([data-position-mode="manual"]) {
|
||
transform: translate(-50%, -100%) !important;
|
||
}
|
||
|
||
#controls {
|
||
display: none;
|
||
flex-direction: row;
|
||
flex-wrap: nowrap;
|
||
align-items: center;
|
||
gap: 3px;
|
||
white-space: nowrap;
|
||
overflow: visible;
|
||
max-width: none;
|
||
}
|
||
|
||
/* Standalone flash next to speed when N is pressed — hidden = no layout footprint */
|
||
#nudge-flash-indicator {
|
||
display: none;
|
||
margin: 0;
|
||
padding: 0;
|
||
border: 0;
|
||
width: 0;
|
||
min-width: 0;
|
||
max-width: 0;
|
||
height: 0;
|
||
min-height: 0;
|
||
overflow: hidden;
|
||
vertical-align: middle;
|
||
align-items: center;
|
||
justify-content: center;
|
||
font-size: 14px;
|
||
line-height: 14px;
|
||
font-weight: bold;
|
||
font-family: "Lucida Console", Monaco, monospace;
|
||
box-sizing: border-box;
|
||
}
|
||
|
||
/* Same 24×24 footprint as #controls button */
|
||
#nudge-flash-indicator.visible {
|
||
display: inline-flex;
|
||
box-sizing: border-box;
|
||
width: 24px;
|
||
height: 24px;
|
||
min-width: 24px;
|
||
min-height: 24px;
|
||
max-width: 24px;
|
||
max-height: 24px;
|
||
margin-left: 5px;
|
||
padding: 0;
|
||
border-width: 1px;
|
||
border-style: solid;
|
||
border-radius: 5px;
|
||
align-items: center;
|
||
justify-content: center;
|
||
font-size: 0;
|
||
line-height: 0;
|
||
overflow: hidden;
|
||
flex-shrink: 0;
|
||
}
|
||
|
||
/* Hide flash indicator when hovering — the one in #controls is visible instead */
|
||
#controller:hover #nudge-flash-indicator,
|
||
:host(:hover) #nudge-flash-indicator {
|
||
display: none !important;
|
||
width: 0;
|
||
height: 0;
|
||
margin: 0;
|
||
padding: 0;
|
||
border: 0;
|
||
overflow: hidden;
|
||
}
|
||
|
||
#nudge-flash-indicator[data-enabled="true"] {
|
||
color: #fff;
|
||
background: #4b9135;
|
||
border-color: #6ec754;
|
||
}
|
||
|
||
#nudge-flash-indicator[data-enabled="false"] {
|
||
color: #fff;
|
||
background: #943e3e;
|
||
border-color: #c06060;
|
||
}
|
||
|
||
/* Same 24×24 chip as control buttons (Lucide check / x inside) */
|
||
#nudge-indicator {
|
||
display: inline-flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
box-sizing: border-box;
|
||
width: 24px;
|
||
height: 24px;
|
||
min-width: 24px;
|
||
min-height: 24px;
|
||
max-height: 24px;
|
||
padding: 0;
|
||
border-width: 1px;
|
||
border-style: solid;
|
||
border-radius: 5px;
|
||
font-size: 0;
|
||
line-height: 0;
|
||
cursor: pointer;
|
||
margin: 0;
|
||
flex-shrink: 0;
|
||
overflow: hidden;
|
||
}
|
||
|
||
#nudge-indicator[data-enabled="true"] {
|
||
color: #fff;
|
||
background: #4b9135;
|
||
border-color: #6ec754;
|
||
}
|
||
|
||
#nudge-indicator[data-enabled="false"] {
|
||
color: #fff;
|
||
background: #943e3e;
|
||
border-color: #c06060;
|
||
}
|
||
|
||
#nudge-indicator[data-supported="false"] {
|
||
opacity: 0.6;
|
||
}
|
||
|
||
#nudge-flash-indicator.visible .vsc-btn-icon,
|
||
#nudge-indicator .vsc-btn-icon {
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
width: 14px;
|
||
height: 14px;
|
||
margin: 0;
|
||
padding: 0;
|
||
line-height: 0;
|
||
}
|
||
|
||
#nudge-flash-indicator.visible .vsc-btn-icon svg,
|
||
#nudge-indicator .vsc-btn-icon svg {
|
||
display: block;
|
||
width: 100%;
|
||
height: 100%;
|
||
flex-shrink: 0;
|
||
transform: translateY(0.5px);
|
||
}
|
||
|
||
#controller.dragging {
|
||
cursor: -webkit-grabbing;
|
||
cursor: -moz-grabbing;
|
||
opacity: 0.7;
|
||
transition: none;
|
||
}
|
||
|
||
#controller.dragging #controls {
|
||
display: inline-flex;
|
||
vertical-align: middle;
|
||
}
|
||
|
||
.draggable {
|
||
cursor: -webkit-grab;
|
||
cursor: -moz-grab;
|
||
vertical-align: middle;
|
||
}
|
||
|
||
.draggable:active {
|
||
cursor: -webkit-grabbing;
|
||
cursor: -moz-grabbing;
|
||
}
|
||
|
||
button {
|
||
cursor: pointer;
|
||
color: black;
|
||
background: white;
|
||
font-weight: bold;
|
||
border-radius: 5px;
|
||
padding: 3px 6px 3px 6px;
|
||
font-size: 14px;
|
||
line-height: 14px;
|
||
border: 1px solid white;
|
||
font-family: "Lucida Console", Monaco, monospace;
|
||
margin-bottom: 2px;
|
||
}
|
||
|
||
/* Icon buttons: square targets, compact bar (no extra vertical stretch). */
|
||
#controls button {
|
||
box-sizing: border-box;
|
||
width: 24px;
|
||
height: 24px;
|
||
min-width: 24px;
|
||
min-height: 24px;
|
||
max-height: 24px;
|
||
padding: 0;
|
||
margin: 0;
|
||
border-width: 1px;
|
||
line-height: 0;
|
||
font-size: 0;
|
||
display: inline-flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
flex-shrink: 0;
|
||
overflow: hidden;
|
||
}
|
||
|
||
button .vsc-btn-icon {
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
width: 14px;
|
||
height: 14px;
|
||
margin: 0;
|
||
padding: 0;
|
||
line-height: 0;
|
||
}
|
||
|
||
button .vsc-btn-icon svg {
|
||
display: block;
|
||
width: 100%;
|
||
height: 100%;
|
||
flex-shrink: 0;
|
||
/* Lucide 24×24 paths sit slightly high in the viewBox */
|
||
transform: translateY(0.5px);
|
||
}
|
||
|
||
button:focus {
|
||
outline: 0;
|
||
}
|
||
|
||
button:hover {
|
||
opacity: 1;
|
||
}
|
||
|
||
button:active {
|
||
background: #ccc;
|
||
}
|
||
|
||
button.rw {
|
||
opacity: 0.65;
|
||
}
|
||
|
||
button.hideButton {
|
||
opacity: 0.65;
|
||
margin-right: 2px;
|
||
}
|