您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Avoids navbar dropdown menus from being cut-off and inaccessible by adding scrolling.
// ==UserScript== // @name SonicHackingContest Navbar Scroll // @version 2024.10.02 // @description Avoids navbar dropdown menus from being cut-off and inaccessible by adding scrolling. // @author Obsidian // @namespace https://greasyfork.org/en/users/318252-obsidian // @include /^https?://(www\.)?sonichacking\.org// // @include /^https?://(www\.)?shc\.zone// // @match http*://*.sonichacking.org/* // @match http*://*.shc.zone/* // @exclude /^https?://(www\.)?(shc\.zone|sonichacking\.org)/vault// // @grant none // @run-at document-end // @icon data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAMAAAD04JH5AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAwUExURUdwTKfH4uzz+dfl8+70+nWn0hpqswpfrfD1+glfrXeo0v///wBbqxpstHCj0EWHwjcCEG0AAAALdFJOUwD49/Oay6syPmGDWhDOJgAABMNJREFUeNrtWtu2oyAMbUgVNRL+/28PoLa1AoRael7cD3NbM7O3uRO43S5cuHDhwoULFyQYhvsTw/Breq3oHQqdkN8pmEhZM3sYY6xlBlSrjB+p6AgXAU94IRBU3O8/UQBzDMYyBhHNLQHEcwKLiOYaMK3Ai/AacGicCmbOwQKRGpqmAuYVzIZVUwmpQHyT0NARkA2DTQLR/d/CYJEA7fwwlZ3gwYruzZxgJQraGWFUyswiI5C6N8oEFgmYDbZxg5aaILjhX00Q3DC0iAKQCpjtNxSEYQw93M/TpDWQESsw5/LRUavHBLb+Sikly8TToTgEcmC2ZvtiYywDFlvSVxQMSIRc8ak5BfVxcFek2MzfQb2CQRF+jT5EoqrzPdE36UM2VoSBo4fv0juA2AlDZYzLw0DIT/I628IJ9yafL3cCNvB+RSYMinhuBy6ZYCCyc0ugKvCrtvwz0z3Pb+bGyKXiL/hzqahVY/+XogB/wp9OBGiaf6+1ABP1D+bfIFEOFSEAsG0fhnM8DOExbwI0VgHpTJymCcLODVuKKNbjaerCKNwsKRJhuD/5TECkGvVF4Wg0dkhtWrN4OtTeDC0kSHywScDaBgmoFBZUA8nnY90pkhvBwHaK5LwPag4pI4iHRPtyo5AtrHWLG90J3WB3lxn8JR949LLN4NuNis0ORsvtT9g3lBfsA1K5VRl8v89Jizbvf3X4wkENDjdKGSdYtsaYbeHA2XF9kKWBOfATVrSH7OezrL4eYb4gQHpQixig4oiZzgrxQY1jAqRDliE4fVCDMwKAphS/uA/E+KVRaAn0LT4nivmjIUBKusccz/KfEgDUJeK/4qBgj+Y3s0Ehv46fFGsOCgcLhBUbi/ghwV+3qInGv+B2LcV/Q6obxTBWgYo1xCDF7e8MUHlShDf/L3OHKQ4wCf6bql0VcKQHmIIVmSjFP1UflU2kBXBeAJDqUy1A1e9K8DCImHwhAYIxfTVavyvgiAGOAszz3iPDX50Cu4nwxQAHAaxI8SZvSo/BHy0reN8Cw4jIB/5NlFFKn70aTkQBv+jhyLHBZBvAsi7DT/i3RDAv9oCjwrVGpgrgpyH40pHgpS7BgX+JECY15i7nPz0Q83outBiZSOB5WslVgE9D8CXK4nOxfQSIQcI++z4iE4LGWHawNrFDej8ewT5AeHnm0/X55xHR/9swAL49pYPIxRrv/xJY5kcCcBAI/Zg9C0c84MjVsjzrPPrwI4Q/i8SrsQygdn542B+py9NHPGAYiQgdbz+Oo35gHPu+S5f78OBv0x0MZkP2j+UHKjuzepcRePJY3uq+1LYeLWLhhyK/3r1MYCRKsi+rg9Lywj5nFAn/rgr51pFlX2xQqFu8roz8+FXmv3UPp670umSyvnR8h7A08+OXgP+G9Eo/askCBwpLsa34SfjXEGAk1Yn+wbJTVYSFSGBmkOzGQhWwVfTBDR0JXhsA0SCIQYtEVfTBCL4kEMSee7zIsuX785HUB/TeCE4CLPUZ2PoN1FKJYBei5T25/ox+dYQrjfDeDxGfa38reMbRf0q/GNCVZy9jg/9NWPsjMAOS6sufcf6hm28TK7ReA2SZhrpTX3fq6Vm/4L/4V8Po24ULFy5cuHDhQhp/KJVML/pyu60AAAAASUVORK5CYII= // @noframes // ==/UserScript== /* jshint esversion: 6 */ (function(){ 'use strict'; // Greasemonkey or Web Storage APIs: // To use Greasemonkey functions instead of localStorage, add @grant GM_getValue and @grant GM_setValue to // the Metadata block in place of @grant none. // Using the synchronous GM_getValue or localStorage.getItem if(typeof GM_getValue !== "function"){ var GM_getValue; GM_getValue = function(aKey, aDefault){ var val = null; try{ val = localStorage.getItem(aKey, aDefault); }catch(e){} if(val === null && typeof aDefault != "undefined"){return aDefault;} return val; }; } // Using the synchronous GM_setValue or localStorage.setItem if(typeof GM_setValue !== "function"){ var GM_setValue; GM_setValue = function(aKey, aVal){ try{ localStorage.setItem(aKey, aVal); }catch(e){} }; } function GM_addStyle(aCss){ var head = document.getElementsByTagName('head')[0]; if(head){ var style = document.createElement('style'); style.setAttribute('type', 'text/css'); style.textContent = aCss; head.appendChild(style); return style; } return null; } var strCss = ` @media (min-width: 992px) { .navbar-nav .dropdown-menu { max-height: calc(100vh - 100% - 2px); overflow-y: auto; scrollbar-width: thin; scrollbar-color: rgba(255,255,255,0.38) rgba(32,32,32,0.35); overscroll-behavior: contain; } .navbar-dark .nav-link { height: 100%; } } /* mobile style (max-width: 991.999) */ @media not all and (min-width: 992px) { .navbar-collapse { padding-top: 0.7px; } .navbar-collapse .navbar-nav { max-height: calc(100vh - 52px); overflow-y: auto; scrollbar-width: thin; scrollbar-color: rgba(255,255,255,0.38) rgba(32,32,32,0.35); overscroll-behavior: contain; min-width: 24em; max-width: 100vw; width: -moz-max-content; width: max-content; } .navbar { max-height: 50.6px; /*max-height: calc(3rem + 2px);*/ } #entry_banner_image { width: 100%; max-width: 352px; } .shc-news-body iframe { max-width: 100%; max-height: calc((100vw - 4rem - 2px) * 0.5625); /* assume this is a 16x9 video */ } .shc-news-body img { max-width: 100%; height: auto; } } /* constrain size of news post avatars on narrow screens */ @media only screen and (max-width: 480px) { .shc-news-header h2 { margin-right: 0px !important; font-size: 1.5rem; } .shc-news-header h2 a { font-size: 1.5rem; } .shc-news-header img { top: auto; bottom: -0.5em; right: 0.4rem; height: auto !important; width: 64px; width: 4.1rem; } /* trick for padding end of last-line */ .shc-news-header h2::after { content: "\\00a0"; display: inline; visibility: hidden; margin-left: -0.25em; padding-right: 58px; padding-right: calc(3.7rem - 1px); } } /* avoid entry list items from overflowing screen */ .shc-entry-list-item.m-4 { max-width: calc(100% - 3rem); } @media only screen and (max-width: 414px) { .shc-entry-list-item.m-4 { margin-left: auto !important; margin-right: auto !important; max-width: 100%; } } /* styles for all */ .navbar-nav > .nav-divider { flex-shrink: 0; } .navbar-nav > .nav-divider:first-child { display: none; } .navbar-backdrop { top: 50.4px !important; /*top: calc(3rem + 1px) !important;*/ } .container-fluid #shc_schedule th { border-bottom: 1px solid #e3e3e3; /*rgba(255,255,255,.75)*/ border-right: 1px solid #e3e3e3; /*rgba(255,255,255,.75)*/ } :root { --shc-tails-light: #edd090; --shc-knuckles-light: #e0c0c6; } .bg-shc-tails-light { background-color: #edd090 !important; background-color: var(--shc-tails-light, #edd090) !important; } .bg-shc-knuckles-light { background-color: #e0c0c6 !important; background-color: var(--shc-knuckles-light, #e0c0c6) !important; } /* tint contest logo image */ .bg-shc-tails-light img.d-block.ml-auto.mr-auto.mb-3 { filter: hue-rotate(calc(39deg - 207deg)) brightness(1.6); } .bg-shc-knuckles-light img.d-block.ml-auto.mr-auto.mb-3 { filter: hue-rotate(calc(349deg - 207deg)) contrast(1.08); } .btn-shc-tails0:not(.btn-shc-grey) { color: #fff; background-color: #e08000; border-color: #e08000; } .btn-shc-tails0:not(.btn-shc-grey):hover { color: #fff; background-color: #ba6a00; border-color: #ad6300; } .btn-shc-tails0:not(.btn-shc-grey):not(:disabled):not(.disabled).active, .btn-shc-tails0:not(.btn-shc-grey):not(:disabled):not(.disabled):active, .show>.btn-shc-tails0.dropdown-toggle { color: #fff; background-color: #ad6300; border-color: #a05c00; } .btn-shc-tails0:not(.btn-shc-grey).disabled, .btn-shc-tails0:not(.btn-shc-grey):disabled { color: #fff; background-color: #e08000; border-color: #e08000; } .btn-shc-knuckles0:not(.btn-shc-grey) { color: #fff; background-color: #c00020; border-color: #c00020; } .btn-shc-knuckles0:not(.btn-shc-grey):hover { color: #fff; background-color: #9a001a; border-color: #8d0018; } .btn-shc-knuckles0:not(.btn-shc-grey):not(:disabled):not(.disabled).active, .btn-shc-knuckles0:not(.btn-shc-grey):not(:disabled):not(.disabled):active, .show>.btn-shc-knuckles0.dropdown-toggle { color: #fff; background-color: #8d0018; border-color: #800015; } .btn-shc-knuckles0:not(.btn-shc-grey).disabled, .btn-shc-knuckles0:not(.btn-shc-grey):disabled { color: #fff; background-color: #c00020; border-color: #c00020; } /* non-standard thin scrollbar style */ .navbar-nav .dropdown-menu::-webkit-scrollbar, .navbar-collapse .navbar-nav::-webkit-scrollbar { width: 8px; height: 8px; } .navbar-nav .dropdown-menu::-webkit-scrollbar-track, .navbar-collapse .navbar-nav::-webkit-scrollbar-track { background: rgba(32,32,32,0.35); } .navbar-nav .dropdown-menu::-webkit-scrollbar-track { margin: 0 1px 1px 1px; /* push away from menu border */ } .navbar-nav .dropdown-menu::-webkit-scrollbar-thumb, .navbar-collapse .navbar-nav::-webkit-scrollbar-thumb { background: transparent linear-gradient(to right, rgba(248,248,248,0.35) 0%, rgba(248,248,248,0.35) 100%) 1.1px 0px/6.2px repeat-y; } .navbar-nav .dropdown-menu::-webkit-scrollbar-thumb:hover, .navbar-collapse .navbar-nav::-webkit-scrollbar-thumb:hover { background-image: linear-gradient(to right, rgba(208,208,208,0.35) 0%, rgba(208,208,208,0.35) 100%); } .navbar-nav .dropdown-menu::-webkit-scrollbar-thumb:active, .navbar-collapse .navbar-nav::-webkit-scrollbar-thumb:active { background-image: linear-gradient(to right, rgba(152,152,152,0.35) 0%, rgba(152,152,152,0.35) 100%); } .navbar-nav .dropdown-menu::-webkit-scrollbar-thumb:horizontal, .navbar-collapse .navbar-nav::-webkit-scrollbar-thumb:horizontal { background-repeat: repeat-x; background-position: 0px 1.1px; background-size: auto 6.15px; } .navbar-nav .dropdown-menu::-webkit-scrollbar-corner, .navbar-collapse .navbar-nav::-webkit-scrollbar-corner { background: transparent; }`; var strCssEx = ` /* EXTRA custom theme: shc-blaze */ :root { --shc-blaze: #7053bc; --shc-blaze-light: #d6c4f0; } .bg-shc-blaze { background-color: var(--shc-blaze, #7053bc) !important; } .border-shc-blaze { border-color: var(--shc-blaze, #7053bc) !important; } .bg-shc-blaze-light { background-color: #d6c4f0 !important; background-color: var(--shc-blaze-light, #d6c4f0) !important; } .bg-shc-blaze-75 { background-color: rgba(102,72,175,0.75) !important; } .btn-shc-blaze:not(.btn-shc-grey) { color: #fff; background-color: var(--shc-blaze, #7053bc); border-color: var(--shc-blaze, #7053bc); } .btn-shc-blaze:not(.btn-shc-grey):hover { color: #fff; background-color: #553a92; border-color: #54329c; } .btn-shc-blaze:not(.btn-shc-grey):not(:disabled):not(.disabled).active, .btn-shc-blaze:not(.btn-shc-grey):not(:disabled):not(.disabled):active, .show > .btn-shc-blaze.dropdown-toggle { color: #fff; background-color: #4c367d; border-color: #492a80; } .btn-shc-blaze:not(.btn-shc-grey).disabled, .btn-shc-blaze:disabled:not(.btn-shc-grey){ color: #fff; background-color: var(--shc-blaze, #7053bc); border-color: var(--shc-blaze, #7053bc); } .bg-shc-blaze-light img.d-block.ml-auto.mr-auto.mb-3 { filter: hue-rotate(calc(260deg - 207deg)) brightness(1.14) saturate(0.6); } .bg-shc-blaze + .shc-entry-body, .bg-shc-blaze + .shc-news-body, .shc-entry-list-item .bg-shc-blaze + p { box-shadow: 0 4px 0 #d7b8f2 inset; } .shc-entry-body .bg-shc-blaze.shc-entry-banner, .bg-shc-blaze.shc-news-header img { box-shadow: 0 4px 0 #d7b8f2; } /* EXTRA custom theme: shc-amy */ :root { --shc-amy: #c84489; --shc-amy-light: #f0c4e1; } .bg-shc-amy { background-color: var(--shc-amy, #c84489) !important; } .border-shc-amy { border-color: var(--shc-amy, #c84489) !important; } .bg-shc-amy-light { background-color: #f0c4e1 !important; background-color: var(--shc-amy-light, #f0c4e1) !important; } .bg-shc-amy-75 { background-color: rgba(174,72,120,0.75) !important; } .btn-shc-amy:not(.btn-shc-grey) { color: #fff; background-color: var(--shc-amy, #c84489); border-color: var(--shc-amy, #c84489); } .btn-shc-amy:not(.btn-shc-grey):hover { color: #fff; background-color: #9a426f; border-color: #943a62; } .btn-shc-amy:not(.btn-shc-grey):not(:disabled):not(.disabled).active, .btn-shc-amy:not(.btn-shc-grey):not(:disabled):not(.disabled):active, .show > .btn-shc-amy.dropdown-toggle { color: #fff; background-color: #8d3e61; border-color: #873258; } .btn-shc-amy:not(.btn-shc-grey).disabled, .btn-shc-amy:disabled:not(.btn-shc-grey){ color: #fff; background-color: var(--shc-amy, #c84489); border-color: var(--shc-amy, #c84489); } .bg-shc-amy-light img.d-block.ml-auto.mr-auto.mb-3 { filter: hue-rotate(112deg) brightness(1.1) saturate(0.95) contrast(0.9); } .bg-shc-amy + .shc-entry-body, .bg-shc-amy + .shc-news-body, .shc-entry-list-item .bg-shc-amy + p { box-shadow: 0 4px 0 #e3c1e6 inset; } .shc-entry-body .bg-shc-amy.shc-entry-banner, .bg-shc-amy.shc-news-header img { box-shadow: 0 4px 0 #e3c1e6; } .dropdown > .bg-shc-amy.dropdown-menu, .dropup > .bg-shc-amy.dropdown-menu, .navbar-collapse .bg-shc-amy.navbar-nav { scrollbar-color: rgba(255,175,235,0.68) rgba(42,32,42,0.45); } .bg-shc-amy-light.schedule-expanded #shc_schedule-wrapper { scrollbar-color: rgba(255,175,235,0.68) rgba(42,32,42,0.45) !important; } .bg-shc-amy-light .navbar-nav .dropdown-menu::-webkit-scrollbar-track, .bg-shc-amy-light .navbar-collapse .navbar-nav::-webkit-scrollbar-track { background: rgba(42,32,38,0.35); } .bg-shc-amy-light .navbar-nav .dropdown-menu::-webkit-scrollbar-thumb, .bg-shc-amy-light .navbar-collapse .navbar-nav::-webkit-scrollbar-thumb { background: transparent linear-gradient(to right, rgba(255,208,220,0.45) 0%, rgba(255,208,220,0.45) 100%) 1.1px 0px/6.2px repeat-y; } .bg-shc-amy-light .navbar-nav .dropdown-menu::-webkit-scrollbar-thumb:hover, .bg-shc-amy-light .navbar-collapse .navbar-nav::-webkit-scrollbar-thumb:hover { background-image: linear-gradient(to right, rgba(218,208,210,0.35) 0%, rgba(218,208,210,0.35) 100%); } .bg-shc-amy-light .navbar-nav .dropdown-menu::-webkit-scrollbar-thumb:active, .bg-shc-amy-light .navbar-collapse .navbar-nav::-webkit-scrollbar-thumb:active { background-image: linear-gradient(to right, rgba(162,152,158,0.35) 0%, rgba(162,152,158,0.35) 100%); } /* EXTRA custom dark theme: shc-shadow */ :root { --shc-shadow: #940010; --shc-shadow-dark: #0d0f12; } body.bg-shc-shadow-light { /* dark rather, but named light for convenience sake */ /* bg-shc-shadow-light reused to also signify dark theme, instead of better class like theme-dark */ color: #f0f8f3; background-color: #0d0f12 !important; background-color: var(--shc-shadow-dark, #0d0f12) !important; background-blend-mode: soft-light; } body.bg-shc-shadow-light .modal { color: #212529; } .bg-shc-shadow-75 { background-color: rgba(148,6,8,0.75) !important; } .bg-shc-shadow { background-color: var(--shc-shadow, #940010) !important; } .border-shc-shadow { border-color: var(--shc-shadow, #940010) !important; } .bg-shc-shadow-light a:not(.btn):not(.navbar-brand) { color: #03a9f4; } .bg-shc-shadow-light a:not(.btn):not(.navbar-brand):hover { color: #00709f; } /* tiny fix to avoid muted text */ .bg-shc-shadow-light .container-fluid > div.bg-white.text-black { color: #fff !important; background-color: #1f2327 !important; } /* dark:entries */ .bg-shc-shadow-light .shc-news-body, .bg-shc-shadow-light .shc-entry-body, .bg-shc-shadow-light .shc-entry-list-item p { color: #fff !important; background-color: #1f2327 !important; border-color: #383e3e !important; box-shadow: inset 0 4px 0 #2f3236; } .bg-shc-shadow-light .border-shc-grey { border-color: #383e3e !important; } .bg-shc-shadow-light .shc-news-header img, .bg-shc-shadow-light .shc-entry-body .shc-entry-banner { box-shadow: 0 4px 0 #2f3236; } .bg-shc-shadow-light .bg-shc-shadow + .shc-news-body, .bg-shc-shadow-light .bg-shc-shadow + .shc-entry-body, .bg-shc-shadow-light .shc-entry-list-item .bg-shc-shadow + p { box-shadow: inset 0 4px 0 #121618; } .bg-shc-shadow-light .bg-shc-shadow.shc-news-header img, .bg-shc-shadow-light .bg-shc-shadow + .shc-entry-body .shc-entry-banner { box-shadow: 0 4px 0 #121618; } /* dark:comments */ .bg-shc-shadow-light .shc-comment-body { background-color: #23292e !important; border-color: #424848 !important; border-bottom-color: #383e3e !important; } .bg-shc-shadow-light .shc-comment-body, .bg-shc-shadow-light .shc-comment-reply > div:first-child { box-shadow: inset 0 -4px 0 #0f1418; } .bg-shc-shadow-light .shc-comment-body::before { background: linear-gradient(45deg,#22282d 0%,#22282d 55%,transparent 55.1%,transparent 100%) transparent; border-left-color: #626868; border-bottom-color: #525858; margin-left: 0.2px; } .bg-shc-shadow-light .shc-comment-avatar { filter: drop-shadow(0px 0px 1px #fff); } /* dark:schedule */ .bg-shc-shadow-light #shc_schedule th { border-color: var(--shc-shadow-dark, #101010); } .bg-shc-shadow-light #shc_schedule td { background-color: #16191e; } .bg-shc-shadow-light #shc_schedule td.now a::after { border-width: 2px; border-style: solid; background-color: rgba(255, 255, 255, 0.5); box-shadow: 0 0 8px rgba(255, 255, 255, 0.5); } .bg-shc-shadow-light #shc_schedule td.now { background-color: #42484d; } /* shadow:buttons */ .btn-shc-shadow:not(.btn-shc-grey) { color: #fff; background-color: var(--shc-shadow, #940010); border-color: var(--shc-shadow, #940010); } .btn-shc-shadow:not(.btn-shc-grey):hover { color: #fff; background-color: #72080a; border-color: #760c0e; } .btn-shc-shadow:not(.btn-shc-grey):not(:disabled):not(.disabled).active, .btn-shc-shadow:not(.btn-shc-grey):not(:disabled):not(.disabled):active, .show > .btn-shc-shadow.dropdown-toggle { color: #fff; background-color: #680608; border-color: #6c0a0c; } .btn-shc-shadow:not(.btn-shc-grey).disabled, .btn-shc-shadow:disabled:not(.btn-shc-grey){ color: #fff; background-color: var(--shc-shadow, #940010); border-color: var(--shc-shadow, #940010); } .bg-shc-shadow-light .shc-entry-body .btn-shc-grey { color: #fff; background-color: #3e4449; border-color: #3e4449; } .bg-shc-shadow-light .shc-entry-body .btn-shc-grey:hover { color: #fff; background-color: #30363b; border-color: #343a3f; } .bg-shc-shadow-light .shc-entry-body .btn-shc-grey:not(:disabled):not(.disabled).active, .bg-shc-shadow-light .shc-entry-body .btn-shc-grey:not(:disabled):not(.disabled):active { color: #fff; background-color: #2b3034; border-color: #2f3438; } /* shadow:menus (main red, dropdown black) */ .bg-shc-shadow.navbar-dark .navbar-nav.navbar-pills:not(.navbar-not-pills) .nav-link:focus, .bg-shc-shadow.navbar-dark .navbar-nav.navbar-pills:not(.navbar-not-pills) .nav-link:hover { background-color: rgba(255,220,100,0.17); } .bg-shc-shadow.navbar-dark .navbar-nav.navbar-pills:not(.navbar-not-pills) .active > .nav-link, .bg-shc-shadow.navbar-dark .navbar-nav.navbar-pills:not(.navbar-not-pills) .nav-link.active, .bg-shc-shadow.navbar-dark .navbar-nav.navbar-pills:not(.navbar-not-pills) .nav-link.show, .bg-shc-shadow.navbar-dark .navbar-nav.navbar-pills:not(.navbar-not-pills) .show > .nav-link { background-color: rgba(255,200,120,0.32); } .bg-shc-shadow .dropdown-dark .dropdown-header { background-color: var(--shc-shadow); } @media (min-width: 992px) { .dropdown > .bg-shc-shadow.dropdown-menu, .dropup > .bg-shc-shadow.dropdown-menu { background-color: #1c2024 !important; scrollbar-color: rgba(255,255,255,0.38) rgba(4,4,4,0.35); } } @media not all and (min-width: 992px) { .dropdown > .bg-shc-shadow.dropdown-menu, .dropup > .bg-shc-shadow.dropdown-menu { background-color: #1c2024 !important; } } .shc-gallery-thumbnail:not(.shc-gallery-thumbnail-active) { border-color: transparent !important; }`; var strCssSticky = ` /* schedule always visible headers */ body.schedule-expanded { overflow: hidden; } body.schedule-expanded::after { content: ""; background: rgba(0,0,0,0.7); position: fixed; top:0; left:0; bottom:0; right: 0; width: 100%; height: 100%; z-index: 1048; } table#shc_schedule { border-width: 0px !important; } table#shc_schedule thead th:last-child { border-right: 1px solid var(--shc-sonic, transparent) !important; } table#shc_schedule tbody tr:last-child th:first-of-type { border-bottom: 1px solid var(--shc-sonic, transparent) !important; } /* column headers */ .schedule-expanded #shc_schedule thead, .schedule-expanded #shc_schedule thead th { position: -webkit-sticky; position: sticky; top: 0; z-index: 3; } /* row headers */ .schedule-expanded #shc_schedule tbody th:first-child { position: -webkit-sticky; position: sticky; left: 0; z-index: 2; } /* corner header */ .schedule-expanded #shc_schedule thead th:first-child { z-index: 4; position: -webkit-sticky; position: sticky; top: 0; left: 0; } /* grid on headers */ .schedule-expanded #shc_schedule tbody tr th:first-of-type::after, .schedule-expanded #shc_schedule thead th::after { content: ""; z-index: -1; position: absolute; height: calc(100% + 0.5px); width: calc(100% + 0.5px); top: 0; left: 0; border-right: 1.15px solid #f0f0f0; border-bottom: 1.15px solid #f0f0f0; background-color: var(--shc-sonic); } .schedule-expanded #shc_schedule tbody tr:last-child th:first-of-type::after { border-bottom: none; } .schedule-expanded #shc_schedule thead th:last-child::after { border-right: none; } .bg-shc-shadow-light #shc_schedule thead th::after, .bg-shc-shadow-light #shc_schedule tbody tr th:first-of-type::after { border-color: var(--shc-shadow-dark, #101010); } body:not(.schedule-expanded) #shc_schedule-wrapper { position: relative; margin-left: -1rem; padding: 0 1rem; overflow: visible; scrollbar-width: thin; } .schedule-expanded #shc_schedule-wrapper { position: fixed; top: 0.65rem; bottom: 0.65rem; left: 0.5rem; right: 0.5rem; max-height: 100vh; max-width: 100vw; overflow: auto; scrollbar-width: thin; scrollbar-color: rgba(255,255,255,0.38) rgba(32,32,32,0.35); background-color: var(--shc-sonic); z-index: 1049; } `; var strCssFilm = ` /* filmstrip effect */ .filmstrip { position: relative; } .filmstrip img { height: 96px !important; padding: 0 4px; box-sizing: border-box; } .filmstrip:before, .filmstrip:after { content: ""; position: absolute; top: calc(.5rem + 3.8px); height: calc(100% - 1rem - 7.8px); width: 14px; background-repeat: repeat-y; background-size: 100% 11px; background-position-y: -9px; } .filmstrip:before { background-image: linear-gradient(to bottom, #353535 6px, rgba(0,0,0,0) 7px), linear-gradient(to left, #353535 4px, #fff 4px, #fff 10px, #353535 10px); left: calc(.5rem + 4px); } .filmstrip:after { background-image: linear-gradient(to bottom, #353535 6px, rgba(0,0,0,0) 7px), linear-gradient(to right, #353535 4px, #fff 4px, #fff 10px, #353535 10px); right: calc(.5rem + 4px); }`; // Insert CSS styles GM_addStyle(strCss + strCssEx + strCssFilm); // Add background color to menus var bgTheme = document.querySelector(".navbar").className.match(/(bg-shc-[a-z]+)|$/)[1] || "bg-shc-sonic"; [].forEach.call(document.querySelectorAll(".navbar .navbar-nav"), function(navnode){navnode.classList.add(bgTheme);}); // Trigger backdrop event when clicking empty menu area [].forEach.call(document.querySelectorAll(".navbar .navbar-collapse"), function(navnode){ navnode.addEventListener("click", function(event){if(event.target===navnode){document.querySelector(".navbar-backdrop").click();}}); }); // Reset menu scroll position back to top [].forEach.call(document.querySelectorAll(".navbar .nav-link.dropdown-toggle"), function(ddnode){ ddnode.addEventListener("click", function(){setTimeout(function(){ddnode.parentElement.querySelector(".dropdown-menu").scrollTop=0;},100);}); }); // Reset mobile-view menu scroll position back to top [].forEach.call(document.querySelectorAll(".navbar-toggler"), function(hbnode){ hbnode.addEventListener("click", function(event){ var n = document.querySelector(event.currentTarget.dataset.target); setTimeout(function(){n.scrollTop=0; if(!!n.firstElementChild){n.firstElementChild.scrollTop=0;}},80); }); }); // Apply a filmstrip effect to GIF and youtube video thumbnails var filmstrip = function(){ var filmExp = new RegExp("(\\.gif\\'\\)$|youtube.*\\.com/embed/)"); [].forEach.call(document.querySelectorAll(".shc-entry-gallery-choice .shc-gallery-item"), function(node){ if(filmExp.test(node.querySelector(".shc-gallery-thumbnail").getAttribute("onclick"))){ node.classList.toggle("filmstrip"); } }); }; if(/\/entries\/(?:expo.+|contest.+)\/[0-9]+$/.test(location.pathname)){filmstrip();} // Add toggle to expand stream schedule table and make the headers always visible if(/^\/streams(\/)?$/.test(location.pathname)){ GM_addStyle(strCssSticky); var tbl = document.getElementById("shc_schedule"); if(tbl){ var strExpandBtn = `<div data-toggle="button" class="btn btn-lg fa fas btn-shc-sonic fa-expand-arrows-alt p-2" style="min-width: 2.1rem; border: 1px solid #fff"></div>`; var wrapper = window.document.createElement("div"); wrapper.setAttribute("id", "shc_schedule-wrapper"); tbl.parentNode.insertBefore(wrapper, tbl); wrapper.appendChild(tbl); document.querySelector("#shc_schedule thead th:first-of-type").innerHTML = strExpandBtn; document.querySelector("#shc_schedule thead th:first-of-type .btn").addEventListener("click", function(event){ if((' '+this.className+' ').indexOf(' active ') > -1){ document.body.classList.remove('schedule-expanded'); this.classList.remove('fa-compress-arrows-alt'); this.classList.add('fa-expand-arrows-alt'); }else{ document.body.classList.add('schedule-expanded'); this.classList.remove('fa-expand-arrows-alt'); this.classList.add('fa-compress-arrows-alt'); } }, false); } } // Periodically update highlight in stream schedule to be on current timeblock function dynamicSchedule(){ function getRow(table,index,rowStart){ if(rowStart==null){rowStart=1;} return [].slice.call(table.rows[index].cells, rowStart); } function getColumn(table,index,colStart){ if(colStart==null){colStart=1;} return [].slice.call(table.rows, colStart).map(function(a){return a.cells[index];}); } function cellFromIndex(table,indexPair){ var rowIndex = indexPair[0]; var colIndex = indexPair[1]; return table.rows[rowIndex].cells[colIndex]; } var dateReg = new RegExp("(\\w+)\\s(\\d+).*\\s(\\w+)"); var schedTable = document.querySelector("#shc_schedule"); if(!schedTable){return;} var schedTopHdrs = getRow(schedTable,0,1); var schedSideHdrs = getColumn(schedTable,0,1); var dateNow = new Date(); var year = dateNow.getFullYear(); for(var i=0;i<schedTopHdrs.length;i++){ var res = schedTopHdrs[i].textContent.match(dateReg); schedTopHdrs[i].dataset.date = Date.UTC(year, new Date(res[3]+" 1, 2020").getMonth(),res[2],(1*schedSideHdrs[0].dataset.hour)+7); } var dateNext = new Date(); dateNext.setUTCHours(dateNext.getUTCHours()+1,0,0,80); // next check at the top of the hour var timeDiff = (dateNext.getTime() - dateNow.getTime()); var schedTimer = setTimeout(updateSelCell, timeDiff); function updateSelCell(){ var dateHere = new Date(); var column = -1, row = -1, sel = null; for(var i=0;i<schedTopHdrs.length;i++){ if(dateHere.getTime()>=1*schedTopHdrs[i].dataset.date && dateHere.getTime()<1*schedTopHdrs[i].dataset.date+86400000){ column = i+1; for(var j=0;j<schedSideHdrs.length;j++){ var hour = ((dateHere.getUTCHours()-7) + 24) % 24; if(hour==1*schedSideHdrs[j].dataset.hour){ row = j+1; break; } } break; } } if(row>=0 && column>=0){ sel = schedTable.querySelector("td.now"); if(sel){sel.classList.remove("now");} sel = cellFromIndex(schedTable, [row,column]); sel.classList.add("now"); console.log("Schedule selection updated \n"+ dateHere.toISOString()); console.log("row: "+row+" column: "+column); }else{ sel = schedTable.querySelector("td.now"); if(sel){sel.classList.remove("now");} } dateNext = new Date(); dateNext.setUTCHours(dateNext.getUTCHours()+1,0,0,0); timeDiff = (dateNext.getTime() - dateHere.getTime()); schedTimer = setTimeout(updateSelCell, timeDiff); } } if(/^\/streams(\/)?$/.test(location.pathname)){dynamicSchedule();} // BONUS: Switching Color Themes // Function for applying a theme var cycleThemes = function(newTheme){ var themes = ["shc-sonic","shc-tails","shc-knuckles"]; var theme = document.querySelector(".navbar").className.match(/bg-(shc-[a-z]+)(?!\S)|$/)[1]; var themeIndex = themes.indexOf(theme); var themeNext = newTheme || themes[(themeIndex+1)%themes.length]; if(!theme){theme = themes[0];} var themeBtn = theme + ((/^shc-(?:tails|knuckles)$/.test(theme)) ? "0":""); var themeBtnNext = themeNext + ((/^shc-(?:tails|knuckles)$/.test(themeNext)) ? "0":""); if(theme===themeNext || !(/^shc-[a-z]+$/).test(themeNext)){return theme;} var themeExp1 = new RegExp("(bg-|border-)("+theme+")","g"); var themeExp2 = new RegExp("(btn-)("+themeBtn+")","g"); [].forEach.call(document.querySelectorAll(".bg-"+theme+", .border-"+theme+", .btn-"+themeBtn), function(node){ node.className = node.className.replace(themeExp1, "$1"+themeNext).replace(themeExp2, "$1"+themeBtnNext); if(node.classList.contains("btn-shc-sonic")){ node.classList.remove("btn-shc-sonic"); node.classList.add("btn-"+themeBtnNext); } }); [].forEach.call(document.querySelectorAll(".shc-entry-body .btn-shc-grey"), function(node){ node.classList.add("btn-"+themeNext); }); if(!!window.hapi_c){window.hapi_c.MODAL_THEME = window.hapi_c.MODAL_THEME.replace(/bg-shc-[a-z]+/, "bg-"+themeNext);} // Some elements (footer, schedule, shc-entry-tags) are using CSS Var for color rather than class name. // Modify CSS Var "--shc-sonic" to match new theme: var cloneCssVar = function(fromVar, toVar, newOnly){ if(!!getComputedStyle(document.documentElement).getPropertyValue("--"+fromVar)){ if(!newOnly || !getComputedStyle(document.documentElement).getPropertyValue("--"+toVar)){ document.documentElement.style.setProperty("--"+toVar, getComputedStyle(document.documentElement).getPropertyValue("--"+fromVar)); return true; } } return false; }; cloneCssVar("shc-sonic","shc-sonic-backup",true); if(themeNext==="shc-sonic"){ cloneCssVar("shc-sonic-backup","shc-sonic"); }else{ cloneCssVar(themeNext,"shc-sonic"); } // Set body background tint document.body.className = document.body.className.replace(/(?:^|\s)bg-(shc-[a-z]+)-light(?!\S)/g, "").replace(/^\s/, ""); document.body.classList.add("bg-"+themeNext+"-light"); return themeNext; }; window.cycleThemes = cycleThemes; // Insert a button for selecting theme var strHtml = `<div id="theme-selector" class="dropup" style="position:absolute;display:inline-block;right:1em;margin-top:-2px;"> <a id="theme-button" class="dropdown-toggle btn btn-shc-sonic" href="#" role="button" data-toggle="dropdown" style="display:block;padding:0 4px;font-size:1.1em;border:1px solid rgba(255,255,255,.4);">Theme</a> <ul role="menu" class="dropdown-menu dropdown-menu-right dropdown-pills dropdown-dark bg-shc-sonic" style="min-width:auto;"> <li><a class="dropdown-item" role="menuitem" href="#" data-value="shc-sonic">SHC-Sonic</a></li> <li><a class="dropdown-item" role="menuitem" href="#" data-value="shc-tails">SHC-Tails</a></li> <li><a class="dropdown-item" role="menuitem" href="#" data-value="shc-knuckles">SHC-Knuckles</a></li> <li><a class="dropdown-item" role="menuitem" href="#" data-value="shc-amy">SHC-Amy</a></li> <li><a class="dropdown-item" role="menuitem" href="#" data-value="shc-blaze">SHC-Blaze</a></li> <li><a class="dropdown-item" role="menuitem" href="#" data-value="shc-shadow">SHC-Shadow</a></li> </ul> </div>`; var footer = document.getElementsByTagName("footer")[0]; footer.insertAdjacentHTML("afterbegin", strHtml); [].forEach.call(footer.querySelectorAll("#theme-selector a.dropdown-item"), function(node){ node.addEventListener("click", function(event){ var res=cycleThemes(event.currentTarget.getAttribute("data-value")); event.preventDefault(); GM_setValue("GM_theme",res); return false; }, false); }); // Restore last theme var savedTheme = GM_getValue("GM_theme"); if(!!savedTheme){cycleThemes(savedTheme);} })();