diff --git a/.gitignore b/.gitignore index ce35528e1..2e12adf22 100644 --- a/.gitignore +++ b/.gitignore @@ -81,6 +81,9 @@ build/Release node_modules/ jspm_packages/ +# Dependency lockfile +package-lock.json + # TypeScript v1 declaration files typings/ diff --git a/README.md b/README.md index f9796e617..6a80b0b09 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ Translation Status -
+
Donate @@ -53,7 +53,7 @@ Jellyfin Web is the frontend used for most of the clients available for end user git clone https://github.com/jellyfin/jellyfin-web.git cd jellyfin-web ``` -2. Install build dependencies in the project directory via npm. +2. Install build dependencies in the project directory. ```sh yarn install ``` diff --git a/package.json b/package.json index a7ef3f7e6..76d01b184 100644 --- a/package.json +++ b/package.json @@ -5,12 +5,14 @@ "repository": "https://github.com/jellyfin/jellyfin-web", "license": "GPL-2.0-or-later", "devDependencies": { + "autoprefixer": "^9.7.3", "clean-webpack-plugin": "^3.0.0", - "copy-webpack-plugin": "^5.0.3", + "copy-webpack-plugin": "^5.1.1", "css-loader": "^2.1.0", "eslint": "^5.16.0", "file-loader": "^3.0.1", "html-webpack-plugin": "^3.2.0", + "postcss-loader": "^3.0.0", "style-loader": "^0.23.1", "webpack": "^4.41.0", "webpack-cli": "^3.3.9", @@ -33,9 +35,25 @@ "shaka-player": "^2.5.5", "sortablejs": "^1.9.0", "swiper": "^3.4.2", + "libass-wasm": "^2.1.1", "webcomponents.js": "^0.7.24", "whatwg-fetch": "^1.1.1" }, + "browserslist": [ + "last 2 Firefox versions", + "last 2 Chrome versions", + "last 2 ChromeAndroid versions", + "last 2 Safari versions", + "last 2 iOS versions", + "last 2 Edge versions", + "Chrome 38", + "Chrome 47", + "Chrome 53", + "Chrome 56", + "Chrome 63", + "Explorer 11", + "Firefox ESR" + ], "scripts": { "serve": "webpack-dev-server --config webpack.dev.js --open", "build": "webpack --config webpack.prod.js", diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 000000000..a26de7e9f --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,5 @@ +module.exports = { + plugins: [ + require('autoprefixer') + ] +} diff --git a/src/css/clearbutton.css b/src/assets/css/clearbutton.css similarity index 100% rename from src/css/clearbutton.css rename to src/assets/css/clearbutton.css diff --git a/src/css/dashboard.css b/src/assets/css/dashboard.css similarity index 83% rename from src/css/dashboard.css rename to src/assets/css/dashboard.css index 1c69dfccb..d4928db69 100644 --- a/src/css/dashboard.css +++ b/src/assets/css/dashboard.css @@ -1,7 +1,6 @@ .dashboardColumn, .dashboardSections { - -webkit-box-orient: vertical; - -webkit-box-direction: normal + flex-direction: column; } .dashboardFooter { @@ -15,8 +14,6 @@ progress { appearance: none; - -moz-appearance: none; - -webkit-appearance: none; margin: 0; background: #ccc !important } @@ -76,23 +73,17 @@ progress[aria-valuenow]:before { div[data-role=controlgroup] a[data-role=button] { display: inline-block !important; margin: 0 !important; - -webkit-box-shadow: none !important; box-shadow: none !important; - -webkit-border-radius: 0; border-radius: 0 } div[data-role=controlgroup] a[data-role=button]:first-child { - -webkit-border-bottom-left-radius: .3125em; border-bottom-left-radius: .3125em; - -webkit-border-top-left-radius: .3125em; border-top-left-radius: .3125em } div[data-role=controlgroup] a[data-role=button]:last-child { - -webkit-border-bottom-right-radius: .3125em; border-bottom-right-radius: .3125em; - -webkit-border-top-right-radius: .3125em; border-top-right-radius: .3125em } @@ -146,23 +137,14 @@ div[data-role=controlgroup] a.ui-btn-active { } .dashboardSections { - display: -webkit-box; - display: -webkit-flex; display: flex; - -webkit-flex-direction: column; flex-direction: column } .dashboardColumn { - display: -webkit-box; - display: -webkit-flex; display: flex; - -webkit-flex-direction: column; flex-direction: column; - -webkit-flex-shrink: 0; flex-shrink: 0; - -webkit-box-flex: 1; - -webkit-flex-grow: 1; flex-grow: 1 } @@ -171,7 +153,6 @@ div[data-role=controlgroup] a.ui-btn-active { } .dashboardSection { - -webkit-flex-shrink: 0; flex-shrink: 0; margin: 0 0 2em } @@ -187,11 +168,7 @@ div[data-role=controlgroup] a.ui-btn-active { @media all and (min-width:70em) { .dashboardSections { - -webkit-flex-wrap: wrap; flex-wrap: wrap; - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - -webkit-flex-direction: row; flex-direction: row } @@ -296,7 +273,6 @@ div[data-role=controlgroup] a.ui-btn-active { } .sessionNowPlayingContent { - -webkit-background-size: cover; background-size: cover; background-repeat: no-repeat; background-position: center center; @@ -395,7 +371,6 @@ div[data-role=controlgroup] a.ui-btn-active { } .disabledUser { - -webkit-filter: grayscale(100%); filter: grayscale(100%) } @@ -416,9 +391,7 @@ div[data-role=controlgroup] a.ui-btn-active { } a[data-role=button] { - -webkit-font-smoothing: antialiased; - -webkit-user-select: none; - -webkit-background-clip: padding-box; + background-clip: padding-box; cursor: pointer !important; font-family: inherit !important; font-weight: 500 !important; @@ -430,37 +403,21 @@ a[data-role=button] { background: #292929 !important; } -@-webkit-keyframes rotating { - from { - -webkit-transform: rotate(0); - transform: rotate(0) - } - - to { - -webkit-transform: rotate(360deg); - transform: rotate(360deg) - } -} - @keyframes rotating { from { - -webkit-transform: rotate(0); transform: rotate(0) } to { - -webkit-transform: rotate(360deg); transform: rotate(360deg) } } .rotatingCircle { - -webkit-animation: rotating 2s linear infinite; animation: rotating 2s linear infinite } .pluginPreviewImg { - -webkit-box-shadow: 0 .0725em .29em 0 rgba(0, 0, 0, .37); box-shadow: 0 .0725em .29em 0 rgba(0, 0, 0, .37) } diff --git a/src/css/detailtable.css b/src/assets/css/detailtable.css similarity index 100% rename from src/css/detailtable.css rename to src/assets/css/detailtable.css diff --git a/src/css/flexstyles.css b/src/assets/css/flexstyles.css similarity index 100% rename from src/css/flexstyles.css rename to src/assets/css/flexstyles.css diff --git a/src/css/fonts.css b/src/assets/css/fonts.css similarity index 95% rename from src/css/fonts.css rename to src/assets/css/fonts.css index 12f1eaf4b..da5515fc1 100644 --- a/src/css/fonts.css +++ b/src/assets/css/fonts.css @@ -4,7 +4,6 @@ html { html { font-size: 93%; - -webkit-text-size-adjust: 100%; text-size-adjust: 100%; } diff --git a/src/css/fonts.sized.css b/src/assets/css/fonts.sized.css similarity index 100% rename from src/css/fonts.sized.css rename to src/assets/css/fonts.sized.css diff --git a/src/css/ios.css b/src/assets/css/ios.css similarity index 100% rename from src/css/ios.css rename to src/assets/css/ios.css diff --git a/src/css/librarybrowser.css b/src/assets/css/librarybrowser.css similarity index 76% rename from src/css/librarybrowser.css rename to src/assets/css/librarybrowser.css index 8982ba88b..af106959e 100644 --- a/src/css/librarybrowser.css +++ b/src/assets/css/librarybrowser.css @@ -15,7 +15,6 @@ .headerSelectedPlayer, .itemMiscInfo, .navMenuOptionText { - -o-text-overflow: ellipsis; text-overflow: ellipsis; overflow: hidden } @@ -25,7 +24,7 @@ } .itemDetailPage { - padding-top: 4em !important + padding-top: 0em !important } .standalonePage { @@ -48,8 +47,6 @@ z-index: 1; margin: 0 !important; top: 6.9em !important; - -webkit-transition: -webkit-transform .2s ease-out; - -o-transition: transform .2s ease-out; transition: transform .2s ease-out } @@ -58,17 +55,14 @@ } .headerUserImage { - -webkit-background-size: contain; background-size: contain; background-repeat: no-repeat; background-position: center center; - -webkit-border-radius: 100em; border-radius: 100em; display: inline-block } .headerUserButtonRound div { - -webkit-border-radius: 100em; border-radius: 100em; background-size: cover; background-repeat: no-repeat; @@ -76,7 +70,6 @@ } .headerButton { - -webkit-flex-shrink: 0; flex-shrink: 0 } @@ -90,34 +83,25 @@ } .pageTitle { - display: -webkit-inline-box; - display: -webkit-inline-flex; display: inline-flex; - margin: 0 0 0 .5em; + margin: .3em 0 0 .5em; height: 1.7em; - -webkit-box-align: center; - -webkit-align-items: center; align-items: center; - -webkit-flex-shrink: 1; flex-shrink: 1 } .headerLeft, .skinHeader { - display: -webkit-box; - display: -webkit-flex + display: flex; } .detailButton-mobile, .skinHeader { - -webkit-flex-direction: column; - -webkit-box-orient: vertical; - -webkit-box-direction: normal + flex-direction: column; } .pageTitleWithLogo { background-position: left center; - -webkit-background-size: contain; background-size: contain; background-repeat: no-repeat; width: 13.2em @@ -137,7 +121,7 @@ .headerLeft, .headerRight { - -webkit-box-align: center + justify-content: center; } .hiddenViewMenuBar .skinHeader { @@ -150,12 +134,10 @@ .headerLeft { display: flex; - -webkit-align-items: center; align-items: center; - -webkit-box-flex: 1; - -webkit-flex-grow: 1; flex-grow: 1; - overflow: hidden + overflow: hidden; + justify-content: left; } .sectionTabs { @@ -163,13 +145,8 @@ } .headerRight { - display: -webkit-box; - display: -webkit-flex; display: flex; - -webkit-align-items: center; align-items: center; - -webkit-box-pack: end; - -webkit-justify-content: flex-end; justify-content: flex-end } @@ -178,27 +155,19 @@ } .navMenuOption { - display: -webkit-box !important; - display: -webkit-flex !important; display: flex !important; - -webkit-box-align: center; - -webkit-align-items: center; align-items: center; text-decoration: none; color: inherit; padding: .9em 0 .9em 2.4em !important; - -webkit-box-flex: 1; - -webkit-flex-grow: 1; flex-grow: 1; font-weight: 400 !important; margin: 0 !important; - -webkit-border-radius: 0 !important; border-radius: 0 !important } .navMenuOptionIcon { margin-right: 1.2em; - -webkit-flex-shrink: 0; flex-shrink: 0 } @@ -212,8 +181,6 @@ } .dashboardDocument .skinBody { - -webkit-transition: left ease-in-out .3s, padding ease-in-out .3s; - -o-transition: left ease-in-out .3s, padding ease-in-out .3s; transition: left ease-in-out .3s, padding ease-in-out .3s; position: absolute; top: 0; @@ -233,6 +200,7 @@ } @media all and (min-width:40em) { + .dashboardDocument .adminDrawerLogo, .dashboardDocument .mainDrawerButton { display: none !important @@ -242,9 +210,7 @@ z-index: inherit !important; left: 0 !important; top: 0 !important; - -webkit-transform: none !important; transform: none !important; - -webkit-box-shadow: none !important; box-shadow: none !important; width: 20.205em !important; font-size: 94% @@ -281,14 +247,9 @@ } .headerTabs { - -webkit-align-self: center; align-self: center; width: auto; - -webkit-box-align: center; - -webkit-align-items: center; align-items: center; - -webkit-box-pack: center; - -webkit-justify-content: center; justify-content: center; margin-top: -3.34em; position: relative; @@ -346,8 +307,6 @@ } .flexPageTabContent.is-active { - display: -webkit-box !important; - display: -webkit-flex !important; display: flex !important } @@ -363,7 +322,6 @@ margin: 1.5em 0; background: #222; padding: .8em .8em .8em 3em; - -webkit-border-radius: .3em; border-radius: .3em; position: relative } @@ -422,8 +380,9 @@ } .itemBackdrop { - -webkit-background-size: cover; background-size: cover; + background-repeat: no-repeat; + background-position: center; height: 50vh; position: relative } @@ -435,41 +394,73 @@ right: 0 } -.itemBackdropFader { - position: absolute; - bottom: -1px; - left: 0; - right: 0; - height: 15vh -} - .desktopMiscInfoContainer { position: absolute; bottom: .75em } +.layout-mobile .detailPagePrimaryContainer { + display: block; + position: relative; +} + +.layout-tv .detailPagePrimaryContainer { + position: relative; +} + +.detailPagePrimaryContainer { + display: flex; + align-items: center; + align-content: center; + position: sticky; + background-color: #101010; + top: 0; + z-index: 2; +} + +.infoWrapper { + flex: 1 0 0; +} + +.infoText { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + text-align: left; +} + +.detailPageSecondaryContainer { + margin: 1.25em 0; + display: flex; + flex-direction: column; + padding-left: 2%; + padding-right: 2%; +} + +.layout-mobile .detailImageContainer, +.layout-tv .detailImageContainer { + position: relative; +} + .detailImageContainer { - margin-right: 2em; - width: 280px; - -webkit-flex-shrink: 0; - flex-shrink: 0; - margin-left: .6em + margin: 1.25em 0; + position: sticky; + top: 15%; + float: left; + width: 22.786458333333332vw; } .detailPagePrimaryContent { position: relative; - -webkit-box-flex: 1; - -webkit-flex-grow: 1; flex-grow: 1 } .detailLogo { - width: 21.3em; - height: 5em; + width: 25em; + height: 9.375em; position: absolute; - top: 13.5%; - right: 19.5%; - -webkit-background-size: contain; + top: 14.5%; + right: 10.5%; background-size: contain } @@ -498,13 +489,8 @@ } .itemDetailImage { - width: 100%; - -webkit-box-shadow: 0 .0725em .29em 0 rgba(0, 0, 0, .37); - box-shadow: 0 .0725em .29em 0 rgba(0, 0, 0, .37) -} - -.thumbDetailImageContainer { - width: 400px + width: 100% !important; + box-shadow: 0 .0725em .29em 0 rgba(0, 0, 0, .37); } @media all and (max-width:62.5em) { @@ -512,36 +498,11 @@ position: relative } - .detailImageContainer { - position: absolute; - top: -90px; - left: 5%; - width: auto - } - - .itemDetailImage { - height: 120px; - width: auto !important - } - .btnPlaySimple { display: none !important } } -@media all and (min-width:62.5em) { - .itemBackdrop { - display: none - } - - .detailPagePrimaryContainer { - display: -webkit-box; - display: -webkit-flex; - display: flex; - margin-bottom: 3em - } -} - @media all and (max-width:75em) { .lnkSibling { display: none !important @@ -597,8 +558,7 @@ .detailButton-mobile, .mainDetailButtons { - display: -webkit-box; - display: -webkit-flex + display: flex; } .itemName { @@ -619,18 +579,14 @@ .mainDetailButtons { display: flex; - -webkit-box-align: center; - -webkit-align-items: center; align-items: center; - -webkit-flex-wrap: wrap; flex-wrap: wrap; - margin: 1em 0 + margin: 1em 0; } .recordingFields button { margin-left: 0; margin-right: .5em; - -webkit-flex-shrink: 0; flex-shrink: 0 } @@ -641,11 +597,7 @@ .detailButton-mobile { display: flex; flex-direction: column; - -webkit-box-pack: center; - -webkit-justify-content: center; justify-content: center; - -webkit-box-align: center; - -webkit-align-items: center; align-items: center; margin: 0 !important; padding: .5em .7em !important @@ -677,18 +629,9 @@ } .detailButton-mobile-content { - display: -webkit-box; - display: -webkit-flex; display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -webkit-flex-direction: column; flex-direction: column; - -webkit-box-pack: center; - -webkit-justify-content: center; justify-content: center; - -webkit-box-align: center; - -webkit-align-items: center; align-items: center } @@ -699,11 +642,8 @@ } .detailImageProgressContainer { - position: absolute; - bottom: 4px; - right: 1px; - left: 1px; - text-align: center + margin-left: 6px; + width: 21.886458333333332vw; } .detailButton-mobile-text { @@ -723,7 +663,7 @@ } @media all and (min-width:62.5em) { - .detailButton-mobile { + .detailFloatingButton { display: none !important } @@ -745,21 +685,14 @@ } .itemMiscInfo { - display: -webkit-box; - display: -webkit-flex; display: flex; - -webkit-flex-wrap: wrap; flex-wrap: wrap; - -webkit-box-align: center; - -webkit-align-items: center; align-items: center } @media all and (max-width:31.25em) { .mobileDetails .itemMiscInfo { text-align: center; - -webkit-box-pack: center; - -webkit-justify-content: center; justify-content: center } @@ -775,13 +708,11 @@ .detailPageContent { border-spacing: 0; border-collapse: collapse; - padding-top: 3em } @media all and (max-width:62.5em) { .detailPageContent-nodetailimg { padding-top: 0; - margin-top: -3em } } @@ -851,7 +782,6 @@ } .btnSyncComplete i { - -webkit-border-radius: 100em; border-radius: 100em } @@ -860,14 +790,9 @@ } .mediaInfoIcons { - display: -webkit-box; - display: -webkit-flex; display: flex; - -webkit-box-align: center; - -webkit-align-items: center; align-items: center; margin: 1em 0; - -webkit-flex-wrap: wrap; flex-wrap: wrap } @@ -892,17 +817,19 @@ vertical-align: middle; } +/* these next two rules are for the scroller element headers */ .sectionTitleContainer-cards { - margin-bottom: 0; + margin: 0; + padding-top: 1.25em; } -.sectionTitle-cards { - margin-bottom: 0; +div:not(.sectionTitleContainer-cards) > .sectionTitle-cards { + margin: 0; + padding-top: 1.25em; } .sectionTitleButton { margin-left: 1.5em !important; - -webkit-flex-shrink: 0; flex-shrink: 0 } @@ -912,22 +839,17 @@ .sectionTitleIconButton { margin-left: 1.5em !important; - -webkit-flex-shrink: 0; flex-shrink: 0; font-size: 84% !important; padding: .5em !important } .horizontalItemsContainer { - display: -webkit-box; - display: -webkit-flex; display: flex } .sectionTitleTextButton { margin: 0 !important; - display: -webkit-inline-box !important; - display: -webkit-inline-flex !important; display: inline-flex !important; color: inherit !important } @@ -999,8 +921,6 @@ } .itemsViewSettingsContainer { - -webkit-box-pack: center; - -webkit-justify-content: center; justify-content: center } diff --git a/src/css/livetv.css b/src/assets/css/livetv.css similarity index 100% rename from src/css/livetv.css rename to src/assets/css/livetv.css diff --git a/src/css/material-icons/flUhRq6tzZclQEJ-Vdg-IuiaDsNa.woff b/src/assets/css/material-icons/flUhRq6tzZclQEJ-Vdg-IuiaDsNa.woff similarity index 100% rename from src/css/material-icons/flUhRq6tzZclQEJ-Vdg-IuiaDsNa.woff rename to src/assets/css/material-icons/flUhRq6tzZclQEJ-Vdg-IuiaDsNa.woff diff --git a/src/css/material-icons/flUhRq6tzZclQEJ-Vdg-IuiaDsNc.woff2 b/src/assets/css/material-icons/flUhRq6tzZclQEJ-Vdg-IuiaDsNc.woff2 similarity index 100% rename from src/css/material-icons/flUhRq6tzZclQEJ-Vdg-IuiaDsNc.woff2 rename to src/assets/css/material-icons/flUhRq6tzZclQEJ-Vdg-IuiaDsNc.woff2 diff --git a/src/css/material-icons/style.css b/src/assets/css/material-icons/style.css similarity index 100% rename from src/css/material-icons/style.css rename to src/assets/css/material-icons/style.css diff --git a/src/css/metadataeditor.css b/src/assets/css/metadataeditor.css similarity index 88% rename from src/css/metadataeditor.css rename to src/assets/css/metadataeditor.css index 542c7c8f2..c5de6f3ef 100644 --- a/src/css/metadataeditor.css +++ b/src/assets/css/metadataeditor.css @@ -28,17 +28,13 @@ .jstree-wholerow-hovered { background: #38c !important; - -webkit-border-radius: 0 !important; border-radius: 0 !important; - -webkit-box-shadow: none !important; box-shadow: none !important } .jstree-default .jstree-hovered { background: 0 0 !important; - -webkit-border-radius: 0 !important; border-radius: 0 !important; - -webkit-box-shadow: none !important; box-shadow: none !important; color: #fff !important } diff --git a/src/css/scrollstyles.css b/src/assets/css/scrollstyles.css similarity index 58% rename from src/css/scrollstyles.css rename to src/assets/css/scrollstyles.css index aa2f7dafa..69039ce34 100644 --- a/src/css/scrollstyles.css +++ b/src/assets/css/scrollstyles.css @@ -1,6 +1,5 @@ .scrollX { overflow-x: auto; - -webkit-overflow-scrolling: touch; overflow-y: hidden; white-space: nowrap; } @@ -10,13 +9,11 @@ } .hiddenScrollX, .layout-tv .scrollX { - -ms-overflow-style: none; - /* Can't do this because it not only hides the scrollbar, but also prevents scrolling */ - /*overflow: -moz-scrollbars-none;*/ + scrollbar-width: none; } .hiddenScrollX-forced { - overflow: -moz-scrollbars-none; + scrollbar-width: none; } .hiddenScrollX::-webkit-scrollbar, .layout-tv .scrollX::-webkit-scrollbar { @@ -26,28 +23,24 @@ .scrollY { overflow-y: auto; - -webkit-overflow-scrolling: touch; overflow-x: hidden; } .smoothScrollY { overflow-y: auto; - -webkit-overflow-scrolling: touch; overflow-x: hidden; scroll-behavior: smooth; } .hiddenScrollY, .layout-tv .smoothScrollY { - -ms-overflow-style: none; - /* Can't do this because it not only hides the scrollbar, but also prevents scrolling */ - /*overflow: -moz-scrollbars-none;*/ + scrollbar-width: none; } .hiddenScrollY-forced { - overflow: -moz-scrollbars-none; + scrollbar-width: none; } .hiddenScrollY::-webkit-scrollbar, .layout-tv .smoothScrollY::-webkit-scrollbar, .layout-tv .scrollY::-webkit-scrollbar { width: 0 !important; display: none; -} \ No newline at end of file +} diff --git a/src/css/site.css b/src/assets/css/site.css similarity index 87% rename from src/css/site.css rename to src/assets/css/site.css index 292fc6745..649179911 100644 --- a/src/css/site.css +++ b/src/assets/css/site.css @@ -20,18 +20,12 @@ html { .layout-mobile, .layout-tv { - -webkit-touch-callout: none; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; user-select: none } body { overflow-x: hidden; background-color: transparent !important; - -webkit-font-smoothing: antialiased } .mainAnimatedPage { diff --git a/src/css/videoosd.css b/src/assets/css/videoosd.css similarity index 64% rename from src/css/videoosd.css rename to src/assets/css/videoosd.css index f9c4798e9..f20abf9d0 100644 --- a/src/css/videoosd.css +++ b/src/assets/css/videoosd.css @@ -1,8 +1,6 @@ .chapterThumbTextContainer, .videoOsdBottom { - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none + user-select: none; } .osdPoster img, @@ -14,13 +12,10 @@ } .osdHeader { - -webkit-transition: opacity .3s ease-out; - -o-transition: opacity .3s ease-out; transition: opacity .3s ease-out; position: relative; z-index: 1; background: rgba(0, 0, 0, 0.7) !important; - -webkit-backdrop-filter: none !important; backdrop-filter: none !important; color: #eee !important; } @@ -34,17 +29,13 @@ } .chapterThumbContainer { - -webkit-box-shadow: 0 0 1.9vh #000; box-shadow: 0 0 1.9vh #000; - -webkit-box-flex: 1; - -webkit-flex-grow: 1; flex-grow: 1; position: relative } .chapterThumb { background-position: center center; - -webkit-background-size: contain; background-size: contain; background-repeat: no-repeat; border: 0; @@ -90,20 +81,12 @@ position: fixed; background-color: rgba(0, 0, 0, 0.7); padding: 1%; - display: -webkit-box; - display: -webkit-flex; display: flex; - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - -webkit-flex-direction: row; flex-direction: row; will-change: opacity; - -webkit-transition: opacity 0.3s ease-out; - -o-transition: opacity 0.3s ease-out; transition: opacity 0.3s ease-out; color: #fff; - user-select: none; - -webkit-touch-callout: none + user-select: none } .videoOsdBottom-hidden { @@ -111,49 +94,35 @@ } .osdControls { - -webkit-box-flex: 1; - -webkit-flex-grow: 1; flex-grow: 1 } .videoOsdBottom .buttons { padding: .25em 0 0; - display: -webkit-box; - display: -webkit-flex; display: flex; - -webkit-flex-wrap: wrap; flex-wrap: wrap; - -webkit-box-align: center; - -webkit-align-items: center; align-items: center } .osdVolumeSliderContainer { width: 9em; - -webkit-box-flex: 1; - -webkit-flex-grow: 1; flex-grow: 1 } .osdMediaInfo, .volumeButtons { - display: -webkit-box; - display: -webkit-flex; - -webkit-box-align: center + display: flex; + align-items: center; } .volumeButtons { margin: 0 .5em 0 auto; display: flex; - -webkit-align-items: center; align-items: center } .osdTimeText { margin-left: 1em; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; user-select: none } @@ -167,15 +136,10 @@ position: absolute; height: auto; width: 100%; - -webkit-box-shadow: 0 0 1.9vh #000; box-shadow: 0 0 1.9vh #000; border: .08em solid #222; user-drag: none; - user-select: none; - -moz-user-select: none; - -webkit-user-drag: none; - -webkit-user-select: none; - -ms-user-select: none + user-select: none } .osdTitle, @@ -185,7 +149,6 @@ .osdMediaInfo { display: flex; - -webkit-align-items: center; align-items: center } @@ -194,23 +157,14 @@ } .osdTextContainer { - display: -webkit-box; - display: -webkit-flex; display: flex; - -webkit-box-align: center; - -webkit-align-items: center; align-items: center; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; user-select: none; margin-bottom: .7em; padding-left: .5em } .osdMainTextContainer { - -webkit-box-align: baseline; - -webkit-align-items: baseline; align-items: baseline } @@ -218,12 +172,13 @@ margin-left: auto; } -@-moz-keyframes spin { 100% { -moz-transform: rotate(360deg); } } -@-webkit-keyframes spin { 100% { -webkit-transform: rotate(360deg); } } -@keyframes spin { 100% { -webkit-transform: rotate(360deg); transform:rotate(360deg); } } +@keyframes spin { + 100% { + transform:rotate(360deg); + } +} + .osdMediaStatus .animate { - -webkit-animation:spin 4s linear infinite; - -moz-animation:spin 4s linear infinite; animation:spin 4s linear infinite; } diff --git a/src/img/logindefault.png b/src/assets/img/avatar.png similarity index 100% rename from src/img/logindefault.png rename to src/assets/img/avatar.png diff --git a/src/assets/img/devices/android.svg b/src/assets/img/devices/android.svg new file mode 100644 index 000000000..c0d377bb7 --- /dev/null +++ b/src/assets/img/devices/android.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/img/devices/chrome.svg b/src/assets/img/devices/chrome.svg similarity index 100% rename from src/img/devices/chrome.svg rename to src/assets/img/devices/chrome.svg diff --git a/src/img/devices/edge.svg b/src/assets/img/devices/edge.svg similarity index 100% rename from src/img/devices/edge.svg rename to src/assets/img/devices/edge.svg diff --git a/src/img/devices/firefox.svg b/src/assets/img/devices/firefox.svg similarity index 100% rename from src/img/devices/firefox.svg rename to src/assets/img/devices/firefox.svg diff --git a/src/img/devices/html5.svg b/src/assets/img/devices/html5.svg similarity index 100% rename from src/img/devices/html5.svg rename to src/assets/img/devices/html5.svg diff --git a/src/assets/img/devices/kodi.svg b/src/assets/img/devices/kodi.svg new file mode 100644 index 000000000..3618149b1 --- /dev/null +++ b/src/assets/img/devices/kodi.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/img/devices/msie.svg b/src/assets/img/devices/msie.svg similarity index 100% rename from src/img/devices/msie.svg rename to src/assets/img/devices/msie.svg diff --git a/src/img/devices/opera.svg b/src/assets/img/devices/opera.svg similarity index 100% rename from src/img/devices/opera.svg rename to src/assets/img/devices/opera.svg diff --git a/src/img/devices/other.svg b/src/assets/img/devices/other.svg similarity index 100% rename from src/img/devices/other.svg rename to src/assets/img/devices/other.svg diff --git a/src/img/devices/playstation.svg b/src/assets/img/devices/playstation.svg similarity index 100% rename from src/img/devices/playstation.svg rename to src/assets/img/devices/playstation.svg diff --git a/src/img/devices/safari.svg b/src/assets/img/devices/safari.svg similarity index 100% rename from src/img/devices/safari.svg rename to src/assets/img/devices/safari.svg diff --git a/src/img/devices/samsungtv.svg b/src/assets/img/devices/samsungtv.svg similarity index 100% rename from src/img/devices/samsungtv.svg rename to src/assets/img/devices/samsungtv.svg diff --git a/src/img/devices/windows.svg b/src/assets/img/devices/windows.svg similarity index 100% rename from src/img/devices/windows.svg rename to src/assets/img/devices/windows.svg diff --git a/src/img/devices/xbox.svg b/src/assets/img/devices/xbox.svg similarity index 100% rename from src/img/devices/xbox.svg rename to src/assets/img/devices/xbox.svg diff --git a/src/img/equalizer.gif b/src/assets/img/equalizer.gif similarity index 100% rename from src/img/equalizer.gif rename to src/assets/img/equalizer.gif diff --git a/src/img/logo.png b/src/assets/img/logo.png similarity index 100% rename from src/img/logo.png rename to src/assets/img/logo.png diff --git a/src/splashscreens/ipad_splash.png b/src/assets/splash/ipad_splash.png similarity index 100% rename from src/splashscreens/ipad_splash.png rename to src/assets/splash/ipad_splash.png diff --git a/src/splashscreens/ipad_splash_l.png b/src/assets/splash/ipad_splash_l.png similarity index 100% rename from src/splashscreens/ipad_splash_l.png rename to src/assets/splash/ipad_splash_l.png diff --git a/src/splashscreens/ipadpro1_splash.png b/src/assets/splash/ipadpro1_splash.png similarity index 100% rename from src/splashscreens/ipadpro1_splash.png rename to src/assets/splash/ipadpro1_splash.png diff --git a/src/splashscreens/ipadpro1_splash_l.png b/src/assets/splash/ipadpro1_splash_l.png similarity index 100% rename from src/splashscreens/ipadpro1_splash_l.png rename to src/assets/splash/ipadpro1_splash_l.png diff --git a/src/splashscreens/ipadpro2_splash.png b/src/assets/splash/ipadpro2_splash.png similarity index 100% rename from src/splashscreens/ipadpro2_splash.png rename to src/assets/splash/ipadpro2_splash.png diff --git a/src/splashscreens/ipadpro2_splash_l.png b/src/assets/splash/ipadpro2_splash_l.png similarity index 100% rename from src/splashscreens/ipadpro2_splash_l.png rename to src/assets/splash/ipadpro2_splash_l.png diff --git a/src/splashscreens/ipadpro3_splash.png b/src/assets/splash/ipadpro3_splash.png similarity index 100% rename from src/splashscreens/ipadpro3_splash.png rename to src/assets/splash/ipadpro3_splash.png diff --git a/src/splashscreens/ipadpro3_splash_l.png b/src/assets/splash/ipadpro3_splash_l.png similarity index 100% rename from src/splashscreens/ipadpro3_splash_l.png rename to src/assets/splash/ipadpro3_splash_l.png diff --git a/src/splashscreens/iphone5_splash.png b/src/assets/splash/iphone5_splash.png similarity index 100% rename from src/splashscreens/iphone5_splash.png rename to src/assets/splash/iphone5_splash.png diff --git a/src/splashscreens/iphone5_splash_l.png b/src/assets/splash/iphone5_splash_l.png similarity index 100% rename from src/splashscreens/iphone5_splash_l.png rename to src/assets/splash/iphone5_splash_l.png diff --git a/src/splashscreens/iphone6_splash.png b/src/assets/splash/iphone6_splash.png similarity index 100% rename from src/splashscreens/iphone6_splash.png rename to src/assets/splash/iphone6_splash.png diff --git a/src/splashscreens/iphone6_splash_l.png b/src/assets/splash/iphone6_splash_l.png similarity index 100% rename from src/splashscreens/iphone6_splash_l.png rename to src/assets/splash/iphone6_splash_l.png diff --git a/src/splashscreens/iphoneplus_splash.png b/src/assets/splash/iphoneplus_splash.png similarity index 100% rename from src/splashscreens/iphoneplus_splash.png rename to src/assets/splash/iphoneplus_splash.png diff --git a/src/splashscreens/iphoneplus_splash_l.png b/src/assets/splash/iphoneplus_splash_l.png similarity index 100% rename from src/splashscreens/iphoneplus_splash_l.png rename to src/assets/splash/iphoneplus_splash_l.png diff --git a/src/splashscreens/iphonex_splash.png b/src/assets/splash/iphonex_splash.png similarity index 100% rename from src/splashscreens/iphonex_splash.png rename to src/assets/splash/iphonex_splash.png diff --git a/src/splashscreens/iphonex_splash_l.png b/src/assets/splash/iphonex_splash_l.png similarity index 100% rename from src/splashscreens/iphonex_splash_l.png rename to src/assets/splash/iphonex_splash_l.png diff --git a/src/splashscreens/iphonexr_splash.png b/src/assets/splash/iphonexr_splash.png similarity index 100% rename from src/splashscreens/iphonexr_splash.png rename to src/assets/splash/iphonexr_splash.png diff --git a/src/splashscreens/iphonexr_splash_l.png b/src/assets/splash/iphonexr_splash_l.png similarity index 100% rename from src/splashscreens/iphonexr_splash_l.png rename to src/assets/splash/iphonexr_splash_l.png diff --git a/src/splashscreens/iphonexsmax_splash.png b/src/assets/splash/iphonexsmax_splash.png similarity index 100% rename from src/splashscreens/iphonexsmax_splash.png rename to src/assets/splash/iphonexsmax_splash.png diff --git a/src/splashscreens/iphonexsmax_splash_l.png b/src/assets/splash/iphonexsmax_splash_l.png similarity index 100% rename from src/splashscreens/iphonexsmax_splash_l.png rename to src/assets/splash/iphonexsmax_splash_l.png diff --git a/src/bundle.js b/src/bundle.js index 508e2c306..54623fab7 100644 --- a/src/bundle.js +++ b/src/bundle.js @@ -17,7 +17,7 @@ _define("fetch", function() { }); // flvjs -var flvjs = require("flv.js"); +var flvjs = require("flv.js").default; _define("flvjs", function() { return flvjs; }); @@ -54,7 +54,7 @@ _define("native-promise-only", function() { }); // resize-observer-polyfill -var resize = require("resize-observer-polyfill"); +var resize = require("resize-observer-polyfill").default; _define("resize-observer-polyfill", function() { return resize; }); @@ -73,7 +73,7 @@ _define("swiper", function() { }); // sortable -var sortable = require("sortablejs"); +var sortable = require("sortablejs").default; _define("sortable", function() { return sortable; }); @@ -90,3 +90,9 @@ require("libjass/libjass.css"); _define("libjass", function() { return libjass; }); + +// libass-wasm +var libass_wasm = require("libass-wasm"); +_define("JavascriptSubtitlesOctopus", function() { + return libass_wasm; +}); diff --git a/src/components/actionsheet/actionsheet.css b/src/components/actionsheet/actionsheet.css index c1b169889..8e5084038 100644 --- a/src/components/actionsheet/actionsheet.css +++ b/src/components/actionsheet/actionsheet.css @@ -37,11 +37,12 @@ box-shadow: none; flex-shrink: 0; border-radius: 0; + margin: 0; } - .actionSheetMenuItem:focus { - transform: none !important; - } +.actionSheetMenuItem:focus { + transform: none !important; +} .actionsheetListItemBody { padding: .4em 1em .4em .6em !important; @@ -104,7 +105,7 @@ } .actionsheet-xlargeFont { - font-size: 112%!important; + font-size: 112% !important; } .btnCloseActionSheet { diff --git a/src/components/apphost.js b/src/components/apphost.js index ad3540e21..b1b1c30dc 100644 --- a/src/components/apphost.js +++ b/src/components/apphost.js @@ -278,6 +278,7 @@ define(["appSettings", "browser", "events", "htmlMediaHelper"], function (appSet features.push("targetblank"); // allows users to connect to more than one server //features.push("multiserver"); + features.push("screensaver"); if (!browser.orsay && !browser.tizen && !browser.msie && (browser.firefox || browser.ps4 || browser.edge || cueSupported())) { features.push("subtitleappearancesettings"); diff --git a/src/components/backdropscreensaver/plugin.js b/src/components/backdropscreensaver/plugin.js new file mode 100644 index 000000000..c0bd31fb8 --- /dev/null +++ b/src/components/backdropscreensaver/plugin.js @@ -0,0 +1,56 @@ +define(["connectionManager"], function (connectionManager) { + + return function () { + + var self = this; + + self.name = "Backdrop ScreenSaver"; + self.type = "screensaver"; + self.id = "backdropscreensaver"; + self.supportsAnonymous = false; + + var currentSlideshow; + + self.show = function () { + + var query = { + ImageTypes: "Backdrop", + EnableImageTypes: "Backdrop", + IncludeItemTypes: "Movie,Series,MusicArtist", + SortBy: "Random", + Recursive: true, + Fields: "Taglines", + ImageTypeLimit: 1, + StartIndex: 0, + Limit: 200 + }; + + var apiClient = connectionManager.currentApiClient(); + apiClient.getItems(apiClient.getCurrentUserId(), query).then(function (result) { + + if (result.Items.length) { + + require(["slideshow"], function (slideshow) { + + var newSlideShow = new slideshow({ + showTitle: true, + cover: true, + items: result.Items + }); + + newSlideShow.show(); + currentSlideshow = newSlideShow; + }); + } + }); + }; + + self.hide = function () { + + if (currentSlideshow) { + currentSlideshow.hide(); + currentSlideshow = null; + } + }; + } +}); diff --git a/src/components/cardbuilder/card.css b/src/components/cardbuilder/card.css index ec19c83f0..5520ce2c7 100644 --- a/src/components/cardbuilder/card.css +++ b/src/components/cardbuilder/card.css @@ -18,7 +18,6 @@ button { padding: 0; display: block; color: inherit !important; - -webkit-tap-highlight-color: rgba(0,0,0,0); outline: none !important; cursor: pointer; contain: layout style; @@ -80,10 +79,9 @@ button { margin: 0.6em; transition: none; border: 0 solid transparent; - /* These both are needed in case cardBox is a button */ - -webkit-tap-highlight-color: rgba(0,0,0,0); outline: none !important; - contain: layout style; + contain: layout; + contain: style; } .card.show-focus:not(.show-animation) .cardBox { @@ -148,7 +146,6 @@ button { background-size: cover; background-repeat: no-repeat; background-position: center center; - display: -webkit-flex; display: flex; align-items: center; justify-content: center; @@ -182,7 +179,6 @@ button { margin: 0 !important; /* Needed in safari */ height: 100%; - -webkit-tap-highlight-color: rgba(0,0,0,0); outline: none !important; contain: strict; } @@ -247,7 +243,7 @@ button { } .coveredImage { - background-size: 100% 100%; + background-size: cover; background-position: center center; } @@ -346,7 +342,6 @@ button { border: 0 !important; padding: 0 !important; cursor: pointer; - -webkit-tap-highlight-color: rgba(0,0,0,0); outline: none !important; color: inherit; vertical-align: middle; @@ -627,7 +622,7 @@ button { @media (min-width: 43.75em) { .overflowSquareCard, .overflowPortraitCard { - width: 23.3vw; + width: 23.1vw; } } @@ -643,13 +638,13 @@ button { } .overflowSquareCard, .overflowPortraitCard { - width: 23.3vw; + width: 23.1vw; } } @media (orientation: landscape) and (min-width: 48.125em) { .overflowBackdropCard, .overflowSmallBackdropCard { - width: 23.3vw; + width: 23.1vw; } } @@ -661,13 +656,13 @@ button { @media (min-width: 50em) { .overflowSquareCard, .overflowPortraitCard { - width: 18.4vw; + width: 18.5vw; } } @media (min-width: 75em) { .overflowBackdropCard, .overflowSmallBackdropCard { - width: 23.3vw; + width: 23.1vw; } .overflowSquareCard, .overflowPortraitCard { @@ -780,4 +775,4 @@ button { .cardOverlayFab-primary:hover { transform: scale(1.4, 1.4); transition: 0.2s; -} \ No newline at end of file +} diff --git a/src/components/cardbuilder/cardBuilder.js b/src/components/cardbuilder/cardBuilder.js index 3b7516309..44c5b3b07 100644 --- a/src/components/cardbuilder/cardBuilder.js +++ b/src/components/cardbuilder/cardBuilder.js @@ -892,7 +892,8 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana } else { if (item.EndDate && item.ProductionYear) { - lines.push(item.ProductionYear + ' - ' + datetime.parseISO8601Date(item.EndDate).getFullYear()); + var endYear = datetime.parseISO8601Date(item.EndDate).getFullYear(); + lines.push(item.ProductionYear + ((endYear === item.ProductionYear) ? '' : (' - ' + endYear))); } else { lines.push(item.ProductionYear || ''); } diff --git a/src/components/dialogHelper/dialoghelper.css b/src/components/dialogHelper/dialoghelper.css index 2cc20b5ff..aa4145e01 100644 --- a/src/components/dialogHelper/dialoghelper.css +++ b/src/components/dialogHelper/dialoghelper.css @@ -16,7 +16,6 @@ .dialog { margin: 0; border-radius: .2em; - -webkit-font-smoothing: antialiased; border: 0; padding: 0; will-change: transform, opacity; diff --git a/src/components/emby-scrollbuttons/emby-scrollbuttons.css b/src/components/emby-scrollbuttons/emby-scrollbuttons.css index 007557be9..6786824bd 100644 --- a/src/components/emby-scrollbuttons/emby-scrollbuttons.css +++ b/src/components/emby-scrollbuttons/emby-scrollbuttons.css @@ -6,6 +6,7 @@ justify-content: center; min-width:104px; min-height:24px; + padding-top: 1.25em; z-index: 1; color: #ffffff; display: flex; @@ -15,4 +16,4 @@ min-width: 24px; min-height: 24px; display: block; -} \ No newline at end of file +} diff --git a/src/components/emby-scroller/emby-scroller.css b/src/components/emby-scroller/emby-scroller.css index 1e0b05b83..11c2c7327 100644 --- a/src/components/emby-scroller/emby-scroller.css +++ b/src/components/emby-scroller/emby-scroller.css @@ -8,21 +8,15 @@ } /* align first card in scroller to heading */ -.emby-scroller .card:first-of-type > .cardBox { +.itemsContainer > .card > .cardBox { margin-left: 0; + margin-right: 1.2em; } -/* align heading for normal item containers */ -/* still not ideal solution but better than the last method */ -.verticalSection > .itemsContainer .cardBox { +.layout-tv .emby-scroller, +.layout-mobile .emby-scroller { + padding-left: 3.3%; + padding-right: 3.3%; margin-left: 0; + margin-right: 0; } - -@media all and (max-width:50em) { - .emby-scroller { - padding-left: 3.3%; - padding-right: 3.3%; - margin-left: 0; - margin-right: 0; - } -} \ No newline at end of file diff --git a/src/components/emby-tabs/emby-tabs.css b/src/components/emby-tabs/emby-tabs.css index 00abd7efa..b8831b881 100644 --- a/src/components/emby-tabs/emby-tabs.css +++ b/src/components/emby-tabs/emby-tabs.css @@ -22,7 +22,7 @@ .emby-tab-button.show-focus:focus { /* these buttons are small so scale larger than usual */ - transform: scale(1.6) !important; + transform: scale(1.3) !important; background: 0 !important; } diff --git a/src/components/filterdialog/style.css b/src/components/filterdialog/style.css index 5daf6eb38..69a82d240 100644 --- a/src/components/filterdialog/style.css +++ b/src/components/filterdialog/style.css @@ -5,7 +5,6 @@ margin-top: 0 !important; margin-bottom: 0 !important; margin-right: 0 !important; - -webkit-border-radius: 0 !important; border-radius: 0 !important; max-height: none !important; max-width: none !important diff --git a/src/components/homesections/homesections.css b/src/components/homesections/homesections.css index 45df67c48..5df2440f8 100644 --- a/src/components/homesections/homesections.css +++ b/src/components/homesections/homesections.css @@ -13,13 +13,11 @@ .homeLibraryIcon { margin-left: .5em; margin-right: .5em; - -webkit-flex-shrink: 0; flex-shrink: 0 } .homeLibraryText { white-space: nowrap; - -o-text-overflow: ellipsis; text-overflow: ellipsis; overflow: hidden } diff --git a/src/components/htmlaudioplayer/plugin.js b/src/components/htmlaudioplayer/plugin.js index 1b41cc544..ef64bad04 100644 --- a/src/components/htmlaudioplayer/plugin.js +++ b/src/components/htmlaudioplayer/plugin.js @@ -2,11 +2,8 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp "use strict"; function getDefaultProfile() { - return new Promise(function (resolve, reject) { - require(['browserdeviceprofile'], function (profileBuilder) { - resolve(profileBuilder({})); }); }); @@ -14,28 +11,22 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp var fadeTimeout; function fade(instance, elem, startingVolume) { - instance._isFadingOut = true; // Need to record the starting volume on each pass rather than querying elem.volume // This is due to iOS safari not allowing volume changes and always returning the system volume value - var newVolume = Math.max(0, startingVolume - 0.15); console.log('fading volume to ' + newVolume); elem.volume = newVolume; if (newVolume <= 0) { - instance._isFadingOut = false; return Promise.resolve(); } return new Promise(function (resolve, reject) { - cancelFadeTimeout(); - fadeTimeout = setTimeout(function () { - fade(instance, elem, newVolume).then(resolve, reject); }, 100); }); @@ -50,7 +41,6 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp } function supportsFade() { - if (browser.tv) { // Not working on tizen. // We could possibly enable on other tv's, but all smart tv browsers tend to be pretty primitive @@ -68,9 +58,7 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp } function enableHlsPlayer(url, item, mediaSource, mediaType) { - if (!htmlMediaHelper.enableHlsJsPlayer(mediaSource.RunTimeTicks, mediaType)) { - return Promise.reject(); } @@ -86,21 +74,18 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp url: url, type: 'HEAD' }).then(function (response) { - var contentType = (response.headers.get('Content-Type') || '').toLowerCase(); if (contentType === 'application/x-mpegurl') { resolve(); } else { reject(); } - }, reject); }); }); } function HtmlAudioPlayer() { - var self = this; self.name = 'Html Audio Player'; @@ -114,11 +99,9 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp self._started = false; self._timeUpdated = false; - self._currentTime = null; var elem = createMediaElement(options); - return setCurrentSrc(elem, options); }; @@ -511,4 +494,4 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp }; return HtmlAudioPlayer; -}); \ No newline at end of file +}); diff --git a/src/components/htmlvideoplayer/plugin.js b/src/components/htmlvideoplayer/plugin.js index ac4e8cf6a..b52b86797 100644 --- a/src/components/htmlvideoplayer/plugin.js +++ b/src/components/htmlvideoplayer/plugin.js @@ -27,6 +27,14 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa return _supportsTextTracks; } + function supportsCanvas() { + return !!document.createElement('canvas').getContext; + } + + function supportsWebWorkers() { + return !!window.Worker; + } + function enableNativeTrackSupport(currentSrc, track) { if (track) { @@ -185,6 +193,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa var lastCustomTrackMs = 0; var currentClock; + var currentSubtitlesOctopus; var currentAssRenderer; var customTrackIndex = -1; @@ -962,6 +971,12 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa currentClock = null; self._currentAspectRatio = null; + var octopus = currentSubtitlesOctopus; + if (octopus) { + octopus.dispose(); + } + currentSubtitlesOctopus = null; + var renderer = currentAssRenderer; if (renderer) { renderer.setEnabled(false); @@ -1026,6 +1041,22 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa lastCustomTrackMs = 0; } + function renderWithSubtitlesOctopus(videoElement, track, item) { + var attachments = self._currentPlayOptions.mediaSource.MediaAttachments || []; + var options = { + video: videoElement, + subUrl: getTextTrackUrl(track, item), + fonts: attachments.map(i => i.DeliveryUrl), + workerUrl: appRouter.baseUrl() + "/libraries/subtitles-octopus-worker.js", + onError: function() { + htmlMediaHelper.onErrorInternal(self, 'mediadecodeerror') + } + }; + require(['JavascriptSubtitlesOctopus'], function(SubtitlesOctopus) { + currentSubtitlesOctopus = new SubtitlesOctopus(options); + }); + } + function renderWithLibjass(videoElement, track, item) { var rendererSettings = {}; @@ -1072,6 +1103,15 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa }); } + function renderSsaAss(videoElement, track, item) { + if (supportsCanvas() && supportsWebWorkers()) { + renderWithSubtitlesOctopus(videoElement, track, item); + } else { + console.log('rendering subtitles with libjass'); + renderWithLibjass(videoElement, track, item); + } + } + function onVideoResize() { if (browser.iOS) { // the new sizes will be delayed for about 500ms with wkwebview @@ -1182,7 +1222,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa var format = (track.Codec || '').toLowerCase(); if (format === 'ssa' || format === 'ass') { // libjass is needed here - renderWithLibjass(videoElement, track, item); + renderSsaAss(videoElement, track, item); return; } @@ -1483,6 +1523,10 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa } } + if (browser.safari || browser.iOS || browser.iPad) { + list.push('AirPlay') + } + list.push('SetBrightness'); list.push("SetAspectRatio") @@ -1591,6 +1635,31 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa return false; }; + HtmlVideoPlayer.prototype.isAirPlayEnabled = function () { + + if (document.AirPlayEnabled) { + return document.AirplayElement ? true : false; + } + + return false; + }; + + HtmlVideoPlayer.prototype.setAirPlayEnabled = function (isEnabled) { + var video = this._mediaElement; + + if (document.AirPlayEnabled) { + if (video) { + if (isEnabled) { + video.requestAirPlay().catch(onAirPlayError); + } else { + document.exitAirPLay().catch(onAirPlayError); + } + } + } else { + video.webkitShowPlaybackTargetPicker(); + } + }; + HtmlVideoPlayer.prototype.setBrightness = function (val) { var elem = this._mediaElement; @@ -1744,6 +1813,10 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa return this.setPictureInPictureEnabled(!this.isPictureInPictureEnabled()); }; + HtmlVideoPlayer.prototype.toggleAirPlay = function () { + return this.setAirPlayEnabled(!this.isAirPlayEnabled()); + }; + HtmlVideoPlayer.prototype.getBufferedRanges = function () { var mediaElement = this._mediaElement; if (mediaElement) { diff --git a/src/components/htmlvideoplayer/style.css b/src/components/htmlvideoplayer/style.css index 9550f2c87..e1875ff33 100644 --- a/src/components/htmlvideoplayer/style.css +++ b/src/components/htmlvideoplayer/style.css @@ -24,6 +24,10 @@ z-index: 1000; } +.videoPlayerContainer .libassjs-canvas-parent { + order: -1; +} + video::-webkit-media-controls { display: none !important; } @@ -38,7 +42,6 @@ video::-webkit-media-controls { .htmlvideoplayer::cue { background-color: transparent; text-shadow: 0.14em 0.14em 0.14em rgba(0, 0, 0, 1); - -webkit-font-smoothing: antialiased; font-family: inherit; } diff --git a/src/components/images/style.css b/src/components/images/style.css index 5cf39c1e4..06fbf1f9c 100644 --- a/src/components/images/style.css +++ b/src/components/images/style.css @@ -18,21 +18,9 @@ .lazy-image-fadein { opacity: 0; - -webkit-animation-duration: .8s; - -moz-animation-duration: .8s; - -o-animation-duration: .8s; animation-duration: .8s; - -webkit-animation-name: popInAnimation; - -moz-animation-name: popInAnimation; - -o-animation-name: popInAnimation; animation-name: popInAnimation; - -webkit-animation-fill-mode: forwards; - -moz-animation-fill-mode: forwards; - -o-animation-fill-mode: forwards; animation-fill-mode: forwards; - -webkit-animation-timing-function: cubic-bezier(0,0,.5,1); - -moz-animation-timing-function: cubic-bezier(0,0,.5,1); - -o-animation-timing-function: cubic-bezier(0,0,.5,1); animation-timing-function: cubic-bezier(0,0,.5,1); } diff --git a/src/components/imageuploader/imageuploader.js b/src/components/imageuploader/imageuploader.js index 98fcf0ebc..198f54080 100644 --- a/src/components/imageuploader/imageuploader.js +++ b/src/components/imageuploader/imageuploader.js @@ -74,7 +74,7 @@ define(['dialogHelper', 'connectionManager', 'dom', 'loading', 'scrollHelper', ' return false; } - if (file.type !== "image/png" && file.type !== "image/x-png" && file.type !== "image/jpeg") { + if (!file.type.startsWith("image/")) { require(['toast'], function (toast) { toast(globalize.translate('MessageImageFileTypeAllowed')); }); @@ -185,4 +185,4 @@ define(['dialogHelper', 'connectionManager', 'dom', 'loading', 'scrollHelper', ' }); } }; -}); \ No newline at end of file +}); diff --git a/src/components/imageuploader/imageuploader.template.html b/src/components/imageuploader/imageuploader.template.html index b33355945..42d894db6 100644 --- a/src/components/imageuploader/imageuploader.template.html +++ b/src/components/imageuploader/imageuploader.template.html @@ -22,7 +22,7 @@
${LabelDropImageHere}
- +

diff --git a/src/components/indicators/indicators.css b/src/components/indicators/indicators.css index c2d089e1a..b0d0119c0 100644 --- a/src/components/indicators/indicators.css +++ b/src/components/indicators/indicators.css @@ -14,7 +14,6 @@ .indicator { border-radius: 100em; - display: -webkit-flex; display: flex; align-items: center; justify-content: center; @@ -43,7 +42,6 @@ .countIndicator { border-radius: 100em; - display: -webkit-flex; display: flex; align-items: center; justify-content: center; @@ -55,7 +53,6 @@ .playedIndicator { border-radius: 100em; - display: -webkit-flex; display: flex; align-items: center; justify-content: center; @@ -67,7 +64,6 @@ .videoIndicator { background: #444; border-radius: 100em; - display: -webkit-flex; display: flex; align-items: center; justify-content: center; diff --git a/src/components/indicators/indicators.js b/src/components/indicators/indicators.js index 8deedef6c..e8813d947 100644 --- a/src/components/indicators/indicators.js +++ b/src/components/indicators/indicators.js @@ -115,7 +115,6 @@ define(['datetime', 'itemHelper', 'css!./indicators.css', 'material-icons'], fun } function getTimerIndicator(item) { - var status; if (item.Type === 'SeriesTimer') { diff --git a/src/components/itemMediaInfo/itemMediaInfo.template.html b/src/components/itemMediaInfo/itemMediaInfo.template.html index a947a55d2..1eeab4fbd 100644 --- a/src/components/itemMediaInfo/itemMediaInfo.template.html +++ b/src/components/itemMediaInfo/itemMediaInfo.template.html @@ -1,8 +1,8 @@
- -

- ${HeaderMediaInfo} -

+ +

${HeaderMediaInfo}

diff --git a/src/components/itemidentifier/itemidentifier.template.html b/src/components/itemidentifier/itemidentifier.template.html index 0081b543a..d921d580a 100644 --- a/src/components/itemidentifier/itemidentifier.template.html +++ b/src/components/itemidentifier/itemidentifier.template.html @@ -2,9 +2,7 @@ -

- ${Identify} -

+

${Identify}

@@ -17,16 +15,13 @@
- +
- +
-
-
+
-
+

${SearchResults}

-

@@ -51,8 +45,7 @@
-
diff --git a/src/components/listview/listview.css b/src/components/listview/listview.css index d91a5377b..4d3b27ce7 100644 --- a/src/components/listview/listview.css +++ b/src/components/listview/listview.css @@ -126,20 +126,20 @@ align-self: center; justify-self: center; margin: auto; - color: rgba(255, 255, 255, .6); + color: rgba(255, 255, 255, 0.6); + background: rgba(0, 0, 0, 0.4); font-size: 1.6em; - background: transparent; - transition: transform 200ms ease-out; + transition: 200ms ease-out; display: flex; } .listItemImageButton:hover { + color: #00a4dc; + background: rgba(0, 164, 220, 0.2); transform: scale(1.2, 1.2); } .listItemImageButton-icon { - background: rgba(0,0,0,.4); - border: 0.1em solid currentColor; border-radius: 100em; display: flex; justify-content: center; @@ -264,4 +264,4 @@ .listItemCheckboxContainer { width: auto !important; -} \ No newline at end of file +} diff --git a/src/components/loading/loader2.gif b/src/components/loading/loader.gif similarity index 100% rename from src/components/loading/loader2.gif rename to src/components/loading/loader.gif diff --git a/src/components/loading/loading.css b/src/components/loading/loading.css index 6d8472fc1..e3f10c0e2 100644 --- a/src/components/loading/loading.css +++ b/src/components/loading/loading.css @@ -7,20 +7,11 @@ .mdlSpinnerActive { display: inline-block; - -webkit-animation: mdl-spinner__container-rotate 1568.23529412ms linear infinite; animation: mdl-spinner__container-rotate 1568.23529412ms linear infinite; } -@-webkit-keyframes mdl-spinner__container-rotate { - to { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); - } -} - @keyframes mdl-spinner__container-rotate { to { - -webkit-transform: rotate(360deg); transform: rotate(360deg); } } @@ -37,7 +28,6 @@ } .mdl-spinner__layer-1-active { - -webkit-animation: mdl-spinner__fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, mdl-spinner__layer-1-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; animation: mdl-spinner__fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, mdl-spinner__layer-1-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; } @@ -46,7 +36,6 @@ } .mdl-spinner__layer-2-active { - -webkit-animation: mdl-spinner__fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, mdl-spinner__layer-2-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; animation: mdl-spinner__fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, mdl-spinner__layer-2-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; } @@ -55,7 +44,6 @@ } .mdl-spinner__layer-3-active { - -webkit-animation: mdl-spinner__fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, mdl-spinner__layer-3-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; animation: mdl-spinner__fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, mdl-spinner__layer-3-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; } @@ -64,90 +52,39 @@ } .mdl-spinner__layer-4-active { - -webkit-animation: mdl-spinner__fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, mdl-spinner__layer-4-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; animation: mdl-spinner__fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, mdl-spinner__layer-4-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; } -@-webkit-keyframes mdl-spinner__fill-unfill-rotate { - 12.5% { - -webkit-transform: rotate(135deg); - transform: rotate(135deg); - } - - 25% { - -webkit-transform: rotate(270deg); - transform: rotate(270deg); - } - - 37.5% { - -webkit-transform: rotate(405deg); - transform: rotate(405deg); - } - - 50% { - -webkit-transform: rotate(540deg); - transform: rotate(540deg); - } - - 62.5% { - -webkit-transform: rotate(675deg); - transform: rotate(675deg); - } - - 75% { - -webkit-transform: rotate(810deg); - transform: rotate(810deg); - } - - 87.5% { - -webkit-transform: rotate(945deg); - transform: rotate(945deg); - } - - to { - -webkit-transform: rotate(1080deg); - transform: rotate(1080deg); - } -} - @keyframes mdl-spinner__fill-unfill-rotate { 12.5% { - -webkit-transform: rotate(135deg); transform: rotate(135deg); } 25% { - -webkit-transform: rotate(270deg); transform: rotate(270deg); } 37.5% { - -webkit-transform: rotate(405deg); transform: rotate(405deg); } 50% { - -webkit-transform: rotate(540deg); transform: rotate(540deg); } 62.5% { - -webkit-transform: rotate(675deg); transform: rotate(675deg); } 75% { - -webkit-transform: rotate(810deg); transform: rotate(810deg); } 87.5% { - -webkit-transform: rotate(945deg); transform: rotate(945deg); } to { - -webkit-transform: rotate(1080deg); transform: rotate(1080deg); } } @@ -161,32 +98,6 @@ * - https://github.com/Polymer/paper-spinner/issues/9 * - https://code.google.com/p/chromium/issues/detail?id=436255 */ -@-webkit-keyframes mdl-spinner__layer-1-fade-in-out { - from { - opacity: 0.99; - } - - 25% { - opacity: 0.99; - } - - 26% { - opacity: 0; - } - - 89% { - opacity: 0; - } - - 90% { - opacity: 0.99; - } - - 100% { - opacity: 0.99; - } -} - @keyframes mdl-spinner__layer-1-fade-in-out { from { opacity: 0.99; @@ -213,28 +124,6 @@ } } -@-webkit-keyframes mdl-spinner__layer-2-fade-in-out { - from { - opacity: 0; - } - - 15% { - opacity: 0; - } - - 25% { - opacity: 0.99; - } - - 50% { - opacity: 0.99; - } - - 51% { - opacity: 0; - } -} - @keyframes mdl-spinner__layer-2-fade-in-out { from { opacity: 0; @@ -257,28 +146,6 @@ } } -@-webkit-keyframes mdl-spinner__layer-3-fade-in-out { - from { - opacity: 0; - } - - 40% { - opacity: 0; - } - - 50% { - opacity: 0.99; - } - - 75% { - opacity: 0.99; - } - - 76% { - opacity: 0; - } -} - @keyframes mdl-spinner__layer-3-fade-in-out { from { opacity: 0; @@ -301,28 +168,6 @@ } } -@-webkit-keyframes mdl-spinner__layer-4-fade-in-out { - from { - opacity: 0; - } - - 65% { - opacity: 0; - } - - 75% { - opacity: 0.99; - } - - 90% { - opacity: 0.99; - } - - 100% { - opacity: 0; - } -} - @keyframes mdl-spinner__layer-4-fade-in-out { from { opacity: 0; @@ -366,7 +211,6 @@ border-color: inherit; border-bottom-color: transparent !important; border-radius: 50%; - -webkit-animation: none; animation: none; position: absolute; top: 0; @@ -377,91 +221,47 @@ .mdl-spinner__circleLeft { border-right-color: transparent !important; - -webkit-transform: rotate(129deg); transform: rotate(129deg); } .mdl-spinner__circleLeft-active { - -webkit-animation: mdl-spinner__left-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; animation: mdl-spinner__left-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; } .mdl-spinner__circleRight { left: -100%; border-left-color: transparent !important; - -webkit-transform: rotate(-129deg); transform: rotate(-129deg); } .mdl-spinner__circleRight-active { - -webkit-animation: mdl-spinner__right-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; animation: mdl-spinner__right-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; } -@-webkit-keyframes mdl-spinner__left-spin { - from { - -webkit-transform: rotate(130deg); - transform: rotate(130deg); - } - - 50% { - -webkit-transform: rotate(-5deg); - transform: rotate(-5deg); - } - - to { - -webkit-transform: rotate(130deg); - transform: rotate(130deg); - } -} - @keyframes mdl-spinner__left-spin { from { - -webkit-transform: rotate(130deg); transform: rotate(130deg); } 50% { - -webkit-transform: rotate(-5deg); transform: rotate(-5deg); } to { - -webkit-transform: rotate(130deg); transform: rotate(130deg); } } -@-webkit-keyframes mdl-spinner__right-spin { - from { - -webkit-transform: rotate(-130deg); - transform: rotate(-130deg); - } - - 50% { - -webkit-transform: rotate(5deg); - transform: rotate(5deg); - } - - to { - -webkit-transform: rotate(-130deg); - transform: rotate(-130deg); - } -} - @keyframes mdl-spinner__right-spin { from { - -webkit-transform: rotate(-130deg); transform: rotate(-130deg); } 50% { - -webkit-transform: rotate(5deg); transform: rotate(5deg); } to { - -webkit-transform: rotate(-130deg); transform: rotate(-130deg); } } diff --git a/src/components/loading/loadingLegacy.js b/src/components/loading/loadingLegacy.js index c5ffd8dc6..757cea016 100644 --- a/src/components/loading/loadingLegacy.js +++ b/src/components/loading/loadingLegacy.js @@ -6,14 +6,11 @@ define(['require', 'css!./loadingLegacy'], function (require) { return { show: function () { var elem = loadingElem; - if (!elem) { - elem = document.createElement("img"); - elem.src = require.toUrl('.').split('?')[0] + '/loader2.gif'; + elem.src = require.toUrl('.').split('?')[0] + '/loader.gif'; loadingElem = elem; - elem.classList.add('loading-spinner'); document.body.appendChild(elem); @@ -23,11 +20,9 @@ define(['require', 'css!./loadingLegacy'], function (require) { }, hide: function () { var elem = loadingElem; - if (elem) { - elem.classList.add('hide'); } } }; -}); \ No newline at end of file +}); diff --git a/src/components/loading/package.json b/src/components/loading/package.json deleted file mode 100644 index 79fd41b0f..000000000 --- a/src/components/loading/package.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "main": "loading.js" -} \ No newline at end of file diff --git a/src/components/loadingdialog/loadingdialog.js b/src/components/loadingdialog/loadingdialog.js index 03e3cc198..bd6a80fd5 100644 --- a/src/components/loadingdialog/loadingdialog.js +++ b/src/components/loadingdialog/loadingdialog.js @@ -2,14 +2,12 @@ define(['loading', 'events', 'dialogHelper', 'dom', 'layoutManager', 'scrollHelp 'use strict'; function showDialog(instance, options, template) { - var dialogOptions = { removeOnClose: true, scrollY: false }; var enableTvLayout = layoutManager.tv; - if (enableTvLayout) { dialogOptions.size = 'fullscreen'; } @@ -48,7 +46,6 @@ define(['loading', 'events', 'dialogHelper', 'dom', 'layoutManager', 'scrollHelp instance.dlg = dlg; return dialogHelper.open(dlg).then(function () { - if (enableTvLayout) { scrollHelper.centerFocus.off(dlg.querySelector('.formDialogContent'), false); } @@ -58,12 +55,10 @@ define(['loading', 'events', 'dialogHelper', 'dom', 'layoutManager', 'scrollHelp } function LoadingDialog(options) { - this.options = options; } LoadingDialog.prototype.show = function () { - var instance = this; loading.show(); @@ -76,15 +71,12 @@ define(['loading', 'events', 'dialogHelper', 'dom', 'layoutManager', 'scrollHelp }; LoadingDialog.prototype.setTitle = function (title) { - }; LoadingDialog.prototype.setText = function (text) { - }; LoadingDialog.prototype.hide = function () { - if (this.dlg) { dialogHelper.close(this.dlg); this.dlg = null; @@ -92,10 +84,9 @@ define(['loading', 'events', 'dialogHelper', 'dom', 'layoutManager', 'scrollHelp }; LoadingDialog.prototype.destroy = function () { - this.dlg = null; this.options = null; }; return LoadingDialog; -}); \ No newline at end of file +}); diff --git a/src/components/themes/logowhite.png b/src/components/logoscreensaver/logowhite.png similarity index 100% rename from src/components/themes/logowhite.png rename to src/components/logoscreensaver/logowhite.png diff --git a/src/components/logoscreensaver/plugin.js b/src/components/logoscreensaver/plugin.js new file mode 100644 index 000000000..521afd269 --- /dev/null +++ b/src/components/logoscreensaver/plugin.js @@ -0,0 +1,192 @@ +define(["pluginManager"], function (pluginManager) { + + return function () { + + var self = this; + + self.name = "Logo ScreenSaver"; + self.type = "screensaver"; + self.id = "logoscreensaver"; + self.supportsAnonymous = true; + + var interval; + + function animate() { + + var animations = [ + + bounceInLeft, + bounceInRight, + swing, + tada, + wobble, + rotateIn, + rotateOut + ]; + + var elem = document.querySelector(".logoScreenSaverImage"); + + if (elem && elem.animate) { + var random = getRandomInt(0, animations.length - 1); + + animations[random](elem, 1); + } + } + + function getRandomInt(min, max) { + return Math.floor(Math.random() * (max - min + 1)) + min; + } + + function bounceInLeft(elem, iterations) { + var keyframes = [ + { transform: "translate3d(-3000px, 0, 0)", opacity: "0", offset: 0 }, + { transform: "translate3d(25px, 0, 0)", opacity: "1", offset: 0.6 }, + { transform: "translate3d(-100px, 0, 0)", offset: 0.75 }, + { transform: "translate3d(5px, 0, 0)", offset: 0.9 }, + { transform: "none", opacity: "1", offset: 1 }]; + var timing = { duration: 900, iterations: iterations, easing: "cubic-bezier(0.215, 0.610, 0.355, 1.000)" }; + return elem.animate(keyframes, timing); + } + + function bounceInRight(elem, iterations) { + var keyframes = [ + { transform: "translate3d(3000px, 0, 0)", opacity: "0", offset: 0 }, + { transform: "translate3d(-25px, 0, 0)", opacity: "1", offset: 0.6 }, + { transform: "translate3d(100px, 0, 0)", offset: 0.75 }, + { transform: "translate3d(-5px, 0, 0)", offset: 0.9 }, + { transform: "none", opacity: "1", offset: 1 }]; + var timing = { duration: 900, iterations: iterations, easing: "cubic-bezier(0.215, 0.610, 0.355, 1.000)" }; + return elem.animate(keyframes, timing); + } + + function shake(elem, iterations) { + var keyframes = [ + { transform: "translate3d(0, 0, 0)", offset: 0 }, + { transform: "translate3d(-10px, 0, 0)", offset: 0.1 }, + { transform: "translate3d(10px, 0, 0)", offset: 0.2 }, + { transform: "translate3d(-10px, 0, 0)", offset: 0.3 }, + { transform: "translate3d(10px, 0, 0)", offset: 0.4 }, + { transform: "translate3d(-10px, 0, 0)", offset: 0.5 }, + { transform: "translate3d(10px, 0, 0)", offset: 0.6 }, + { transform: "translate3d(-10px, 0, 0)", offset: 0.7 }, + { transform: "translate3d(10px, 0, 0)", offset: 0.8 }, + { transform: "translate3d(-10px, 0, 0)", offset: 0.9 }, + { transform: "translate3d(0, 0, 0)", offset: 1 }]; + var timing = { duration: 900, iterations: iterations }; + return elem.animate(keyframes, timing); + } + + function swing(elem, iterations) { + var keyframes = [ + { transform: "translate(0%)", offset: 0 }, + { transform: "rotate3d(0, 0, 1, 15deg)", offset: 0.2 }, + { transform: "rotate3d(0, 0, 1, -10deg)", offset: 0.4 }, + { transform: "rotate3d(0, 0, 1, 5deg)", offset: 0.6 }, + { transform: "rotate3d(0, 0, 1, -5deg)", offset: 0.8 }, + { transform: "rotate3d(0, 0, 1, 0deg)", offset: 1 }]; + var timing = { duration: 900, iterations: iterations }; + return elem.animate(keyframes, timing); + } + + function tada(elem, iterations) { + var keyframes = [ + { transform: "scale3d(1, 1, 1)", offset: 0 }, + { transform: "scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg)", offset: 0.1 }, + { transform: "scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg)", offset: 0.2 }, + { transform: "scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg)", offset: 0.3 }, + { transform: "scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg)", offset: 0.4 }, + { transform: "scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg)", offset: 0.5 }, + { transform: "scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg)", offset: 0.6 }, + { transform: "scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg)", offset: 0.7 }, + { transform: "scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg)", offset: 0.8 }, + { transform: "scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg)", offset: 0.9 }, + { transform: "scale3d(1, 1, 1)", offset: 1 }]; + var timing = { duration: 900, iterations: iterations }; + return elem.animate(keyframes, timing); + } + + function wobble(elem, iterations) { + var keyframes = [ + { transform: "translate(0%)", offset: 0 }, + { transform: "translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg)", offset: 0.15 }, + { transform: "translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg)", offset: 0.45 }, + { transform: "translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg)", offset: 0.6 }, + { transform: "translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg)", offset: 0.75 }, + { transform: "translateX(0%)", offset: 1 }]; + var timing = { duration: 900, iterations: iterations }; + return elem.animate(keyframes, timing); + } + + function rotateIn(elem, iterations) { + var transformOrigin = elem.style["transform-origin"]; + var keyframes = [{ transform: "rotate3d(0, 0, 1, -200deg)", opacity: "0", transformOrigin: "center", offset: 0 }, + { transform: "none", opacity: "1", transformOrigin: "center", offset: 1 }]; + var timing = { duration: 900, iterations: iterations }; + return elem.animate(keyframes, timing); + } + + function rotateOut(elem, iterations) { + var transformOrigin = elem.style["transform-origin"]; + var keyframes = [{ transform: "none", opacity: "1", transformOrigin: "center", offset: 0 }, + { transform: "rotate3d(0, 0, 1, 200deg)", opacity: "0", transformOrigin: "center", offset: 1 }]; + var timing = { duration: 900, iterations: iterations }; + return elem.animate(keyframes, timing); + + } + + function fadeOut(elem, iterations) { + var keyframes = [ + { opacity: "1", offset: 0 }, + { opacity: "0", offset: 1 }]; + var timing = { duration: 400, iterations: iterations }; + return elem.animate(keyframes, timing); + } + + function stopInterval() { + if (interval) { + clearInterval(interval); + interval = null; + } + } + + self.show = function () { + + require(["css!" + pluginManager.mapPath(self, "style.css")], function () { + + var elem = document.querySelector(".logoScreenSaver"); + + if (!elem) { + elem = document.createElement("div"); + elem.classList.add("logoScreenSaver"); + document.body.appendChild(elem); + + elem.innerHTML = ''; + } + + stopInterval(); + interval = setInterval(animate, 3000); + }); + }; + + self.hide = function () { + + stopInterval(); + + var elem = document.querySelector(".logoScreenSaver"); + + if (elem) { + + var onAnimationFinish = function () { + elem.parentNode.removeChild(elem); + }; + + if (elem.animate) { + var animation = fadeOut(elem, 1); + animation.onfinish = onAnimationFinish; + } else { + onAnimationFinish(); + } + } + }; + } +}); diff --git a/src/components/logoscreensaver/style.css b/src/components/logoscreensaver/style.css new file mode 100644 index 000000000..92c813971 --- /dev/null +++ b/src/components/logoscreensaver/style.css @@ -0,0 +1,18 @@ +.logoScreenSaver { + background: #101010; + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: 1000; + text-align: center; +} + +.logoScreenSaverImage { + height: 120px; + position: absolute; + top: 50%; + margin-top: -60px; + margin-left: -197px; +} diff --git a/src/components/mediainfo/mediainfo.css b/src/components/mediainfo/mediainfo.css index 9b27e1253..2203ba667 100644 --- a/src/components/mediainfo/mediainfo.css +++ b/src/components/mediainfo/mediainfo.css @@ -69,10 +69,7 @@ } .closedCaptionMediaInfoText { - /*padding: .24em .4em;*/ font-weight: bold; - /*font-size: inherit;*/ - /*background: rgba(81, 81, 81, .7);*/ } .mediaInfoOfficialRating { diff --git a/src/components/navdrawer/navdrawer.css b/src/components/navdrawer/navdrawer.css index f774c6919..5d63e150d 100644 --- a/src/components/navdrawer/navdrawer.css +++ b/src/components/navdrawer/navdrawer.css @@ -9,29 +9,20 @@ .touch-menu-la { background-color: #FFF; will-change: transform; - display: -webkit-box; - display: -webkit-flex; display: flex; - -webkit-transition: -webkit-transform ease-out 40ms, left ease-out 260ms; - -o-transition: transform ease-out 40ms, left ease-out 260ms; transition: transform ease-out 40ms, left ease-out 260ms; z-index: 1099 } .touch-menu-la.transition { - -webkit-transition: -webkit-transform ease-out 240ms, left ease-out 260ms; - -o-transition: transform ease-out 240ms, left ease-out 260ms; transition: transform ease-out 240ms, left ease-out 260ms } .drawer-open { - -webkit-box-shadow: 2px 0 12px rgba(0, 0, 0, .4); box-shadow: 2px 0 12px rgba(0, 0, 0, .4) } .scrollContainer { - -webkit-box-flex: 1; - -webkit-flex-grow: 1; flex-grow: 1 } @@ -41,8 +32,6 @@ background-color: #000; opacity: 0; z-index: 1098; - -webkit-transition: opacity ease-in-out .38s, visibility ease-in-out .38s; - -o-transition: opacity ease-in-out .38s, visibility ease-in-out .38s; transition: opacity ease-in-out .38s, visibility ease-in-out .38s; will-change: opacity; background-color: rgba(0, 0, 0, .3) diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index 23f0d4572..da04a2e13 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -1540,6 +1540,11 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla return player.togglePictureInPicture(); }; + self.toggleAirPlay = function (player) { + player = player || self._currentPlayer; + return player.toggleAirPlay(); + }; + self.getSubtitleStreamIndex = function (player) { player = player || self._currentPlayer; @@ -3854,6 +3859,9 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla if (player.supports('PictureInPicture')) { list.push('PictureInPicture'); } + if (player.supports('AirPlay')) { + list.push('AirPlay'); + } if (player.supports('SetBrightness')) { list.push('SetBrightness'); } diff --git a/src/components/remotecontrol/remotecontrol.css b/src/components/remotecontrol/remotecontrol.css index 0b6a2dbbc..673f301c1 100644 --- a/src/components/remotecontrol/remotecontrol.css +++ b/src/components/remotecontrol/remotecontrol.css @@ -1,10 +1,5 @@ .nowPlayingInfoContainer { - display: -webkit-box; - display: -webkit-flex; display: flex; - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - -webkit-flex-direction: row; flex-direction: row } @@ -21,27 +16,20 @@ } .nowPlayingInfoButtons { - display: -webkit-box; - display: -webkit-flex; display: flex; - -webkit-box-align: center; - -webkit-align-items: center; align-items: center; - -webkit-flex-wrap: wrap; flex-wrap: wrap } .nowPlayingInfoControls, .nowPlayingTime { - display: -webkit-box; - display: -webkit-flex + display: flex; } .nowPlayingPageImageContainer { width: 20%; margin-right: .25em; position: relative; - -webkit-flex-shrink: 0; flex-shrink: 0 } @@ -52,16 +40,9 @@ } .nowPlayingInfoControls { - -webkit-box-flex: 1; - -webkit-flex-grow: 1; flex-grow: 1; display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -webkit-flex-direction: column; flex-direction: column; - -webkit-box-pack: center; - -webkit-justify-content: center; justify-content: center } @@ -70,25 +51,15 @@ left: 0; right: 0; width: 100%; - -webkit-box-shadow: 0 0 1.9vh #000; box-shadow: 0 0 1.9vh #000; border: .1em solid #222; user-drag: none; user-select: none; - -moz-user-select: none; - -webkit-user-drag: none; - -webkit-user-select: none; - -ms-user-select: none } @media all and (orientation:portrait) and (max-width:50em) { .nowPlayingInfoContainer { - -webkit-box-orient: vertical !important; - -webkit-box-direction: normal !important; - -webkit-flex-direction: column !important; flex-direction: column !important; - -webkit-box-align: center; - -webkit-align-items: center; align-items: center } @@ -102,8 +73,6 @@ } .nowPlayingInfoButtons { - -webkit-box-pack: center; - -webkit-justify-content: center; justify-content: center } @@ -131,33 +100,20 @@ .nowPlayingTime { display: flex; - -webkit-box-align: center; - -webkit-align-items: center; align-items: center; margin: 0 1em } .nowPlayingSecondaryButtons { - display: -webkit-box; - display: -webkit-flex; display: flex; - -webkit-box-align: center; - -webkit-align-items: center; align-items: center; - -webkit-flex-wrap: wrap; flex-wrap: wrap; - -webkit-box-pack: center; - -webkit-justify-content: center; justify-content: center } @media all and (min-width:50em) { .nowPlayingSecondaryButtons { - -webkit-box-flex: 1; - -webkit-flex-grow: 1; flex-grow: 1; - -webkit-box-pack: end; - -webkit-justify-content: flex-end; justify-content: flex-end } } @@ -174,15 +130,13 @@ .smallBackdropPosterItem .cardOverlayInner>div { white-space: nowrap; - -o-text-overflow: ellipsis; text-overflow: ellipsis; overflow: hidden } .playlistIndexIndicatorImage { - -webkit-background-size: initial initial !important; background-size: initial !important; - background-image: url(../../img/equalizer.gif) !important; + background-image: url(assets/img/equalizer.gif) !important; } .hideVideoButtons .videoButton { diff --git a/src/components/screensavermanager.js b/src/components/screensavermanager.js new file mode 100644 index 000000000..5b7613c98 --- /dev/null +++ b/src/components/screensavermanager.js @@ -0,0 +1,132 @@ +define(["events", "playbackManager", "pluginManager", "inputManager", "connectionManager", "userSettings"], function (events, playbackManager, pluginManager, inputManager, connectionManager, userSettings) { + "use strict"; + + function getMinIdleTime() { + // Returns the minimum amount of idle time required before the screen saver can be displayed + //time units used Millisecond + return 180000; + } + + var lastFunctionalEvent = 0; + + function getFunctionalEventIdleTime() { + return new Date().getTime() - lastFunctionalEvent; + } + + events.on(playbackManager, "playbackstop", function (e, stopInfo) { + var state = stopInfo.state; + if (state.NowPlayingItem && state.NowPlayingItem.MediaType == "Video") { + lastFunctionalEvent = new Date().getTime(); + } + }); + + function getScreensaverPlugin(isLoggedIn) { + + var option; + try { + option = userSettings.get("screensaver", false); + } catch (err) { + option = isLoggedIn ? "backdropscreensaver" : "logoscreensaver"; + } + + var plugins = pluginManager.ofType("screensaver"); + + for (var i = 0, length = plugins.length; i < length; i++) { + var plugin = plugins[i]; + + if (plugin.id === option) { + return plugin; + } + } + + return null; + } + + function ScreenSaverManager() { + + var self = this; + var activeScreenSaver; + + function showScreenSaver(screensaver) { + + if (activeScreenSaver) { + throw new Error("An existing screensaver is already active."); + } + + console.log("Showing screensaver " + screensaver.name); + + screensaver.show(); + activeScreenSaver = screensaver; + + if (screensaver.hideOnClick !== false) { + window.addEventListener("click", hide, true); + } + if (screensaver.hideOnMouse !== false) { + window.addEventListener("mousemove", hide, true); + } + if (screensaver.hideOnKey !== false) { + window.addEventListener("keydown", hide, true); + } + } + + function hide() { + if (activeScreenSaver) { + console.log("Hiding screensaver"); + activeScreenSaver.hide(); + activeScreenSaver = null; + } + + window.removeEventListener("click", hide, true); + window.removeEventListener("mousemove", hide, true); + window.removeEventListener("keydown", hide, true); + } + + self.isShowing = function () { + return activeScreenSaver != null; + }; + + self.show = function () { + var isLoggedIn; + var apiClient = connectionManager.currentApiClient(); + + if (apiClient && apiClient.isLoggedIn()) { + isLoggedIn = true; + } + + var screensaver = getScreensaverPlugin(isLoggedIn); + + if (screensaver) { + showScreenSaver(screensaver); + } + }; + + self.hide = function () { + hide(); + }; + + function onInterval() { + + if (self.isShowing()) { + return; + } + + if (inputManager.idleTime() < getMinIdleTime()) { + return; + } + + if (getFunctionalEventIdleTime < getMinIdleTime()) { + return; + } + + if (playbackManager.isPlayingVideo()) { + return; + } + + self.show(); + } + + setInterval(onInterval, 10000); + } + + return new ScreenSaverManager(); +}); diff --git a/src/components/serverNotifications/package.json b/src/components/serverNotifications/package.json deleted file mode 100644 index 779da202d..000000000 --- a/src/components/serverNotifications/package.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "main": "serverNotifications.js" -} \ No newline at end of file diff --git a/src/components/serverNotifications/serverNotifications.js b/src/components/serverNotifications/serverNotifications.js index ff571b1e1..1941881b7 100644 --- a/src/components/serverNotifications/serverNotifications.js +++ b/src/components/serverNotifications/serverNotifications.js @@ -4,20 +4,15 @@ define(['connectionManager', 'playbackManager', 'events', 'inputManager', 'focus var serverNotifications = {}; function notifyApp() { - inputManager.notify(); } function displayMessage(cmd) { - var args = cmd.Arguments; - if (args.TimeoutMs) { - require(['toast'], function (toast) { toast({ title: args.Header, text: args.Text }); }); - } else { require(['alert'], function (alert) { alert({ title: args.Header, text: args.Text }); @@ -146,14 +141,10 @@ define(['connectionManager', 'playbackManager', 'events', 'inputManager', 'focus } function onMessageReceived(e, msg) { - var apiClient = this; - if (msg.MessageType === "Play") { - notifyApp(); var serverId = apiClient.serverInfo().Id; - if (msg.Data.PlayCommand === "PlayNext") { playbackManager.queueNext({ ids: msg.Data.ItemIds, serverId: serverId }); } else if (msg.Data.PlayCommand === "PlayLast") { @@ -169,9 +160,7 @@ define(['connectionManager', 'playbackManager', 'events', 'inputManager', 'focus serverId: serverId }); } - } else if (msg.MessageType === "Playstate") { - if (msg.Data.Command === 'Stop') { inputManager.trigger('stop'); } else if (msg.Data.Command === 'Pause') { @@ -193,22 +182,17 @@ define(['connectionManager', 'playbackManager', 'events', 'inputManager', 'focus var cmd = msg.Data; processGeneralCommand(cmd, apiClient); } else if (msg.MessageType === "UserDataChanged") { - if (msg.Data.UserId === apiClient.getCurrentUserId()) { - for (var i = 0, length = msg.Data.UserDataList.length; i < length; i++) { events.trigger(serverNotifications, 'UserDataChanged', [apiClient, msg.Data.UserDataList[i]]); } } } else { - events.trigger(serverNotifications, msg.MessageType, [apiClient, msg.Data]); } - } function bindEvents(apiClient) { - events.off(apiClient, "message", onMessageReceived); events.on(apiClient, "message", onMessageReceived); } @@ -229,7 +213,6 @@ define(['connectionManager', 'playbackManager', 'events', 'inputManager', 'focus connectionManager.getApiClients().forEach(bindEvents); events.on(connectionManager, 'apiclientcreated', function (e, newApiClient) { - bindEvents(newApiClient); }); diff --git a/src/components/skinManager.js b/src/components/skinManager.js index 9f9651642..06125e947 100644 --- a/src/components/skinManager.js +++ b/src/components/skinManager.js @@ -72,7 +72,7 @@ define(['apphost', 'userSettings', 'browser', 'events', 'pluginManager', 'backdr selectedTheme = selectedTheme || defaultTheme; return { - stylesheetPath: require.toUrl('components/themes/' + selectedTheme.id + '/theme.css'), + stylesheetPath: require.toUrl('themes/' + selectedTheme.id + '/theme.css'), themeId: selectedTheme.id }; } diff --git a/src/components/slideshow/style.css b/src/components/slideshow/style.css index 43211a8fe..1167a972c 100644 --- a/src/components/slideshow/style.css +++ b/src/components/slideshow/style.css @@ -41,9 +41,6 @@ height: auto; max-width: 100%; max-height: 100%; - -ms-transform: translate(-50%, -50%); - -webkit-transform: translate(-50%, -50%); - -moz-transform: translate(-50%, -50%); transform: translate(-50%, -50%); position: absolute; left: 50%; diff --git a/src/components/subtitlesync/subtitlesync.css b/src/components/subtitlesync/subtitlesync.css index 112e62472..38a15be90 100644 --- a/src/components/subtitlesync/subtitlesync.css +++ b/src/components/subtitlesync/subtitlesync.css @@ -40,8 +40,6 @@ margin-right: 1%; top: 2.5em; height: 1.4em; - -webkit-box-flex: 1; - -webkit-flex-grow: 1; flex-grow: 1; border-radius: .3em; z-index: 1; diff --git a/src/components/upnextdialog/upnextdialog.css b/src/components/upnextdialog/upnextdialog.css index 336a90d58..784c79cbb 100644 --- a/src/components/upnextdialog/upnextdialog.css +++ b/src/components/upnextdialog/upnextdialog.css @@ -11,7 +11,6 @@ background-color: rgba(0, 0, 0, 0.7); color: #fff; user-select: none; - -webkit-touch-callout: none; } .upNextDialog-hidden { @@ -67,8 +66,4 @@ border: 0; user-drag: none; user-select: none; - -moz-user-select: none; - -webkit-user-drag: none; - -webkit-user-select: none; - -ms-user-select: none; } diff --git a/src/components/viewContainer.js b/src/components/viewContainer.js index c2d060162..607e7029d 100644 --- a/src/components/viewContainer.js +++ b/src/components/viewContainer.js @@ -41,84 +41,87 @@ define(["browser", "dom", "layoutManager", "css!components/viewManager/viewConta var isPluginpage = -1 !== options.url.toLowerCase().indexOf("/configurationpage"); var newViewInfo = normalizeNewView(options, isPluginpage); var newView = newViewInfo.elem; + var modulesToLoad = []; if (isPluginpage) { - require(["legacyDashboard"]); + modulesToLoad.push("legacyDashboard"); } if (newViewInfo.hasjQuerySelect) { - require(["legacySelectMenu"]); + modulesToLoad.push("legacySelectMenu"); } if (newViewInfo.hasjQueryChecked) { - require(["fnchecked"]); + modulesToLoad.push("fnchecked"); } return new Promise(function (resolve) { - var currentPage = allPages[pageIndex]; + require(modulesToLoad, function () { + var currentPage = allPages[pageIndex]; - if (currentPage) { - triggerDestroy(currentPage); - } + if (currentPage) { + triggerDestroy(currentPage); + } - var view = newView; + var view = newView; - if ("string" == typeof view) { - view = document.createElement("div"); - view.innerHTML = newView; - } + if ("string" == typeof view) { + view = document.createElement("div"); + view.innerHTML = newView; + } - view.classList.add("mainAnimatedPage"); + view.classList.add("mainAnimatedPage"); - if (currentPage) { - if (newViewInfo.hasScript && window.$) { - view = $(view).appendTo(mainAnimatedPages)[0]; - mainAnimatedPages.removeChild(currentPage); + if (currentPage) { + if (newViewInfo.hasScript && window.$) { + view = $(view).appendTo(mainAnimatedPages)[0]; + mainAnimatedPages.removeChild(currentPage); + } else { + mainAnimatedPages.replaceChild(view, currentPage); + } } else { - mainAnimatedPages.replaceChild(view, currentPage); - } - } else { - if (newViewInfo.hasScript && window.$) { - view = $(view).appendTo(mainAnimatedPages)[0]; - } else { - mainAnimatedPages.appendChild(view); - } - } - - if (options.type) { - view.setAttribute("data-type", options.type); - } - - var properties = []; - - if (options.fullscreen) { - properties.push("fullscreen"); - } - - if (properties.length) { - view.setAttribute("data-properties", properties.join(",")); - } - - allPages[pageIndex] = view; - setControllerClass(view, options).then(function () { - if (onBeforeChange) { - onBeforeChange(view, false, options); + if (newViewInfo.hasScript && window.$) { + view = $(view).appendTo(mainAnimatedPages)[0]; + } else { + mainAnimatedPages.appendChild(view); + } } - beforeAnimate(allPages, pageIndex, selected); - selectedPageIndex = pageIndex; - currentUrls[pageIndex] = options.url; - - if (!options.cancel && previousAnimatable) { - afterAnimate(allPages, pageIndex); + if (options.type) { + view.setAttribute("data-type", options.type); } - if (window.$) { - $.mobile = $.mobile || {}; - $.mobile.activePage = view; + var properties = []; + + if (options.fullscreen) { + properties.push("fullscreen"); } - resolve(view); + if (properties.length) { + view.setAttribute("data-properties", properties.join(",")); + } + + allPages[pageIndex] = view; + setControllerClass(view, options).then(function () { + if (onBeforeChange) { + onBeforeChange(view, false, options); + } + + beforeAnimate(allPages, pageIndex, selected); + selectedPageIndex = pageIndex; + currentUrls[pageIndex] = options.url; + + if (!options.cancel && previousAnimatable) { + afterAnimate(allPages, pageIndex); + } + + if (window.$) { + $.mobile = $.mobile || {}; + $.mobile.activePage = view; + } + + resolve(view); + }); }); }); } diff --git a/src/controllers/auth/login.js b/src/controllers/auth/login.js index 8dd041a9f..54fb6ce5e 100644 --- a/src/controllers/auth/login.js +++ b/src/controllers/auth/login.js @@ -92,7 +92,7 @@ define(["apphost", "appSettings", "dom", "connectionManager", "loading", "layout html += '
"; } else { var background = getMetroColor(user.Id); - imgUrl = "img/logindefault.png"; + imgUrl = "assets/img/avatar.png"; html += '
'; } html += "
"; diff --git a/src/controllers/dashboard/dashboard.js b/src/controllers/dashboard/dashboard.js index 699c80c80..63c6f3226 100644 --- a/src/controllers/dashboard/dashboard.js +++ b/src/controllers/dashboard/dashboard.js @@ -623,7 +623,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa } }, getClientImage: function (connection) { - var iconUrl = imageHelper.getDeviceIcon(connection.DeviceName); + var iconUrl = imageHelper.getDeviceIcon(connection); return ""; }, getNowPlayingImageUrl: function (item) { diff --git a/src/controllers/devices.js b/src/controllers/devices.js index 897282a0e..4c8c37eed 100644 --- a/src/controllers/devices.js +++ b/src/controllers/devices.js @@ -74,7 +74,7 @@ define(["loading", "dom", "libraryMenu", "globalize", "scripts/imagehelper", "hu deviceHtml += '
'; deviceHtml += '
'; deviceHtml += ''; - var iconUrl = imageHelper.getDeviceIcon(device.Name); + var iconUrl = imageHelper.getDeviceIcon(device); if (iconUrl) { deviceHtml += '"; elem.innerHTML = html; @@ -898,7 +895,7 @@ define(["loading", "appRouter", "layoutManager", "userSettings", "connectionMana var html = cardBuilder.getCardsHtml({ items: result.Items, - shape: getThumbShape(false), + shape: "overflowBackdrop", showTitle: true, displayAsSpecial: "Season" == item.Type && item.IndexNumber, overlayText: false, @@ -1274,7 +1271,7 @@ define(["loading", "appRouter", "layoutManager", "userSettings", "connectionMana coverImage: "MusicAlbum" == item.Type || "MusicArtist" == item.Type, overlayPlayButton: true, overlayText: false, - showYear: "Movie" === item.Type || "Trailer" === item.Type + showYear: "Movie" === item.Type || "Trailer" === item.Type || "Series" === item.Type }); var similarContent = similarCollapsible.querySelector(".similarContent"); similarContent.innerHTML = html; @@ -1403,7 +1400,7 @@ define(["loading", "appRouter", "layoutManager", "userSettings", "connectionMana scrollX = enableScrollX(); html = cardBuilder.getCardsHtml({ items: result.Items, - shape: getPortraitShape(), + shape: "overflowPortrait", showTitle: true, centerText: true, lazy: true, @@ -1422,7 +1419,7 @@ define(["loading", "appRouter", "layoutManager", "userSettings", "connectionMana if ("Episode" === item.Type) { html = cardBuilder.getCardsHtml({ items: result.Items, - shape: getThumbShape(scrollX), + shape: "overflowBackdrop", showTitle: true, displayAsSpecial: "Season" == item.Type && item.IndexNumber, playFromHere: true, @@ -1740,6 +1737,7 @@ define(["loading", "appRouter", "layoutManager", "userSettings", "connectionMana items: items, shape: shape, showTitle: true, + showYear: "Video" === type.mediaType || "Series" === type.type, centerText: true, lazy: true, showDetailsMenu: true, @@ -1860,7 +1858,7 @@ define(["loading", "appRouter", "layoutManager", "userSettings", "connectionMana coverImage: true, serverId: item.ServerId, width: 160, - shape: getPortraitShape() + shape: "overflowPortrait" }); }); } diff --git a/src/controllers/playback/videoosd.js b/src/controllers/playback/videoosd.js index a93b5b61a..bd12ba507 100644 --- a/src/controllers/playback/videoosd.js +++ b/src/controllers/playback/videoosd.js @@ -1,4 +1,4 @@ -define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "mediaInfo", "focusManager", "imageLoader", "scrollHelper", "events", "connectionManager", "browser", "globalize", "apphost", "layoutManager", "userSettings", "scrollStyles", "emby-slider", "paper-icon-button-light", "css!css/videoosd"], function (playbackManager, dom, inputManager, datetime, itemHelper, mediaInfo, focusManager, imageLoader, scrollHelper, events, connectionManager, browser, globalize, appHost, layoutManager, userSettings) { +define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "mediaInfo", "focusManager", "imageLoader", "scrollHelper", "events", "connectionManager", "browser", "globalize", "apphost", "layoutManager", "userSettings", "scrollStyles", "emby-slider", "paper-icon-button-light", "css!assets/css/videoosd"], function (playbackManager, dom, inputManager, datetime, itemHelper, mediaInfo, focusManager, imageLoader, scrollHelper, events, connectionManager, browser, globalize, appHost, layoutManager, userSettings) { "use strict"; function seriesImageUrl(item, options) { @@ -789,6 +789,12 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med view.querySelector(".btnPip").classList.remove("hide"); } + if (-1 === supportedCommands.indexOf("AirPlay")) { + view.querySelector(".btnAirPlay").classList.add("hide"); + } else { + view.querySelector(".btnAirPlay").classList.remove("hide"); + } + updateFullscreenIcon(); } @@ -1306,6 +1312,9 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med view.querySelector(".btnPip").addEventListener("click", function () { playbackManager.togglePictureInPicture(currentPlayer); }); + view.querySelector(".btnAirPlay").addEventListener("click", function () { + playbackManager.toggleAirPlay(currentPlayer); + }); view.querySelector(".btnVideoOsdSettings").addEventListener("click", onSettingsButtonClick); view.addEventListener("viewhide", function () { headerElement.classList.remove("hide"); diff --git a/src/controllers/user/profile.js b/src/controllers/user/profile.js index 8bd2bdd37..3b85cb1d8 100644 --- a/src/controllers/user/profile.js +++ b/src/controllers/user/profile.js @@ -8,7 +8,7 @@ define(["controllers/userpasswordpage", "loading", "libraryMenu", "apphost", "em page.querySelector(".username").innerHTML = user.Name; libraryMenu.setTitle(user.Name); - var imageUrl = "img/logindefault.png"; + var imageUrl = "assets/img/avatar.png"; if (user.PrimaryImageTag) { imageUrl = ApiClient.getUserImageUrl(user.Id, { tag: user.PrimaryImageTag, diff --git a/src/dashboard.html b/src/dashboard.html index f29de59f9..dc9a56abb 100644 --- a/src/dashboard.html +++ b/src/dashboard.html @@ -112,7 +112,7 @@
diff --git a/src/dlnasettings.html b/src/dlnasettings.html index c93aeb226..8c44f751a 100644 --- a/src/dlnasettings.html +++ b/src/dlnasettings.html @@ -8,7 +8,7 @@

${TabSettings}

- ${Help} + ${Help}
@@ -66,4 +66,4 @@
- \ No newline at end of file + diff --git a/src/components/emby-button/emby-button.css b/src/elements/emby-button/emby-button.css similarity index 89% rename from src/components/emby-button/emby-button.css rename to src/elements/emby-button/emby-button.css index 0273de9d7..ee15e2e12 100644 --- a/src/components/emby-button/emby-button.css +++ b/src/elements/emby-button/emby-button.css @@ -9,9 +9,6 @@ font-family: inherit; color: inherit; outline-width: 0; - -moz-user-select: none; - -ms-user-select: none; - -webkit-user-select: none; user-select: none; cursor: pointer; z-index: 0; @@ -24,8 +21,6 @@ outline: none !important; position: relative; font-weight: 600; - /* Disable webkit tap highlighting */ - -webkit-tap-highlight-color: rgba(0,0,0,0); text-decoration: none; /* Not crazy about this but it normalizes heights between anchors and buttons */ line-height: 1.35; @@ -34,7 +29,7 @@ } .emby-button.show-focus:focus { - transform: scale(1.4); + transform: scale(1.2); z-index: 1; } @@ -99,9 +94,6 @@ font-size: inherit; font-family: inherit; color: inherit; - -moz-user-select: none; - -ms-user-select: none; - -webkit-user-select: none; user-select: none; cursor: pointer; z-index: 0; @@ -118,15 +110,13 @@ position: relative; overflow: hidden; border-radius: 50%; - /* Disable webkit tap highlighting */ - -webkit-tap-highlight-color: rgba(0,0,0,0); justify-content: center; transform-origin: center; transition: 0.2s; } .paper-icon-button-light.show-focus:focus { - transform: scale(1.6); + transform: scale(1.3); z-index: 1; } diff --git a/src/components/emby-button/emby-button.js b/src/elements/emby-button/emby-button.js similarity index 100% rename from src/components/emby-button/emby-button.js rename to src/elements/emby-button/emby-button.js diff --git a/src/components/emby-button/paper-icon-button-light.js b/src/elements/emby-button/paper-icon-button-light.js similarity index 100% rename from src/components/emby-button/paper-icon-button-light.js rename to src/elements/emby-button/paper-icon-button-light.js diff --git a/src/components/emby-checkbox/emby-checkbox.css b/src/elements/emby-checkbox/emby-checkbox.css similarity index 94% rename from src/components/emby-checkbox/emby-checkbox.css rename to src/elements/emby-checkbox/emby-checkbox.css index 5641893f6..4e27928e2 100644 --- a/src/components/emby-checkbox/emby-checkbox.css +++ b/src/elements/emby-checkbox/emby-checkbox.css @@ -38,9 +38,6 @@ margin: 0; padding: 0; opacity: 0; - -ms-appearance: none; - -moz-appearance: none; - -webkit-appearance: none; appearance: none; border: none; } @@ -115,7 +112,7 @@ margin-bottom: .25em; } -@-webkit-keyframes repaintChrome { +@keyframes repaintChrome { from { padding: 0; } diff --git a/src/components/emby-checkbox/emby-checkbox.js b/src/elements/emby-checkbox/emby-checkbox.js similarity index 100% rename from src/components/emby-checkbox/emby-checkbox.js rename to src/elements/emby-checkbox/emby-checkbox.js diff --git a/src/components/emby-collapse/emby-collapse.css b/src/elements/emby-collapse/emby-collapse.css similarity index 100% rename from src/components/emby-collapse/emby-collapse.css rename to src/elements/emby-collapse/emby-collapse.css diff --git a/src/components/emby-collapse/emby-collapse.js b/src/elements/emby-collapse/emby-collapse.js similarity index 100% rename from src/components/emby-collapse/emby-collapse.js rename to src/elements/emby-collapse/emby-collapse.js diff --git a/src/components/emby-input/emby-input.css b/src/elements/emby-input/emby-input.css similarity index 86% rename from src/components/emby-input/emby-input.css rename to src/elements/emby-input/emby-input.css index d888eb570..57a46ec7b 100644 --- a/src/components/emby-input/emby-input.css +++ b/src/elements/emby-input/emby-input.css @@ -10,10 +10,8 @@ font-weight: inherit; padding: .4em .25em; /* Prevent padding from causing width overflow */ - -webkit-box-sizing: border-box; box-sizing: border-box; outline: none !important; - -webkit-tap-highlight-color: rgba(0,0,0,0); width: 100%; } @@ -35,6 +33,5 @@ } .emby-input-iconbutton { - -webkit-align-self: flex-end; align-self: flex-end; } diff --git a/src/components/emby-input/emby-input.js b/src/elements/emby-input/emby-input.js similarity index 100% rename from src/components/emby-input/emby-input.js rename to src/elements/emby-input/emby-input.js diff --git a/src/components/emby-progressring/emby-progressring.css b/src/elements/emby-progressring/emby-progressring.css similarity index 100% rename from src/components/emby-progressring/emby-progressring.css rename to src/elements/emby-progressring/emby-progressring.css diff --git a/src/components/emby-progressring/emby-progressring.js b/src/elements/emby-progressring/emby-progressring.js similarity index 100% rename from src/components/emby-progressring/emby-progressring.js rename to src/elements/emby-progressring/emby-progressring.js diff --git a/src/components/emby-progressring/emby-progressring.template.html b/src/elements/emby-progressring/emby-progressring.template.html similarity index 100% rename from src/components/emby-progressring/emby-progressring.template.html rename to src/elements/emby-progressring/emby-progressring.template.html diff --git a/src/components/emby-radio/emby-radio.css b/src/elements/emby-radio/emby-radio.css similarity index 89% rename from src/components/emby-radio/emby-radio.css rename to src/elements/emby-radio/emby-radio.css index 25fdc5b93..6b8575bc8 100644 --- a/src/components/emby-radio/emby-radio.css +++ b/src/elements/emby-radio/emby-radio.css @@ -27,9 +27,6 @@ margin: 0; padding: 0; opacity: 0; - -ms-appearance: none; - -moz-appearance: none; - -webkit-appearance: none; appearance: none; border: none; } @@ -70,17 +67,13 @@ cursor: pointer; transition-duration: 0.28s; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-property: -webkit-transform; transition-property: transform; - transition-property: transform, -webkit-transform; - -webkit-transform: scale3d(0, 0, 0); transform: scale3d(0, 0, 0); border-radius: 50%; background: #00a4dc; } .mdl-radio__button:checked + .mdl-radio__label + .mdl-radio__outer-circle + .mdl-radio__inner-circle { - -webkit-transform: scale3d(1, 1, 1); transform: scale3d(1, 1, 1); } diff --git a/src/components/emby-radio/emby-radio.js b/src/elements/emby-radio/emby-radio.js similarity index 100% rename from src/components/emby-radio/emby-radio.js rename to src/elements/emby-radio/emby-radio.js diff --git a/src/components/emby-select/emby-select.css b/src/elements/emby-select/emby-select.css similarity index 91% rename from src/components/emby-select/emby-select.css rename to src/elements/emby-select/emby-select.css index 76b28c420..4aff8cab9 100644 --- a/src/components/emby-select/emby-select.css +++ b/src/elements/emby-select/emby-select.css @@ -12,7 +12,6 @@ /* Prevent padding from causing width overflow */ box-sizing: border-box; outline: none !important; - -webkit-tap-highlight-color: rgba(0,0,0,0); width: 100%; } @@ -20,8 +19,6 @@ background: none !important; border-color: transparent !important; color: inherit !important; - -webkit-appearance: none; - -moz-appearance: none; appearance: none; } @@ -41,7 +38,6 @@ .emby-select-focusscale { transition: transform 180ms ease-out !important; - -webkit-transform-origin: center center; transform-origin: center center; } @@ -77,7 +73,6 @@ } .emby-select-withcolor { - -webkit-appearance: none; appearance: none; border-radius: .2em; } diff --git a/src/components/emby-select/emby-select.js b/src/elements/emby-select/emby-select.js similarity index 100% rename from src/components/emby-select/emby-select.js rename to src/elements/emby-select/emby-select.js diff --git a/src/components/emby-slider/emby-slider.css b/src/elements/emby-slider/emby-slider.css similarity index 90% rename from src/components/emby-slider/emby-slider.css rename to src/elements/emby-slider/emby-slider.css index b173f5c51..6fc861deb 100644 --- a/src/components/emby-slider/emby-slider.css +++ b/src/elements/emby-slider/emby-slider.css @@ -1,31 +1,21 @@ _:-ms-input-placeholder { - -ms-appearance: none; + appearance: none; height: 2.223em; margin: 0; } .mdl-slider { width: 100%; - -webkit-appearance: none; - -moz-appearance: none; - -ms-appearance: none; appearance: none; height: 150%;/*150% is needed, else ie and edge won't display the thumb properly*/ background: transparent; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; user-select: none; outline: 0; color: #00a4dc; - -webkit-align-self: center; - -ms-flex-item-align: center; align-self: center; z-index: 1; cursor: pointer; margin: 0; - /* Disable webkit tap highlighting */ - -webkit-tap-highlight-color: rgba(0,0,0,0); display: block; } @@ -69,7 +59,7 @@ _:-ms-input-placeholder { } .mdl-slider::-webkit-slider-thumb { - -webkit-appearance: none; + appearance: none; width: 1.2em; height: 1.2em; box-sizing: border-box; @@ -84,11 +74,11 @@ _:-ms-input-placeholder { } .mdl-slider:hover::-webkit-slider-thumb { - transform: scale(1.6); + transform: scale(1.3); } .mdl-slider.show-focus:focus::-webkit-slider-thumb { - transform: scale(1.6); + transform: scale(1.3); } .slider-no-webkit-thumb::-webkit-slider-thumb { @@ -108,7 +98,7 @@ _:-ms-input-placeholder { } .mdl-slider::-ms-thumb { - -webkit-appearance: none; + appearance: none; width: 1.8em; height: 1.8em; box-sizing: border-box; diff --git a/src/components/emby-slider/emby-slider.js b/src/elements/emby-slider/emby-slider.js similarity index 100% rename from src/components/emby-slider/emby-slider.js rename to src/elements/emby-slider/emby-slider.js diff --git a/src/components/emby-textarea/emby-textarea.css b/src/elements/emby-textarea/emby-textarea.css similarity index 93% rename from src/components/emby-textarea/emby-textarea.css rename to src/elements/emby-textarea/emby-textarea.css index 6ac826223..0dab1b1ec 100644 --- a/src/components/emby-textarea/emby-textarea.css +++ b/src/elements/emby-textarea/emby-textarea.css @@ -13,7 +13,6 @@ /* Prevent padding from causing width overflow */ box-sizing: border-box; outline: none !important; - -webkit-tap-highlight-color: rgba(0,0,0,0); width: 100%; } diff --git a/src/components/emby-textarea/emby-textarea.js b/src/elements/emby-textarea/emby-textarea.js similarity index 100% rename from src/components/emby-textarea/emby-textarea.js rename to src/elements/emby-textarea/emby-textarea.js diff --git a/src/components/emby-toggle/emby-toggle.css b/src/elements/emby-toggle/emby-toggle.css similarity index 91% rename from src/components/emby-toggle/emby-toggle.css rename to src/elements/emby-toggle/emby-toggle.css index fb91419cb..3b14b8cf0 100644 --- a/src/components/emby-toggle/emby-toggle.css +++ b/src/elements/emby-toggle/emby-toggle.css @@ -9,10 +9,6 @@ margin: 0; padding: 0; overflow: visible; - -webkit-touch-callout: none; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; user-select: none; flex-direction: row-reverse; justify-content: flex-end; @@ -28,9 +24,6 @@ margin: 0; padding: 0; opacity: 0; - -ms-appearance: none; - -moz-appearance: none; - -webkit-appearance: none; appearance: none; border: none; } @@ -89,7 +82,6 @@ position: absolute; top: 50%; left: 50%; - -webkit-transform: translate(-50%, -50%); transform: translate(-50%, -50%); display: inline-block; box-sizing: border-box; diff --git a/src/components/emby-toggle/emby-toggle.js b/src/elements/emby-toggle/emby-toggle.js similarity index 100% rename from src/components/emby-toggle/emby-toggle.js rename to src/elements/emby-toggle/emby-toggle.js diff --git a/src/index.html b/src/index.html index ad42c2618..8e9c8db3b 100644 --- a/src/index.html +++ b/src/index.html @@ -22,44 +22,44 @@ - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + diff --git a/src/itemdetails.html b/src/itemdetails.html index 303202bf6..fbe0cc50d 100644 --- a/src/itemdetails.html +++ b/src/itemdetails.html @@ -1,276 +1,235 @@
- - -
-
- -
+
-
-
-
+
+
+
+
+
-
- -
- -
- -
- -
- -
- - -
- -
-
- -
-
- -
-
- -
- - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
+ -
+ -
-
+ -

-

-

-

-

-

-

+ -
+ + + + + + + + + + + + + + + + + +
+
+
+
+
+
+
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+ +

+

+

+

+

+

+

+ +
+ +
+
+
- +
+

${HeaderSchedule}

+
+
-
-
+
+ +
+

${HeaderNextUp}

+
+
+ +
+
+
+ +
+

+ +

+
+
+
+
+ +
+

${HeaderAdditionalParts}

+
+
+ +
+

+
+
+
+
+ +
+

+
+
+
+
+ +
+

${HeaderCastCrew}

+
+
+
+
+ +
+

${HeaderUpcomingOnTV}

+
+
+ +
+

${HeaderSpecialFeatures}

+
+
+ +
+

${HeaderMusicVideos}

+
+
+ +
+

${HeaderScenes}

+
+
+
+
+ +
+

${HeaderMoreLikeThis}

+
+
-
-

${HeaderSchedule}

-
-
- -
-
-

${HeaderNextUp}

-
-
-
-
-
-
-

- -

-
-
-
-
-
-

${HeaderAdditionalParts}

-
-
-
-

-
-
-
-
-
-

-
-
-
-
-
-

${HeaderCastCrew}

-
-
-
-
- -
-

${HeaderUpcomingOnTV}

-
-
- -
-

${HeaderSpecialFeatures}

-
-
- -
-

${HeaderMusicVideos}

-
-
- -
-

${HeaderScenes}

-
-
-
-
- -
-

${HeaderMoreLikeThis}

-
-
-
-
diff --git a/src/mypreferencesmenu.html b/src/mypreferencesmenu.html index 0be133ef7..0638a49d9 100644 --- a/src/mypreferencesmenu.html +++ b/src/mypreferencesmenu.html @@ -3,7 +3,7 @@

- +
person
@@ -12,7 +12,7 @@
- +
tv
@@ -21,7 +21,7 @@
- +
home
@@ -30,7 +30,7 @@
- +
play_circle_filled
@@ -39,7 +39,7 @@
- +
closed_caption
@@ -50,7 +50,7 @@
diff --git a/src/networking.html b/src/networking.html index 7f32c33bb..35468a94c 100644 --- a/src/networking.html +++ b/src/networking.html @@ -5,7 +5,7 @@
diff --git a/src/notificationsettings.html b/src/notificationsettings.html index e0747c34b..241e1cef2 100644 --- a/src/notificationsettings.html +++ b/src/notificationsettings.html @@ -2,9 +2,8 @@
-
-
+
-
\ No newline at end of file +
diff --git a/src/nowplaying.html b/src/nowplaying.html index 86565254a..44b7e3816 100644 --- a/src/nowplaying.html +++ b/src/nowplaying.html @@ -13,7 +13,6 @@
- @@ -53,8 +52,7 @@
-
-
+
-
-
-
-
+
+
@@ -23,8 +21,7 @@

${HeaderContinueWatching}

-
-
+
@@ -76,4 +73,4 @@
-
\ No newline at end of file +
diff --git a/src/userparentalcontrol.html b/src/userparentalcontrol.html index e2bc19151..302969b6c 100644 --- a/src/userparentalcontrol.html +++ b/src/userparentalcontrol.html @@ -1,5 +1,4 @@
-
-
+
${MaxParentalRatingHelp}
-
-
+
+
@@ -35,9 +34,7 @@ add
-
- -
+
@@ -47,10 +44,9 @@ add
-

${HeaderAccessScheduleHelp}

-
-
+

${HeaderAccessScheduleHelp}

+
@@ -58,8 +54,7 @@ ${ButtonSave}
-
-
\ No newline at end of file +
diff --git a/src/userpassword.html b/src/userpassword.html index 3014317cf..3f65c214f 100644 --- a/src/userpassword.html +++ b/src/userpassword.html @@ -1,5 +1,4 @@
-
@@ -18,7 +17,6 @@
-
@@ -71,4 +69,4 @@
-
\ No newline at end of file +
diff --git a/src/userprofiles.html b/src/userprofiles.html index 6fa5f058c..1272957e5 100644 --- a/src/userprofiles.html +++ b/src/userprofiles.html @@ -8,7 +8,7 @@ - ${Help} + ${Help}
diff --git a/src/videoosd.html b/src/videoosd.html index c9a46fd02..4d18787a5 100644 --- a/src/videoosd.html +++ b/src/videoosd.html @@ -64,6 +64,9 @@ +
diff --git a/src/wizardfinish.html b/src/wizardfinish.html index 2c01ec22b..e593c430f 100644 --- a/src/wizardfinish.html +++ b/src/wizardfinish.html @@ -1,14 +1,8 @@
-
-
-

- ${LabelYoureDone} -

- +

${LabelYoureDone}

${WizardCompleted}

-
-
diff --git a/src/wizardlibrary.html b/src/wizardlibrary.html index 758a545cb..710bf5581 100644 --- a/src/wizardlibrary.html +++ b/src/wizardlibrary.html @@ -1,25 +1,24 @@
-
-
-
-

- ${HeaderSetupLibrary} -

+

${HeaderSetupLibrary}

-


- - + +
-
-
\ No newline at end of file +
diff --git a/src/wizardremoteaccess.html b/src/wizardremoteaccess.html index 98fe1b2d8..f0375a4e2 100644 --- a/src/wizardremoteaccess.html +++ b/src/wizardremoteaccess.html @@ -1,7 +1,5 @@
-
-

${HeaderConfigureRemoteAccess}

@@ -21,13 +19,17 @@
${LabelEnableAutomaticPortMapHelp}

-
- - + +
-
-
\ No newline at end of file +
diff --git a/src/wizardsettings.html b/src/wizardsettings.html index 95e1d459f..cced04c5b 100644 --- a/src/wizardsettings.html +++ b/src/wizardsettings.html @@ -1,11 +1,8 @@
-
-

${HeaderPreferredMetadataLanguage}

-

${DefaultMetadataLangaugeDescription}

@@ -18,11 +15,17 @@
- - + +
-
\ No newline at end of file +
diff --git a/src/wizardstart.html b/src/wizardstart.html index 35fc1172d..1308fcb2e 100644 --- a/src/wizardstart.html +++ b/src/wizardstart.html @@ -1,14 +1,9 @@
-
-
-
-

- ${WelcomeToProject} -

+

${WelcomeToProject}

${ButtonQuickStartGuide} @@ -23,10 +18,12 @@
- +
-
diff --git a/src/wizarduser.html b/src/wizarduser.html index 26064d32f..0a943f81a 100644 --- a/src/wizarduser.html +++ b/src/wizarduser.html @@ -1,15 +1,9 @@
-
-
-
-

- ${TellUsAboutYourself} -

- +

${TellUsAboutYourself}

${UserProfilesIntro}


@@ -26,11 +20,16 @@
- - + +
-
diff --git a/webpack.common.js b/webpack.common.js index 969c7d6e0..5e0f88526 100644 --- a/webpack.common.js +++ b/webpack.common.js @@ -5,7 +5,10 @@ const CopyPlugin = require("copy-webpack-plugin"); const Assets = [ "alameda/alameda.js", - "requirejs/require.js" + "requirejs/require.js", + "libass-wasm/dist/subtitles-octopus-worker.js", + "libass-wasm/dist/subtitles-octopus-worker.data", + "libass-wasm/dist/subtitles-octopus-worker.wasm" ]; module.exports = { diff --git a/webpack.dev.js b/webpack.dev.js index 3aecac1a5..d3791e679 100644 --- a/webpack.dev.js +++ b/webpack.dev.js @@ -15,7 +15,7 @@ module.exports = merge(common, { rules: [ { test: /\.css$/i, - use: ["style-loader", "css-loader"] + use: ["style-loader", "css-loader", "postcss-loader"] }, { test: /\.(png|jpg|gif)$/i, diff --git a/webpack.prod.js b/webpack.prod.js index 8880a2168..319d8f14f 100644 --- a/webpack.prod.js +++ b/webpack.prod.js @@ -13,12 +13,12 @@ module.exports = merge(common, { rules: [ { test: /\.css$/i, - use: ["style-loader", "css-loader"] + use: ["style-loader", "css-loader", "postcss-loader"] }, { test: /\.(png|jpg|gif)$/i, use: ["file-loader"] } ] - }, + } }); diff --git a/yarn.lock b/yarn.lock index 8335ba92c..705eac6a1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -461,6 +461,19 @@ atob@^2.1.1: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== +autoprefixer@^9.7.3: + version "9.7.3" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.7.3.tgz#fd42ed03f53de9beb4ca0d61fb4f7268a9bb50b4" + integrity sha512-8T5Y1C5Iyj6PgkPSFd0ODvK9DIleuPKUPYniNxybS47g2k2wFgLZ46lGQHlBuGKIAEV8fbCDfKCCRS1tvOgc3Q== + dependencies: + browserslist "^4.8.0" + caniuse-lite "^1.0.30001012" + chalk "^2.4.2" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + postcss "^7.0.23" + postcss-value-parser "^4.0.2" + balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" @@ -635,6 +648,15 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" +browserslist@^4.8.0: + version "4.8.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.8.2.tgz#b45720ad5fbc8713b7253c20766f701c9a694289" + integrity sha512-+M4oeaTplPm/f1pXDw84YohEv7B1i/2Aisei8s4s6k3QsoSHa7i5sz8u/cGQkkatCPxMASKxPualR4wwYgVboA== + dependencies: + caniuse-lite "^1.0.30001015" + electron-to-chromium "^1.3.322" + node-releases "^1.1.42" + buffer-from@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" @@ -674,16 +696,17 @@ bytes@3.1.0: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== -cacache@^11.3.3: - version "11.3.3" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.3.3.tgz#8bd29df8c6a718a6ebd2d010da4d7972ae3bbadc" - integrity sha512-p8WcneCytvzPxhDvYp31PD039vi77I12W+/KfR9S8AZbaiARFBCpsPJS+9uhWfeBfeAtW7o/4vt3MUqLkbY6nA== +cacache@^12.0.2: + version "12.0.2" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.2.tgz#8db03205e36089a3df6954c66ce92541441ac46c" + integrity sha512-ifKgxH2CKhJEg6tNdAwziu6Q33EvuG26tYcda6PT3WKisZcYDXsnEdnRv67Po3yCzFfaSoMjGZzJyD2c3DT1dg== dependencies: bluebird "^3.5.5" chownr "^1.1.1" figgy-pudding "^3.5.1" glob "^7.1.4" graceful-fs "^4.1.15" + infer-owner "^1.0.3" lru-cache "^5.1.1" mississippi "^3.0.0" mkdirp "^0.5.1" @@ -694,10 +717,10 @@ cacache@^11.3.3: unique-filename "^1.1.1" y18n "^4.0.0" -cacache@^12.0.2: - version "12.0.2" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.2.tgz#8db03205e36089a3df6954c66ce92541441ac46c" - integrity sha512-ifKgxH2CKhJEg6tNdAwziu6Q33EvuG26tYcda6PT3WKisZcYDXsnEdnRv67Po3yCzFfaSoMjGZzJyD2c3DT1dg== +cacache@^12.0.3: + version "12.0.3" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.3.tgz#be99abba4e1bf5df461cd5a2c1071fc432573390" + integrity sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw== dependencies: bluebird "^3.5.5" chownr "^1.1.1" @@ -735,6 +758,25 @@ call-me-maybe@^1.0.1: resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= +caller-callsite@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" + integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= + dependencies: + callsites "^2.0.0" + +caller-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" + integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= + dependencies: + caller-callsite "^2.0.0" + +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= + callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" @@ -753,6 +795,11 @@ camelcase@^5.0.0, camelcase@^5.2.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== +caniuse-lite@^1.0.30001012, caniuse-lite@^1.0.30001015: + version "1.0.30001017" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001017.tgz#d3ad6ec18148b9bd991829958d9d7e562bb78cd6" + integrity sha512-EDnZyOJ6eYh6lHmCvCdHAFbfV4KJ9lSdfv4h/ppEhrU/Yudkl7jujwMZ1we6RX7DXqBfT04pVMQ4J+1wcTlsKA== + chalk@2.4.2, chalk@^2.0.0, chalk@^2.1.0, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -1038,12 +1085,12 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= -copy-webpack-plugin@^5.0.3: - version "5.0.4" - resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-5.0.4.tgz#c78126f604e24f194c6ec2f43a64e232b5d43655" - integrity sha512-YBuYGpSzoCHSSDGyHy6VJ7SHojKp6WHT4D7ItcQFNAYx2hrwkMe56e97xfVR0/ovDuMTrMffXUiltvQljtAGeg== +copy-webpack-plugin@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-5.1.1.tgz#5481a03dea1123d88a988c6ff8b78247214f0b88" + integrity sha512-P15M5ZC8dyCjQHWwd4Ia/dm0SgVvZJMYeykVIVYXbGyqO4dWB5oyPHp9i7wjwo5LhtlhKbiBCdS2NvM07Wlybg== dependencies: - cacache "^11.3.3" + cacache "^12.0.3" find-cache-dir "^2.1.0" glob-parent "^3.1.0" globby "^7.1.1" @@ -1051,9 +1098,9 @@ copy-webpack-plugin@^5.0.3: loader-utils "^1.2.3" minimatch "^3.0.4" normalize-path "^3.0.0" - p-limit "^2.2.0" + p-limit "^2.2.1" schema-utils "^1.0.0" - serialize-javascript "^1.7.0" + serialize-javascript "^2.1.2" webpack-log "^2.0.0" core-util-is@~1.0.0: @@ -1061,6 +1108,16 @@ core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= +cosmiconfig@^5.0.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" + integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== + dependencies: + import-fresh "^2.0.0" + is-directory "^0.3.1" + js-yaml "^3.13.1" + parse-json "^4.0.0" + create-ecdh@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" @@ -1432,6 +1489,11 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= +electron-to-chromium@^1.3.322: + version "1.3.322" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.322.tgz#a6f7e1c79025c2b05838e8e344f6e89eb83213a8" + integrity sha512-Tc8JQEfGQ1MzfSzI/bTlSr7btJv/FFO7Yh6tanqVmIWOuNCu6/D1MilIEgLtmWqIrsv+o4IjpLAhgMBr/ncNAA== + elliptic@^6.0.0: version "6.5.0" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.0.tgz#2b8ed4c891b7de3200e14412a5b8248c7af505ca" @@ -1493,6 +1555,13 @@ errno@^0.1.3, errno@~0.1.7: dependencies: prr "~1.0.1" +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + es-abstract@^1.5.1: version "1.16.2" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.16.2.tgz#4e874331645e9925edef141e74fc4bd144669d34" @@ -2415,6 +2484,21 @@ ignore@^4.0.6: resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== +import-cwd@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9" + integrity sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk= + dependencies: + import-from "^2.1.0" + +import-fresh@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" + integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= + dependencies: + caller-path "^2.0.0" + resolve-from "^3.0.0" + import-fresh@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.1.0.tgz#6d33fa1dcef6df930fae003446f33415af905118" @@ -2423,6 +2507,13 @@ import-fresh@^3.0.0: parent-module "^1.0.0" resolve-from "^4.0.0" +import-from@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1" + integrity sha1-M1238qev/VOqpHHUuAId7ja387E= + dependencies: + resolve-from "^3.0.0" + import-local@2.0.0, import-local@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" @@ -2555,6 +2646,11 @@ is-arguments@^1.0.4: resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.0.4.tgz#3faf966c7cba0ff437fb31f6250082fcf0448cf3" integrity sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA== +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + is-binary-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" @@ -2609,6 +2705,11 @@ is-descriptor@^1.0.0, is-descriptor@^1.0.2: is-data-descriptor "^1.0.0" kind-of "^6.0.2" +is-directory@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" + integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= + is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" @@ -2751,7 +2852,7 @@ js-tokens@^4.0.0: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@^3.13.0: +js-yaml@^3.13.0, js-yaml@^3.13.1: version "3.13.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== @@ -2759,7 +2860,7 @@ js-yaml@^3.13.0: argparse "^1.0.7" esprima "^4.0.0" -json-parse-better-errors@^1.0.2: +json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== @@ -2842,6 +2943,11 @@ levn@^0.3.0, levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" +libass-wasm@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/libass-wasm/-/libass-wasm-2.1.1.tgz#f12f4fdb9579dd422dcbc348bc3bd61097f4d07d" + integrity sha512-d45bHQ7tFVsLW3QstQDrDog2m+0D6Cja4GTrkGi70R9A5+aeLunPSUz3G4CVB+sKffNgiWjK4QI5NZLHQKZ9oQ== + libjass@^0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/libjass/-/libjass-0.11.0.tgz#bff1f464a2428c3bddfb68e4503b2d52afe3d6e6" @@ -3274,6 +3380,13 @@ node-pre-gyp@^0.12.0: semver "^5.3.0" tar "^4" +node-releases@^1.1.42: + version "1.1.44" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.44.tgz#cd66438a6eb875e3eb012b6a12e48d9f4326ffd7" + integrity sha512-NwbdvJyR7nrcGrXvKAvzc5raj/NkoJudkarh2yIpJ4t0NH4aqjUDz/486P+ynIW5eokKOfzGNRdYoLfBlomruw== + dependencies: + semver "^6.3.0" + nopt@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" @@ -3294,6 +3407,11 @@ normalize-path@^3.0.0: resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= + npm-bundled@^1.0.1: version "1.0.6" resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" @@ -3331,6 +3449,11 @@ nth-check@~1.0.1: dependencies: boolbase "~1.0.0" +num2fraction@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" + integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= + number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" @@ -3491,13 +3614,20 @@ p-is-promise@^2.0.0: resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== -p-limit@^2.0.0, p-limit@^2.2.0: +p-limit@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.0.tgz#417c9941e6027a9abcba5092dd2904e255b5fbc2" integrity sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ== dependencies: p-try "^2.0.0" +p-limit@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.1.tgz#aa07a788cc3151c939b5131f63570f0dd2009537" + integrity sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg== + dependencies: + p-try "^2.0.0" + p-locate@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" @@ -3562,6 +3692,14 @@ parse-asn1@^5.0.0: pbkdf2 "^3.0.3" safe-buffer "^5.1.1" +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + parse-passwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" @@ -3678,6 +3816,24 @@ posix-character-classes@^0.1.0: resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= +postcss-load-config@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.0.tgz#c84d692b7bb7b41ddced94ee62e8ab31b417b003" + integrity sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q== + dependencies: + cosmiconfig "^5.0.0" + import-cwd "^2.0.0" + +postcss-loader@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-3.0.0.tgz#6b97943e47c72d845fa9e03f273773d4e8dd6c2d" + integrity sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA== + dependencies: + loader-utils "^1.1.0" + postcss "^7.0.0" + postcss-load-config "^2.0.0" + schema-utils "^1.0.0" + postcss-modules-extract-imports@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e" @@ -3724,6 +3880,20 @@ postcss-value-parser@^3.3.0, postcss-value-parser@^3.3.1: resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== +postcss-value-parser@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz#482282c09a42706d1fc9a069b73f44ec08391dc9" + integrity sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ== + +postcss@^7.0.0, postcss@^7.0.23: + version "7.0.25" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.25.tgz#dd2a2a753d50b13bed7a2009b4a18ac14d9db21e" + integrity sha512-NXXVvWq9icrm/TgQC0O6YVFi4StfJz46M1iNd/h6B26Nvh/HKI+q4YZtFN/EjcInZliEscO/WL10BXnc1E5nwg== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + postcss@^7.0.14, postcss@^7.0.5, postcss@^7.0.6: version "7.0.17" resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.17.tgz#4da1bdff5322d4a0acaab4d87f3e782436bad31f" @@ -4177,6 +4347,11 @@ serialize-javascript@^1.7.0: resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.7.0.tgz#d6e0dfb2a3832a8c94468e6eb1db97e55a192a65" integrity sha512-ke8UG8ulpFOxO8f8gRYabHQe/ZntKlcig2Mp+8+URDP1D8vJZ0KUt7LYo07q25Z/+JVSgpr/cui9PIp5H6/+nA== +serialize-javascript@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.2.tgz#ecec53b0e0317bdc95ef76ab7074b7384785fa61" + integrity sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ== + serve-index@^1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" @@ -4924,10 +5099,10 @@ wbuf@^1.1.0, wbuf@^1.7.3: dependencies: minimalistic-assert "^1.0.0" -webcomponents.js-2@^0.7.24: +webcomponents.js@^0.7.24: version "0.7.24" - resolved "https://registry.yarnpkg.com/webcomponents.js-2/-/webcomponents.js-2-0.7.24.tgz#c0ffef99749c3970aa3ae71363ea6f0a40bcada6" - integrity sha1-wP/vmXScOXCqOucTY+pvCkC8raY= + resolved "https://registry.yarnpkg.com/webcomponents.js/-/webcomponents.js-0.7.24.tgz#2116fbfa1468ec416a7befdaa333e1d118f69c04" + integrity sha1-IRb7+hRo7EFqe+/aozPh0Rj2nAQ= webpack-cli@^3.3.9: version "3.3.9"