// ==UserScript== // @name ppixiv // @author ppixiv // @description Better Pixiv image viewing | Download ugoira as MKV | One-click like, bookmark, follow // @include http://*.pixiv.net/* // @include https://*.pixiv.net/* // @run-at document-start // @grant GM.xmlHttpRequest // @grant GM_xmlhttpRequest // @grant GM_setValue // @grant GM_getValue // @connect pixiv.net // @connect i.pximg.net // @connect self // @version 26 // @namespace ppixiv // @downloadURL none // ==/UserScript== (function() { var resources = { "disabled.html": "
\r\n", "main.css": "* { box-sizing: border-box; }\r\nbody {\r\n font-family: \"Helvetica Neue\", arial, sans-serif;\r\n}\r\na {\r\n text-decoration: none;\r\n /*color: #fff;*/\r\n color: inherit;\r\n}\r\nbody.light a {\r\n color: inherit;\r\n}\r\nul {\r\n padding: 0;\r\n margin: 0;\r\n}\r\n.view-illust-container {\r\n width: 100%;\r\n height: 100%;\r\n}\r\n\r\n.image-container {\r\n width: 100%;\r\n height: 100%;\r\n user-select: none;\r\n -moz-user-select: none;\r\n cursor: pointer;\r\n}\r\n[hidden] {\r\n display: none !important;\r\n}\r\n\r\ntextarea:focus, input:focus, a:focus {\r\n outline: none;\r\n}\r\n\r\n.hide-cursor { cursor: none !important; }\r\n.hide-cursor * { cursor: inherit !important; }\r\n\r\n.main-container {\r\n position: fixed;\r\n top: 0px;\r\n left: 0px;\r\n width: 100%;\r\n height: 100%;\r\n overflow: hidden;\r\n}\r\n.progress-bar {\r\n position: absolute;\r\n pointer-events: none;\r\n background-color: #00F;\r\n bottom: 0px;\r\n left: 0px;\r\n width: 100%;\r\n height: 2px;\r\n}\r\n@keyframes flash-progress-bar { to { opacity: 0; } }\r\n.refresh-icon {\r\n cursor: pointer;\r\n}\r\n.progress-bar.hide {\r\n animation: flash-progress-bar 500ms linear 1 forwards;\r\n}\r\n\r\n.loading-progress-bar .progress-bar {\r\n z-index: 100;\r\n}\r\n\r\n/* .seek-bar is the outer seek bar area, which is what can be dragged. */\r\n.seek-bar {\r\n position: absolute;\r\n bottom: 0px;\r\n left: 0px;\r\n width: 100%;\r\n\r\n box-sizing: content-box;\r\n height: 12px;\r\n padding-top: 25px;\r\n\r\n cursor: pointer;\r\n}\r\n\r\n.seek-bar .seek-empty {\r\n height: 100%;\r\n background-color: rgba(0,0,0,0.25);\r\n}\r\n\r\n.seek-bar .seek-fill {\r\n background-color: #F00;\r\n height: 100%;\r\n}\r\n\r\n.seek-bar .seek-empty {\r\n transition: transform .25s;\r\n transform: translate(0, 12px);\r\n}\r\n\r\n.seek-bar.visible .seek-empty {\r\n transform: translate(0, 6px);\r\n}\r\n.seek-bar.dragging .seek-empty {\r\n transform: translate(0, 0);\r\n}\r\n\r\n.title-font {\r\n font-weight: 700;\r\n font-size: 20px;\r\n font-family: system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, Ubuntu, Cantarell,\r\n Droid Sans, Helvetica Neue, Hiragino Kaku Gothic ProN, Meiryo, sans-serif;\r\n}\r\n\r\n.hover-message {\r\n width: 100%;\r\n position: absolute;\r\n bottom: 0px;\r\n display: flex;\r\n justify-content: center; \r\n pointer-events: none;\r\n opacity: 0;\r\n transition: opacity .25s;\r\n z-index: 100;\r\n}\r\n\r\n.hover-message.show {\r\n opacity: 1;\r\n}\r\n\r\n.hover-message.centered {\r\n bottom: 50%;\r\n}\r\n\r\n.hover-message > .message {\r\n background-color: #000;\r\n color: #fff;\r\n font-size: 1.4em;\r\n padding: 6px 15px;\r\n margin: 4px;\r\n max-width: 600px;\r\n text-align: center;\r\n border-radius: 5px;\r\n box-shadow: 0 0 10px 5px #aaa;\r\n}\r\n\r\nbody.light .hover-message > .message {\r\n background-color: #eee;\r\n color: #222;\r\n}\r\n\r\n.view-illust-container .ui {\r\n position: absolute;\r\n top: 0px;\r\n left: 0px;\r\n min-width: 450px;\r\n max-height: 500px;\r\n width: 30%;\r\n height: auto;\r\n\r\n /* Disable events on the top-level container, so it doesn't block clicks on the\r\n * image when the UI isn't visible. We'll reenable events on the hover-box and ui-box\r\n * below it where we actually want pointer events. */\r\n pointer-events: none;\r\n}\r\n.view-illust-container .ui-box {\r\n pointer-events: none;\r\n}\r\n.view-illust-container .ui.disabled {\r\n display: none;\r\n}\r\n\r\n/*\r\n * This is the box that triggers the UI to be displayed. We use this rather than\r\n * ui-box for this so we can give it a fixed size. That way, the UI box won't suddenly\r\n * appear when changing to another image because a longer description caused the box\r\n * to become bigger.\r\n *\r\n * This is a little tricky. Hovering over either hover-box or the UI makes it visible.\r\n * When the UI is hidden, it's set to pointer-events: none, so it can't be hovered,\r\n * but once you hover over hover-box and cause the UI to be visible, pointer events\r\n * are reenabled so hovering over anywhere in the UI keeps it visible. The UI is\r\n * over hover-box in the Z order, so we don't need to disable pointer events on hover-box\r\n * to prevent it from blocking the UI.\r\n *\r\n * We also disable pointer-events on the UI until it's visible, so it doesn't receive\r\n * clicks until it's visible.\r\n */\r\n.hover-box {\r\n width: 400px;\r\n height: 200px;\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n pointer-events: auto; /* reenable pointer events that are disabled on .ui */\r\n}\r\n.hover-sphere {\r\n width: 500px;\r\n height: 500px;\r\n\r\n /* Clamp the sphere to a percentage of the viewport width, so it gets smaller for\r\n * small windows. */\r\n max-width: 30vw;\r\n max-height: 30vw;\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n}\r\n.hover-sphere circle {\r\n pointer-events: auto; /* reenable pointer events that are disabled on .ui */\r\n}\r\n.hover-sphere > svg {\r\n width: 100%;\r\n height: 100%;\r\n transform: translate(-50%,-50%)\r\n}\r\n.ui-box {\r\n background-color: #222;\r\n border: solid 2px #000;\r\n padding: 1em;\r\n color: #EEE;\r\n border-radius: 8px;\r\n position: relative;\r\n}\r\n.view-illust-container .ui-box {\r\n margin: .5em;\r\n}\r\n\r\n.view-manga-container .ui-container {\r\n width: 600px;\r\n max-width: 90%;\r\n pointer-events: auto;\r\n}\r\n\r\n/* Since the UI isn't a popup on the manga page, hide the description and\r\n * tag list to make it smaller. These can be viewed while viewing a page. */\r\n.view-manga-container .ui-box > .description,\r\n.view-manga-container .ui-box > .tag-list\r\n{\r\n display: none;\r\n}\r\n\r\n.view-illust-container .ui-box {\r\n transition: transform .25s, opacity .25s;\r\n opacity: 0;\r\n transform: translate(-50px, 0);\r\n pointer-events: none;\r\n}\r\nbody.light .ui-box {\r\n background-color: #eee;\r\n color: #222;\r\n border-color: #ccc;\r\n}\r\n\r\n/* Debugging: */\r\nbody.force-ui .view-illust-container .ui > .ui-box {\r\n opacity: 1;\r\n transform: translate(0, 0);\r\n pointer-events: inherit;\r\n}\r\n\r\n/* Show the UI on hover when hide-ui isn't set. */\r\nbody:not(.hide-ui) .view-illust-container .ui-box.hovering-over-box,\r\nbody:not(.hide-ui) .view-illust-container .ui-box.hovering-over-sphere {\r\n opacity: 1;\r\n transform: translate(0, 0);\r\n pointer-events: auto;\r\n}\r\n\r\n.button-row {\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n height: 32px;\r\n margin-top: 5px;\r\n margin-bottom: 4px;\r\n}\r\n.ui-box > .button-row .button.enabled {\r\n cursor: pointer;\r\n}\r\n\r\n/* An icon in a button strip. */\r\n.icon-button {\r\n display: block;\r\n width: 32px;\r\n height: auto;\r\n}\r\n\r\n/* If this is an icon-button with an svg inside, set the svg to block. */\r\n.icon-button > svg {\r\n display: block;\r\n}\r\n.disable-ui-button > .icon-button {\r\n /* The .pixiv-icon class on this element sets the background. */\r\n padding: 3px; /* center the 26px icon */\r\n margin: 0 4px;\r\n cursor: pointer;\r\n}\r\n.disable-ui-button:hover > .icon-button {\r\n color: #0096FA;\r\n}\r\n.thumbnail-settings-menu-box > .icon-button {\r\n padding: 0 4px; /* center the 24px icon */\r\n}\r\n.navigate-out-button {\r\n cursor: pointer;\r\n}\r\n\r\n@keyframes spin { to { transform: rotate(360deg); } }\r\n.refresh-icon {\r\n animation: spin 1000ms linear infinite;\r\n animation-play-state: paused;\r\n}\r\n\r\n/* The icon SVG is placed in this. */\r\n.refresh-icon:after {\r\n display: block;\r\n width: 20px;\r\n height: 20px;\r\n}\r\n.refresh-icon.spin {\r\n animation-play-state: running;\r\n}\r\n\r\n.thumbnail-settings-menu-box svg {\r\n margin: 0 .5em;\r\n}\r\n\r\n.popup-menu-box .menu-toggle {\r\n display: block;\r\n}\r\n.menu-slider input {\r\n vertical-align: middle;\r\n width: 100%;\r\n padding: 0;\r\n margin: 0;\r\n}\r\n\r\n.popup.avatar-popup:hover:after {\r\n left: auto;\r\n bottom: auto;\r\n top: 60px;\r\n right: -10px;\r\n}\r\n.follow-container .avatar {\r\n border-radius: 5px;\r\n object-fit: cover;\r\n}\r\n.follow-container:not(.big) .avatar {\r\n width: 50px;\r\n height: 50px;\r\n}\r\n.follow-container.big .avatar {\r\n width: 170px;\r\n height: 170px;\r\n}\r\n.follow-popup {\r\n margin-top: 10px;\r\n right: 0px;\r\n}\r\n.follow-container .hover-area {\r\n top: -12px;\r\n}\r\n.follow-container .avatar-link {\r\n display: block;\r\n}\r\n.follow-popup .folder {\r\n display: block;\r\n}\r\n\r\n.follow-container.followed .follow-popup .not-following { display: none; }\r\n.follow-container:not(.followed) .follow-popup .following { display: none; }\r\n.follow-container.followed .avatar {\r\n box-shadow: 0 0 15px 10px #0aa;\r\n}\r\n\r\n.title-block {\r\n display: inline-block;\r\n padding: 0 10px;\r\n background-color: #444;\r\n margin-right: 1em;\r\n border-radius: 8px 0;\r\n}\r\n.light .title-block {\r\n background-color: #888;\r\n color: #fff;\r\n}\r\n.title-block.popup:hover:after {\r\n top: 40px;\r\n bottom: auto;\r\n}\r\n.author {\r\n vertical-align: top;\r\n}\r\n/* When .dot is set, show images with nearest neighbor filtering. */\r\nbody.dot img.filtering,\r\nbody.dot canvas.filtering {\r\n image-rendering: -moz-crisp-edges;\r\n image-rendering: crisp-edges;\r\n image-rendering: pixelated;\r\n}\r\n.similar-illusts-button:hover > .icon-button {\r\n color: #FF0 !important; /* override grey-icon hover color */\r\n}\r\n\r\nbody.light .similar-illusts-button:hover > .icon-button {\r\n stroke: #000;\r\n}\r\n\r\n.similar-illusts-button > .icon-button {\r\n margin-top: -3px;\r\n}\r\n\r\n.post-info {\r\n}\r\n.post-info > * {\r\n display: inline-block;\r\n background-color: #111;\r\n color: #eee;\r\n padding: 2px 10px;\r\n\r\n /* Use a smaller, heavier font to distinguish these from tags. */\r\n font-size: .8em;\r\n font-weight: bold;\r\n}\r\n.description {\r\n border: solid 1px #000;\r\n padding: .35em;\r\n background-color: #555;\r\n max-height: 10em;\r\n overflow-y: auto;\r\n}\r\n.light .description {\r\n background-color: #ccc;\r\n border: none;\r\n}\r\n/* Override obnoxious colors in descriptions. Why would you allow this? */\r\n.description * {\r\n color: #eee !important;\r\n}\r\nbody.light .description * {\r\n color: #222 !important;\r\n}\r\n\r\n.popup {\r\n position: relative;\r\n}\r\n.popup:hover:after {\r\n pointer-events: none;\r\n background: #111;\r\n border-radius: .5em;\r\n left: 0em;\r\n top: -2.0em;\r\n color: #fff;\r\n content: attr(data-popup);\r\n display: block;\r\n padding: .3em 1em;\r\n position: absolute;\r\n text-shadow: 0 1px 0 #000;\r\n white-space: nowrap;\r\n z-index: 98;\r\n}\r\n.popup-bottom:hover:after {\r\n top: auto;\r\n bottom: -2em;\r\n}\r\n\r\nbody:not(.premium) .premium-only { display: none; }\r\n.popup-menu-box {\r\n position: absolute;\r\n visibility: hidden;\r\n min-width: 10em;\r\n background-color: #000;\r\n border: 1px solid #444;\r\n padding: .25em .5em;\r\n z-index: 1;\r\n}\r\nbody.light .popup-menu-box {\r\n background-color: #fff;\r\n border-color: #ddd;\r\n}\r\n.popup-menu-box.popup-visible {\r\n visibility: inherit;\r\n}\r\n.popup-visible .popup-menu-box {\r\n visibility: inherit;\r\n}\r\n\r\n/* This is an invisible block underneath the hover zone to keep the hover UI visible. */\r\n.hover-area {\r\n position: absolute;\r\n top: -50%;\r\n left: -33%;\r\n width: 150%;\r\n height: 200%;\r\n z-index: -1;\r\n}\r\n/* This one is under the bookmark popup. Extend over the bottom, so the list doesn\\'t disappear\r\n * when deleting a recent bookmark at the bottom of the list, but don\\'t extend over the top, so\r\n * we don\\'t block the mouse hovering over other things.\r\n *\r\n * Note that the positioning of this is important: we want to fully close the gap between the\r\n * popup and the bottom that opened it, but we don't want to overlap the button and block it. */\r\n.navigation-menu-box .hover-area,\r\n.settings-menu-box .hover-area,\r\n.image-settings-menu-box .hover-area\r\n{\r\n top: -2px;\r\n height: 125%;\r\n}\r\n\r\n.follow-popup input{\r\n margin: .25em;\r\n padding: .25em;\r\n}\r\n.popup-menu-box .button {\r\n padding: .25em;\r\n cursor: pointer;\r\n}\r\n\r\n.popup-menu-box .button:hover {\r\n background-color: #444;\r\n width: 100%;\r\n}\r\nbody.light .popup-menu-box .button:hover {\r\n background-color: #ccc;\r\n}\r\n\r\n.view-search-container {\r\n position: absolute;\r\n width: 100%;\r\n height: 100%;\r\n top: 0;\r\n left: 0;\r\n overflow-x: hidden;\r\n /* Always show the vertical scrollbar, so we don't relayout as images load. */\r\n overflow-y: scroll;\r\n background-color: #000;\r\n color: #fff;\r\n}\r\n\r\n.view-search-container .thumbnail-ui,\r\n.view-manga-container .ui\r\n{\r\n /* This places the thumbnail UI at the top, so the thumbnails sit below it when\r\n * scrolled all the way up, and scroll underneath it. */\r\n position: sticky;\r\n top: 0;\r\n width: 100%;\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n padding-top: 1em;\r\n margin-bottom: .5em;\r\n z-index: 1;\r\n pointer-events: none;\r\n}\r\n\r\n.view-search-container .thumbnail-ui-box {\r\n width: 50%;\r\n /* Make sure this doesn't get too narrow, or it'll overlap too much of the thumbnail area. */\r\n min-width: 800px;\r\n background-color: #444;\r\n\r\n box-shadow: 0 0 15px 10px #000;\r\n border-radius: 4px;\r\n\r\n padding: 10px;\r\n pointer-events: auto;\r\n}\r\n\r\nbody.light .view-search-container .thumbnail-ui-box {\r\n background-color: #ddd;\r\n color: #444;\r\n box-shadow: 0 0 15px 10px #fff;\r\n}\r\n\r\n\r\n.view-search-container .thumbnail-ui-box .displaying {\r\n padding-bottom: 4px;\r\n}\r\n\r\n.view-search-container .thumbnail-ui-box .bookmarks-link {\r\n display: block;\r\n}\r\n\r\n.view-search-container .thumbnail-ui-box .contact-link {\r\n display: block;\r\n width: 31px;\r\n height: 31px;\r\n margin: 0 3px;\r\n}\r\n\r\n.view-search-container .thumbnail-ui-box .webpage-link {\r\n display: block;\r\n margin: 0 2px;\r\n width: 26px;\r\n height: 26px;\r\n}\r\n\r\n.view-search-container .thumbnail-ui-box .twitter-icon {\r\n display: block;\r\n width: 32px;\r\n height: 32px;\r\n margin: 0 1px;\r\n}\r\n\r\n/* .thumbnails is the actual thumbnail list. */\r\n.view-search-container .thumbnails {\r\n user-select: none;\r\n -moz-user-select: none;\r\n padding: 0;\r\n text-align: center;\r\n}\r\n\r\n.view-search-container ul {\r\n margin: 0;\r\n margin: 0 auto; /* center */\r\n}\r\n\r\nli.thumbnail-box {\r\n display: inline-block;\r\n padding: 1em;\r\n}\r\n/* Hide pending images (they haven't been set up yet). */\r\nli.thumbnail-box[data-pending] {\r\n visibility: hidden;\r\n}\r\nli.thumbnail-box .thumbnail-inner {\r\n position: relative;\r\n}\r\n\r\nli.thumbnail-box a.thumbnail-link {\r\n display: block;\r\n\r\n border-radius: 4px;\r\n overflow: hidden;\r\n position: relative;\r\n text-decoration: none;\r\n color: #fff;\r\n}\r\n\r\n.page-count-box {\r\n pointer-events: none;\r\n position: absolute;\r\n right: 2px;\r\n bottom: 2px;\r\n padding: 4px 8px;\r\n background-color: rgba(0,0,0,.6);\r\n border-radius: 6px;\r\n}\r\n\r\n.page-count-box .page-icon {\r\n width: 16px;\r\n height: 16px;\r\n display: inline-block;\r\n vertical-align: middle;\r\n}\r\n\r\n.page-count-box {\r\n transition: opacity .5s;\r\n}\r\n.thumbnail-inner:hover .page-count-box {\r\n opacity: 0.5;\r\n}\r\n\r\n.page-count-box .page-count {\r\n vertical-align: middle;\r\n margin-left: -4px;\r\n}\r\n\r\n/* The similar illusts button on top of thumbnails. */\r\n.view-search-container li.thumbnail-box .similar-illusts-button {\r\n display: block;\r\n width: 32px;\r\n height: 32px;\r\n margin-top: -2px;\r\n}\r\n.view-search-container li.thumbnail-box:not(:hover) .similar-illusts-button {\r\n visibility: hidden;\r\n}\r\n.view-search-container li.thumbnail-box .similar-illusts-button {\r\n color: #FF0 !important; /* override grey-icon hover color */\r\n opacity: 0.5;\r\n\r\n /* Use a very subtle stroke when not hovered, so it's not completely invisible\r\n * on light backgrounds. */\r\n stroke: rgba(0,0,0,0.5);\r\n}\r\n.view-search-container li.thumbnail-box .similar-illusts-button:hover {\r\n opacity: 1;\r\n stroke: #000;\r\n}\r\n\r\n.view-search-container li.thumbnail-box .thumbnail-bottom-left {\r\n position: absolute;\r\n display: flex;\r\n left: 0px;\r\n bottom: 0px;\r\n}\r\n.view-search-container li.thumbnail-box .heart {\r\n pointer-events: none;\r\n width: 32px;\r\n height: 32px;\r\n}\r\n.view-search-container li.thumbnail-box .heart > svg {\r\n transition: opacity .5s;\r\n}\r\n.view-search-container li.thumbnail-box .heart[data-bookmark-type=\"public\"] > svg {\r\n fill: #f00; stroke: #000; stroke-width: .5px;\r\n}\r\n.view-search-container li.thumbnail-box .heart[data-bookmark-type=\"private\"] > svg {\r\n fill: #800; stroke: #fff;\r\n}\r\n\r\n.thumbnail-inner:hover .heart > svg {\r\n opacity: 0.5;\r\n}\r\n.view-search-container li.thumbnail-box .ugoira-icon {\r\n pointer-events: none;\r\n width: 32px;\r\n height: 32px;\r\n right: 0px;\r\n bottom: 0px;\r\n color: #fff;\r\n position: absolute;\r\n transition: opacity .5s;\r\n}\r\n\r\n.thumbnail-inner:hover .ugoira-icon {\r\n opacity: 0.5;\r\n}\r\n\r\n.view-search-container li.thumbnail-box[data-pending] a {\r\n /* Don't show a grey box while an image is pending. It just causes extra\r\n * flicker. */\r\n/* opacity: 0.5;\r\n background-color: #444;*/\r\n}\r\n\r\n/* The popup title below thumbs: */\r\n.thumbnail-inner > .thumbnail-label {\r\n position: absolute;\r\n pointer-events: none;\r\n visibility: hidden;\r\n height: 25px;\r\n white-space: nowrap;\r\n width: 100%;\r\n padding-top: 4px;\r\n}\r\n\r\n.thumbnail-inner > .thumbnail-label > div {\r\n background-color: #000;\r\n left: 50%;\r\n position: absolute;\r\n transform: translate(-50%, 0);\r\n padding: 0 10px;\r\n max-width: 400px;\r\n overflow: hidden;\r\n border-radius: 2px;\r\n text-overflow: ellipsis;\r\n}\r\nbody.light .thumbnail-inner > .thumbnail-label > div {\r\n background-color: #fff;\r\n color: #222;\r\n}\r\n.thumbnail-inner:hover .thumbnail-label {\r\n visibility: visible;\r\n}\r\n\r\n/* Hide the img while it's pending so we don't show a broken image icon. */\r\nli.thumbnail-box[data-pending] a img.thumb {\r\n display: none;\r\n}\r\n\r\n.thumbnail-box .thumb {\r\n object-fit: cover;\r\n\r\n /* Show the top-center of the thunbnail. This generally makes more sense\r\n * than cropping the center. */\r\n object-position: 50% 0%; \r\n width: 100%;\r\n height: 100%;\r\n}\r\n\r\n/* Be careful not to set any transform: scale if zooming is disabled. A scale of 1\r\n * will cause thumbnails to shift around in Firefox. */\r\nbody:not(.disable-thumbnail-zooming) .view-search-container .thumbnail-box .thumb {\r\n transition: transform .5s;\r\n transform: scale(1.25, 1.25);\r\n}\r\n\r\nbody:not(.disable-thumbnail-zooming) .view-search-container .thumbnail-box .thumbnail-inner:hover .thumb {\r\n transform: scale(1, 1);\r\n}\r\n\r\n.thumbnail-box.vertical-panning .thumb,\r\n.thumbnail-box.horizontal-panning .thumb\r\n{\r\n animation-duration: 4s;\r\n animation-timing-function: ease-in-out;\r\n animation-iteration-count: infinite;\r\n}\r\n\r\n.thumbnail-box .thumbnail-inner:not(:hover) .thumb {\r\n animation-play-state: paused;\r\n}\r\n\r\nbody:not(.disable-thumbnail-panning) .thumbnail-box.horizontal-panning .thumb {\r\n animation-name: pan-thumbnail-horizontally;\r\n object-position: left top;\r\n\r\n /* The full animation is 4 seconds, and we want to start 20% in, at the halfway\r\n * point of the first left-right pan, where the pan is exactly in the center where\r\n * we are before any animation. This is different from vertical panning, since it\r\n * pans from the top, which is already where we start (top center). */\r\n animation-delay: -.8s;\r\n\r\n}\r\nbody:not(.disable-thumbnail-panning) .thumbnail-box.vertical-panning .thumb {\r\n animation-name: pan-thumbnail-vertically;\r\n}\r\n\r\n@keyframes pan-thumbnail-horizontally {\r\n /* This starts in the middle, pans left, pauses, pans right, pauses, returns to the middle, then pauses again. */\r\n 0% { object-position: left top; } /* left */\r\n 40% { object-position: right top; } /* pan right */\r\n 50% { object-position: right top; } /* pause */\r\n 90% { object-position: left top; } /* pan left */\r\n 100% { object-position: left top; } /* pause */\r\n}\r\n\r\n@keyframes pan-thumbnail-vertically {\r\n /* This starts at the top, pans down, pauses, pans back up, then pauses again. */\r\n 0% { object-position: 50% 0%; }\r\n 40% { object-position: 50% 100%; }\r\n 50% { object-position: 50% 100%; }\r\n 90% { object-position: 50% 0%; }\r\n 100% { object-position: 50% 0%; }\r\n}\r\n\r\n.view-search-container .thumbnail-box:not(.muted) .muted {\r\n display: none;\r\n}\r\n.view-search-container .thumbnail-box .muted {\r\n pointer-events: none;\r\n left: 0;\r\n top: 50%;\r\n width: 100%;\r\n height: 32px;\r\n color: #000;\r\n position: absolute;\r\n text-shadow: 0px 1px 1px #fff, 0px -1px 1px #fff, 1px 0px 1px #fff, -1px 0px 1px #fff;\r\n font-size: 22px;\r\n}\r\n\r\n/* Zoom muted images in a little, and zoom them out on hover, which is the opposite\r\n * of other images. This also helps hide the black bleed around the edge caused by\r\n * the blur. */\r\n.view-search-container .thumbnail-box.muted .thumb {\r\n filter: blur(10px);\r\n transform: scale(1.25, 1.25);\r\n}\r\nbody:not(.disable-thumbnail-zooming) .view-search-container .thumbnail-box.muted .thumb:hover {\r\n transform: scale(1, 1);\r\n}\r\n\r\n/* Hide the fake thumbnail used to detect when we've scrolled to the bottom.\r\n * Note that we need to hide something inside the