Compare commits
13 Commits
Author | SHA1 | Date | |
---|---|---|---|
26bd4d0833 | |||
b6d5ba43ec | |||
6cbcfd75d1 | |||
ce39369d84 | |||
e73eb87c7e | |||
daf2cf4b07 | |||
beba315ec5 | |||
880152d0a0 | |||
4314853640 | |||
dc10139f80 | |||
05a97500aa | |||
eb630ab551 | |||
bb193ff152 |
2
.gitignore
vendored
2
.gitignore
vendored
@ -2,3 +2,5 @@ node_modules
|
|||||||
*.sublime-project
|
*.sublime-project
|
||||||
*.sublime-workspace
|
*.sublime-workspace
|
||||||
.DS_Store
|
.DS_Store
|
||||||
|
aws.json
|
||||||
|
docs/index.dev.html
|
@ -1,6 +1,5 @@
|
|||||||
{
|
{
|
||||||
"name": "plyr",
|
"name": "plyr",
|
||||||
"version": "1.0.16",
|
|
||||||
"description": "A simple HTML5 media player using custom controls",
|
"description": "A simple HTML5 media player using custom controls",
|
||||||
"homepage": "http://plyr.io",
|
"homepage": "http://plyr.io",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
@ -14,10 +13,11 @@
|
|||||||
],
|
],
|
||||||
"dependencies": {},
|
"dependencies": {},
|
||||||
"main": [
|
"main": [
|
||||||
"dist/css/plyr.css",
|
"dist/plyr.css",
|
||||||
"dist/js/plyr.js",
|
"dist/plyr.js",
|
||||||
"dist/sprite.svg",
|
"dist/sprite.svg",
|
||||||
"src/less/plyr.less",
|
"src/less/plyr.less",
|
||||||
|
"src/sass/plyr.sass",
|
||||||
"src/js/plyr.js"
|
"src/js/plyr.js"
|
||||||
],
|
],
|
||||||
"ignore": [
|
"ignore": [
|
||||||
|
23
bundles.json
23
bundles.json
@ -1,14 +1,25 @@
|
|||||||
{
|
{
|
||||||
|
"plyr": {
|
||||||
"less": {
|
"less": {
|
||||||
"plyr.css": ["src/less/plyr.less"],
|
"plyr.css": ["src/less/plyr.less"]
|
||||||
"docs.css": ["src/less/docs.less"]
|
},
|
||||||
|
"sass": {
|
||||||
|
"plyr.css": ["src/less/plyr.sass"]
|
||||||
|
},
|
||||||
|
"js": {
|
||||||
|
"plyr.js": ["src/js/plyr.js"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"docs": {
|
||||||
|
"less": {
|
||||||
|
"docs.css": ["docs/src/less/docs.less"]
|
||||||
},
|
},
|
||||||
"js": {
|
"js": {
|
||||||
"plyr.js": ["src/js/plyr.js"],
|
|
||||||
"docs.js": [
|
"docs.js": [
|
||||||
"src/js/lib/hogan-3.0.2.mustache.js",
|
"docs/src/js/lib/hogan-3.0.2.mustache.js",
|
||||||
"dist/js/templates.js",
|
"docs/dist/templates.js",
|
||||||
"src/js/docs.js"
|
"docs/src/js/docs.js"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
11
changelog.md
11
changelog.md
@ -1,5 +1,16 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## v1.0.19
|
||||||
|
- Fixed firefox fullscreen issue (#38)
|
||||||
|
|
||||||
|
## v1.0.18
|
||||||
|
- Added CDN references
|
||||||
|
|
||||||
|
## v1.0.17
|
||||||
|
- SASS support added (thanks to @brunowego)
|
||||||
|
- Docs completely seperated to avoid any confusion
|
||||||
|
- New gulp tasks (will add more documentation for this)
|
||||||
|
|
||||||
## v1.0.16
|
## v1.0.16
|
||||||
- Aria label is now dynamic
|
- Aria label is now dynamic
|
||||||
|
|
||||||
|
1
dist/css/docs.css
vendored
1
dist/css/docs.css
vendored
@ -1 +0,0 @@
|
|||||||
/*! normalize.css v2.1.3 | MIT License | git.io/normalize */article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block}audio:not([controls]){display:none;height:0}[hidden],template{display:none}html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}a{background:0 0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}hr{box-sizing:content-box;height:0}mark{background:#ff0;color:#000}code,kbd,pre,samp{font-family:monospace,serif;font-size:1em}pre{white-space:pre-wrap}q{quotes:"\201C" "\201D" "\2018" "\2019"}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:0}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}button,input{line-height:normal}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=search]{-webkit-appearance:textfield;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top}table{border-collapse:collapse;border-spacing:0}*,::after,::before{box-sizing:border-box}body{font-family:Avenir,"Helvetica Neue",Helvetica,Arial,sans-serif;background:#fff;line-height:1.5;text-align:center;color:#6D797F}h1,h2{letter-spacing:-.025em;color:#2E3C44;margin:0 0 10px;line-height:1.2;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}h1{font-size:64px;font-size:4rem;color:#3498DB}p,small{margin:0 0 20px}small{display:block;padding:0 10px;font-size:14px;font-size:.9rem}header{padding:20px;margin-bottom:20px}header p{font-size:18px;font-size:1.1rem}@media (min-width:560px){header{padding-top:60px;padding-bottom:60px}}section{padding-bottom:20px}@media (min-width:560px){section{padding-bottom:40px}}a{text-decoration:none;color:#3498db;border-bottom:1px solid currentColor;transition:all .3s ease}a:focus,a:hover{color:#000}a:focus{outline:#343f4a dotted thin;outline-offset:1px}a.logo{border:0}.btn{display:inline-block;padding:10px 30px;background:#3498db;border:0;color:#fff;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-weight:600;border-radius:3px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:hover{color:#fff;background:#258cd1}.example-audio .player{max-width:480px}.example-video .player{max-width:1200px}.example-audio .player,.example-video .player{margin:0 auto 20px}.example-audio .player-fullscreen,.example-audio .player.fullscreen-active,.example-video .player-fullscreen,.example-video .player.fullscreen-active{max-width:none}footer{margin-bottom:20px}footer p{margin-bottom:10px}@font-face{font-family:Avenir;src:url(../../src/fonts/AvenirLTStd-Medium.woff2) format("woff2"),url(../../src/fonts/AvenirLTStd-Medium.woff) format("woff"),url(../../src/fonts/AvenirLTStd-Medium.ttf) format("truetype");font-style:normal;font-weight:400}@font-face{font-family:Avenir;src:url(../../src/fonts/AvenirLTStd-Heavy.woff2) format("woff2"),url(../../src/fonts/AvenirLTStd-Heavy.woff) format("woff"),url(../../src/fonts/AvenirLTStd-Heavy.ttf) format("truetype");font-style:normal;font-weight:600}
|
|
0
dist/css/plyr.css → dist/plyr.css
vendored
0
dist/css/plyr.css → dist/plyr.css
vendored
2
dist/js/plyr.js → dist/plyr.js
vendored
2
dist/js/plyr.js → dist/plyr.js
vendored
File diff suppressed because one or more lines are too long
1
docs/dist/docs.css
vendored
Normal file
1
docs/dist/docs.css
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
/*! normalize.css v2.1.3 | MIT License | git.io/normalize */article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block}audio:not([controls]){display:none;height:0}[hidden],template{display:none}html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}a{background:0 0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}hr{box-sizing:content-box;height:0}mark{background:#ff0;color:#000}code,kbd,pre,samp{font-family:monospace,serif;font-size:1em}pre{white-space:pre-wrap}q{quotes:"\201C" "\201D" "\2018" "\2019"}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:0}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}button,input{line-height:normal}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=search]{-webkit-appearance:textfield;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top}table{border-collapse:collapse;border-spacing:0}@font-face{font-family:Avenir;src:url(//cdn.sampotts.me/plyr/fonts/AvenirLTStd-Medium.woff2) format("woff2"),url(//cdn.sampotts.me/plyr/fonts/AvenirLTStd-Medium.woff) format("woff"),url(//cdn.sampotts.me/plyr/fonts/AvenirLTStd-Medium.ttf) format("truetype");font-style:normal;font-weight:400}@font-face{font-family:Avenir;src:url(//cdn.sampotts.me/plyr/fonts/AvenirLTStd-Heavy.woff2) format("woff2"),url(//cdn.sampotts.me/plyr/fonts/AvenirLTStd-Heavy.woff) format("woff"),url(//cdn.sampotts.me/plyr/fonts/AvenirLTStd-Heavy.ttf) format("truetype");font-style:normal;font-weight:600}*,::after,::before{box-sizing:border-box}body{font-family:Avenir,"Helvetica Neue",Helvetica,Arial,sans-serif;background:#fff;line-height:1.5;text-align:center;color:#6D797F}h1,h2{letter-spacing:-.025em;color:#2E3C44;margin:0 0 10px;line-height:1.2;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}h1{font-size:64px;font-size:4rem;color:#3498DB}p,small{margin:0 0 20px}small{display:block;padding:0 10px;font-size:14px;font-size:.9rem}header{padding:20px;margin-bottom:20px}header p{font-size:18px;font-size:1.1rem}@media (min-width:560px){header{padding-top:60px;padding-bottom:60px}}section{padding-bottom:20px}@media (min-width:560px){section{padding-bottom:40px}}a{text-decoration:none;color:#3498db;border-bottom:1px solid currentColor;transition:all .3s ease}a:focus,a:hover{color:#000}a:focus{outline:#343f4a dotted thin;outline-offset:1px}a.logo{border:0}.btn{display:inline-block;padding:10px 30px;background:#3498db;border:0;color:#fff;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-weight:600;border-radius:3px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:hover{color:#fff;background:#258cd1}.example-audio .player{max-width:480px}.example-video .player{max-width:1200px}.example-audio .player,.example-video .player{margin:0 auto 20px}.example-audio .player-fullscreen,.example-audio .player.fullscreen-active,.example-video .player-fullscreen,.example-video .player.fullscreen-active{max-width:none}footer{margin-bottom:20px}footer p{margin-bottom:10px}
|
2
dist/js/docs.js → docs/dist/docs.js
vendored
2
dist/js/docs.js → docs/dist/docs.js
vendored
File diff suppressed because one or more lines are too long
79
docs/index.html
Normal file
79
docs/index.html
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8" />
|
||||||
|
<title>Plyr - A simple HTML5 media player</title>
|
||||||
|
<meta name="description" content="A simple HTML5 media player with custom controls and WebVTT captions.">
|
||||||
|
<meta name="author" content="Sam Potts">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
|
||||||
|
<!-- Styles -->
|
||||||
|
<link rel="stylesheet" href="//cdn.plyr.io/1.0.17/plyr.css">
|
||||||
|
|
||||||
|
<!-- Docs styles -->
|
||||||
|
<link rel="stylesheet" href="//cdn.plyr.io/1.0.17/docs.css">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<header>
|
||||||
|
<h1>Plyr</h1>
|
||||||
|
<p>A simple HTML5 media player with custom controls and WebVTT captions.</p>
|
||||||
|
<a href="https://github.com/selz/plyr" target="_blank" class="btn">Download on Github</a>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<main>
|
||||||
|
<section class="example-video">
|
||||||
|
<div class="player">
|
||||||
|
<video poster="//cdn.selz.com/plyr/1.0/poster.jpg" controls crossorigin>
|
||||||
|
<!-- Video files -->
|
||||||
|
<source src="//cdn.selz.com/plyr/1.0/movie.mp4" type="video/mp4">
|
||||||
|
<source src="//cdn.selz.com/plyr/1.0/movie.webm" type="video/webm">
|
||||||
|
|
||||||
|
<!-- Text track file -->
|
||||||
|
<track kind="captions" label="English" srclang="en" src="//cdn.selz.com/plyr/1.0/movie_en_captions.vtt" default>
|
||||||
|
|
||||||
|
<!-- Fallback for browsers that don't support the <video> element -->
|
||||||
|
<div>
|
||||||
|
<a href="//cdn.selz.com/plyr/1.0/movie.mp4">Download</a>
|
||||||
|
</div>
|
||||||
|
</video>
|
||||||
|
</div>
|
||||||
|
<small>Big Buck Bunny. More info can be found at <a href="https://peach.blender.org" target="_blank">peach.blender.org</a>.</small>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="example-audio">
|
||||||
|
<div class="player">
|
||||||
|
<audio controls>
|
||||||
|
<!-- Audio files -->
|
||||||
|
<source src="//cdn.selz.com/plyr/1.0/logistics-96-sample.mp3" type="audio/mp3">
|
||||||
|
<source src="//cdn.selz.com/plyr/1.0/logistics-96-sample.ogg" type="audio/ogg">
|
||||||
|
|
||||||
|
<!-- Fallback for browsers that don't support the <audio> element -->
|
||||||
|
<div>
|
||||||
|
<a href="//cdn.selz.com/plyr/1.0/logistics-96-sample.mp3">Download</a>
|
||||||
|
</div>
|
||||||
|
</audio>
|
||||||
|
</div>
|
||||||
|
<small>"96" by Logistics, which can be purchased from <a href="https://www.hospitalrecords.com/shop/artist/logistics" target="_blank">Hospital Records</a>.</small>
|
||||||
|
</section>
|
||||||
|
</main>
|
||||||
|
|
||||||
|
<footer>
|
||||||
|
<p>Used by …</p>
|
||||||
|
<a href="https://selz.com" target="_blank" class="logo">
|
||||||
|
<img src="https://d33i624pw6jj68.cloudfront.net/static/img/logos/selz.svg" alt="Selz">
|
||||||
|
</a>
|
||||||
|
</footer>
|
||||||
|
|
||||||
|
<!-- Load SVG defs -->
|
||||||
|
<!-- You should bundle all SVG/Icons into one file using a build tool such as gulp and svg store -->
|
||||||
|
<script>
|
||||||
|
(function(d,p){var a=new XMLHttpRequest(),b=d.body;a.open("GET",p,!0);a.send();a.onload=function(){var c=d.createElement("div");c.style.display="none";c.innerHTML=a.responseText;b.insertBefore(c,b.childNodes[0])}})(document,"//cdn.plyr.io/1.0.17/sprite.svg");
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<!-- Plyr core script -->
|
||||||
|
<script src="//cdn.plyr.io/1.0.17/plyr.js"></script>
|
||||||
|
|
||||||
|
<!-- Docs script -->
|
||||||
|
<script src="//cdn.plyr.io/1.0.17/docs.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
@ -15,8 +15,8 @@ plyr.setup({
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Google analytics
|
// Google analytics
|
||||||
// For demo site (http://plyr.io) only
|
// For demo site (http://[www.]plyr.io) only
|
||||||
if(document.domain === "plyr.io") {
|
if(document.domain.indexOf("plyr.io") > -1) {
|
||||||
(function(i,s,o,g,r,a,m){i.GoogleAnalyticsObject=r;i[r]=i[r]||function(){
|
(function(i,s,o,g,r,a,m){i.GoogleAnalyticsObject=r;i[r]=i[r]||function(){
|
||||||
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
|
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
|
||||||
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
|
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
|
@ -3,9 +3,11 @@
|
|||||||
// ==========================================================================
|
// ==========================================================================
|
||||||
|
|
||||||
// Reset
|
// Reset
|
||||||
@import "docs/normalize.less";
|
@import "lib/normalize.less";
|
||||||
// Mixins
|
// Mixins
|
||||||
@import "docs/mixins.less";
|
@import "lib/mixins.less";
|
||||||
|
// Fonts - docs only!
|
||||||
|
@import "lib/fontface.less";
|
||||||
|
|
||||||
// Variables
|
// Variables
|
||||||
// ---------------------------------------
|
// ---------------------------------------
|
||||||
@ -147,7 +149,3 @@ footer {
|
|||||||
margin-bottom: (@padding-base / 2);
|
margin-bottom: (@padding-base / 2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fonts
|
|
||||||
// Last to not block rendering
|
|
||||||
@import "docs/fontface.less";
|
|
16
docs/src/less/lib/fontface.less
Normal file
16
docs/src/less/lib/fontface.less
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
@font-face {
|
||||||
|
font-family: "Avenir";
|
||||||
|
src: url("//cdn.sampotts.me/plyr/fonts/AvenirLTStd-Medium.woff2") format("woff2"),
|
||||||
|
url("//cdn.sampotts.me/plyr/fonts/AvenirLTStd-Medium.woff") format("woff"),
|
||||||
|
url("//cdn.sampotts.me/plyr/fonts/AvenirLTStd-Medium.ttf") format("truetype");
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 400;
|
||||||
|
}
|
||||||
|
@font-face {
|
||||||
|
font-family: "Avenir";
|
||||||
|
src: url("//cdn.sampotts.me/plyr/fonts/AvenirLTStd-Heavy.woff2") format("woff2"),
|
||||||
|
url("//cdn.sampotts.me/plyr/fonts/AvenirLTStd-Heavy.woff") format("woff"),
|
||||||
|
url("//cdn.sampotts.me/plyr/fonts/AvenirLTStd-Heavy.ttf") format("truetype");
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
235
gulpfile.js
235
gulpfile.js
@ -10,125 +10,234 @@ var fs = require("fs"),
|
|||||||
concat = require("gulp-concat"),
|
concat = require("gulp-concat"),
|
||||||
uglify = require("gulp-uglify"),
|
uglify = require("gulp-uglify"),
|
||||||
less = require("gulp-less"),
|
less = require("gulp-less"),
|
||||||
minifyCss = require("gulp-minify-css"),
|
sass = require("gulp-sass"),
|
||||||
runSequence = require("run-sequence"),
|
minify = require("gulp-minify-css"),
|
||||||
|
run = require("run-sequence"),
|
||||||
prefix = require("gulp-autoprefixer"),
|
prefix = require("gulp-autoprefixer"),
|
||||||
svgstore = require("gulp-svgstore"),
|
svgstore = require("gulp-svgstore"),
|
||||||
svgmin = require("gulp-svgmin"),
|
svgmin = require("gulp-svgmin"),
|
||||||
hogan = require("gulp-hogan-compile");
|
hogan = require("gulp-hogan-compile"),
|
||||||
|
rename = require("gulp-rename"),
|
||||||
|
s3 = require("gulp-s3"),
|
||||||
|
gzip = require("gulp-gzip"),
|
||||||
|
replace = require("gulp-replace");
|
||||||
|
|
||||||
var root = __dirname,
|
var root = __dirname,
|
||||||
paths = {
|
paths = {
|
||||||
// Watch paths
|
plyr: {
|
||||||
watch: {
|
// Source paths
|
||||||
|
src: {
|
||||||
less: path.join(root, "src/less/**/*"),
|
less: path.join(root, "src/less/**/*"),
|
||||||
|
sass: path.join(root, "src/sass/**/*"),
|
||||||
js: path.join(root, "src/js/**/*"),
|
js: path.join(root, "src/js/**/*"),
|
||||||
sprite: path.join(root, "src/sprite/*.svg"),
|
sprite: path.join(root, "src/sprite/*.svg")
|
||||||
templates: path.join(root, "src/templates/*.html"),
|
|
||||||
},
|
},
|
||||||
// Output paths
|
// Output paths
|
||||||
output: {
|
output: path.join(root, "dist/")
|
||||||
js: path.join(root, "dist/js/"),
|
},
|
||||||
css: path.join(root, "dist/css/"),
|
docs: {
|
||||||
sprite: path.join(root, "dist/")
|
// Source paths
|
||||||
}
|
src: {
|
||||||
|
less: path.join(root, "docs/src/less/**/*"),
|
||||||
|
js: path.join(root, "docs/src/js/**/*"),
|
||||||
|
templates: path.join(root, "docs/src/templates/*.html")
|
||||||
|
},
|
||||||
|
// Output paths
|
||||||
|
output: path.join(root, "docs/dist/"),
|
||||||
|
// Docs
|
||||||
|
root: path.join(root, "docs/")
|
||||||
|
},
|
||||||
|
upload: [path.join(root, "dist/**"), path.join(root, "docs/dist/**")]
|
||||||
},
|
},
|
||||||
|
|
||||||
// Task names
|
|
||||||
taskNames = {
|
|
||||||
jsAll: "js-all",
|
|
||||||
lessBuild: "less-",
|
|
||||||
jsBuild: "js-",
|
|
||||||
sprite: "sprite-build",
|
|
||||||
templates: "templates"
|
|
||||||
},
|
|
||||||
// Task arrays
|
// Task arrays
|
||||||
lessBuildTasks = [],
|
tasks = {
|
||||||
jsBuildTasks = [],
|
less: [],
|
||||||
|
sass: [],
|
||||||
|
js: []
|
||||||
|
},
|
||||||
|
|
||||||
// Fetch bundles from JSON
|
// Fetch bundles from JSON
|
||||||
bundles = loadJSON(path.join(root, "bundles.json"));
|
bundles = loadJSON(path.join(root, "bundles.json")),
|
||||||
|
package = loadJSON(path.join(root, "package.json"));
|
||||||
|
|
||||||
// Load json
|
// Load json
|
||||||
function loadJSON(path) {
|
function loadJSON(path) {
|
||||||
return JSON.parse(fs.readFileSync(path));
|
return JSON.parse(fs.readFileSync(path));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Build templates
|
var build = {
|
||||||
gulp.task(taskNames.templates, function () {
|
js: function (files, bundle) {
|
||||||
return gulp
|
for (var key in files) {
|
||||||
.src(paths.watch.templates)
|
|
||||||
.pipe(hogan("templates.js", {
|
|
||||||
wrapper: false,
|
|
||||||
templateName: function (file) {
|
|
||||||
return path.basename(file.relative.replace(/\\/g, "-"), path.extname(file.relative));
|
|
||||||
}
|
|
||||||
}))
|
|
||||||
.pipe(gulp.dest(paths.output.js));
|
|
||||||
});
|
|
||||||
|
|
||||||
// Process JS
|
|
||||||
for (var key in bundles.js) {
|
|
||||||
(function(key) {
|
(function(key) {
|
||||||
var taskName = taskNames.jsBuild + key;
|
var name = "js-" + key;
|
||||||
jsBuildTasks.push(taskName);
|
tasks.js.push(name);
|
||||||
|
|
||||||
gulp.task(taskName, function () {
|
gulp.task(name, function () {
|
||||||
return gulp
|
return gulp
|
||||||
.src(bundles.js[key])
|
.src(bundles[bundle].js[key])
|
||||||
.pipe(concat(key))
|
.pipe(concat(key))
|
||||||
.pipe(uglify())
|
.pipe(uglify())
|
||||||
.pipe(gulp.dest(paths.output.js));
|
.pipe(gulp.dest(paths[bundle].output));
|
||||||
});
|
});
|
||||||
})(key);
|
})(key);
|
||||||
}
|
}
|
||||||
|
},
|
||||||
// Process CSS
|
less: function(files, bundle) {
|
||||||
for (var key in bundles.less) {
|
for (var key in files) {
|
||||||
(function (key) {
|
(function (key) {
|
||||||
var taskName = taskNames.lessBuild + key;
|
var name = "less-" + key;
|
||||||
lessBuildTasks.push(taskName);
|
tasks.less.push(name);
|
||||||
|
|
||||||
gulp.task(taskName, function () {
|
gulp.task(name, function () {
|
||||||
return gulp
|
return gulp
|
||||||
.src(bundles.less[key])
|
.src(bundles[bundle].less[key])
|
||||||
.pipe(less())
|
.pipe(less())
|
||||||
.on("error", gutil.log)
|
.on("error", gutil.log)
|
||||||
.pipe(concat(key))
|
.pipe(concat(key))
|
||||||
.pipe(prefix(["last 2 versions"], { cascade: true }))
|
.pipe(prefix(["last 2 versions"], { cascade: true }))
|
||||||
.pipe(minifyCss())
|
.pipe(minify())
|
||||||
.pipe(gulp.dest(paths.output.css));
|
.pipe(gulp.dest(paths[bundle].output));
|
||||||
});
|
});
|
||||||
})(key);
|
})(key);
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
sass: function(files, bundle) {
|
||||||
|
for (var key in files) {
|
||||||
|
(function (key) {
|
||||||
|
var name = "sass-" + key;
|
||||||
|
tasks.sass.push(name);
|
||||||
|
|
||||||
// Process Icons
|
gulp.task(name, function () {
|
||||||
gulp.task(taskNames.sprite, function () {
|
|
||||||
return gulp
|
return gulp
|
||||||
.src(paths.watch.sprite)
|
.src(bundles[bundle].sass[key])
|
||||||
|
.pipe(sass())
|
||||||
|
.on("error", gutil.log)
|
||||||
|
.pipe(concat(key))
|
||||||
|
.pipe(prefix(["last 2 versions"], { cascade: true }))
|
||||||
|
.pipe(minify())
|
||||||
|
.pipe(gulp.dest(paths[bundle].output));
|
||||||
|
});
|
||||||
|
})(key);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
sprite: function() {
|
||||||
|
// Process Icons
|
||||||
|
gulp.task("sprite", function () {
|
||||||
|
return gulp
|
||||||
|
.src(paths.plyr.src.sprite)
|
||||||
.pipe(svgmin({
|
.pipe(svgmin({
|
||||||
plugins: [{
|
plugins: [{
|
||||||
removeDesc: true
|
removeDesc: true
|
||||||
}]
|
}]
|
||||||
}))
|
}))
|
||||||
.pipe(svgstore())
|
.pipe(svgstore())
|
||||||
.pipe(gulp.dest(paths.output.sprite));
|
.pipe(gulp.dest(paths.plyr.output));
|
||||||
});
|
});
|
||||||
|
},
|
||||||
|
templates: function() {
|
||||||
|
// Build templates
|
||||||
|
gulp.task("templates", function () {
|
||||||
|
return gulp
|
||||||
|
.src(paths.docs.src.templates)
|
||||||
|
.pipe(hogan("templates.js", {
|
||||||
|
wrapper: false,
|
||||||
|
templateName: function (file) {
|
||||||
|
return path.basename(file.relative.replace(/\\/g, "-"), path.extname(file.relative));
|
||||||
|
}
|
||||||
|
}))
|
||||||
|
.pipe(gulp.dest(paths.docs.output));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Plyr core files
|
||||||
|
build.js(bundles.plyr.js, "plyr");
|
||||||
|
build.less(bundles.plyr.less, "plyr");
|
||||||
|
build.sass(bundles.plyr.sass, "plyr");
|
||||||
|
build.sprite();
|
||||||
|
|
||||||
|
// Docs files
|
||||||
|
build.templates();
|
||||||
|
build.less(bundles.docs.less, "docs");
|
||||||
|
build.js(bundles.docs.js, "docs");
|
||||||
|
|
||||||
// Default gulp task
|
// Default gulp task
|
||||||
gulp.task("default", function(){
|
gulp.task("default", function(){
|
||||||
runSequence(taskNames.jsAll, lessBuildTasks.concat(taskNames.sprite, "watch"));
|
run("templates", tasks.js, tasks.less, "sprite");
|
||||||
});
|
});
|
||||||
|
|
||||||
// Build all JS (inc. templates)
|
// Build all JS (inc. templates)
|
||||||
gulp.task(taskNames.jsAll, function(){
|
gulp.task("js", function(){
|
||||||
runSequence(taskNames.templates, jsBuildTasks);
|
run("templates", tasks.js);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Build SASS (for testing, default is LESS)
|
||||||
|
gulp.task("sass", function(){
|
||||||
|
run(tasks.sass);
|
||||||
});
|
});
|
||||||
|
|
||||||
// Watch for file changes
|
// Watch for file changes
|
||||||
gulp.task("watch", function () {
|
gulp.task("watch", function () {
|
||||||
//gulp.watch(paths.watch.templates, [taskNames.jsAll]);
|
// Plyr core
|
||||||
//gulp.watch(paths.watch.js, [taskNames.jsAll]);
|
gulp.watch(paths.plyr.src.js, tasks.js);
|
||||||
gulp.watch(paths.watch.less, lessBuildTasks);
|
gulp.watch(paths.plyr.src.less, tasks.less);
|
||||||
gulp.watch(paths.watch.sprite, [taskNames.iconBuild]);
|
gulp.watch(paths.plyr.src.sprite, "sprite");
|
||||||
|
|
||||||
|
// Docs
|
||||||
|
gulp.watch(paths.docs.src.js, tasks.js);
|
||||||
|
gulp.watch(paths.docs.src.less, tasks.less);
|
||||||
|
gulp.watch(paths.docs.src.templates, "js");
|
||||||
|
});
|
||||||
|
|
||||||
|
// Publish the docs site
|
||||||
|
try {
|
||||||
|
var aws = loadJSON(path.join(root, "aws.json"));
|
||||||
|
}
|
||||||
|
catch (e) { }
|
||||||
|
|
||||||
|
var version = package.version,
|
||||||
|
maxAge = 31536000, // seconds 1 year
|
||||||
|
options = {
|
||||||
|
cdn: {
|
||||||
|
headers: {
|
||||||
|
"Cache-Control": "max-age=" + maxAge + ", no-transform, public",
|
||||||
|
"Vary": "Accept-Encoding"
|
||||||
|
},
|
||||||
|
gzippedOnly: true
|
||||||
|
},
|
||||||
|
docs: {
|
||||||
|
headers: {
|
||||||
|
"Cache-Control": "public, must-revalidate, proxy-revalidate, max-age=0",
|
||||||
|
"Vary": "Accept-Encoding"
|
||||||
|
},
|
||||||
|
gzippedOnly: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
cdnpath = new RegExp(aws.cdn.bucket + "\/(\\d+\\.)?(\\d+\\.)?(\\*|\\d+)","gi");
|
||||||
|
|
||||||
|
gulp.task("cdn", function () {
|
||||||
|
console.log("Uploading " + version + " to " + aws.cdn.bucket);
|
||||||
|
|
||||||
|
// Upload to CDN
|
||||||
|
gulp.src(paths.upload)
|
||||||
|
.pipe(rename(function (path) {
|
||||||
|
path.dirname = path.dirname.replace(".", version);
|
||||||
|
}))
|
||||||
|
.pipe(gzip())
|
||||||
|
.pipe(s3(aws.cdn, options.cdn));
|
||||||
|
});
|
||||||
|
|
||||||
|
gulp.task("docs", function () {
|
||||||
|
console.log("Uploading " + version + " docs to " + aws.docs.bucket);
|
||||||
|
|
||||||
|
// Replace versioned files in index.html
|
||||||
|
gulp.src([paths.docs.root + "index.html"])
|
||||||
|
.pipe(replace(cdnpath, aws.cdn.bucket + "/" + version))
|
||||||
|
.pipe(gzip())
|
||||||
|
.pipe(s3(aws.docs, options.docs));
|
||||||
|
});
|
||||||
|
|
||||||
|
gulp.task("publish", function () {
|
||||||
|
run("templates", tasks.js, tasks.less, "sprite", "cdn", "docs");
|
||||||
});
|
});
|
74
index.html
74
index.html
@ -1,74 +0,0 @@
|
|||||||
<!doctype html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8" />
|
|
||||||
<title>Plyr - A simple HTML5 media player</title>
|
|
||||||
<meta name="description" content="A simple HTML5 media player with custom controls and WebVTT captions.">
|
|
||||||
<meta name="author" content="Sam Potts">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
||||||
|
|
||||||
<!-- Styles -->
|
|
||||||
<link rel="stylesheet" href="dist/css/plyr.css">
|
|
||||||
<link rel="stylesheet" href="dist/css/docs.css">
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<header>
|
|
||||||
<h1>Plyr</h1>
|
|
||||||
<p>A simple HTML5 media player with custom controls and WebVTT captions.</p>
|
|
||||||
<a href="https://github.com/selz/plyr" target="_blank" class="btn">Download on Github</a>
|
|
||||||
</header>
|
|
||||||
|
|
||||||
<section class="example-video">
|
|
||||||
<div class="player">
|
|
||||||
<video poster="//cdn.selz.com/plyr/1.0/poster.jpg" controls crossorigin>
|
|
||||||
<!-- Video files -->
|
|
||||||
<source src="//cdn.selz.com/plyr/1.0/movie.mp4" type="video/mp4">
|
|
||||||
<source src="//cdn.selz.com/plyr/1.0/movie.webm" type="video/webm">
|
|
||||||
|
|
||||||
<!-- Text track file -->
|
|
||||||
<track kind="captions" label="English" srclang="en" src="//cdn.selz.com/plyr/1.0/movie_en_captions.vtt" default>
|
|
||||||
|
|
||||||
<!-- Fallback for browsers that don't support the <video> element -->
|
|
||||||
<div>
|
|
||||||
<a href="//cdn.selz.com/plyr/1.0/movie.mp4">Download</a>
|
|
||||||
</div>
|
|
||||||
</video>
|
|
||||||
</div>
|
|
||||||
<small>Big Buck Bunny. More info can be found at <a href="https://peach.blender.org" target="_blank">peach.blender.org</a>.</small>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<section class="example-audio">
|
|
||||||
<div class="player">
|
|
||||||
<audio controls>
|
|
||||||
<!-- Audio files -->
|
|
||||||
<source src="//cdn.selz.com/plyr/1.0/logistics-96-sample.mp3" type="audio/mp3">
|
|
||||||
<source src="//cdn.selz.com/plyr/1.0/logistics-96-sample.ogg" type="audio/ogg">
|
|
||||||
|
|
||||||
<!-- Fallback for browsers that don't support the <audio> element -->
|
|
||||||
<div>
|
|
||||||
<a href="//cdn.selz.com/plyr/1.0/logistics-96-sample.mp3">Download</a>
|
|
||||||
</div>
|
|
||||||
</audio>
|
|
||||||
</div>
|
|
||||||
<small>"96" by Logistics, which can be purchased from <a href="https://www.hospitalrecords.com/shop/artist/logistics" target="_blank">Hospital Records</a>.</small>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<footer>
|
|
||||||
<p>Used by …</p>
|
|
||||||
<a href="https://selz.com" target="_blank" class="logo">
|
|
||||||
<img src="https://d33i624pw6jj68.cloudfront.net/static/img/logos/selz.svg" alt="Selz">
|
|
||||||
</a>
|
|
||||||
</footer>
|
|
||||||
|
|
||||||
<!-- Load SVG defs -->
|
|
||||||
<script>
|
|
||||||
(function(d,p){var a=new XMLHttpRequest(),b=d.body;a.open("GET",p,!0);a.send();a.onload=function(){var c=d.createElement("div");c.style.display="none";c.innerHTML=a.responseText;b.insertBefore(c,b.childNodes[0])}})(document,"dist/sprite.svg");
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<!-- Core player -->
|
|
||||||
<script src="dist/js/plyr.js"></script>
|
|
||||||
|
|
||||||
<!-- Docs setup -->
|
|
||||||
<script src="dist/js/docs.js"></script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "plyr",
|
"name": "plyr",
|
||||||
"version": "1.0.16",
|
"version": "1.0.19",
|
||||||
"description": "A simple HTML5 media player using custom controls",
|
"description": "A simple HTML5 media player using custom controls",
|
||||||
"homepage": "http://plyr.io",
|
"homepage": "http://plyr.io",
|
||||||
"main": "gulpfile.js",
|
"main": "gulpfile.js",
|
||||||
@ -9,9 +9,14 @@
|
|||||||
"gulp": "~3.8.6",
|
"gulp": "~3.8.6",
|
||||||
"gulp-autoprefixer": "^0.0.8",
|
"gulp-autoprefixer": "^0.0.8",
|
||||||
"gulp-concat": "~2.3.3",
|
"gulp-concat": "~2.3.3",
|
||||||
|
"gulp-gzip": "^1.0.0",
|
||||||
"gulp-hogan-compile": "^0.4.1",
|
"gulp-hogan-compile": "^0.4.1",
|
||||||
"gulp-less": "~1.3.1",
|
"gulp-less": "~1.3.1",
|
||||||
"gulp-minify-css": "~0.3.6",
|
"gulp-minify-css": "~0.3.6",
|
||||||
|
"gulp-rename": "^1.2.0",
|
||||||
|
"gulp-replace": "^0.5.3",
|
||||||
|
"gulp-s3": "^0.3.0",
|
||||||
|
"gulp-sass": "^1.3.3",
|
||||||
"gulp-svgmin": "^1.0.0",
|
"gulp-svgmin": "^1.0.0",
|
||||||
"gulp-svgstore": "^5.0.0",
|
"gulp-svgstore": "^5.0.0",
|
||||||
"gulp-uglify": "~0.3.1",
|
"gulp-uglify": "~0.3.1",
|
||||||
|
24
readme.md
24
readme.md
@ -30,6 +30,8 @@ If you have any cool ideas or features, please let me know by [creating an issue
|
|||||||
|
|
||||||
## Implementation
|
## Implementation
|
||||||
|
|
||||||
|
Check `docs/index.html` and `docs/dist/docs.js` for an example setup.
|
||||||
|
|
||||||
### Bower
|
### Bower
|
||||||
If bower is your thang, you can grab Plyr using:
|
If bower is your thang, you can grab Plyr using:
|
||||||
```
|
```
|
||||||
@ -37,15 +39,25 @@ bower install plyr
|
|||||||
```
|
```
|
||||||
More info on setting up dependencies can be found in the [Bower Docs](http://bower.io/docs/creating-packages/#maintaining-dependencies)
|
More info on setting up dependencies can be found in the [Bower Docs](http://bower.io/docs/creating-packages/#maintaining-dependencies)
|
||||||
|
|
||||||
### CSS
|
### CDN
|
||||||
If you want to use the default css, add the css file from /dist into your head, or even better use the less file included in `/src` in your build to save a request.
|
If you want to use our CDN, you can use the following. Currently it's HTTP only.
|
||||||
|
|
||||||
```html
|
```html
|
||||||
<link rel="stylesheet" href="dist/css/plyr.css">
|
<link rel="stylesheet" href="http://cdn.plyr.io/1.0.19/plyr.css">
|
||||||
|
<script src="http://cdn.plyr.io/1.0.19/plyr.js"></script>
|
||||||
|
```
|
||||||
|
|
||||||
|
You can also access the `sprite.svg` file at `http://cdn.plyr.io/1.0.19/sprite.svg`.
|
||||||
|
|
||||||
|
### CSS
|
||||||
|
If you want to use the default css, add the `plyr.css` file from /dist into your head, or even better use `plyr.less` or `plyr.sass` file included in `/src` in your build to save a request.
|
||||||
|
|
||||||
|
```html
|
||||||
|
<link rel="stylesheet" href="dist/plyr.css">
|
||||||
```
|
```
|
||||||
|
|
||||||
### SVG
|
### SVG
|
||||||
The SVG sprite for the controls icons is loaded in by AJAX to help with performance. This is best added before the closing `</body>`
|
The SVG sprite for the controls icons is loaded in by AJAX to help with performance. This is best added before the closing `</body>`, before any other scripts.
|
||||||
|
|
||||||
```html
|
```html
|
||||||
<script>
|
<script>
|
||||||
@ -60,7 +72,7 @@ The SVG sprite for the controls icons is loaded in by AJAX to help with performa
|
|||||||
c.innerHTML=a.responseText;
|
c.innerHTML=a.responseText;
|
||||||
b.insertBefore(c,b.childNodes[0])
|
b.insertBefore(c,b.childNodes[0])
|
||||||
}
|
}
|
||||||
})(document,"dist/svg/sprite.svg");
|
})(document,"dist/sprite.svg");
|
||||||
</script>
|
</script>
|
||||||
```
|
```
|
||||||
More info on SVG sprites here:
|
More info on SVG sprites here:
|
||||||
@ -114,7 +126,7 @@ More info on CORS here:
|
|||||||
Much of the behaviour of the player is configurable when initialising the library. Below is an example of a default instance.
|
Much of the behaviour of the player is configurable when initialising the library. Below is an example of a default instance.
|
||||||
|
|
||||||
```html
|
```html
|
||||||
<script src="dist/js/plyr.js"></script>
|
<script src="dist/plyr.js"></script>
|
||||||
<script>
|
<script>
|
||||||
plyr.setup({
|
plyr.setup({
|
||||||
html: **your controls html**
|
html: **your controls html**
|
||||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -1,6 +1,6 @@
|
|||||||
// ==========================================================================
|
// ==========================================================================
|
||||||
// Plyr
|
// Plyr
|
||||||
// plyr.js v1.0.16
|
// plyr.js v1.0.19
|
||||||
// https://github.com/sampotts/plyr
|
// https://github.com/sampotts/plyr
|
||||||
// ==========================================================================
|
// ==========================================================================
|
||||||
// Credits: http://paypal.github.io/accessible-html5-video-player/
|
// Credits: http://paypal.github.io/accessible-html5-video-player/
|
||||||
@ -795,12 +795,12 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Toggle fullscreen
|
// Toggle fullscreen
|
||||||
function _toggleFullscreen() {
|
function _toggleFullscreen(event) {
|
||||||
// Check for native support
|
// Check for native support
|
||||||
var nativeSupport = fullscreen.supportsFullScreen;
|
var nativeSupport = fullscreen.supportsFullScreen;
|
||||||
|
|
||||||
// If it's a fullscreen change event, it's probably a native close
|
// If it's a fullscreen change event, it's probably a native close
|
||||||
if(event.type === fullscreen.fullScreenEventName) {
|
if(event && event.type === fullscreen.fullScreenEventName) {
|
||||||
config.fullscreen.active = fullscreen.isFullScreen();
|
config.fullscreen.active = fullscreen.isFullScreen();
|
||||||
}
|
}
|
||||||
// If there's native support, use it
|
// If there's native support, use it
|
||||||
|
@ -1,16 +0,0 @@
|
|||||||
@font-face {
|
|
||||||
font-family: "Avenir";
|
|
||||||
src: url("../../src/fonts/AvenirLTStd-Medium.woff2") format("woff2"),
|
|
||||||
url("../../src/fonts/AvenirLTStd-Medium.woff") format("woff"),
|
|
||||||
url("../../src/fonts/AvenirLTStd-Medium.ttf") format("truetype");
|
|
||||||
font-style: normal;
|
|
||||||
font-weight: 400;
|
|
||||||
}
|
|
||||||
@font-face {
|
|
||||||
font-family: "Avenir";
|
|
||||||
src: url("../../src/fonts/AvenirLTStd-Heavy.woff2") format("woff2"),
|
|
||||||
url("../../src/fonts/AvenirLTStd-Heavy.woff") format("woff"),
|
|
||||||
url("../../src/fonts/AvenirLTStd-Heavy.ttf") format("truetype");
|
|
||||||
font-style: normal;
|
|
||||||
font-weight: 600;
|
|
||||||
}
|
|
443
src/sass/plyr.scss
Normal file
443
src/sass/plyr.scss
Normal file
@ -0,0 +1,443 @@
|
|||||||
|
// ==========================================================================
|
||||||
|
// HTML5 Media Player
|
||||||
|
// ==========================================================================
|
||||||
|
|
||||||
|
// Variables
|
||||||
|
// -------------------------------
|
||||||
|
// Colors
|
||||||
|
$blue: #3498DB;
|
||||||
|
$gray-dark: #343f4a;
|
||||||
|
$gray: #565d64;
|
||||||
|
$gray-light: #cbd0d3;
|
||||||
|
|
||||||
|
// Font sizes
|
||||||
|
$font-size-small: 14px;
|
||||||
|
$font-size-base: 16px;
|
||||||
|
$font-size-large: ceil(($font-size-base * 1.5));
|
||||||
|
|
||||||
|
// Controls
|
||||||
|
$control-spacing: 10px;
|
||||||
|
$controls-bg: $gray-dark;
|
||||||
|
$control-bg-hover: $blue;
|
||||||
|
$control-color: $gray-light;
|
||||||
|
$control-color-inactive: $gray;
|
||||||
|
$control-color-focus: #fff;
|
||||||
|
$control-color-hover: #fff;
|
||||||
|
|
||||||
|
// Progress
|
||||||
|
$progress-bg: lighten($gray, 10%);
|
||||||
|
$progress-playing-bg: $blue;
|
||||||
|
$progress-buffered-bg: $gray;
|
||||||
|
|
||||||
|
// Range
|
||||||
|
$range-track-height: 6px;
|
||||||
|
$range-track-bg: $gray;
|
||||||
|
$range-thumb-height: ($range-track-height * 2);
|
||||||
|
$range-thumb-width: ($range-track-height * 2);
|
||||||
|
$range-thumb-bg: $control-color;
|
||||||
|
$range-thumb-bg-focus: $control-bg-hover;
|
||||||
|
|
||||||
|
// Breakpoints
|
||||||
|
$bp-control-split: 560px; // When controls split into left/right
|
||||||
|
$bp-captions-large: 768px; // When captions jump to the larger font size
|
||||||
|
|
||||||
|
// Utility classes & mixins
|
||||||
|
// -------------------------------
|
||||||
|
// Screen reader only
|
||||||
|
.sr-only {
|
||||||
|
position: absolute !important;
|
||||||
|
clip: rect(1px, 1px, 1px, 1px);
|
||||||
|
padding: 0 !important;
|
||||||
|
border: 0 !important;
|
||||||
|
height: 1px !important;
|
||||||
|
width: 1px !important;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
// Contain floats: nicolasgallagher.com/micro-clearfix-hack/
|
||||||
|
@mixin clearfix()
|
||||||
|
{
|
||||||
|
zoom: 1;
|
||||||
|
&:before,
|
||||||
|
&:after { content: ""; display: table; }
|
||||||
|
&:after { clear: both; }
|
||||||
|
}
|
||||||
|
|
||||||
|
// Tab focus styles
|
||||||
|
@mixin tab-focus()
|
||||||
|
{
|
||||||
|
outline: thin dotted #000;
|
||||||
|
outline-offset: 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Range styling
|
||||||
|
// ---------------------------------------
|
||||||
|
@mixin range-thumb()
|
||||||
|
{
|
||||||
|
height: $range-thumb-height;
|
||||||
|
width: $range-thumb-width;
|
||||||
|
background: $range-thumb-bg;
|
||||||
|
border: 0;
|
||||||
|
border-radius: ($range-thumb-height / 2);
|
||||||
|
transition: background .3s ease;
|
||||||
|
cursor: ew-resize;
|
||||||
|
}
|
||||||
|
@mixin range-track()
|
||||||
|
{
|
||||||
|
height: $range-track-height;
|
||||||
|
background: $range-track-bg;
|
||||||
|
border: 0;
|
||||||
|
border-radius: ($range-track-height / 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Font smoothing
|
||||||
|
// ---------------------------------------
|
||||||
|
@mixin font-smoothing($mode: on) when ($mode = on)
|
||||||
|
{
|
||||||
|
-moz-osx-font-smoothing: grayscale;
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
|
}
|
||||||
|
@mixin font-smoothing($mode: on) when ($mode = off)
|
||||||
|
{
|
||||||
|
-moz-osx-font-smoothing: auto;
|
||||||
|
-webkit-font-smoothing: subpixel-antialiased;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Styles
|
||||||
|
// -------------------------------
|
||||||
|
// Base
|
||||||
|
.player {
|
||||||
|
position: relative;
|
||||||
|
max-width: 100%;
|
||||||
|
min-width: 290px;
|
||||||
|
overflow: hidden; // For the controls
|
||||||
|
|
||||||
|
// border-box everything
|
||||||
|
// http://paulirish.com/2012/box-sizing-border-box-ftw/
|
||||||
|
&,
|
||||||
|
*,
|
||||||
|
*::after,
|
||||||
|
*::before {
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
// For video
|
||||||
|
&-video-wrapper {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
video {
|
||||||
|
width: 100%;
|
||||||
|
height: auto;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Captions
|
||||||
|
&-captions {
|
||||||
|
display: none;
|
||||||
|
position: absolute;
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
padding: 20px;
|
||||||
|
min-height: 2.5em;
|
||||||
|
color: #fff;
|
||||||
|
font-size: $font-size-base;
|
||||||
|
font-weight: 600;
|
||||||
|
text-shadow:
|
||||||
|
-1px -1px 0 $gray,
|
||||||
|
1px -1px 0 $gray,
|
||||||
|
-1px 1px 0 $gray,
|
||||||
|
1px 1px 0 $gray;
|
||||||
|
text-align: center;
|
||||||
|
@include font-smoothing();
|
||||||
|
|
||||||
|
@media (min-width: $bp-captions-large) {
|
||||||
|
font-size: $font-size-large;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
&.captions-active &-captions {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Player controls
|
||||||
|
&-controls {
|
||||||
|
@include clearfix();
|
||||||
|
@include font-smoothing();
|
||||||
|
position: relative;
|
||||||
|
padding: ($control-spacing * 2) $control-spacing $control-spacing;
|
||||||
|
background: $controls-bg;
|
||||||
|
line-height: 1;
|
||||||
|
text-align: center;
|
||||||
|
|
||||||
|
// Layout
|
||||||
|
&-sound {
|
||||||
|
display: block;
|
||||||
|
margin: $control-spacing auto 0;
|
||||||
|
}
|
||||||
|
@media (min-width: $bp-control-split) {
|
||||||
|
&-playback {
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
&-sound {
|
||||||
|
float: right;
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
input + label,
|
||||||
|
button {
|
||||||
|
display: inline-block;
|
||||||
|
vertical-align: middle;
|
||||||
|
margin: 0 2px;
|
||||||
|
padding: ($control-spacing / 2) $control-spacing;
|
||||||
|
|
||||||
|
transition: background .3s ease;
|
||||||
|
border-radius: 3px;
|
||||||
|
cursor: pointer;
|
||||||
|
|
||||||
|
svg {
|
||||||
|
width: 18px;
|
||||||
|
height: 18px;
|
||||||
|
display: block;
|
||||||
|
fill: currentColor;
|
||||||
|
transition: fill .3s ease;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
input + label,
|
||||||
|
input.inverted:checked + label {
|
||||||
|
color: $control-color-inactive;
|
||||||
|
}
|
||||||
|
button,
|
||||||
|
input.inverted + label,
|
||||||
|
input:checked + label {
|
||||||
|
color: $control-color;
|
||||||
|
}
|
||||||
|
button {
|
||||||
|
border: 0;
|
||||||
|
background: transparent;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
input:focus + label,
|
||||||
|
button:focus {
|
||||||
|
@include tab-focus();
|
||||||
|
color: $control-color-focus;
|
||||||
|
}
|
||||||
|
button:hover,
|
||||||
|
input + label:hover {
|
||||||
|
background: $control-bg-hover;
|
||||||
|
color: $control-color-hover;
|
||||||
|
}
|
||||||
|
.icon-exit-fullscreen,
|
||||||
|
.icon-muted {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.player-time {
|
||||||
|
display: inline-block;
|
||||||
|
vertical-align: middle;
|
||||||
|
margin-left: $control-spacing;
|
||||||
|
color: $control-color;
|
||||||
|
font-weight: 600;
|
||||||
|
font-size: $font-size-small;
|
||||||
|
@include font-smoothing();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Player progress
|
||||||
|
// <progress> element
|
||||||
|
&-progress {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: $control-spacing;
|
||||||
|
background: $progress-bg;
|
||||||
|
|
||||||
|
&-buffer,
|
||||||
|
&-played {
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
top: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
margin: 0;
|
||||||
|
vertical-align: top;
|
||||||
|
|
||||||
|
&[value] {
|
||||||
|
-webkit-appearance: none;
|
||||||
|
border: none;
|
||||||
|
background: transparent;
|
||||||
|
|
||||||
|
&::-webkit-progress-bar {
|
||||||
|
background: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Inherit from currentColor;
|
||||||
|
&::-webkit-progress-value {
|
||||||
|
background: currentColor;
|
||||||
|
}
|
||||||
|
&::-moz-progress-bar {
|
||||||
|
background: currentColor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
&-played {
|
||||||
|
z-index: 2;
|
||||||
|
}
|
||||||
|
&-played[value] {
|
||||||
|
cursor: pointer;
|
||||||
|
color: $progress-playing-bg;
|
||||||
|
}
|
||||||
|
&-buffer[value] {
|
||||||
|
color: $progress-buffered-bg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// States
|
||||||
|
&-controls [data-player='pause'],
|
||||||
|
&.playing .player-controls [data-player='play'] {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
&.playing .player-controls [data-player='pause'] {
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Muted
|
||||||
|
&.muted .player-controls .icon-muted {
|
||||||
|
display: block;
|
||||||
|
|
||||||
|
& + svg {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Volume control
|
||||||
|
// <input[type='range']> element
|
||||||
|
// Specificty is for bootstrap compatibility
|
||||||
|
&-volume[type=range] {
|
||||||
|
vertical-align: middle;
|
||||||
|
-webkit-appearance: none;
|
||||||
|
-moz-appearance: none;
|
||||||
|
width: 100px;
|
||||||
|
margin: 0 $control-spacing 0 0;
|
||||||
|
padding: 0;
|
||||||
|
cursor: pointer;
|
||||||
|
background: none;
|
||||||
|
|
||||||
|
// Webkit
|
||||||
|
&::-webkit-slider-runnable-track {
|
||||||
|
@include range-track();
|
||||||
|
}
|
||||||
|
&::-webkit-slider-thumb {
|
||||||
|
-webkit-appearance: none;
|
||||||
|
margin-top: -(($range-thumb-height - $range-track-height) / 2);
|
||||||
|
@include range-thumb();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mozilla
|
||||||
|
&::-moz-range-track {
|
||||||
|
@include range-track();
|
||||||
|
}
|
||||||
|
&::-moz-range-thumb {
|
||||||
|
@include range-thumb();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Microsoft
|
||||||
|
&::-ms-track {
|
||||||
|
height: $range-track-height;
|
||||||
|
background: transparent;
|
||||||
|
border-color: transparent;
|
||||||
|
border-width: (($range-thumb-height - $range-track-height) / 2) 0;
|
||||||
|
color: transparent;
|
||||||
|
}
|
||||||
|
&::-ms-fill-lower,
|
||||||
|
&::-ms-fill-upper {
|
||||||
|
@include range-track();
|
||||||
|
}
|
||||||
|
&::-ms-thumb {
|
||||||
|
@include range-thumb();
|
||||||
|
}
|
||||||
|
|
||||||
|
&:focus {
|
||||||
|
outline: 0;
|
||||||
|
|
||||||
|
&::-webkit-slider-thumb {
|
||||||
|
background: $range-thumb-bg-focus;
|
||||||
|
}
|
||||||
|
&::-moz-range-thumb {
|
||||||
|
background: $range-thumb-bg-focus;
|
||||||
|
}
|
||||||
|
&::-ms-thumb {
|
||||||
|
background: $range-thumb-bg-focus;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Full screen mode
|
||||||
|
&-fullscreen,
|
||||||
|
&.fullscreen-active {
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
height: 100%;
|
||||||
|
width: 100%;
|
||||||
|
z-index: 10000000;
|
||||||
|
background: #000;
|
||||||
|
|
||||||
|
.player-video-wrapper {
|
||||||
|
height: 100%;
|
||||||
|
width: 100%;
|
||||||
|
|
||||||
|
video {
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
.player-captions {
|
||||||
|
top: auto;
|
||||||
|
bottom: 90px;
|
||||||
|
|
||||||
|
@media (min-width: $bp-control-split) and (max-width: ($bp-captions-large - 1)) {
|
||||||
|
bottom: 60px;
|
||||||
|
}
|
||||||
|
@media (min-width: $bp-captions-large) {
|
||||||
|
bottom: 80px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.player-controls {
|
||||||
|
position: absolute;
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// When true full screen, show exit fullscreen icon
|
||||||
|
&.fullscreen-active .icon-exit-fullscreen {
|
||||||
|
display: block;
|
||||||
|
|
||||||
|
& + svg {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Some options are hidden by default
|
||||||
|
[data-player='captions'],
|
||||||
|
[data-player='captions'] + label,
|
||||||
|
[data-player='fullscreen'],
|
||||||
|
[data-player='fullscreen'] + label {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
&.captions-enabled [data-player='captions'],
|
||||||
|
&.captions-enabled [data-player='captions'] + label,
|
||||||
|
&.fullscreen-enabled [data-player='fullscreen'],
|
||||||
|
&.fullscreen-enabled [data-player='fullscreen'] + label {
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Full browser view hides toggle
|
||||||
|
&-fullscreen [data-player='fullscreen'],
|
||||||
|
&-fullscreen [data-player='fullscreen'] + label {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user