/*! 98.css v0.1.21 - https://github.com/jdan/98.css */@font-face{font-family:"Pixelated MS Sans Serif";font-style:normal;font-weight:400;src:url(/assets/ms_sans_serif-C3pax6mQ.woff) format("woff");src:url(/assets/ms_sans_serif-Du8rjN1q.woff2) format("woff2")}@font-face{font-family:"Pixelated MS Sans Serif";font-style:normal;font-weight:700;src:url(/assets/ms_sans_serif_bold-B8yxhAcs.woff) format("woff");src:url(/assets/ms_sans_serif_bold-D5dpRRHG.woff2) format("woff2")}body{color:#222;font-family:Arial;font-size:12px}.title-bar,.window,button,input,label,legend,li[role=tab],option,select,table,textarea,ul.tree-view{-webkit-font-smoothing:none;font-family:"Pixelated MS Sans Serif",Arial;font-size:11px}h1{font-size:5rem}h2{font-size:2.5rem}h3{font-size:2rem}h4{font-size:1.5rem}u{border-bottom:.5px solid #222;text-decoration:none}button,input[type=reset],input[type=submit]{background:silver;border:none;border-radius:0;box-shadow:inset -1px -1px #0a0a0a,inset 1px 1px #fff,inset -2px -2px grey,inset 2px 2px #dfdfdf;box-sizing:border-box;color:transparent;min-height:23px;min-width:75px;padding:0 12px;text-shadow:0 0 #222}button.default,input[type=reset].default,input[type=submit].default{box-shadow:inset -2px -2px #0a0a0a,inset 1px 1px #0a0a0a,inset 2px 2px #fff,inset -3px -3px grey,inset 3px 3px #dfdfdf}.vertical-bar{background:silver;box-shadow:inset -1px -1px #0a0a0a,inset 1px 1px #fff,inset -2px -2px grey,inset 2px 2px #dfdfdf;height:20px;width:4px}button:not(:disabled):active,input[type=reset]:not(:disabled):active,input[type=submit]:not(:disabled):active{box-shadow:inset -1px -1px #fff,inset 1px 1px #0a0a0a,inset -2px -2px #dfdfdf,inset 2px 2px grey;text-shadow:1px 1px #222}button.default:not(:disabled):active,input[type=reset].default:not(:disabled):active,input[type=submit].default:not(:disabled):active{box-shadow:inset 2px 2px #0a0a0a,inset -1px -1px #0a0a0a,inset -2px -2px #fff,inset 3px 3px grey,inset -3px -3px #dfdfdf}@media (not(hover)){button:not(:disabled):hover,input[type=reset]:not(:disabled):hover,input[type=submit]:not(:disabled):hover{box-shadow:inset -1px -1px #fff,inset 1px 1px #0a0a0a,inset -2px -2px #dfdfdf,inset 2px 2px grey}}button:focus,input[type=reset]:focus,input[type=submit]:focus{outline:1px dotted #000;outline-offset:-4px}button::-moz-focus-inner,input[type=reset]::-moz-focus-inner,input[type=submit]::-moz-focus-inner{border:0}:disabled,:disabled+label,input[readonly],input[readonly]+label{color:grey}:disabled+label,button:disabled,input[type=reset]:disabled,input[type=submit]:disabled{text-shadow:1px 1px 0 #fff}.window{background:silver;box-shadow:inset -1px -1px #0a0a0a,inset 1px 1px #dfdfdf,inset -2px -2px grey,inset 2px 2px #fff;padding:3px}.title-bar{align-items:center;background:linear-gradient(90deg,navy,#1084d0);display:flex;justify-content:space-between;padding:3px 2px 3px 3px}.title-bar.inactive{background:linear-gradient(90deg,grey,#b5b5b5)}.title-bar-text{color:#fff;font-weight:700;letter-spacing:0;margin-right:24px}.title-bar-controls{display:flex}.title-bar-controls button{display:block;min-height:14px;min-width:16px;padding:0}.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("data:image/svg+xml;charset=utf-8,%3Csvg width='6' height='2' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='%23000' d='M0 0h6v2H0z'/%3E%3C/svg%3E");background-position:bottom 3px left 4px;background-repeat:no-repeat}.title-bar-controls button[aria-label=Maximize],.title-bar-controls button[aria-label].maximize{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='9' height='9' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9 0H0v9h9V0zM8 2H1v6h7V2z' fill='%23000'/%3E%3C/svg%3E");background-position:top 2px left 3px;background-repeat:no-repeat}.title-bar-controls button[aria-label=Maximize]:disabled,.title-bar-controls button[aria-label].maximize:disabled{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='10' height='10' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10 1H1v9h9V1zM9 3H2v6h7V3z' fill='%23fff'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9 0H0v9h9V0zM8 2H1v6h7V2z' fill='gray'/%3E%3C/svg%3E");background-position:top 2px left 3px;background-repeat:no-repeat}.title-bar-controls button[aria-label=Restore],.title-bar-controls button[aria-label].restore{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='8' height='9' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='%23000' d='M2 0h6v2H2zM7 2h1v4H7zM2 2h1v1H2zM6 5h1v1H6zM0 3h6v2H0zM5 5h1v4H5zM0 5h1v4H0zM1 8h4v1H1z'/%3E%3C/svg%3E");background-position:top 2px left 3px;background-repeat:no-repeat}.title-bar-controls button[aria-label=Help],.title-bar-controls button[aria-label].help{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='6' height='9' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='%23000' d='M0 1h2v2H0zM1 0h4v1H1zM4 1h2v2H4zM3 3h2v1H3zM2 4h2v2H2zM2 7h2v2H2z'/%3E%3C/svg%3E");background-position:top 2px left 5px;background-repeat:no-repeat}.title-bar-controls button[aria-label=Close],.title-bar-controls button[aria-label].close{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='8' height='7' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M0 0h2v1h1v1h2V1h1V0h2v1H7v1H6v1H5v1h1v1h1v1h1v1H6V6H5V5H3v1H2v1H0V6h1V5h1V4h1V3H2V2H1V1H0V0z' fill='%23000'/%3E%3C/svg%3E");background-position:top 3px left 4px;background-repeat:no-repeat;margin-left:2px}.status-bar{gap:1px;display:flex;margin:0 1px}.status-bar-field{box-shadow:inset -1px -1px #dfdfdf,inset 1px 1px grey;flex-grow:1;margin:0;padding:2px 3px}.window-body{margin:8px}fieldset{border-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='5' height='5' fill='gray' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M0 0h5v5H0V2h2v1h1V2H0' fill='%23fff'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M0 0h4v4H0V1h1v2h2V1H0'/%3E%3C/svg%3E") 2;margin:0;padding:10px;padding-block-start:8px}legend{background:silver}.field-row{align-items:center;display:flex}[class^=field-row]+[class^=field-row]{margin-top:6px}.field-row>*+*{margin-left:6px}.field-row-stacked{display:flex;flex-direction:column}.field-row-stacked *+*{margin-top:6px}label{align-items:center;display:inline-flex;user-select:none}input[type=checkbox],input[type=radio]{appearance:none;-webkit-appearance:none;-moz-appearance:none;background:0;border:none;margin:0;opacity:0;position:fixed}input[type=checkbox]+label,input[type=radio]+label{line-height:13px}input[type=radio]+label{margin-left:18px;position:relative}input[type=radio]+label:before{background:url("data:image/svg+xml;charset=utf-8,%3Csvg width='12' height='12' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8 0H4v1H2v1H1v2H0v4h1v2h1V8H1V4h1V2h2V1h4v1h2V1H8V0z' fill='gray'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8 1H4v1H2v2H1v4h1v1h1V8H2V4h1V3h1V2h4v1h2V2H8V1z' fill='%23000'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9 3h1v1H9V3zm1 5V4h1v4h-1zm-2 2V9h1V8h1v2H8zm-4 0v1h4v-1H4zm0 0V9H2v1h2z' fill='%23DFDFDF'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11 2h-1v2h1v4h-1v2H8v1H4v-1H2v1h2v1h4v-1h2v-1h1V8h1V4h-1V2z' fill='%23fff'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M4 2h4v1h1v1h1v4H9v1H8v1H4V9H3V8H2V4h1V3h1V2z' fill='%23fff'/%3E%3C/svg%3E");content:"";display:inline-block;height:12px;left:-18px;margin-right:6px;position:absolute;top:0;width:12px}input[type=radio]:active+label:before{background:url("data:image/svg+xml;charset=utf-8,%3Csvg width='12' height='12' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8 0H4v1H2v1H1v2H0v4h1v2h1V8H1V4h1V2h2V1h4v1h2V1H8V0z' fill='gray'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8 1H4v1H2v2H1v4h1v1h1V8H2V4h1V3h1V2h4v1h2V2H8V1z' fill='%23000'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9 3h1v1H9V3zm1 5V4h1v4h-1zm-2 2V9h1V8h1v2H8zm-4 0v1h4v-1H4zm0 0V9H2v1h2z' fill='%23DFDFDF'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11 2h-1v2h1v4h-1v2H8v1H4v-1H2v1h2v1h4v-1h2v-1h1V8h1V4h-1V2z' fill='%23fff'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M4 2h4v1h1v1h1v4H9v1H8v1H4V9H3V8H2V4h1V3h1V2z' fill='silver'/%3E%3C/svg%3E")}input[type=radio]:checked+label:after{background:url("data:image/svg+xml;charset=utf-8,%3Csvg width='4' height='4' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M3 0H1v1H0v2h1v1h2V3h1V1H3V0z' fill='%23000'/%3E%3C/svg%3E");content:"";display:block;height:4px;left:-14px;position:absolute;top:4px;width:4px}input[type=checkbox]:focus+label,input[type=radio]:focus+label{outline:1px dotted #000}input[type=radio][disabled]+label:before{background:url("data:image/svg+xml;charset=utf-8,%3Csvg width='12' height='12' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8 0H4v1H2v1H1v2H0v4h1v2h1V8H1V4h1V2h2V1h4v1h2V1H8V0z' fill='gray'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8 1H4v1H2v2H1v4h1v1h1V8H2V4h1V3h1V2h4v1h2V2H8V1z' fill='%23000'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9 3h1v1H9V3zm1 5V4h1v4h-1zm-2 2V9h1V8h1v2H8zm-4 0v1h4v-1H4zm0 0V9H2v1h2z' fill='%23DFDFDF'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11 2h-1v2h1v4h-1v2H8v1H4v-1H2v1h2v1h4v-1h2v-1h1V8h1V4h-1V2z' fill='%23fff'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M4 2h4v1h1v1h1v4H9v1H8v1H4V9H3V8H2V4h1V3h1V2z' fill='silver'/%3E%3C/svg%3E")}input[type=radio][disabled]:checked+label:after{background:url("data:image/svg+xml;charset=utf-8,%3Csvg width='4' height='4' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M3 0H1v1H0v2h1v1h2V3h1V1H3V0z' fill='gray'/%3E%3C/svg%3E")}input[type=checkbox]+label{margin-left:19px;position:relative}input[type=checkbox]+label:before{background:#fff;box-shadow:inset -1px -1px #fff,inset 1px 1px grey,inset -2px -2px #dfdfdf,inset 2px 2px #0a0a0a;content:"";display:inline-block;height:13px;left:-19px;margin-right:6px;position:absolute;width:13px}input[type=checkbox]:active+label:before{background:silver}input[type=checkbox]:checked+label:after{background:url("data:image/svg+xml;charset=utf-8,%3Csvg width='7' height='7' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M7 0H6v1H5v1H4v1H3v1H2V3H1V2H0v3h1v1h1v1h1V6h1V5h1V4h1V3h1V0z' fill='%23000'/%3E%3C/svg%3E");content:"";display:block;height:7px;left:-16px;position:absolute;width:7px}input[type=checkbox][disabled]+label:before{background:silver}input[type=checkbox][disabled]:checked+label:after{background:url("data:image/svg+xml;charset=utf-8,%3Csvg width='7' height='7' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M7 0H6v1H5v1H4v1H3v1H2V3H1V2H0v3h1v1h1v1h1V6h1V5h1V4h1V3h1V0z' fill='gray'/%3E%3C/svg%3E")}input[type=email],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=url]{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:none;border-radius:0}input[type=email],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=url],select{background-color:#fff;box-shadow:inset -1px -1px #fff,inset 1px 1px grey,inset -2px -2px #dfdfdf,inset 2px 2px #0a0a0a;box-sizing:border-box;padding:3px 4px}select,textarea{border:none}textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-radius:0;box-shadow:inset -1px -1px #fff,inset 1px 1px grey,inset -2px -2px #dfdfdf,inset 2px 2px #0a0a0a;box-sizing:border-box;padding:3px 4px}input[type=email],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=url],select{height:21px}input[type=number]{height:22px}input[type=search]::-ms-clear,input[type=search]::-ms-reveal{display:none;height:0;width:0}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration,input[type=search]::-webkit-search-results-button,input[type=search]::-webkit-search-results-decoration{display:none}input[type=email],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=url]{line-height:2}input[type=email]:disabled,input[type=email]:read-only,input[type=number]:disabled,input[type=number]:read-only,input[type=password]:disabled,input[type=password]:read-only,input[type=search]:disabled,input[type=search]:read-only,input[type=tel]:disabled,input[type=tel]:read-only,input[type=text]:disabled,input[type=text]:read-only,input[type=url]:disabled,input[type=url]:read-only,textarea:disabled{background-color:silver}select{appearance:none;-webkit-appearance:none;-moz-appearance:none;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='17' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M15 0H0v16h1V1h14V0z' fill='%23DFDFDF'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M2 1H1v14h1V2h12V1H2z' fill='%23fff'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M16 17H0v-1h15V0h1v17z' fill='%23000'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M15 1h-1v14H1v1h14V1z' fill='gray'/%3E%3Cpath fill='silver' d='M2 2h12v13H2z'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11 6H4v1h1v1h1v1h1v1h1V9h1V8h1V7h1V6z' fill='%23000'/%3E%3C/svg%3E");background-position:top 2px right 2px;background-repeat:no-repeat;border-radius:0;padding-right:32px;position:relative}input[type=email]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=url]:focus,select:focus,textarea:focus{outline:none}input[type=range]{-webkit-appearance:none;background:transparent;width:100%}input[type=range]:focus{outline:none}input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;background:url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='21' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M0 0v16h2v2h2v2h1v-1H3v-2H1V1h9V0z' fill='%23fff'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M1 1v15h1v1h1v1h1v1h2v-1h1v-1h1v-1h1V1z' fill='%23C0C7C8'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9 1h1v15H8v2H6v2H5v-1h2v-2h2z' fill='%2387888F'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10 0h1v16H9v2H7v2H5v1h1v-2h2v-2h2z' fill='%23000'/%3E%3C/svg%3E");border:none;box-shadow:none;height:21px;transform:translateY(-8px);width:11px}input[type=range].has-box-indicator::-webkit-slider-thumb{background:url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='21' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M0 0v20h1V1h9V0z' fill='%23fff'/%3E%3Cpath fill='%23C0C7C8' d='M1 1h8v18H1z'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9 1h1v19H1v-1h8z' fill='%2387888F'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10 0h1v21H0v-1h10z' fill='%23000'/%3E%3C/svg%3E");transform:translateY(-10px)}input[type=range]::-moz-range-thumb{background:url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='21' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M0 0v16h2v2h2v2h1v-1H3v-2H1V1h9V0z' fill='%23fff'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M1 1v15h1v1h1v1h1v1h2v-1h1v-1h1v-1h1V1z' fill='%23C0C7C8'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9 1h1v15H8v2H6v2H5v-1h2v-2h2z' fill='%2387888F'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10 0h1v16H9v2H7v2H5v1h1v-2h2v-2h2z' fill='%23000'/%3E%3C/svg%3E");border:0;border-radius:0;height:21px;transform:translateY(2px);width:11px}input[type=range].has-box-indicator::-moz-range-thumb{background:url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='21' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M0 0v20h1V1h9V0z' fill='%23fff'/%3E%3Cpath fill='%23C0C7C8' d='M1 1h8v18H1z'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9 1h1v19H1v-1h8z' fill='%2387888F'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M10 0h1v21H0v-1h10z' fill='%23000'/%3E%3C/svg%3E");transform:translateY(0)}input[type=range]::-webkit-slider-runnable-track{background:#000;border-bottom:1px solid grey;border-right:1px solid grey;box-shadow:1px 0 0 #fff,1px 1px 0 #fff,0 1px 0 #fff,-1px 0 0 #a9a9a9,-1px -1px 0 #a9a9a9,0 -1px 0 #a9a9a9,-1px 1px 0 #fff,1px -1px #a9a9a9;box-sizing:border-box;height:2px;width:100%}input[type=range]::-moz-range-track{background:#000;border-bottom:1px solid grey;border-right:1px solid grey;box-shadow:1px 0 0 #fff,1px 1px 0 #fff,0 1px 0 #fff,-1px 0 0 #a9a9a9,-1px -1px 0 #a9a9a9,0 -1px 0 #a9a9a9,-1px 1px 0 #fff,1px -1px #a9a9a9;box-sizing:border-box;height:2px;width:100%}.is-vertical{display:inline-block;height:150px;transform:translateY(50%);width:4px}.is-vertical>input[type=range]{height:4px;margin:0 16px 0 10px;transform:rotate(270deg) translateX(calc(-50% + 8px));transform-origin:left;width:150px}.is-vertical>input[type=range]::-webkit-slider-runnable-track{border-bottom:1px solid grey;border-left:1px solid grey;border-right:0;box-shadow:-1px 0 0 #fff,-1px 1px 0 #fff,0 1px 0 #fff,1px 0 0 #a9a9a9,1px -1px 0 #a9a9a9,0 -1px 0 #a9a9a9,1px 1px 0 #fff,-1px -1px #a9a9a9}.is-vertical>input[type=range]::-moz-range-track{border-bottom:1px solid grey;border-left:1px solid grey;border-right:0;box-shadow:-1px 0 0 #fff,-1px 1px 0 #fff,0 1px 0 #fff,1px 0 0 #a9a9a9,1px -1px 0 #a9a9a9,0 -1px 0 #a9a9a9,1px 1px 0 #fff,-1px -1px #a9a9a9}.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(0) scaleX(-1)}select:focus{background-color:navy;color:#fff}select:focus option{background-color:#fff;color:#000}select:active{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='17' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M0 0h16v17H0V0zm1 16h14V1H1v15z' fill='gray'/%3E%3Cpath fill='silver' d='M1 1h14v15H1z'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M12 7H5v1h1v1h1v1h1v1h1v-1h1V9h1V8h1V7z' fill='%23000'/%3E%3C/svg%3E")}a{color:#00f}a:focus{outline:1px dotted #00f}ul.tree-view{background:#fff;box-shadow:inset -1px -1px #fff,inset 1px 1px grey,inset -2px -2px #dfdfdf,inset 2px 2px #0a0a0a;display:block;margin:0;padding:6px}ul.tree-view li{list-style-type:none}ul.tree-view a{color:#000;text-decoration:none}ul.tree-view a:focus{background-color:navy;color:#fff}ul.tree-view li,ul.tree-view ul{margin-top:3px}ul.tree-view ul{border-left:1px dotted grey;margin-left:16px;padding-left:16px}ul.tree-view ul>li{position:relative}ul.tree-view ul>li:before{border-bottom:1px dotted grey;content:"";display:block;left:-16px;position:absolute;top:6px;width:12px}ul.tree-view ul>li:last-child:after{background:#fff;bottom:0;content:"";display:block;left:-20px;position:absolute;top:7px;width:8px}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{background-color:#fff;border:1px solid grey;content:"+";display:block;float:left;height:9px;line-height:8px;margin-right:5px;padding-left:1px;text-align:center;width:8px}ul.tree-view details[open]>summary:before{content:"-"}ul.tree-view details>summary::-webkit-details-marker,ul.tree-view details>summary::marker{content:""}pre{background:#fff;box-shadow:inset -1px -1px #fff,inset 1px 1px grey,inset -2px -2px #dfdfdf,inset 2px 2px #0a0a0a;display:block;margin:0;padding:12px 8px}code,code *{font-family:monospace}summary:focus{outline:1px dotted #000}::-webkit-scrollbar{width:16px}::-webkit-scrollbar:horizontal{height:17px}::-webkit-scrollbar-corner{background:#dfdfdf}::-webkit-scrollbar-track{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='2' height='2' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M1 0H0v1h1v1h1V1H1V0z' fill='silver'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M2 0H1v1H0v1h1V1h1V0z' fill='%23fff'/%3E%3C/svg%3E")}::-webkit-scrollbar-thumb{background-color:#dfdfdf;box-shadow:inset -1px -1px #0a0a0a,inset 1px 1px #fff,inset -2px -2px grey,inset 2px 2px #dfdfdf}::-webkit-scrollbar-button:horizontal:end:increment,::-webkit-scrollbar-button:horizontal:start:decrement,::-webkit-scrollbar-button:vertical:end:increment,::-webkit-scrollbar-button:vertical:start:decrement{display:block}::-webkit-scrollbar-button:vertical:start{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='17' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M15 0H0v16h1V1h14V0z' fill='%23DFDFDF'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M2 1H1v14h1V2h12V1H2z' fill='%23fff'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M16 17H0v-1h15V0h1v17z' fill='%23000'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M15 1h-1v14H1v1h14V1z' fill='gray'/%3E%3Cpath fill='silver' d='M2 2h12v13H2z'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8 6H7v1H6v1H5v1H4v1h7V9h-1V8H9V7H8V6z' fill='%23000'/%3E%3C/svg%3E");height:17px}::-webkit-scrollbar-button:vertical:end{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='17' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M15 0H0v16h1V1h14V0z' fill='%23DFDFDF'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M2 1H1v14h1V2h12V1H2z' fill='%23fff'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M16 17H0v-1h15V0h1v17z' fill='%23000'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M15 1h-1v14H1v1h14V1z' fill='gray'/%3E%3Cpath fill='silver' d='M2 2h12v13H2z'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11 6H4v1h1v1h1v1h1v1h1V9h1V8h1V7h1V6z' fill='%23000'/%3E%3C/svg%3E");height:17px}::-webkit-scrollbar-button:horizontal:start{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='17' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M15 0H0v16h1V1h14V0z' fill='%23DFDFDF'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M2 1H1v14h1V2h12V1H2z' fill='%23fff'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M16 17H0v-1h15V0h1v17z' fill='%23000'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M15 1h-1v14H1v1h14V1z' fill='gray'/%3E%3Cpath fill='silver' d='M2 2h12v13H2z'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M9 4H8v1H7v1H6v1H5v1h1v1h1v1h1v1h1V4z' fill='%23000'/%3E%3C/svg%3E");width:16px}::-webkit-scrollbar-button:horizontal:end{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='17' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M15 0H0v16h1V1h14V0z' fill='%23DFDFDF'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M2 1H1v14h1V2h12V1H2z' fill='%23fff'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M16 17H0v-1h15V0h1v17z' fill='%23000'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M15 1h-1v14H1v1h14V1z' fill='gray'/%3E%3Cpath fill='silver' d='M2 2h12v13H2z'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M7 4H6v7h1v-1h1V9h1V8h1V7H9V6H8V5H7V4z' fill='%23000'/%3E%3C/svg%3E");width:16px}.window[role=tabpanel]{position:relative;z-index:2}menu[role=tablist]{display:flex;list-style-type:none;margin:0 0 -2px;padding-left:3px;position:relative;text-indent:0}menu[role=tablist]>li{border-top-left-radius:3px;border-top-right-radius:3px;box-shadow:inset -1px 0 #0a0a0a,inset 1px 1px #dfdfdf,inset -2px 0 grey,inset 2px 2px #fff;z-index:1}menu[role=tablist]>li[aria-selected=true]{background-color:silver;margin-left:-3px;margin-top:-2px;padding-bottom:2px;position:relative;z-index:8}menu[role=tablist]>li>a{color:#222;display:block;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{border:2px groove transparent;border-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='5' height='5' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='gray' d='M0 0h4v1H0z'/%3E%3Cpath fill='gray' d='M0 0h1v4H0z'/%3E%3Cpath fill='%230a0a0a' d='M1 1h2v1H1z'/%3E%3Cpath fill='%230a0a0a' d='M1 1h1v2H1z'/%3E%3Cpath fill='%23fff' d='M0 4h5v1H0z'/%3E%3Cpath fill='%23fff' d='M4 0h1v5H4z'/%3E%3Cpath fill='%23dfdfdf' d='M3 1h1v3H3z'/%3E%3Cpath fill='%23dfdfdf' d='M1 3h3v1H1z'/%3E%3C/svg%3E") 2;box-sizing:border-box;overflow:auto}.sunken-panel,table{background-color:#fff}table{border-collapse:collapse;position:relative;text-align:left;white-space:nowrap}table>thead>tr>*{background:silver;box-shadow:inset -1px -1px #0a0a0a,inset 1px 1px #fff,inset -2px -2px grey,inset 2px 2px #dfdfdf;box-sizing:border-box;font-weight:400;height:17px;padding:0 6px;position:sticky;top:0}table.interactive>tbody>tr{cursor:pointer}table>tbody>tr.highlighted{background-color:navy;color:#fff}table>tbody>tr>*{height:14px;padding:0 6px}.progress-indicator{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:none;border-radius:0;box-shadow:inset -2px -2px #dfdfdf,inset 2px 2px grey;box-sizing:border-box;height:32px;padding:4px;position:relative}.progress-indicator>.progress-indicator-bar{background-color:navy;display:block;height:100%}.progress-indicator.segmented>.progress-indicator-bar{background-color:transparent;background-image:linear-gradient(90deg,navy 16px,transparent 0 2px);background-repeat:repeat;background-size:18px 100%;width:100%}.field-border{background:#fff}.field-border,.field-border-disabled{box-shadow:inset -1px -1px #fff,inset 1px 1px grey,inset -2px -2px #dfdfdf,inset 2px 2px #0a0a0a;padding:2px}.field-border-disabled{background:silver}.status-field-border{background:silver;box-shadow:inset -1px -1px #dfdfdf,inset 1px 1px grey;padding:1px}
/*# sourceMappingURL=98.css.map *//* ===== RESET & BASE ===== */
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }

/* Only carry the main font onto form controls - 98.css supplies their
   borders/bevels, so we no longer strip those. */
button, input, select, textarea {
  font: inherit;
  line-height: inherit;
}

@font-face {
  font-family: 'Super Mario Bros NES';
  src: url('/fonts/Super-Mario-Bros-NES.ttf') format('truetype');
  font-weight: 400;
  font-style: normal;
  font-display: swap;
}

:root {
  /* Theme-independent colors - the per-theme palette is in the
     [data-theme] blocks below. */
  --accent2: #a00000;
  --gold: #fff900;
  --text-light: #f7f7fd;
  --text-light2: #8890b0;
  --border: #808080;
  --boost: #f2360b;
  /* Per-bonus-type stat colors (see UpgradeCard) - manual/click keeps the
     existing --accent/--accent-light look, these two cover auto and speed. */
  --auto: #8e44ad;
  --speed: #077a72;

  --right-w: 300px;
  --top-h: 66px;
  /* Bottom taskbar (components/Taskbar) - layout and mobile sheets stop above it. */
  --taskbar-h: 38px;
  --radius: 0px;

  /* Type scale: base 14px, ratio = sqrt(golden ratio) ~= 1.272,
     so every 2 steps is a golden-ratio (x1.618) jump. Scaled down 40%
     since the pixel font renders much larger than its declared size. */
  --fs-xs: 6px;
  --fs-sm: 8px;
  --fs-md: 10px;
  --fs-lg: 13px;
  --fs-xl: 15px;
  --fs-2xl: 20px;
  --fs-3xl: 25px;

  /* Plain native cursor for clickable elements. When CursorLayer mounts (see
     App.tsx - currently disabled) it overrides this to `none` and draws its
     own DOM cursor instead. */
  --cursor-pointer: pointer;
}

/* Themes - picked in Settings (lib/themes.ts), set on <html data-theme> by
   App. Plain [data-theme] selectors (not :root-only) so the Settings swatches
   can carry their own data-theme and preview each palette from these same
   vars. 'classic' doubles as the :root default.
   --surface, --surface-button, --title-from/to and --highlight drive 98.css's chrome (see
   the 98.css overrides further down): window/button face, active title-bar
   gradient, and the selection/progress fill 98.css hardcodes as navy. */
:root, [data-theme="classic"] {
  /* Palette remapped onto the standard Windows 98 / 98.css theme so every
     component that still reads these vars picks up the retro look. */
  --bg: #c0c0c0;
  --bg2: #c0c0c0;
  --bg3: #c0c0c0;
  --surface: #c0c0c0;
  --surface-button: #ccc;
  --title-from: #000080;
  --title-to: #1084d0;
  --highlight: #000080;
  --accent: #000080;
  --accent-light: #1084d0;
  --text: #222222;
  --text2: #555555;
  /* Used as both text and bar fill, so pick per theme for contrast on --surface. */
  --success: #00af46;
  /* Enhancement stars (UpgradeCard) and enhanced-component gauge bars (DeviceTile). */
  --enhance-star: #e0580d;
}
[data-theme="slate"] {
  --bg: #a9b6c4;
  --bg2: #a9b6c4;
  --bg3: #a9b6c4;
  --surface: #a9b6c4;
  --surface-button: #b5c1cd;
  --title-from: #2c3e58;
  --title-to: #6d8bb0;
  --highlight: #2c3e58;
  --accent: #2c3e58;
  --accent-light: #4a72a8;
  --text2: #3c4652;
  --success: #008a3a;
  --enhance-star: #d24f08;
}
/* Spruce: sea-green greys tuned to sit with the Teal (#008080) wallpaper -
   title bar and selection are deep variants of that same teal. */
[data-theme="spruce"] {
  --bg: #a4bdb8;
  --bg2: #a4bdb8;
  --bg3: #a4bdb8;
  --surface: #a4bdb8;
  --surface-button: #b0c7c2;
  --title-from: #0c4848;
  --title-to: #3a9494;
  --highlight: #0c5656;
  --accent: #0c5656;
  --accent-light: #1f7a7a;
  --text2: #384c49;
  /* Darker green than the others so it doesn't vanish into the face. */
  --success: #006b34;
  --enhance-star: #a86a00;
}
/* Moonlight: pale moonlit-blue faces under deep night-indigo title bars and
   selection. Faces stay light (dark text) because 98.css's white bevels and
   inputs don't change with the theme and look harsh on a dark face. */
[data-theme="moonlight"] {
  --bg: #1f2740;
  --bg2: #1f2740;
  --bg3: #1f2740;
  --surface: #c3c9da;
  --surface-button: #ced3e1;
  --title-from: #161d3a;
  --title-to: #6b78b8;
  --highlight: #2e3a78;
  --accent: #2e3a78;
  --accent-light: #5263b0;
  --text: #1c2030;
  --text2: #4a5266;
  --success: #00804a;
  --enhance-star: #b07400;
}

html, body, #root {
  height: 100%;
  overflow: hidden;
  font-family: 'Super Mario Bros NES', 'Segoe UI', system-ui, sans-serif;
  background: var(--bg);
  color: var(--text);
  font-size: var(--fs-sm);
  line-height: 1.5;
  font-weight: 400;
  word-spacing: -30%;
}


body {
  position: relative;
  height: 100vh;
  /* dvh tracks the actually-visible viewport, not the "toolbars hidden"
     one 100vh assumes - without it, mobile browser address/tab bars can
     cover the bottom of the page (or fixed children can render up under a
     top toolbar) whenever their own chrome is actually showing. Declared
     after the 100vh fallback since browsers just ignore a value they don't
     support rather than erroring, so this only overrides where dvh works. */
  height: 100dvh;
}

h1, h2, h3, h4, h5 {
  margin-block-start: 0;
  margin-block-end: 0;
}

h1 { font-size: var(--fs-xl); }
h2 { font-size: var(--fs-lg); }
h3 { font-size: var(--fs-md); }

button {
  cursor: var(--cursor-pointer);
  background-color: var(--surface-button);
  word-spacing: -30%;
}

/* Use our loaded MSW98UI on the elements 98.css otherwise forces to its bundled
   "Pixelated MS Sans Serif". */
.title-bar, .title-bar-text, .window, button, input, label, legend,
option, select, table, textarea, ul.tree-view, .status-bar, li[role="tab"] {
  font-family: 'Super Mario Bros NES', 'Segoe UI', system-ui, sans-serif;
}
menu[role=tablist]>li {
  margin-left: -3px;
  margin-right: -3px;
}
menu[role=tablist]>li[aria-selected=true] {
  padding-bottom: 0;
  margin-left: 0;
  margin-bottom: -2px;
}

/* 98.css's tab label: `margin:6px` all round and a hardcoded #222. Widen the
   side margins to match this UI's roomier spacing (same 14px as .btn's
   horizontal padding) and pull the color from the design system instead of
   the hardcoded hex, so a future palette change reaches tabs too. */
menu[role="tablist"] > li > a {
  padding: 8px 22px 3px;
  font-size: var(--fs-lg);
  color: var(--text);
  margin: 0;
}

/* Opt-in Win98 tab strip (Display Properties) - sits directly on a
   .window tab page. Replaces the -3px side margins above, which overlap
   every tab: unselected tabs sit edge to edge; the selected one grows 2px
   each side via padding and takes it back via negative margin, so it
   overlaps its neighbours without shifting them, rises 2px above them and
   covers the page's top border below. padding-left: 2px puts a selected
   first tab flush with the page edge. Wraps to a second row in a narrow
   column, like Win98's multi-row tabs. */
menu[role="tablist"].tabs-98 {
  flex-shrink: 0;
  flex-wrap: wrap;
  margin: 0;
  padding-left: 2px;
}
menu[role="tablist"].tabs-98 > li > a {
  padding: 6px 6px 3px;
  font-size: var(--fs-md);
}
menu[role="tablist"].tabs-98 > li {
  margin: 0;
}
menu[role="tablist"].tabs-98 > li[aria-selected=true] {
  margin: -2px -2px -2px;
  padding: 0 2px;
}


/* 98.css's title-bar close button is sized for its own tiny 16x14 hit target -
   bump it up to match this UI's chunkier pixel-art scale (and give touch a
   bigger target). Re-center the icon instead of reusing 98.css's fixed
   `top 3px left 4px` offset, which only lines up at the original size. */
.title-bar-controls button {
  min-width: 27px;
  min-height: 27px;
}
.title-bar-controls button[aria-label="Close"],
.title-bar-controls button[aria-label].close {
  background-position: center;
  background-size: 14px;
}

.title-bar-text {
  margin-left: 8px;
}

/* Route 98.css's hardcoded silver/navy through the theme vars. Same
   specificity as 98.css's own rules - wins by loading after it. */
.window, input[type=reset], input[type=submit], legend, .vertical-bar,
menu[role=tablist] > li[aria-selected=true], table > thead > tr > *,
input[type=checkbox]:active + label::before,
input[type=checkbox][disabled] + label::before,
.field-border-disabled, .status-field-border {
  background-color: var(--surface);
}
.title-bar {
  background: linear-gradient(90deg, var(--title-from), var(--title-to));
}
select:focus, ul.tree-view a:focus, table > tbody > tr.highlighted,
.progress-indicator > .progress-indicator-bar {
  background-color: var(--highlight);
}
.progress-indicator.segmented > .progress-indicator-bar {
  background-color: transparent;
  background-image: linear-gradient(90deg, var(--highlight) 16px, transparent 0 2px);
}

table>thead>tr>* {
  height: 24px;
}

table>tbody>tr>* {
  height: 22px;
}


/* 98.css paints button text via a transparent color + text-shadow trick, which
   breaks buttons whose children set their own color. Render text normally. */
button, input[type="reset"], input[type="submit"] {
  padding: 10px;
  color: var(--text);
  text-shadow: none;
}
button:disabled { color: grey; }

/* 98.css draws a dotted focus ring on :focus (not just :focus-visible), so it
   also shows after a plain mouse click/tap - inside buttons, around tabs. */
button:focus,
button:focus-visible,
input[type="reset"]:focus,
input[type="submit"]:focus,
menu[role="tablist"] > li > a:focus,
a:focus,
summary:focus { outline: none; }

button:not(:disabled):active, input[type=reset]:not(:disabled):active, input[type=submit]:not(:disabled):active {
  text-shadow: none;
}

:disabled+label, button:disabled, input[type=reset]:disabled, input[type=submit]:disabled {
  text-shadow: none;
}

/* ===== BUTTONS =====
   `.btn` used to carry a full pixel-art button look; now bare <button>s already
   get the 98.css treatment, so this only keeps a bit of layout padding and a
   colour hook (`--btn-bg` / `.btn-accent2`) for callers that still reference it. */
.btn {
  padding: 4px 14px;
  min-height: 23px;
}
.btn:disabled { opacity: 0.6; }
.btn-accent2 { color: var(--accent2); }

/* Button sizes - font size + padding as one step. btn-sm is exactly what a
   bare <button> already gets (body's --fs-sm, the 10px padding above, 98.css's
   23px min-height), so it can be added anywhere without changing the look;
   xs/md scale down/up from it. Opt-in. */
.btn-xs { font-size: var(--fs-sm); padding: 10px; }
.btn-sm { font-size: var(--fs-md); padding: 11px; }
.btn-md { font-size: var(--fs-lg); padding: 12px; }

/* ===== FORMS =====
   Caption above a field-row-stacked input (98.css gives the input itself a
   themed look already, but leaves a bare <label> at browser defaults) -
   dimmer and smaller than body text so it reads as a field caption, not a
   sentence of its own. */
.input-label {
  display: block;
  /* margin-bottom: 4px; */
  font-size: var(--fs-sm);
  color: var(--text2);
}

/* Text-like input, sized for this UI's pixel font instead of 98.css's own
   21px/3px default (tuned for its bundled MS Sans Serif, not our much
   larger custom face - see the li[role=tab] comment above for the same
   issue). `input.text-input` matches 98.css's own `input[type="text"]` etc.
   selectors' specificity exactly (element + one class/attribute each) -
   this file loading after 98.css (see main.tsx) is what lets the cascade
   pick this over that instead of needing !important. */
input[type=email], input[type=number], input[type=password], input[type=search], input[type=tel], input[type=text], input[type=url] {
  width: 100%;
  /* height: 32px; */
  padding: 16px 8px;
  font-size: var(--fs-md);
}

/* ===== ICONS =====
   Single-color SVGs from /img/ui/svg recolored via CSS mask, so callers pick
   the color with --icon-color instead of shipping one file per color. */
.icon {
  display: inline-block;
  flex: none;
  width: var(--icon-size, 16px);
  height: var(--icon-size, 16px);
  background-color: var(--icon-color, var(--text));
  -webkit-mask-image: var(--icon-src);
  mask-image: var(--icon-src);
  -webkit-mask-repeat: no-repeat;
  mask-repeat: no-repeat;
  -webkit-mask-position: center;
  mask-position: center;
  -webkit-mask-size: contain;
  mask-size: contain;
}

/* ===== SCROLLABLE LISTS =====
   Add alongside any overflow-y: auto container (device grid, upgrade cards,
   achievements list, ...) to hint there's more content below via a bottom
   gradient - no wrapper markup or extra DOM node needed, just this class on
   the scrolling element itself.
   This has to be `position: sticky`, not `absolute`: an absolutely
   positioned box's containing block is the scroll container's padding box,
   but that box still scrolls along with the rest of its content (it's part
   of the same scrollable-overflow region) - so an `absolute; bottom: 0`
   pseudo-element ends up pinned to the bottom of the *content*, and scrolls
   with everything else instead of staying visible. `sticky` is the one
   positioning scheme built to stick to a scrollport edge while its
   scrolling ancestor moves underneath it. As a real (last-child, in-flow)
   box it would normally add its own height to the scrollable area, so
   `margin-top` cancels that out - the two sum to a zero-height margin box,
   overlapping the last 20px of real content instead of appending past it,
   right up until scrolling brings it to the container's bottom edge, where
   it sticks.
   Only works with the scrolling element's children in normal block flow
   (this pseudo-element becomes an ordinary last flow child) - a flex row
   container needs `flex-direction: column` (or equivalent) for this to
   stack below its content instead of sitting beside it; see
   DeviceGrid.module.css's compact 2-column mode.
   --scroll-fade-display lets a container that only *sometimes* scrolls
   (e.g. DeviceGrid's 2-column layout below a max-height breakpoint, vs. its
   non-scrolling 3x3 square above it) suppress the pseudo-element from its
   own CSS for the states where it doesn't apply, without fighting this
   rule's cascade order or duplicating the gradient.
   --scroll-fade-inset-x/-bottom (both 0 by default, matching an unpadded
   scroll container like the achievements list's) let a scrolling element
   that carries its own padding (e.g. .upgList's 12px) pull the fade
   out past it - a bare `bottom: 0`/`width: 100%` here reads relative to
   sticky's own containing block, not that padding, so without this the fade
   would visibly stop short of the container's true edges by the padding
   amount instead of reaching them. */
.scrollFade::after {
  content: '';
  display: var(--scroll-fade-display, block);
  position: sticky;
  bottom: calc(var(--scroll-fade-inset-bottom, 0px) * -1);
  left: calc(var(--scroll-fade-inset-x, 0px) * -1);
  width: calc(100% + var(--scroll-fade-inset-x, 0px) * 2);
  height: 20px;
  margin-top: -20px;
  margin-bottom: calc(var(--scroll-fade-inset-bottom, 0px) * -1);
  background: linear-gradient(to bottom, transparent, var(--surface));
  pointer-events: none;
  z-index: 1;
  transition: opacity 0.15s;
}
/* Nothing left to scroll to (at the bottom, or no overflow at all) - set by
   lib/scrollFade.ts, so the fade never covers the last row of content. */
.scrollFade.scrollFadeEnd::after {
  opacity: 0;
}

/* ===== MOBILE ===== */
@media (max-width: 768px) {
  :root {
    --right-w: 0px;
    --taskbar-h: 50px;
  }

  body {
    overflow: auto;
  }

  .title-bar-controls button {
    min-width: 34px;
    min-height: 34px;
  }
  .title-bar-controls button[aria-label="Close"],
  .title-bar-controls button[aria-label].close {
    background-position: center;
    background-size: 16px;
  }
}
/* Page-load intro for the main blocks - see lib/intro.ts. Fill mode is
   `backwards`, not `both`: a transform left on these after the animation
   would turn them into containing blocks for position: fixed descendants.
   Translate only, no scale - DeviceGrid measures its window on mount. */
@keyframes intro-down { from { opacity: 0; transform: translateY(-24px); } }
@keyframes intro-up { from { opacity: 0; transform: translateY(24px); } }
@keyframes intro-fade { from { opacity: 0; transform: translateY(8px); } }
.intro-down,
.intro-up,
.intro-fade {
  animation: 0.5s cubic-bezier(0.2, 0.8, 0.2, 1) var(--intro-delay, 0s) backwards;
}
.intro-down { animation-name: intro-down; }
.intro-up { animation-name: intro-up; }
.intro-fade { animation-name: intro-fade; }
@media (prefers-reduced-motion: reduce) {
  .intro-down,
  .intro-up,
  .intro-fade { animation: none; }
}
