/* ==UserStyle==
@name YouTube Live Borderless
@version 0.2.9
@namespace github.com/cyfung1031
@license MIT
@description Make YouTube Live Borderless
@author CY Fung
@supportURL https://github.com/cyfung1031/YouTube-Live-Borderless/
@compatible edge Edge [Blink] >= 105; Stylus (Beta)
@compatible chrome Chrome >= 105; Stylus (Beta); Chrome 101-104 requires "enable-experimental-web-platform-features"
@compatible firefox FireFox >= 103; Stylus; layout.css.has-selector.enabled = true; note: some features might not be very stable!!
@compatible opera Opera >= 91; Stylus (Beta)
@compatible safari Safari >= 15.4; Stylus
@preprocessor stylus
@var select mode-for-two-col "Mode for Two Columns" {
"Expanded Panel Only (Recommended)": "expanded-panel",
"Expanded Live Chat Only": "expanded-live",
"Expandable Live Chat Only": "expandable-live",
"Always": "always"
}
@var select mode-for-single-col "Mode for Single Column" {
"YouTube Mobile (Recommended)": "mobile",
"Normal": "normal",
"Disabled": "disabled"
}
@var checkbox no-masthead "Hide Top Masthead Bar" 0
@var number masthead-hoverable-h "MastHead Hoverable (1 = always hide)" [4, 1, 8, 1]
@var range primary-content-margin "Primary Content Margin" [24, 6, 48, 6, "px"]
@var checkbox no-bottom-row "Hide Primary MetaInfo Bottom Row" 0
@var range video-title-size "Video Title Size" [2.0, 1.0, 3.0, 0.2, "rem"]
@var range min-below-area "Minimum area below video" [120, 10, 240, 10, 'px']
@var number side-panel-width "Side Panel Width" [440, 320, 640, 20, "px"]
@var checkbox no-round-border "No Round Border" 1
@var checkbox disable-cinematics "Disable Cinematics Effect" 0
@var number chat-zoom-for-mobile "Chat Zoom for Mobile" [1.0, 0.2, 1.8, 0.05]
==/UserStyle== */
/*
"Fill up Chat Area (experimental)": "chat-fill-up",
@var range chrome-bottom-bar-margin "Chrome Bottom Bar Margin" [12, 6, 48, 6, "px"]
Chrome Bottom Bar Margin is 12px only due to
MU = function(a) {
var b = a.u.ag()
, c = a.G.getVideoData().D
, d = 0;
a.u.ag() && a.u.Me() && (d = (a.G.fb().getPlayerSize().width - a.G.getVideoContentRect().width) / 2);
return 12 * (c ? 0 : b ? 2 : 1) + d
}
*/
@-moz-document url-prefix("https://www.youtube.com/watch?v=") {
dummy() {
// dummy
border: 0;
}
masthead-hoverable-height=(masthead-hoverable-h - 1) * 2px
no-masthead-w=no-masthead //
chrome-bottom-bar-margin=12px // this cannot be changed
single-col-mobile=0 //
if mode-for-single-col=="mobile" {
single-col-mobile=1 //
if no-masthead==0 {
no-masthead-w=2 //
}
}
chat-zoom-for-mobile-enable = ((chat-zoom-for-mobile < 1) or (chat-zoom-for-mobile > 1))
//
contentNoMasthead() {
&,
ytd-app,
ytd-page-manager[class].style-scope,
ytd-watch-flexy[class].style-scope {
/* 0px not 0 */
--ytd-masthead-height: 0px;
--ytd-toolbar-height: 0px;
--ytd-watch-flexy-masthead-height: 0px;
}
#masthead-container {
height: 0;
--masthead-opacity: 0;
opacity: var(--masthead-opacity) !important;
transition: opacity 300ms;
min-height: masthead-hoverable-height;
contain: layout size style;
}
#masthead-container > ytd-masthead {
transform: translateY(-100%);
transition: transform 300ms;
}
if masthead-hoverable-height > 0 {
#masthead-container:hover {
--masthead-opacity: 1;
}
#masthead-container:hover > ytd-masthead {
transform: translateY(0%);
}
#masthead-container::after {
content: '';
display: flex;
width: 100%;
height: masthead-hoverable-height;
top: 0;
z-index: 77;
cursor: default;
user-select: none !important;
touch-action: none !important;
box-sizing: border-box;
padding: 0;
margin: 0;
}
}
ytd-watch-flexy.style-scope[is-two-columns_]:not([fullscreen]):not([theater]) {
#columns.style-scope.ytd-watch-flexy,
#primary.style-scope.ytd-watch-flexy,
#primary-inner.style-scope.ytd-watch-flexy,
#secondary.style-scope.ytd-watch-flexy,
#secondary-inner.style-scope.ytd-watch-flexy {
height: 100vh;
max-height: 100%;
}
}
ytd-watch-flexy.style-scope[is-two-columns_][theater]:not([fullscreen]) {
height: 100vh;
#player-theater-container.ytd-watch-flexy {
flex: 77;
max-height: unset;
}
#player-theater-container.ytd-watch-flexy ~ #columns.style-scope.ytd-watch-flexy {
overflow: visible;
}
}
ytd-watch-flexy.style-scope:not([fullscreen]) {
#movie_player .html5-video-container > video[style*="top:"]:not(video[style*="top: -"]):not(video[style*="top:-"]) {
top: 0 !important;
}
}
} //
contentSingleColMobile(){
// html:has(ytd-watch-flexy:not([is-two-columns_]):not([fullscreen]))
#chat:not([collapsed]) {
--ytd-margin-2x: 0;
--ytd-margin-4x: 0;
--ytd-margin-6x: 0;
--ytd-margin-8x: 0;
height: 100% !important;
min-height: unset !important;
max-height: 100vh !important;
--single-col-mobile-below-inside-display: flex;
if chat-zoom-for-mobile-enable {
iframe#chatframe {
iframe-transform = 'scale(%s)' % chat-zoom-for-mobile
iframe-ratio = 100% / chat-zoom-for-mobile
transform: iframe-transform;
height: iframe-ratio;
position: absolute;
/* max-height: unset !important; */
transform-origin: 0 0;
width: iframe-ratio;
}
}
}
&:has(#chat:not([collapsed])) {
#contentContainer.tp-yt-app-drawer[swipe-open].tp-yt-app-drawer::after {
content: unset;
}
#primary-inner.ytd-watch-flexy ytd-comments#comments.ytd-watch-flexy,
#below.ytd-watch-flexy > #related.ytd-watch-flexy,
#below.ytd-watch-flexy > ytd-watch-metadata.ytd-watch-flexy {
display:none !important;
}
#secondary.ytd-watch-flexy {
display: none !important;
}
.efyt-control-bar {
position: relative;
display: inline-flex;
top: auto;
left: auto;
z-index: 99999;
opacity: 0.8;
transform: translate(calc(-100% + 32px), 0) !important;
}
.efyt-control-bar:hover {
opacity: 1.0;
background: var(--yt-spec-general-background-a);
transform: translate(0px, 0) !important;
}
#player {
margin-bottom: 0;
}
#columns,
#primary {
padding: 0;
}
#player,
#player-theater-container,
#player-container-outer,
#player-container-inner,
#player-container,
#movie_player,
#movie_player video {
object-fit: contain;
max-height: calc(100vh - 400px) !important;
}
#primary-inner.ytd-watch-flexy > :not(.style-scope) {
display: none !important;
}
#below > * {
display: var(--single-col-mobile-below-inside-display) !important;
}
#below:not(:has(#chat)) {
display: none;
}
ytd-watch-flexy,
#columns.ytd-watch-flexy,
#primary.ytd-watch-flexy,
#primary-inner.ytd-watch-flexy {
display: flex;
flex-direction: column;
margin: 0;
flex: 1;
}
#below {
flex: 1;
}
ytd-watch-flexy {
height: 100vh !important;
max-height: 100vh !important;
}
ytd-watch-flexy[theater] #player-theater-container.ytd-watch-flexy,
ytd-watch-flexy[fullscreen] #player-theater-container.ytd-watch-flexy {
min-height: unset !important;
}
}
}
contentf() {
&:not([tabview-loaded]) {
#primary-inner.ytd-watch-flexy ytd-comments#comments.ytd-watch-flexy,
#secondary-inner.ytd-watch-flexy > #related.ytd-watch-flexy {
display: none !important;
}
#player-theater-container {
max-height: calc(100vh - 100px) !important;
}
#cinematics {
// contain: layout;
contain: layout size style;
user-select: none;
touch-action: none;
pointer-events: none;
}
}
if no-masthead-w==2 {
//
} else if no-masthead-w==1 {
contentNoMasthead()
}
else {
ytd-watch-flexy.style-scope[is-two-columns_]:not([theater]):not([fullscreen]) {
#secondary.style-scope.ytd-watch-flexy,
#secondary-inner.style-scope.ytd-watch-flexy {
height: calc(100vh - var(--ytd-toolbar-height));
max-height: 100%;
}
}
}
if no-bottom-row {
#bottom-row.ytd-watch-metadata {
display: none !important;
}
}
h1.ytd-watch-metadata {
font-size: video-title-size;
--font-size: video-title-size;
line-height: calc(var(--font-size) * 1.4);
}
& {
--ylb-min-below-area: min-below-area;
}
ytd-watch-flexy.style-scope:not([fullscreen]) {
& {
--ytd-margin-2y: var(--ytd-margin-2x);
--ytd-margin-4y: var(--ytd-margin-4x);
--ytd-margin-6y: var(--ytd-margin-6x);
--ytd-margin-8y: var(--ytd-margin-8x);
}
#columns.style-scope.ytd-watch-flexy {
--ytd-margin-2x: 0;
--ytd-margin-4x: 0;
--ytd-margin-6x: 0;
--ytd-margin-8x: 0;
}
.style-scope.ytd-watch-flexy > :not(.ytd-watch-flexy),
#below,
#player {
--ytd-margin-2x: var(--ytd-margin-2y);
--ytd-margin-4x: var(--ytd-margin-4y);
--ytd-margin-6x: var(--ytd-margin-6y);
--ytd-margin-8x: var(--ytd-margin-8y);
}
#secondary-inner.style-scope.ytd-watch-flexy {
display: flex;
flex-direction: column;
height: 100%;
}
#movie_player {
position: relative;
> .html5-video-container:has(video) {
top: 0;
bottom: 0;
left: 0;
right: 0;
position: absolute;
}
.ytp-chrome-bottom[style*="width"] {
width: unset !important;
left: chrome-bottom-bar-margin !important;
right: chrome-bottom-bar-margin !important;
}
.html5-video-container > video {
width: unset !important;
height: 100% !important;
left: 0 !important;
right: 0 !important;
max-height: 100%;
max-width: 100%;
margin: 0 auto;
}
.ytp-iv-video-content {
width: 100% !important;
height: 100% !important;
}
/*
// this is buggy; eg multiple chapter hover container; can be fixed by YouTube Video Resize Fix Only
.ytp-chapter-hover-container[style*="width"] {
width: 100% !important;
}
*/
}
#chat:not([collapsed]) {
flex: 77;
}
#right-tabs {
display: flex;
margin: 0 !important;
flex: 1;
flex-direction: column;
#material-tabs,
.tab-content {
outline: 0;
}
.tab-content {
flex: 77;
}
}
&[is-two-columns_] #primary-inner > *:not(#player) {
padding: 0 primary-content-margin 0;
}
&:not([is-two-columns_]) #primary-inner > *:not(#player) {
padding: 0;
}
&:not([is-two-columns_]) #primary-inner #below > *:not(ytd-live-chat-frame#chat) {
padding: 0 primary-content-margin 0;
}
#player-container-outer.ytd-watch-flexy {
max-width: unset;
}
}
ytd-watch-flexy.style-scope[is-two-columns_]:not([theater]):not([fullscreen]) {
ytd-live-chat-frame#chat:not([collapsed]) {
min-height: unset;
}
}
if min-below-area > 0 {
ytd-watch-flexy.style-scope[is-two-columns_]:not([theater]):not([fullscreen]) {
#player #player-container-outer.ytd-watch-flexy, // layout outside
#player #player-container-inner.ytd-watch-flexy, // no effect
#player #player-container.ytd-watch-flexy { // layout inside
max-height: calc(100vh - var(--ytd-toolbar-height, 0px) - var(--ylb-min-below-area, 0px));
}
}
ytd-watch-flexy.style-scope[is-two-columns_][theater]:not([fullscreen]) {
#player-theater-container.ytd-watch-flexy {
max-height: calc(100vh - var(--ytd-toolbar-height, 0px) - var(--ylb-min-below-area, 0px));
}
}
}
else {
ytd-watch-flexy.style-scope[is-two-columns_]:not([theater]):not([fullscreen]) {
#player #player-container-outer.ytd-watch-flexy,
#player #player-container-inner.ytd-watch-flexy,
#player #player-container.ytd-watch-flexy {
max-height: calc(100vh - var(--ytd-toolbar-height, 0px)); // for very wide screen
}
}
ytd-watch-flexy.style-scope[is-two-columns_][theater]:not([fullscreen]) {
#player-theater-container.ytd-watch-flexy {
max-height: calc(100vh - var(--ytd-toolbar-height, 0px)); // for 4:3 video
}
}
}
body.lock-scrollbar[style*="overflow"][style*="hidden"]:has(ytd-watch-flexy[is-two-columns_] #columns.ytd-watch-flexy #primary-inner.ytd-watch-flexy #player #movie_player video[src]) { // note: might not be supported by FireFox due to its bug
overflow-y: unset !important;
}
ytd-watch-flexy.style-scope[is-two-columns_] #columns.ytd-watch-flexy > #secondary.ytd-watch-flexy {
width: side-panel-width;
}
if no-round-border {
ytd-live-chat-frame[rounded-container],
ytd-live-chat-frame[rounded-container] #show-hide-button.ytd-live-chat-frame ytd-toggle-button-renderer.ytd-live-chat-frame,
ytd-live-chat-frame[rounded-container] iframe.ytd-live-chat-frame,
ytd-live-chat-frame[rounded-container] #show-hide-button.ytd-live-chat-frame ytd-toggle-button-renderer.ytd-live-chat-frame button.yt-spec-button-shape-next,
ytd-live-chat-frame[rounded-container] #show-hide-button.ytd-live-chat-frame ytd-toggle-button-renderer.ytd-live-chat-frame button.yt-spec-button-shape-next:hover {
border-radius: unset;
}
}
if mode-for-single-col=="chat-fill-up" {
&:has(#below > #chat:not([collapsed])):not([tabview-loaded]) { // note: might not be supported by FireFox due to its bug
#primary-inner.style-scope.ytd-watch-flexy {
max-height: 100vh;
display: flex;
flex-direction: column;
}
#below.style-scope.ytd-watch-flexy {
flex-shrink: 1;
overflow: auto;
position: relative;
padding-top: 100%;
}
#below.style-scope.ytd-watch-flexy > #chat.style-scope.ytd-watch-flexy:not([collapsed]) {
margin: 0;
min-height: unset;
height: auto;
position: absolute;
top: 0;
bottom: 0;
right: 0;
left: 0;
top: 0;
}
}
}
if disable-cinematics {
#cinematics.ytd-watch-flexy {
display: none;
}
}
} //
contentg() {
if mode-for-single-col=="disabled" {
&:has(ytd-watch-flexy[is-two-columns_]){
contentf()
}
} else {
contentf()
}
}
if mode-for-two-col == "expanded-panel" {
html:has(ytd-live-chat-frame#chat:not([collapsed])):has(iframe#chatframe),
/*
html:has(ytd-engagement-panel-section-list-renderer[visibility="ENGAGEMENT_PANEL_VISIBILITY_EXPANDED"]:not([hidden])),
html:has(.tab-content-cld:not(.tab-content-hidden)),
*/
html[tabview-loaded]:has(ytd-watch-flexy[is-two-columns_]:not([fullscreen]):not([theater])) {
contentg() //
}
} else if mode-for-two-col == "expanded-live" {
html:has(ytd-live-chat-frame#chat:not([collapsed])):has(iframe#chatframe) {
contentg() //
}
} else if mode-for-two-col == "expandable-live" {
html:has(ytd-live-chat-frame#chat):has(iframe#chatframe) {
contentg() //
}
} else if mode-for-two-col == "always" {
html { //
contentg() //
}
}
if single-col-mobile {
html {
--single-col-mobile-below-inside-display: none;
}
&:has(ytd-watch-flexy:not([is-two-columns_]):not([fullscreen])) {
if no-masthead-w==2 {
contentNoMasthead()
}
contentSingleColMobile()
}
}
}