/** * RetroArch Web Player * * This provides the basic styling for the RetroArch web player. */ @import url("https://fonts.googleapis.com/css2?family=Inter:opsz,wght@14..32,400..700&display=swap"); @keyframes loaded { from { opacity: 0.2; } to { opacity: 1; } } @keyframes loading { from { opacity: 0.2; } to { opacity: 0.35; } } /* real ozone */ @keyframes hover { from { box-shadow: 0px 0px 1px 1px #198AC6, inset 0px 0px 1px 1px #198AC6; } to { box-shadow: 0px 0px 1px 1px #89F1F2, inset 0px 0px 1px 1px #89F1F2; } } @keyframes hover-danger { from { box-shadow: 0px 0px 1px 1px #C7261A, inset 0px 0px 1px 1px #C7261A; } to { box-shadow: 0px 0px 1px 1px #F75C4A, inset 0px 0px 1px 1px #F75C4A; } } body { margin: 0px; background-color: black; font-family: "Inter", sans-serif; font-variant-ligatures: no-contextual; scrollbar-color: #505050 #2e2e2e; --menuheight: 65px; --menumarginy: 14px; --menumarginx: 7px; --menupaddingy: 8px; --menupaddingx: 16px; --submarginy: 0px; --submarginx: 0px; --subpaddingy: 5px; --subpaddingx: 8px; --rounding: 1px; --barcolor: #2e2e2e; --subcolor: #282828; --barbuttoncolor: var(--barcolor); --barbuttonhovercolor: #212227; --barbuttonoutline: 1px; --barbuttonoutlinecolor: #51514f; --barfontcolor: #ffffff; --bardisabledfontcolor: #b6b6b6; /* do not modify */ --actualmenuheight: var(--menuheight); --menubuttonbordery: calc(var(--menuheight) - calc(var(--menumarginy) * 2)); --menubuttoncontenty: calc(var(--menubuttonbordery) - calc(var(--menupaddingy) * 2)); } canvas.webplayer, #webplayer-preview { display: block; position: fixed; top: var(--actualmenuheight); width: 100vw; height: calc(100vh - var(--actualmenuheight)); outline: none; z-index: 4; } #webplayer-preview { background-image: url(media/canvas.png); background-size: contain; background-repeat: no-repeat; background-position: center; cursor: wait; opacity: 0.2; transition: opacity 0.8s; animation: loading 0.8s ease-in-out infinite alternate; z-index: 5; } #webplayer-preview.loaded { cursor: pointer; opacity: 1; animation: loaded 0.8s ease-in-out; } /** * Hack to make emscripten stop messing with the canvas size while in fullscreen. * Foiled again! */ :fullscreen canvas.webplayer { top: 0px; min-width: 100vw; max-width: 100vw; min-height: 100vh; max-height: 100vh; } a { color: #3ec3f0; } /* menu bar */ #navbar { position: fixed; width: 100vw; height: var(--actualmenuheight); background-color: var(--barcolor); color: var(--barfontcolor); z-index: 20; user-select: none; } #menu { float: left; list-style: none; margin: 0px; width: max-content; height: 100%; padding: 0px var(--menumarginx); } .progressContainer { width: 100%; float: left; } .progressBar { width: 100%; height: 0px; --progressbarpercent: 0%; --progressbarcolor: #1fb01a; } .progressBar::after { content: ""; display: block; width: var(--progressbarpercent); height: 100%; transition: width 0.2s ease-out; background-color: var(--progressbarcolor); } .progressText { padding: 0px 4px; } #menu li { white-space: nowrap; max-width: 500px; position: relative; outline: none; } #menu>li { margin: var(--menumarginy) var(--menumarginx); display: inline-block; float: left; height: var(--menubuttoncontenty); line-height: var(--menubuttoncontenty); border-radius: var(--rounding); background-color: var(--barbuttoncolor); outline: var(--barbuttonoutline) solid var(--barbuttonoutlinecolor); font-size: 12pt; } .dropdown-parent { height: var(--menubuttonbordery) !important; } .dropdown-parent>label { display: inline-block; } #menu>li:not(.dropdown-parent), .dropdown-parent>label { padding: var(--menupaddingy) var(--menupaddingx); } label { cursor: inherit; } .ozone-list { background-color: var(--subcolor); width: max-content; padding: 1px; } .dropdown-child { position: absolute; overflow: hidden auto; max-height: calc(100vh - var(--actualmenuheight)); display: none; top: calc(100% + 1px); left: 0px; border-radius: var(--rounding); box-sizing: border-box; z-index: 1; } #fileManagerPanel { margin: auto; margin-top: 10px; } .ozone-list>* { display: block; border-radius: var(--rounding); text-decoration: none; color: inherit; margin: var(--submarginy) var(--submarginx); padding: 8px 12px; line-height: initial; font-size: 10pt; outline: none; user-select: none; } .dropdown-child>* { padding: var(--subpaddingy) var(--subpaddingx); } .ozone-list>*:not(:last-child) { box-shadow: 0px 2px 0px -1px var(--barbuttonoutlinecolor); } #menu>li:not(.disabled), .ozone-list>*:not(.disabled) { cursor: pointer; } #menu .disabled, .ozone-list .disabled { cursor: not-allowed !important; color: var(--bardisabledfontcolor); } #menu>li:not(.disabled):not(.dropdown-parent:has(.dropdown-child:hover)):hover, .ozone-list>*:hover, .ozone-list>*:focus, #menuhider:not(:checked) ~ .menuhiderlabel:hover { background-color: var(--barbuttonhovercolor); outline: none; animation: hover 0.5s ease-in-out infinite alternate; } .ozone-list>.danger:hover, .ozone-list>.danger:focus { animation: hover-danger 0.5s ease-in-out infinite alternate; } /* hide/show the menu */ .menuhiderlabel { position: absolute; top: 0px; right: 0px; width: 45px; height: 45px; cursor: pointer; z-index: 1; } #menuhider:not(:checked) ~ .menuhiderlabel { margin: var(--menumarginy) 0px; margin-right: calc(var(--menumarginx) * 2); width: var(--menubuttonbordery) !important; height: var(--menubuttonbordery) !important; border-radius: var(--rounding); background-color: var(--barbuttoncolor); outline: var(--barbuttonoutline) solid var(--barbuttonoutlinecolor); } .menuhiderlabel span { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); transition: transform 0.2s ease; } #menuhider:checked ~ .menuhiderlabel span { transform: translate(-50%, -50%) scaleY(-1); color: #dfdfdf !important; } #menuhider:checked ~ .menuhiderlabel:hover { background-color: rgba(0, 0, 0, 0.1) !important; } .hide, #dropdown-box, #menuhider, #menuhider:checked ~ #menu { display: none !important; } #dropdown-box:checked ~ .dropdown-child { display: block; } /* modals */ #modals { display: none; background-color: rgba(0, 0, 0, 0.4); backdrop-filter: blur(6px); position: fixed; width: 100vw; height: 100vh; z-index: 30; } #modal-window { background-color: var(--barcolor); color: var(--barfontcolor); position: fixed; left: 50%; top: 50%; transform: translate(-50%, -50%); left: round(50%, 1px); top: round(50%, 1px); transform: translate(round(-50%, 1px), round(-50%, 1px)); max-height: calc(100vh - 40px); max-width: calc(100vw - 40px); width: 750px; overflow: hidden; } .modal-header { height: 50px; line-height: 30px; } .modal-header .progressContainer { position: absolute; top: 50px; } .modal-header .progressText { white-space: nowrap; font-size: 10pt; } #modal-title { display: inline-block; margin: 10px; } #modal-close { float: right; width: 30px; text-align: center; cursor: pointer; font-size: 24px; margin: 10px; } .modal-body { display: none; width: calc(100% - 40px); max-height: calc(100vh - 135px); padding: 20px; padding-top: 0px; margin-top: 25px; overflow: auto; } .modal-body>*:first-child { margin-top: 0px; } /* debug */ .retroarchWebcamVideo, .retroarchWebcamCanvas { position: absolute; left: 0px; top: 0px; z-index: 5000; } .retroarchWebcamCanvas { top: 112px; } /* mobile */ @media only screen and (max-width: 720px) { body { --subpaddingy: 8px; } #menu { width: calc(100% - calc(var(--menumarginx) * 2)); height: max-content; padding-bottom: var(--menumarginy); background-color: var(--barcolor); } #menu>li { margin-bottom: 0px; } .dropdown-child { max-width: calc(100vw - calc(var(--menumarginx) * 4)); width: max-content; } .dropdown-child a { white-space: normal; } }