UNPKG

cloudinary-video-player

Version:

Cloudinary Video Player

266 lines (213 loc) 8.26 kB
import assign from 'utils/assign'; import { playerClassPrefix } from 'utils/css-prefix'; const playerColors = ` .PLAYER-CLASS-PREFIX { color: --text-color; } .PLAYER-CLASS-PREFIX .vjs-time-tooltip, .PLAYER-CLASS-PREFIX .vjs-mouse-display:after, .PLAYER-CLASS-PREFIX .vjs-play-progress:after { color: --base-color; background-color: --text-color; } .PLAYER-CLASS-PREFIX .vjs-slider { background-color: rgba(--accent-color, 0.3); } .PLAYER-CLASS-PREFIX .vjs-load-progress, .PLAYER-CLASS-PREFIX .vjs-load-progress div { background: rgba(--accent-color, 0.2); } .PLAYER-CLASS-PREFIX .vjs-volume-level, .PLAYER-CLASS-PREFIX .vjs-play-progress { background: --accent-color; } .PLAYER-CLASS-PREFIX .vjs-volume-vertical { background-color: rgba(--base-color, 0.7); } .PLAYER-CLASS-PREFIX .vjs-volume-panel-horizontal .vjs-control:before { border-color: transparent transparent rgba(--accent-color, 0.4) transparent; } .PLAYER-CLASS-PREFIX .vjs-volume-panel-horizontal .vjs-volume-level:before { border-color: transparent transparent --accent-color transparent; } .PLAYER-CLASS-PREFIX .vjs-title-bar { color: --text-color; } .PLAYER-CLASS-PREFIX .vjs-recommendations-overlay { color: --text-color; background-color: rgba(--base-color, 0.4); } .PLAYER-CLASS-PREFIX .vjs-recommendations-overlay .vjs-recommendations-overlay-item { box-shadow: 0 0.5em 1.2em 0px --base-color; color: --text-color; border: 1px solid --text-color !important; position: relative; } .PLAYER-CLASS-PREFIX .vjs-recommendations-overlay .vjs-recommendations-overlay-item:active, .PLAYER-CLASS-PREFIX .vjs-recommendations-overlay .vjs-recommendations-overlay-item:hover { border: 1px solid --accent-color !important; } .PLAYER-CLASS-PREFIX .vjs-context-menu-ui .vjs-menu-content .vjs-menu-item:active, .PLAYER-CLASS-PREFIX .vjs-context-menu-ui .vjs-menu-content .vjs-menu-item:hover { color: --text-color; background-color: --accent-color; } .PLAYER-CLASS-PREFIX.vjs-ad-playing .vjs-progress-control .vjs-play-progress { background: --base-color; } .PLAYER-CLASS-PREFIX.cld-plw-layout { background-color: --base-color; } .PLAYER-CLASS-PREFIX .cld-plw-item-info-wrap { color: --text-color; } .PLAYER-CLASS-PREFIX .cld-plw-panel-item { border-color: --text-color; } `; const darkOnlyColors = ` .PLAYER-CLASS-PREFIX .vjs-big-play-button { border-color: rgba(--text-color, 0.5); } .PLAYER-CLASS-PREFIX.cld-video-player-skin-dark .vjs-control-bar, .PLAYER-CLASS-PREFIX.cld-video-player-skin-dark .vjs-big-play-button, .PLAYER-CLASS-PREFIX.cld-video-player-skin-dark .vjs-menu-button .vjs-menu-content { background-color: rgba(--base-color, 0.6); } .PLAYER-CLASS-PREFIX .vjs-title-bar { background-image: linear-gradient(--base-color, rgba(255, 255, 255, 0) 100%); } .PLAYER-CLASS-PREFIX .vjs-recommendations-overlay .vjs-recommendations-overlay-item.vjs-recommendations-overlay-item-primary .vjs-recommendations-overlay-item-primary-content { background-color: rgba(--base-color, 0.6); } .PLAYER-CLASS-PREFIX .vjs-recommendations-overlay .vjs-recommendations-overlay-item.vjs-recommendations-overlay-item-secondary div { background: linear-gradient(to top, rgba(0, 0, 0, 0.7), transparent 80%); } .PLAYER-CLASS-PREFIX .vjs-upcoming-video { border: 1px solid rgba(--text-color, 0.5); } .PLAYER-CLASS-PREFIX .vjs-upcoming-video .vjs-upcoming-video-bar { background-color: rgba(--base-color, 0.6); } .PLAYER-CLASS-PREFIX .vjs-context-menu-ui .vjs-menu-content { background-color: rgba(--base-color, 0.6); } `; const lightOnlyColors = ` .PLAYER-CLASS-PREFIX .vjs-title-bar { flex-direction: row; justify-content: left; height: 3.6em; background: --base-color; } .PLAYER-CLASS-PREFIX .vjs-title-bar div { width: auto; padding: 0 inherit; margin: 0; } .PLAYER-CLASS-PREFIX .vjs-big-play-button { border-color: --text-color; } .PLAYER-CLASS-PREFIX.cld-video-player-skin-light .vjs-control-bar, .PLAYER-CLASS-PREFIX.cld-video-player-skin-light .vjs-big-play-button, .PLAYER-CLASS-PREFIX.cld-video-player-skin-light .vjs-menu-button .vjs-menu-content { background-color: --base-color; } .PLAYER-CLASS-PREFIX .vjs-recommendations-overlay .vjs-recommendations-overlay-item.vjs-recommendations-overlay-item-primary .vjs-recommendations-overlay-item-primary-content { background-color: --base-color; } .PLAYER-CLASS-PREFIX .vjs-recommendations-overlay .vjs-recommendations-overlay-item.vjs-recommendations-overlay-item-primary:active .vjs-recommendations-overlay-item-primary-content, .PLAYER-CLASS-PREFIX .vjs-recommendations-overlay .vjs-recommendations-overlay-item.vjs-recommendations-overlay-item-primary:hover .vjs-recommendations-overlay-item-primary-content { color: --base-color; background-color: rgba(--accent-color, 0.8); } .PLAYER-CLASS-PREFIX .vjs-recommendations-overlay .vjs-recommendations-overlay-item.vjs-recommendations-overlay-item-secondary:active div, .PLAYER-CLASS-PREFIX .vjs-recommendations-overlay .vjs-recommendations-overlay-item.vjs-recommendations-overlay-item-secondary:hover div { color: --base-color; background-color: rgba(--accent-color, 0.8); } .PLAYER-CLASS-PREFIX .vjs-recommendations-overlay .vjs-recommendations-overlay-item.vjs-recommendations-overlay-item-secondary div { background: --base-color; } .PLAYER-CLASS-PREFIX .vjs-upcoming-video { border: 1px solid --text-color; } .PLAYER-CLASS-PREFIX .vjs-upcoming-video .vjs-upcoming-video-bar { background-color: --base-color; } .PLAYER-CLASS-PREFIX .vjs-context-menu-ui .vjs-menu-content { background-color: --base-color; } .PLAYER-CLASS-PREFIX .cld-plw-item-info-wrap { color: --text-color; } @media only screen and (max-width: 768px) { .PLAYER-CLASS-PREFIX.cld-plw-vertical .cld-plw-item-info-wrap { color: --accent-color; } } `; const defaults = { colorsDark: { 'base': '#000000', 'accent': '#FF620C', 'text': '#FFFFFF' }, colorsLight: { 'base': '#FFFFFF', 'accent': '#0078FF', 'text': '#0E2F5A' } }; class Colors { constructor(player, opts = {}) { this.player = player; const skinDefaults = this.player.options_.skin === 'light' ? defaults.colorsLight : defaults.colorsDark; opts.colors = assign({}, skinDefaults, opts.colors); this.init = () => { injectCSS(parseStyles(playerColors)); if (this.player.options_.skin === 'light') { injectCSS(parseStyles(lightOnlyColors)); } else { injectCSS(parseStyles(darkOnlyColors)); } }; const injectCSS = (css) => { const style = document.createElement('style'); style.innerHTML = css; this.player.el_.appendChild(style); }; const hexToRgb = (hex) => { // Expand shorthand form (e.g. "03F") to full form (e.g. "0033FF") const shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i; hex = hex.replace(shorthandRegex, function(m, r, g, b) { return r + r + g + g + b + b; }); // '#0080C0' to '0, 128, 192' const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex); return result ? parseInt(result[1], 16) + ', ' + parseInt(result[2], 16) + ', ' + parseInt(result[3], 16) : null; }; const parseStyles = (styles) => { const parsed = styles // wrapper class .replace(/PLAYER\-CLASS\-PREFIX/g, playerClassPrefix(this.player)) // rgba first .replace(/rgba\(\-\-base\-color/g, 'rgba(' + hexToRgb(opts.colors.base)) .replace(/rgba\(\-\-accent\-color/g, 'rgba(' + hexToRgb(opts.colors.accent)) .replace(/rgba\(\-\-text\-color/g, 'rgba(' + hexToRgb(opts.colors.text)) // solid colors .replace(/\-\-base\-color/g, opts.colors.base) .replace(/\-\-accent\-color/g, opts.colors.accent) .replace(/\-\-text\-color/g, opts.colors.text); return parsed; }; } } export default function(opts = {}) { new Colors(this, opts).init(); }