UNPKG

shaka-player

Version:
592 lines (487 loc) 14.7 kB
/** @license * Shaka Player * Copyright 2016 Google LLC * SPDX-License-Identifier: Apache-2.0 */ /* stylelint-disable selector-class-pattern -- MDL classes can't be changed */ // Import the MDL styles with the desired color scheme. @import (css, inline) "../node_modules/material-design-lite/dist/material.indigo-blue.min.css"; @import (css, inline) "../node_modules/dialog-polyfill/dialog-polyfill.css"; @import (css, inline) "../node_modules/awesomplete/awesomplete.css"; @import (css, inline) "../node_modules/tippy.js/index.css"; @accent-border-color: #8080ff; @error-color: #d84a38; @drawer-width: 550px; @mdl-footer-link-color: #9e9e9e; /* copied from MDL stylesheet */ @mdl-button-color: rgb(63 81 181); /* copied from MDL stylesheet */ @progress-circle-size: 45px; @progress-circle-thickness: 5px; /* This class name is used by MDL, but we use a slightly different font. So * here we override the font family for the MDL class. Without this, the menu * on the left side of the screen has no icon. */ .material-icons { font-family: "Material Icons Round"; } /* Conflicting styles between the icons font & the MDL buttons caused some * icons not to be centered in their MDL button. This fixes it. */ .mdl-button .material-icons { line-height: 36px; } /* This is a less mixin only, rather than a CSS class. MDL has an equivalent * class with the same name, which can be used in the application directly. */ .hidden() { display: none; } .borderless { outline: none; } /* Use the class name, which is more specific than just "main". Otherwise, the * MDL styles will be used instead. */ main.mdl-layout__content { /* Make the main container a flex container oriented as a column. */ display: flex; flex-direction: column; } #contents { /* Expand the contents section to take up any extra space on the page. This * pushes the footer to the bottom when the window is large, while still * allowing the contents to scroll when the window is small. */ flex-grow: 1; /* Pad the outside of the contents. */ padding: 20px; text-align: center; } .shaka-controls-button-panel > .close-button { /* Move the button to the top-right. */ position: absolute; top: 10px; right: 10px; /* Give the button a round background, meant to look like the play button. */ border-radius: 50%; color: #000; background: rgba(255 255 255 / 85%); } html, body { /* Ensure everything has a consistent font. */ font-family: Roboto-Regular, Roboto, sans-serif, TengwarTelcontar; } // This font supports the Sindarin (sjn) translation. @font-face { font-family: TengwarTelcontar; // This could be served from demo/ (uncompiled) or dist (compiled). src: url("../demo/TengwarTelcontar.woff2") format("woff2"); font-weight: normal; font-style: normal; } /* Change the default opacity of the ripple container, to get around an iOS bug. * See: https://github.com/google/material-design-lite/issues/5281 */ .mdl-ripple { opacity: 0.001; } /* Give the FAB a drop shadow, that expands a little bit when moused over. */ .mdl-button--fab { filter: drop-shadow(0 2px 5px #333); transition: 0.2s ease-in-out; } .mdl-button--fab, .mdl-button--icon { /* By default, MDL icon buttons may end up vertically off-center. This aligns * them to the center both vertically and horizontally. */ display: inline-flex; align-items: center; justify-content: center; } .mdl-button--fab:hover { filter: drop-shadow(0 2px 8px #333); } .input-container-label { padding-right: 1em; } /* Remove vertical padding on MDL text fields, but only while they are in * the hamburger menu. */ .hamburger-menu .mdl-textfield { padding: 0; // The default width of 300px is a bit too wide for us. width: 220px; } .hamburger-menu .mdl-textfield__label { top: 4px; } .hamburger-menu .mdl-textfield__label:after { bottom: 0; } .hamburger-menu .mdl-layout-title { /* The line-height style in mdl-layout-title looks weird on narrow displays, * so remove it in the hamburger menu. */ line-height: unset; } .hamburger-menu .input-container-label { /* Give the labels for input rows a left margin. This keeps them from directly * touching the left side of the screen, for improved readability. */ margin-left: 1em; } .hamburger-menu .mdl-button--raised { /* Left-align the text content of the section header buttons. */ text-align: left; } /* Styles for error display. */ #error-display { background-color: @error-color; margin: 0; padding: 1em; line-height: 2em; text-align: center; } #error-display-link { color: white; display: inline-block; margin-left: auto; margin-right: auto; max-width: 90%; /* Some very long URLs can appear in the error text, and word wrapping is very * helpful. */ overflow-wrap: anywhere; } .input-disabled { pointer-events: none; } #error-display-close-button { background-color: @error-color; color: white; position: relative; padding: 0; top: 0; right: 1em; float: right; font-size: 24px; font-weight: bold; text-decoration: none; cursor: pointer; } /* Styles for asset cards. */ .asset-card { display: inline-block; margin: 1em; } .asset-card-unsupported { display: inline-block; margin: 1em; background-color: #ddd; } /* Asset icons. */ .feature-icon { width: 24px; height: 24px; background-size: contain; background-repeat: no-repeat; display: inline-block; /* features */ &[icon="high_definition"] { background-image: data-uri("icons/custom_high_definition.svg"); } &[icon="ultra_high_definition"] { background-image: data-uri("icons/custom_ultra_high_definition.svg"); } &[icon="subtitles"] { background-image: data-uri("icons/baseline-subtitles-24px.svg"); } &[icon="closed_caption"] { background-image: data-uri("icons/baseline-closed_caption-24px.svg"); } &[icon="live"] { background-image: data-uri("icons/baseline-live_tv-24px.svg"); } &[icon="trick_mode"] { background-image: data-uri("icons/baseline-fast_forward-24px.svg"); } &[icon="surround_sound"] { background-image: data-uri("icons/baseline-surround_sound-24px.svg"); } &[icon="multiple_languages"] { background-image: data-uri("icons/baseline-language-24px.svg"); } &[icon="ad"] { background-image: data-uri("icons/custom_ad.svg"); } &[icon="audio_only"] { background-image: data-uri("icons/baseline-audiotrack-24px.svg"); } /* key systems */ &[icon="widevine"] { background-image: data-uri("icons/custom_widevine.svg"); } &[icon="clear_key"] { background-image: data-uri("icons/custom_clear_key.svg"); } &[icon="playready"] { background-image: data-uri("icons/custom_playready.svg"); } } @media screen and (max-width: 400px) { /* On screens less than 400px, the 330px-wide cards need to shrink. * This makes them shrink linearly below that threshold. */ .asset-card { width: 82.5%; } } .asset-card-corner-button { /* Move the button to the top-right. */ position: absolute; top: 5px; right: 5px; } .progress-circle { position: absolute; top: 0; right: 14px; width: @progress-circle-size; height: @progress-circle-size; /* This should be unclickable, so that you can click the button beneath. */ pointer-events: none; } .progress-circle-svg { /* In rotation, 0 degrees is the right side. That means that the progress * circle "starts at" the right side. Normally, you expect the circle to * "start at" the top, like a clock; this rotates the circle, so it behaves * thusly. */ transform: rotate(-90deg); } .progress-circle-circle() { /* Set the position and radius of the circle, so it is in the center of the * svg's canvas. */ cx: @progress-circle-size / 2; cy: @progress-circle-size / 2; r: (@progress-circle-size - @progress-circle-thickness) / 2; fill: none; stroke-width: @progress-circle-thickness; } .progress-circle-bar { .progress-circle-circle(); stroke: @mdl-button-color; stroke-linecap: round; } .progress-circle-back { .progress-circle-circle(); stroke: #eee; } .asset-card .mdl-card__title { /* The maximum width of the title should be narrower than the width of the * card itself, so that the title doesn't overlap with the store button. */ max-width: 260px; margin: auto; } .asset-card div { /* Override the default value of "stretch" for mdl cards. */ justify-content: center; } .asset-card img { /* Icons are 300px by 210px (10:7 aspect ratio). */ width: 300px; /* Constrain to space if necessary. */ max-width: 100%; display: block; margin-left: auto; margin-right: auto; } .asset-card-unsupported img { /* Set opacity to 50%, so the image is greyed out also. */ opacity: 0.5; } .asset-card.selected { border-style: solid; border-color: @accent-border-color; } /* Override some MDL styles to get the desired look and feel. */ .app-header { background-color: white; color: black; } @media screen and (max-width: 780px) { /* On smaller screens, the header should expand and the elements in it should * wrap to remain accessible. */ #nav-button-container { height: auto; flex-wrap: wrap; } /* The spacer should be hidden in this mode, so that the version number is no * longer being forced to the right. */ .app-header .mdl-layout-spacer { .hidden(); } } .significant-right-padding { padding-right: 5em; } .mdl-dialog { /* Override MDL dialog width, so that input elements don't overflow. */ width: 420px; } .mdl-dialog img { width: 300px; max-width: 100%; } .app-header .mdl-layout__drawer-button { color: black; } .app-header .logo { max-height: 80%; /* Match the padding of the buttons next to the logo. */ padding: 0 16px; } .app-header .mdl-layout__drawer-button .material-icons { &:hover { /* Spin the gear icon in the settings menu when hovered. */ transform: rotate(90deg); } /* Animate the spin. */ transition: transform 0.3s ease-in-out; } footer li { list-style: square outside; } /* More specific selector than MDL's stylesheet uses. */ footer .mdl-mega-footer__link-list { a { /* The default color was low-contrast on this dark background. */ color: lighten(@mdl-footer-link-color, 20%); } a[disabled] { /* Making the disabled version even darker would be even worse in terms of * contrast, so use a strikethrough style instead. */ text-decoration: line-through; cursor: not-allowed; } } /* Style the container that contains the "add custom assets" button. */ .add-button-container { text-align: right; margin: 1em; } .disabled-by-fail { pointer-events: none; user-select: none; } /* Style the hamburger menu (mdl drawer). */ .hamburger-menu { /* To properly change the width of an MDL drawer, you also have to change the * transform applied to hide it. */ width: @drawer-width; transform: translateX(-@drawer-width); /* If the main app page is scrollable, we don't want see "under" the drawer. * Making the position fixed means it won't move, no matter what. * Within the drawer itself, the drawer content can still be scrolled. */ position: fixed; /* Constrain to the window if necessary, so that it doesn't overflow small * mobile screens. */ max-width: 100%; } /* When the drawer is open, MDL sets overflow: hidden on the main content * in order to hide the scroll bar. * * This also causes most of the elements on screen to jump to the right, * though, which is very visually distracting. This overrides that style, to * prevent that behavior. * * The class name mdl-layout__content is repeated twice to make the selector * more specific than what MDL is using. */ .mdl-layout__drawer.is-visible ~ .mdl-layout__content.mdl-layout__content { overflow: auto; } /* The title contains the close button, so use flex to center it. * Also use right-padding to keep it off the right edge. */ #hamburger-menu-title { display: flex; align-items: center; padding-right: 16px; } .mdl-layout__obfuscator.is-visible { /* If the main app page is scrollable, we don't want see "under" the layout * obfuscator (which grays out the app while the drawer is open). * Making the position fixed means it won't move, no matter what. */ position: fixed; } /* Control the size of the video. */ #video-bar { /* The video bar fills the horizontal space, but its height depends on the * contents. */ width: 100%; /* Add a little bit of padding on top, to make the video not look cropped. */ padding-top: 1em; } /* This is an id rather than a class so that it will consistently be applied * before UI CSS values on all platforms. */ .video-container { /* Fixed width, but height will expand based on video aspect ratio. * Does not affect fullscreen size. */ width: 640px; margin: auto; /* Constrain to the window if necessary, so that it doesn't overflow small * mobile screens. */ max-width: 100%; } #visualizer-canvas { display: flex; width: 100%; height: 120px; } #video-bar.no-input-sized { /* Add some additional padding so that TV overscan doesn't cut off the version * number or other information we might need. */ padding: 2.5em 2em; /* Constrain the body to its size minus margin and padding, so that nested * elements can constrain to the body. */ width: 100%; width: calc(100% - 4em); height: 100%; height: calc(100% - 5em); } .video-container.no-input-sized { width: 100%; height: 100%; } #video { /* Fill whatever space we're given, whether fullscreen or not. */ width: 100%; height: 100%; margin: auto; } /* Style the intermediate tooltip attach points, required for tooltips to be * added to disabled buttons. */ .tooltip-attach-point { display: inline-block; } /* Style the input containers. */ .input-container-row { /* When a row is preceded by its label, inline-block will ensure the label * sits before the input row on the same line. */ display: inline-block; } .input-container-style-flex { display: inline-flex; flex-wrap: wrap; } .input-container-style-vertical { text-align: left; } .input-container-style-accordion { text-align: left; opacity: 0; max-height: 0; transition: 0.3s ease-in-out; } .input-container-style-accordion.show { opacity: 1; /* If the max-height is too high (e.g. set to 100%), the "sliding out" * animation is too fast to make out with the eye. * So give it a fixed maximum instead. */ max-height: 1000px; } .input-header { font-size: 125%; } .wide-input, .wide-input .input-container-row, .wide-input .mdl-textfield { width: 100%; }