Files
shaka-player/ui/less/containers.less
T
Jacob Trimble cdeffbb9e6 fix(ui): Fix styling of UI text cues
First, the positioning of cues was incorrect.  We need to explicitly
set all the position attributes when we position elements with the
"absolute" position.

Second, if we position a text <span> manually, the background will fill
the whole region.  So to keep the background wrapping the text, we need
to add another <span> for the text.

Third, the background and font color should not be set on every <span>
element since it won't allow parent cues to set the inherited value.
So this moves the defaults to the top-level text element and allows
parent cue elements to override this.  It also would make app CSS
easier to override.  Because background color isn't inherited through
CSS, the default is set in JavaScript instead.

Fixes #3521
Fixes #3600
Closes #3713

Change-Id: I45fc88dcac4a0a062e1474087f24c80d98eef619
2021-11-03 17:31:25 +00:00

359 lines
9.5 KiB
Plaintext

/** @license
* Shaka Player
* Copyright 2016 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
/* All of the top-level containers into which various visible features go. */
@transparent: rgba(0, 0, 0, 0);
/* A container for the entire video + controls combo. This is the auto-setup
* div which we populate. */
.shaka-video-container {
.overlay-parent();
/* Without this, the container somehow winds up being a tad taller than it
* should be (484px vs 480px). */
display: flex;
/* Set a special font for material design icons. */
.material-icons-round {
font-family: 'Material Icons Round';
font-size: 24px;
}
/* Set the fonts for all other content. */
* {
font-family: Roboto-Regular, Roboto, sans-serif;
}
}
/* Each browser has a different prefixed pseudo-class for fullscreened elements.
* Define the properties of a fullscreened element in a mixin, then apply to
* each of the browser-specific pseudo-classes.
* NOTE: These fullscreen pseudo-classes can't be combined with commas into a
* single delcaration. Browsers ignore the rest of the list once they hit one
* pseudo-class they don't support. */
.fullscreen-container() {
.fill-container();
background-color: black;
.shaka-text-container {
/* In fullscreen mode, the text displayer's font size should be relative to
* the either window height or width (whichever is smaller), instead of a
* fixed size. */
font-size: 4.4vmin;
}
}
.shaka-video-container:fullscreen { .fullscreen-container(); }
.shaka-video-container:-webkit-full-screen { .fullscreen-container(); }
.shaka-video-container:-moz-full-screen { .fullscreen-container(); }
.shaka-video-container:-ms-fullscreen { .fullscreen-container(); }
/* The actual video element. Sits inside .shaka-video-container and gives it a
* size in non-fullscreen mode. In fullscreen mode, the sizing relationship
* flips. CSS is just great like that. :-( */
.shaka-video {
/* At the moment, nothing special is required here.
* Note that this should NOT be an overlay-child, as its size could dictate
* the size of the container for some applications. */
}
/* A container for all controls, including the giant play button, seek bar, etc.
* Sits inside .shaka-video-container, on top of (Z axis) .shaka-video, and
* below (Y axis) .shaka-play-button-container. */
.shaka-controls-container {
.overlay-child();
.hide-when-shaka-controls-disabled();
/* Without this, the controls container overflows the video container. */
box-sizing: border-box;
/* A flex container, to make layout of children easier to reason about. */
display: flex;
/* Defines in which direction the children should flow. */
flex-direction: column;
/* Pushes the children toward the bottom of the container. */
justify-content: flex-end;
/* Centers children horizontally. */
align-items: center;
/* By default, do not allow any of our controls to shrink.
* Specific controls can use .shrinkable() to override. */
* { .unshrinkable(); }
/* Position the controls container in front of the text container, so that
* the text container doesn't interfere with the control buttons. */
z-index: 1;
&[casting="true"] {
/* Hide fullscreen button while casting. */
.shaka-fullscreen-button {
.hidden();
}
}
}
/* Container for controls positioned at the bottom of the video container:
* controls button panel and the seek bar. */
.shaka-bottom-controls {
width: @bottom-controls-width;
padding: 0;
padding-bottom: 2.5%;
/* Position the bottom panel in front of other controls (play button and
* spinner containers).
* TODO: A different layout arrangement might be a better solution for this.
* Need to experiment.
*/
z-index: 1;
}
/* This is the container for the horizontal row of controls above the seek bar.
* It sits above (Y axis) the seek bar, and below (Y axis) the giant play button
* in the middle. */
.shaka-controls-button-panel {
/* Fill the space horizontally, with no extra padding or margin. */
padding: 0;
margin: 0;
/* This is itself a flex container, with children layed out horizontally. */
display: flex;
flex-direction: row;
/* Push children to the right. */
justify-content: flex-end;
/* Center children vertically. */
align-items: center;
/* TODO: Document why. */
overflow: hidden;
min-width: 48px;
/* Make sure we don't inherit odd font sizes and styles from the environment.
* TODO: When did this happen? What forced us to do this? */
font-size: 12px;
font-weight: normal;
font-style: normal;
/* Make sure contents cannot be selected. */
.unselectable();
.show-when-controls-shown();
/* All buttons, divs, and other controls directly inside this panel should
* have these characteristics by default. */
& > * {
/* White text or button icons. */
color: white;
/* 32px tall controls. */
height: 32px;
/* Consistent alignment of buttons. */
line-height: 0.5;
/* Consistent margins (external) and padding (internal) between controls. */
.bottom-panels-elements-margin();
padding: 0;
/* Transparent backgrounds, no borders, and a pointer when you mouse over
* them. */
background: transparent;
border: 0;
cursor: pointer;
}
}
/* Buttons hide certain items if they are found inside the control panel */
.shaka-controls-button-panel .shaka-overflow-menu-only {
display: none;
}
/* The container for the giant play button. Sits above (Y axis) the
* other video controls and seek bar, in the middle of the video frame, on top
* of (Z axis) the video. */
.shaka-play-button-container {
/* Take up as much space as possible, but shrink (vertically) to accomodate
* the controls at the bottom. */
margin: 0;
.fill-container();
.shrinkable();
.absolute-position();
/* Keep the play button in the middle of this container. */
display: flex;
justify-content: center;
align-items: center;
}
.shaka-statistics-container {
overflow-x: hidden;
overflow-y: auto;
min-width: 300px;
color: white;
background-color: rgba(35, 35, 35, 0.9);
font-size: 14px;
padding: 5px 10px;
border-radius: 2px;
position: absolute;
z-index: 2;
left: 15px;
top: 15px;
/* Fades out with the other controls. */
.show-when-controls-shown();
div {
display: flex;
justify-content: space-between;
}
span {
color: rgb(150, 150, 150);
}
}
.shaka-context-menu {
background-color: rgba(35, 35, 35, 0.9);
border-radius: 2px;
position: absolute;
z-index: 3;
button {
padding: 5px 10px;
width: 100%;
display: flex;
align-items: center;
color: white;
background: transparent;
border: 0;
cursor: pointer;
&:hover {
background-color: rgba(50, 50, 50, 0.9);
}
}
label {
padding: 0 20px;
align-items: flex-start;
color: white;
cursor: pointer;
}
.shaka-current-selection-span {
align-items: flex-start;
color: white;
cursor: pointer;
}
}
.shaka-scrim-container {
margin: 0;
.fill-container();
.shrinkable();
.absolute-position();
.show-when-controls-shown();
/* A black gradient at the bottom, behind the controls, but only so high. */
background: linear-gradient(to top, rgba(0, 0, 0, 1) 0, @transparent 15%);
}
.shaka-text-container {
.absolute-position();
/* Make sure the text container doesn't steal pointer events from another
* layer, such as the ad container. There is nothing interactive in this
* layer, so this should be fine. */
pointer-events: none;
/* Place the text container on the bottom of the video container. */
bottom: 0%;
width: 100%;
min-width: 48px;
/* When the controls fade in or out, it takes 600ms. Thus, when the text
* container adjusts to the presence or absence of controls, we should wait
* briefly, so the captions don't end up appearing behind the controls.
* Instead of being a gradual animation, this is a fast animation with a
* significant delay, since the captions moving around is a little
* distracting. */
transition: bottom cubic-bezier(0.4, 0, 0.6, 1) 100ms;
transition-delay: 500ms;
/* These are defaults which are overridden by JS or cue styles. */
font-size: 20px;
line-height: 1.4; // relative to font size.
color: rgb(255, 255, 255);
span.shaka-text-wrapper {
display: inline;
background: none;
}
}
.shaka-controls-container[shown="true"] ~ .shaka-text-container {
/* While the controls are shown, the text container should avoid the 15%
* at the bottom of the video, to avoid overlapping with controls. */
bottom: 15%;
/* Disable the transition delay when moving the captions up, so that the
* controls don't appear over the captions. */
transition-delay: 0ms;
}
/* The buffering spinner. */
.shaka-spinner-container {
.absolute-position();
.fill-container();
.hide-when-shaka-controls-disabled();
flex-shrink: 1;
display: flex;
justify-content: center;
align-items: center;
}
@spinner-size-percentage: 15.6%;
.shaka-spinner {
/* This uses the same trickery as the big play button define
the spinner's width and height. See .shaka-play-button
for the detailed explanation. */
/* For the padding thing to work, spinner div needs to be an
overlay-parent and spinner svg - an overlay child. */
.overlay-parent();
margin: 0;
box-sizing: border-box;
padding: @spinner-size-percentage / 2;
width: 0;
height: 0;
/* Add a bit of a white shadow to keep our black spinner visible
on a black background. */
filter: drop-shadow(0 0 2px rgba(255, 255, 255, 0.5));
}