/*! 98.css v0.1.21 - https://github.com/jdan/98.css */ /** * 98.css * Copyright (c) 2020 Jordan Scales * https://github.com/jdan/98.css/blob/main/LICENSE */ @font-face { font-family: unifont; src: url("/assets/UnifontExMono.woff2"); } :root { /* Color */ --text-color: var(--fg); --surface: var(--bg2); --button-highlight: var(--bg4); --button-face: var(--bg3); --button-shadow: var(--bg-dim); --window-frame: #0a0a0a; --dialog-blue: var(--bg-blue); --dialog-blue-light: var(--blue); --dialog-gray: #808080; --dialog-gray-light: #b5b5b5; --link-blue: var(--blue); /* Spacing */ --element-spacing: 8px; --grouped-button-spacing: 4px; --grouped-element-spacing: 6px; --radio-width: 12px; --checkbox-width: 13px; --radio-label-spacing: 6px; --range-track-height: 4px; --range-spacing: 10px; /* Some detailed computations for radio buttons and checkboxes */ --radio-total-width-precalc: var(--radio-width) + var(--radio-label-spacing); --radio-total-width: calc(var(--radio-total-width-precalc)); --radio-left: calc(-1 * var(--radio-total-width-precalc)); --radio-dot-width: 4px; --radio-dot-top: calc(var(--radio-width) / 2 - var(--radio-dot-width) / 2); --radio-dot-left: calc( -1 * (var(--radio-total-width-precalc)) + var(--radio-width) / 2 - var(--radio-dot-width) / 2 ); --checkbox-total-width-precalc: var(--checkbox-width) + var(--radio-label-spacing); --checkbox-total-width: calc(var(--checkbox-total-width-precalc)); --checkbox-left: calc(-1 * var(--checkbox-total-width-precalc)); --checkmark-width: 7px; --checkmark-left: 3px; /* Borders */ --border-width: 1px; --border-raised-outer: inset -1px -1px var(--window-frame), inset 1px 1px var(--button-highlight); --border-raised-inner: inset -2px -2px var(--button-shadow), inset 2px 2px var(--button-face); --border-sunken-outer: inset -1px -1px var(--button-highlight), inset 1px 1px var(--window-frame); --border-sunken-inner: inset -2px -2px var(--button-face), inset 2px 2px var(--button-shadow); --default-button-border-raised-outer: inset -2px -2px var(--window-frame), inset 1px 1px var(--window-frame); --default-button-border-raised-inner: inset 2px 2px var(--button-highlight), inset -3px -3px var(--button-shadow), inset 3px 3px var(--button-face); --default-button-border-sunken-outer: inset 2px 2px var(--window-frame), inset -1px -1px var(--window-frame); --default-button-border-sunken-inner: inset -2px -2px var(--button-highlight), inset 3px 3px var(--button-shadow), inset -3px -3px var(--button-face); /* Window borders flip button-face and button-highlight */ --border-window-outer: inset -1px -1px var(--window-frame), inset 1px 1px var(--button-face); --border-window-inner: inset -2px -2px var(--button-shadow), inset 2px 2px var(--button-highlight); /* Field borders (checkbox, input, etc) flip window-frame and button-shadow */ --border-field: inset -1px -1px var(--button-highlight), inset 1px 1px var(--button-shadow), inset -2px -2px var(--button-face), inset 2px 2px var(--window-frame); --border-status-field: inset -1px -1px var(--button-face), inset 1px 1px var(--button-shadow); /* Tabs */ --border-tab: inset -1px 0 var(--window-frame), inset 1px 1px var(--button-face), inset -2px 0 var(--button-shadow), inset 2px 2px var(--button-highlight); } @font-face { font-family: "Pixelated MS Sans Serif"; src: url("fonts/converted/ms_sans_serif.woff") format("woff"); src: url("fonts/converted/ms_sans_serif.woff2") format("woff2"); font-weight: normal; font-style: normal; } @font-face { font-family: "Pixelated MS Sans Serif"; src: url("fonts/converted/ms_sans_serif_bold.woff") format("woff"); src: url("fonts/converted/ms_sans_serif_bold.woff2") format("woff2"); font-weight: bold; font-style: normal; } body { font-family: unifont; font-size: 1rem; color: var(--text-color); } button, label, input, legend, textarea, select, option, table, ul.tree-view, .window, .title-bar, li[role="tab"] { font-family: unifont; -webkit-font-smoothing: none; font-size: 1rem; } h1 { font-size: 2rem; } h2 { font-size: 1rem; } h3 { font-size: 1rem; } h4 { font-size: 1rem; } u { text-decoration: none; border-bottom: 0.5px solid #222222; } button, input[type="submit"], input[type="reset"] { box-sizing: border-box; border: none; color: transparent; text-shadow: 0 0 var(--text-color); background: var(--surface); box-shadow: var(--border-raised-outer), var(--border-raised-inner); border-radius: 0; min-width: 75px; min-height: 23px; padding: 0 12px; } button.default, input[type="submit"].default, input[type="reset"].default { box-shadow: var(--default-button-border-raised-outer), var(--default-button-border-raised-inner); } .vertical-bar { width: 4px; height: 20px; background: #c0c0c0; box-shadow: var(--border-raised-outer), var(--border-raised-inner); } button:not(:disabled):active, input[type="submit"]:not(:disabled):active, input[type="reset"]:not(:disabled):active { box-shadow: var(--border-sunken-outer), var(--border-sunken-inner); text-shadow: 1px 1px var(--text-color); } button.default:not(:disabled):active, input[type="submit"].default:not(:disabled):active, input[type="reset"].default:not(:disabled):active { box-shadow: var(--default-button-border-sunken-outer), var(--default-button-border-sunken-inner); } @media (not(hover)) { button:not(:disabled):hover, input[type="submit"]:not(:disabled):hover, input[type="reset"]:not(:disabled):hover { box-shadow: var(--border-sunken-outer), var(--border-sunken-inner); } } button:focus, input[type="submit"]:focus, input[type="reset"]:focus { outline: 1px dotted #000000; outline-offset: -4px; } button::-moz-focus-inner, input[type="submit"]::-moz-focus-inner, input[type="reset"]::-moz-focus-inner { border: 0; } :disabled, :disabled + label, input[readonly], input[readonly] + label { color: var(--button-shadow); } button:disabled, input[type="submit"]:disabled, input[type="reset"]:disabled, :disabled + label { text-shadow: 1px 1px 0 var(--button-highlight); } .window { box-shadow: var(--border-window-outer), var(--border-window-inner); background: var(--surface); padding: 3px; } .title-bar { background: linear-gradient(90deg, var(--bg0), var(--green)); padding: 3px 2px 3px 3px; display: flex; justify-content: space-between; align-items: center; } .title-bar.inactive { background: linear-gradient( 90deg, var(--dialog-gray), var(--dialog-gray-light) ); } .title-bar-text { font-weight: bold; color: var(--fg); letter-spacing: 0; margin-right: 24px; } .title-bar-controls { display: flex; } .title-bar-controls button { padding: 0; display: block; min-width: 16px; min-height: 14px; } .title-bar-controls button:active { padding: 0; } .title-bar-controls button:focus { outline: none; } .title-bar-controls button[aria-label="Minimize"], .title-bar-controls button[aria-label].minimize { background-image: url("/assets/icon/minimize.svg"); background-repeat: no-repeat; background-position: bottom 3px left 4px; } .title-bar-controls button[aria-label="Maximize"], .title-bar-controls button[aria-label].maximize { background-image: url("/assets/icon/maximize.svg"); background-repeat: no-repeat; background-position: top 2px left 3px; } .title-bar-controls button[aria-label="Maximize"]:disabled, .title-bar-controls button[aria-label].maximize:disabled { background-image: url("/assets/icon/maximize-disabled.svg"); background-repeat: no-repeat; background-position: top 2px left 3px; } .title-bar-controls button[aria-label="Restore"], .title-bar-controls button[aria-label].restore { background-image: url("/assets/icon/restore.svg"); background-repeat: no-repeat; background-position: top 2px left 3px; } .title-bar-controls button[aria-label="Help"], .title-bar-controls button[aria-label].help { background-image: url("/assets/icon/help.svg"); background-repeat: no-repeat; background-position: top 2px left 5px; } .title-bar-controls button[aria-label="Close"], .title-bar-controls button[aria-label].close { margin-left: 2px; background-image: url("/assets/icon/close.svg"); background-repeat: no-repeat; background-position: top 3px left 4px; } .status-bar { margin: 0px 1px; display: flex; gap: 1px; } .status-bar-field { box-shadow: var(--border-status-field); flex-grow: 1; padding: 2px 3px; margin: 0; } .window-body { margin: var(--element-spacing); } fieldset { border-image: url("/assets/icon/groupbox-border.svg") 2; padding: calc(2 * var(--border-width) + var(--element-spacing)); padding-block-start: var(--element-spacing); margin: 0; } legend { background: var(--surface); } .field-row { display: flex; align-items: center; } [class^="field-row"] + [class^="field-row"] { margin-top: var(--grouped-element-spacing); } .field-row > * + * { margin-left: var(--grouped-element-spacing); } .field-row-stacked { display: flex; flex-direction: column; } .field-row-stacked * + * { margin-top: var(--grouped-element-spacing); } label { display: inline-flex; align-items: center; user-select: none; } input[type="radio"], input[type="checkbox"] { appearance: none; -webkit-appearance: none; -moz-appearance: none; margin: 0; background: 0; position: fixed; opacity: 0; border: none; } input[type="radio"] + label, input[type="checkbox"] + label { line-height: 13px; } input[type="radio"] + label { position: relative; margin-left: var(--radio-total-width); } input[type="radio"] + label::before { content: ""; position: absolute; top: 0; left: calc(-1 * (var(--radio-total-width-precalc))); display: inline-block; width: var(--radio-width); height: var(--radio-width); margin-right: var(--radio-label-spacing); background: url("/assets/icon/radio-border.svg"); } input[type="radio"]:active + label::before { background: url("/assets/icon/radio-border-disabled.svg"); } input[type="radio"]:checked + label::after { content: ""; display: block; width: var(--radio-dot-width); height: var(--radio-dot-width); top: var(--radio-dot-top); left: var(--radio-dot-left); position: absolute; background: url("/assets/icon/radio-dot.svg"); } input[type="radio"]:focus + label, input[type="checkbox"]:focus + label { outline: 1px dotted #000000; } input[type="radio"][disabled] + label::before { background: url("/assets/icon/radio-border-disabled.svg"); } input[type="radio"][disabled]:checked + label::after { background: url("/assets/icon/radio-dot-disabled.svg"); } input[type="checkbox"] + label { position: relative; margin-left: var(--checkbox-total-width); } input[type="checkbox"] + label::before { content: ""; position: absolute; left: calc(-1 * (var(--checkbox-total-width-precalc))); display: inline-block; width: var(--checkbox-width); height: var(--checkbox-width); background: var(--button-highlight); box-shadow: var(--border-field); margin-right: var(--radio-label-spacing); } input[type="checkbox"]:active + label::before { background: var(--surface); } input[type="checkbox"]:checked + label::after { content: ""; display: block; width: var(--checkmark-width); height: var(--checkmark-width); position: absolute; left: calc( -1 * (var(--checkbox-total-width-precalc)) + var(--checkmark-left) ); background: url("/assets/icon/checkmark.svg"); } input[type="checkbox"][disabled] + label::before { background: var(--surface); } input[type="checkbox"][disabled]:checked + label::after { background: url("/assets/icon/checkmark-disabled.svg"); } input[type="text"], input[type="password"], input[type="email"], input[type="url"], input[type="tel"], input[type="number"], input[type="search"], select, textarea { padding: 3px 4px; border: none; box-shadow: var(--border-field); background-color: var(--button-highlight); box-sizing: border-box; -webkit-appearance: none; -moz-appearance: none; appearance: none; border-radius: 0; } input[type="text"], input[type="password"], input[type="email"], input[type="url"], input[type="tel"], input[type="search"], select { height: 21px; } input[type="number"] { /* need this 1 pixel to fit the spinner controls in box */ height: 22px; } /* clears the ‘X’ from Internet Explorer */ input[type="search"]::-ms-clear { display: none; width: 0; height: 0; } input[type="search"]::-ms-reveal { display: none; width: 0; height: 0; } /* clears the ‘X’ from Chrome */ input[type="search"]::-webkit-search-decoration, input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-results-button, input[type="search"]::-webkit-search-results-decoration { display: none; } input[type="text"], input[type="password"], input[type="email"], input[type="url"], input[type="tel"], input[type="number"], input[type="search"] { /* For some reason descenders are getting cut off without this */ line-height: 2; } input[type="email"]:disabled, input[type="url"]:disabled, input[type="tel"]:disabled, input[type="password"]:disabled, input[type="text"]:disabled, input[type="number"]:disabled, input[type="search"]:disabled, input[type="email"]:read-only, input[type="url"]:read-only, input[type="tel"]:read-only, input[type="password"]:read-only, input[type="text"]:read-only, input[type="number"]:read-only, input[type="search"]:read-only, textarea:disabled { background-color: var(--surface); } select { appearance: none; -webkit-appearance: none; -moz-appearance: none; position: relative; padding-right: 32px; background-image: url("/assets/icon/button-down.svg"); background-position: top 2px right 2px; background-repeat: no-repeat; border-radius: 0; } select:focus, input[type="text"]:focus, input[type="password"]:focus, input[type="email"]:focus, input[type="url"]:focus, input[type="tel"]:focus, input[type="number"]:focus, input[type="search"]:focus, textarea:focus { outline: none; } input[type="range"] { -webkit-appearance: none; width: 100%; background: transparent; } input[type="range"]:focus { outline: none; } input[type="range"]::-webkit-slider-thumb { -webkit-appearance: none; height: 21px; width: 11px; background: url("/assets/icon/indicator-horizontal.svg"); transform: translateY(-8px); box-shadow: none; border: none; } input[type="range"].has-box-indicator::-webkit-slider-thumb { background: url("/assets/icon/indicator-rectangle-horizontal.svg"); transform: translateY(-10px); } input[type="range"]::-moz-range-thumb { height: 21px; width: 11px; border: 0; border-radius: 0; background: url("/assets/icon/indicator-horizontal.svg"); transform: translateY(2px); } input[type="range"].has-box-indicator::-moz-range-thumb { background: url("/assets/icon/indicator-rectangle-horizontal.svg"); transform: translateY(0px); } input[type="range"]::-webkit-slider-runnable-track { width: 100%; height: 2px; box-sizing: border-box; background: black; border-right: 1px solid grey; border-bottom: 1px solid grey; box-shadow: 1px 0 0 white, 1px 1px 0 white, 0 1px 0 white, -1px 0 0 darkgrey, -1px -1px 0 darkgrey, 0 -1px 0 darkgrey, -1px 1px 0 white, 1px -1px darkgrey; } input[type="range"]::-moz-range-track { width: 100%; height: 2px; box-sizing: border-box; background: black; border-right: 1px solid grey; border-bottom: 1px solid grey; box-shadow: 1px 0 0 white, 1px 1px 0 white, 0 1px 0 white, -1px 0 0 darkgrey, -1px -1px 0 darkgrey, 0 -1px 0 darkgrey, -1px 1px 0 white, 1px -1px darkgrey; } .is-vertical { display: inline-block; width: 4px; height: 150px; transform: translateY(50%); } .is-vertical > input[type="range"] { width: 150px; height: 4px; margin: 0 calc(var(--grouped-element-spacing) + var(--range-spacing)) 0 var(--range-spacing); transform-origin: left; transform: rotate(270deg) translateX(calc(-50% + var(--element-spacing))); } .is-vertical > input[type="range"]::-webkit-slider-runnable-track { border-left: 1px solid grey; border-right: 0; border-bottom: 1px solid grey; box-shadow: -1px 0 0 white, -1px 1px 0 white, 0 1px 0 white, 1px 0 0 darkgrey, 1px -1px 0 darkgrey, 0 -1px 0 darkgrey, 1px 1px 0 white, -1px -1px darkgrey; } .is-vertical > input[type="range"]::-moz-range-track { border-left: 1px solid grey; border-right: 0; border-bottom: 1px solid grey; box-shadow: -1px 0 0 white, -1px 1px 0 white, 0 1px 0 white, 1px 0 0 darkgrey, 1px -1px 0 darkgrey, 0 -1px 0 darkgrey, 1px 1px 0 white, -1px -1px darkgrey; } .is-vertical > input[type="range"]::-webkit-slider-thumb { transform: translateY(-8px) scaleX(-1); } .is-vertical > input[type="range"].has-box-indicator::-webkit-slider-thumb { transform: translateY(-10px) scaleX(-1); } .is-vertical > input[type="range"]::-moz-range-thumb { transform: translateY(2px) scaleX(-1); } .is-vertical > input[type="range"].has-box-indicator::-moz-range-thumb { transform: translateY(0px) scaleX(-1); } select:focus { color: var(--button-highlight); background-color: var(--dialog-blue); } select:focus option { color: #000; background-color: #fff; } select:active { background-image: url("/assets/icon/button-down-active.svg"); } a { color: var(--link-blue); } a:focus { outline: 1px dotted var(--link-blue); } ul.tree-view { display: block; background: var(--button-highlight); /* box-shadow: var(--border-field); */ padding: 6px; margin: 0; } ul.tree-view li { list-style-type: none; } ul.tree-view a { text-decoration: none; color: var(--blue); } ul.tree-view a:focus { background-color: var(--dialog-blue); color: var(--button-highlight); } ul.tree-view ul, ul.tree-view li { margin-top: 3px; } ul.tree-view ul { margin-left: 16px; padding-left: 16px; /* Goes down too far */ border-left: 1px dotted #808080; } ul.tree-view ul > li { position: relative; } ul.tree-view ul > li::before { content: ""; display: block; position: absolute; left: -16px; top: 6px; width: 12px; border-bottom: 1px dotted #808080; } /* Cover the bottom of the left dotted border */ ul.tree-view ul > li:last-child::after { content: ""; display: block; position: absolute; left: -20px; top: 7px; bottom: 0px; width: 8px; background: var(--button-highlight); } ul.tree-view details { margin-top: 0; } ul.tree-view details[open] summary { margin-bottom: 0; } ul.tree-view ul details > summary:before { margin-left: -22px; position: relative; z-index: 1; } ul.tree-view details > summary:before { text-align: center; display: block; float: left; content: "+"; border: 1px solid var(--bg5); width: 11px; height: 11px; line-height: 10px; margin-right: 5px; background-color: var(--bg1); } ul.tree-view details[open] > summary:before { content: "-"; } ul.tree-view details > summary::marker, ul.tree-view details > summary::-webkit-details-marker { content: ""; } pre { display: block; background: var(--button-highlight); box-shadow: var(--border-field); padding: 12px 8px; margin: 0; } code, code * { font-family: monospace; } summary:focus { outline: 1px dotted #000000; } ::-webkit-scrollbar { width: 16px; } ::-webkit-scrollbar:horizontal { height: 17px; } ::-webkit-scrollbar-corner { background: var(--button-face); } ::-webkit-scrollbar-track { background-image: url("/assets/icon/scrollbar-background.svg"); } ::-webkit-scrollbar-thumb { background-color: var(--button-face); box-shadow: var(--border-raised-outer), var(--border-raised-inner); } ::-webkit-scrollbar-button:horizontal:start:decrement, ::-webkit-scrollbar-button:horizontal:end:increment, ::-webkit-scrollbar-button:vertical:start:decrement, ::-webkit-scrollbar-button:vertical:end:increment { display: block; } ::-webkit-scrollbar-button:vertical:start { height: 17px; background-image: url("/assets/icon/button-up.svg"); } ::-webkit-scrollbar-button:vertical:end { height: 17px; background-image: url("/assets/icon/button-down.svg"); } ::-webkit-scrollbar-button:horizontal:start { width: 16px; background-image: url("/assets/icon/button-left.svg"); } ::-webkit-scrollbar-button:horizontal:end { width: 16px; background-image: url("/assets/icon/button-right.svg"); } .window[role="tabpanel"] { position: relative; z-index: 2; } menu[role="tablist"] { position: relative; margin: 0 0 -2px 0; text-indent: 0; list-style-type: none; display: flex; padding-left: 3px; } menu[role="tablist"] > li { border-top-left-radius: 3px; border-top-right-radius: 3px; box-shadow: var(--border-tab); z-index: 1; } menu[role="tablist"] > li[aria-selected="true"] { padding-bottom: 2px; margin-top: -2px; background-color: var(--surface); position: relative; z-index: 8; margin-left: -3px; } menu[role="tablist"] > li > a { display: block; color: #222; margin: 6px; text-decoration: none; } menu[role="tablist"] > li[aria-selected="true"] > a:focus { outline: none; } menu[role="tablist"] > li > a:focus { outline: 1px dotted #222; } menu[role="tablist"].multirows > li { flex-grow: 1; text-align: center; } .sunken-panel { box-sizing: border-box; border: 2px groove transparent; border-image: url("/assets/icon/sunken-panel-border.svg") 2; overflow: auto; background-color: #fff; } table { border-collapse: collapse; position: relative; text-align: left; white-space: nowrap; background-color: var(--bg0); } table > thead > tr > * { position: sticky; top: 0; height: 17px; box-shadow: var(--border-raised-outer), var(--border-raised-inner); background: var(--surface); box-sizing: border-box; font-weight: normal; padding: 0 var(--grouped-element-spacing); } table.interactive > tbody > tr { cursor: pointer; } table > tbody > tr.highlighted { color: #fff; background-color: var(--dialog-blue); } table > tbody > tr > * { padding: 0 var(--grouped-element-spacing); height: 14px; } .progress-indicator { height: 32px; position: relative; box-shadow: var(--border-sunken-inner); padding: 4px 4px; border: none; box-sizing: border-box; -webkit-appearance: none; -moz-appearance: none; appearance: none; border-radius: 0; } .progress-indicator > .progress-indicator-bar { height: 100%; display: block; background-color: var(--dialog-blue); } .progress-indicator.segmented > .progress-indicator-bar { width: 100%; background-color: transparent; /* resets the background color which is set to blue in the non-segmented selector */ background-image: linear-gradient( 90deg, var(--dialog-blue) 0 16px, transparent 0 2px ); background-repeat: repeat; background-size: 18px 100%; } .field-border { background: var(--button-highlight); box-shadow: var(--border-field); padding: 2px; } .field-border-disabled { background: var(--surface); box-shadow: var(--border-field); padding: 2px; } .status-field-border { background: var(--surface); box-shadow: var(--border-status-field); padding: 1px; }