mirror of
https://github.com/NaitLee/Cat-Printer.git
synced 2025-05-16 07:10:30 -07:00
611 lines
15 KiB
CSS
611 lines
15 KiB
CSS
|
|
:root {
|
|
--font-size: 1.2rem;
|
|
/* --dpi-zoom: 0.96; */
|
|
--deco-size: calc(var(--font-size) / 2);
|
|
--line-height: calc(var(--font-size) / 2 * 3);
|
|
--compact-menu-height: 2em;
|
|
--span: 8px;
|
|
--span-half: calc(var(--span) / 2);
|
|
--span-double: calc(var(--span) * 2);
|
|
--border: 1px;
|
|
--border-double: calc(var(--border) * 2);
|
|
--paper-width: 384px;
|
|
--anim-time: 0.5s;
|
|
--fore-color: #111;
|
|
--back-color: #eee;
|
|
--canvas-back: #fff;
|
|
--curve: cubic-bezier(.08,.82,.17,1);
|
|
--panel-height: 20em;
|
|
--target-color: rgba(0, 255, 255, 0.2);
|
|
--notice-wait: rgba(0, 128, 255, 0.2);
|
|
--notice-note: rgba(0, 255, 0, 0.2);
|
|
--notice-warn: rgba(255, 128, 0, 0.2);
|
|
--notice-error: rgba(255, 0, 0, 0.2);
|
|
--shade: rgba(238, 238, 238, 0.5);
|
|
}
|
|
|
|
body {
|
|
border: none;
|
|
background-color: var(--back-color);
|
|
color: var(--fore-color);
|
|
font-size: var(--font-size);
|
|
line-height: var(--line-height);
|
|
font-family: 'Noto Sans', 'Segoe UI', sans-serif;
|
|
overflow: auto;
|
|
margin: 1em 0;
|
|
user-select: none;
|
|
}
|
|
h1, h2 {
|
|
font-weight: normal;
|
|
margin: var(--span-half) 0;
|
|
}
|
|
h1 { font-size: 1.5em; }
|
|
h2 { font-size: 1.2em; }
|
|
a:link, a:visited {
|
|
color: #33f;
|
|
}
|
|
a:hover, a:active {
|
|
color: #22f;
|
|
}
|
|
a+a {
|
|
margin-left: var(--font-size);
|
|
}
|
|
|
|
.center {
|
|
text-align: center;
|
|
}
|
|
button, input, select, textarea, label {
|
|
font: inherit;
|
|
color: var(--fore-color);
|
|
/* background-color: var(--back-color); */
|
|
background-color: transparent;
|
|
display: inline-block;
|
|
}
|
|
select[multiple] {
|
|
width: 8em;
|
|
padding: var(--border);
|
|
margin: var(--span-half) var(--span);
|
|
}
|
|
button, input[type="number"], input[type="text"], select {
|
|
margin: var(--span-half) var(--span);
|
|
border: var(--border) solid var(--fore-color);
|
|
padding: var(--span-half) var(--span);
|
|
transition: all var(--anim-time) var(--curve);
|
|
cursor: pointer;
|
|
min-width: 6em;
|
|
line-height: calc(var(--font-size) + var(--span));
|
|
}
|
|
input[type="number"], input[type="text"] {
|
|
width: 6em;
|
|
cursor: text;
|
|
}
|
|
button:hover {
|
|
margin: 0;
|
|
padding: var(--span) calc(var(--span-double));
|
|
min-width: calc(6em + var(--span-double));
|
|
}
|
|
button:active {
|
|
box-shadow: 0 0 var(--span) inset var(--fore-color);
|
|
}
|
|
@keyframes notice-fade {
|
|
to { background-color: transparent; border-color: transparent; }
|
|
}
|
|
@keyframes notice-wait {
|
|
50% { background-color: transparent; border-color: transparent; }
|
|
}
|
|
#notice {
|
|
min-height: var(--font-size);
|
|
margin: var(--span-half) 0;
|
|
}
|
|
#notice span {
|
|
display: block;
|
|
}
|
|
#notice .note {
|
|
background-color: var(--notice-note);
|
|
animation: notice-fade 1s ease-out 1s 1 forwards;
|
|
}
|
|
#notice .wait {
|
|
background-color: var(--notice-wait);
|
|
animation: notice-wait 2s ease-in-out 0s infinite forwards;
|
|
}
|
|
#notice .warn {
|
|
background-color: var(--notice-warn);
|
|
animation: notice-fade 1s ease-out 1s 1 forwards;
|
|
}
|
|
#notice .error {
|
|
background-color: var(--notice-error);
|
|
animation: notice-fade 1s ease-out 1s 1 forwards;
|
|
}
|
|
#button-exit {
|
|
background-color: var(--notice-warn);
|
|
}
|
|
.noscript {
|
|
margin: var(--span-double);
|
|
text-align: center;
|
|
background-color: var(--notice-error);
|
|
display: block;
|
|
}
|
|
main, header, footer {
|
|
max-width: 45em;
|
|
margin: 1em auto;
|
|
display: flex;
|
|
flex-direction: row;
|
|
}
|
|
main>.canvas-side {
|
|
flex-grow: 0;
|
|
margin: 0 auto;
|
|
height: 100%;
|
|
overflow: auto;
|
|
text-align: center;
|
|
min-width: calc(var(--paper-width) + var(--border-double) + var(--span-double));
|
|
}
|
|
main>.menu-side {
|
|
flex-grow: 1;
|
|
position: sticky;
|
|
top: 0;
|
|
height: 100%;
|
|
/* overflow: auto; */
|
|
margin: var(--span);
|
|
min-width: 12em;
|
|
}
|
|
main>.menu-side>.menu {
|
|
border: var(--border) solid var(--fore-color);
|
|
border-bottom: none;
|
|
margin-top: var(--span);
|
|
}
|
|
.compact-menu {
|
|
display: flex;
|
|
flex-direction: row;
|
|
justify-content: space-around;
|
|
background-color: var(--back-color);
|
|
}
|
|
.compact-button {
|
|
width: max-content;
|
|
height: var(--compact-menu-height);
|
|
flex-grow: 1;
|
|
line-height: var(--compact-menu-height);
|
|
text-align: center;
|
|
cursor: pointer;
|
|
border: none;
|
|
border-top: var(--border) solid var(--fore-color);
|
|
border-bottom: var(--border) solid transparent;
|
|
padding: 0;
|
|
margin: 0;
|
|
}
|
|
.compact-button:hover {
|
|
margin: 0;
|
|
padding: 0 var(--span) calc(var(--span-double));
|
|
min-width: 6em;
|
|
}
|
|
.compact-button.active {
|
|
border: var(--border) solid var(--fore-color);
|
|
border-top: var(--border) solid transparent;
|
|
}
|
|
canvas#preview, canvas#control-canvas, #control-document {
|
|
border: var(--border) solid var(--fore-color);
|
|
background-color: var(--canvas-back);
|
|
width: var(--paper-width);
|
|
display: inline-block;
|
|
}
|
|
#control-document {
|
|
font: initial;
|
|
font-size: 16px;
|
|
font-family: 'Unifont';
|
|
text-align: initial;
|
|
color: #000;
|
|
}
|
|
#control-document.normal-font {
|
|
font-family: inherit;
|
|
font-size: inherit;
|
|
}
|
|
canvas#preview {
|
|
z-index: 0;
|
|
}
|
|
canvas#control-canvas,
|
|
#control-document {
|
|
position: absolute;
|
|
opacity: 0;
|
|
transition: opacity var(--anim-time) var(--curve);
|
|
z-index: 1;
|
|
}
|
|
canvas#control-canvas:hover,
|
|
#control-document:hover {
|
|
opacity: 1;
|
|
}
|
|
canvas#control-canvas.disabled,
|
|
#control-document.disabled {
|
|
display: none;
|
|
}
|
|
p {
|
|
margin: var(--span) 0;
|
|
}
|
|
.panel {
|
|
overflow: hidden;
|
|
height: 0;
|
|
}
|
|
.panel.active {
|
|
height: calc(var(--panel-height) - var(--compact-menu-height));
|
|
padding: var(--span-double) var(--span);
|
|
box-sizing: border-box;
|
|
/* overflow-y: scroll; */
|
|
}
|
|
.panel.sub.active {
|
|
height: calc(var(--panel-height) / 2);
|
|
}
|
|
input[type="range"] {
|
|
width: 10em;
|
|
vertical-align: middle;
|
|
content: attr(value);
|
|
}
|
|
@keyframes hint {
|
|
0% { box-shadow: 0 0 var(--span-) inset transparent; }
|
|
50% { box-shadow: 0 0 var(--span) inset var(--fore-color); }
|
|
100% { box-shadow: 0 0 var(--span) inset transparent; }
|
|
}
|
|
.hint {
|
|
animation: hint 3s ease-out 0.1s infinite;
|
|
}
|
|
.hidden {
|
|
/* visibility: hidden; */
|
|
height: 0;
|
|
overflow: hidden;
|
|
opacity: 0;
|
|
pointer-events: none;
|
|
}
|
|
#hidden, .hard-hidden {
|
|
display: none;
|
|
}
|
|
#error-record {
|
|
font-family: 'DejaVu Sans Mono', 'Consolas', monospace;
|
|
width: 100%;
|
|
font-size: 1rem;
|
|
overflow: auto;
|
|
white-space: pre;
|
|
height: calc(var(--panel-height) - var(--border-double) * 4);
|
|
}
|
|
.table-wrap {
|
|
overflow-x: auto;
|
|
width: 100%;
|
|
}
|
|
table#jslicense-labels1 {
|
|
min-width: 40em;
|
|
}
|
|
table#jslicense-labels1 td {
|
|
padding: var(--span-half) var(--span);
|
|
}
|
|
*:target {
|
|
background-color: var(--target-color);
|
|
}
|
|
dl {
|
|
margin: var(--span) 0;
|
|
display: block;
|
|
}
|
|
dd { display: inline; }
|
|
dd+dd { margin-left: var(--font-size); }
|
|
hr {
|
|
border: none;
|
|
border-top: var(--border) solid var(--fore-color);
|
|
}
|
|
iframe#frame {
|
|
width: 100%;
|
|
height: 12em;
|
|
border: none;
|
|
background-color: transparent;
|
|
}
|
|
.blank {
|
|
height: 0em;
|
|
}
|
|
.shade {
|
|
position: fixed;
|
|
width: 100%;
|
|
height: 100%;
|
|
top: 0;
|
|
left: 0;
|
|
background-color: var(--back-color);
|
|
opacity: 0.95;
|
|
z-index: -1;
|
|
}
|
|
#dialog {
|
|
position: fixed;
|
|
width: 100%;
|
|
top: 16%;
|
|
text-align: center;
|
|
z-index: 2;
|
|
opacity: 2;
|
|
transition: opacity var(--anim-time) var(--curve);
|
|
}
|
|
#dialog>.content {
|
|
max-width: 100%;
|
|
width: 40em;
|
|
margin: auto;
|
|
box-sizing: border-box;
|
|
border: var(--border) solid var(--fore-color);
|
|
transition: transform var(--anim-time) var(--curve);
|
|
transform-origin: center 33%;
|
|
}
|
|
#dialog.hidden {
|
|
opacity: 0;
|
|
height: unset;
|
|
}
|
|
#dialog.hidden>.content {
|
|
transform: scaleY(0);
|
|
}
|
|
#dialog-content {
|
|
/* height: 12em; */
|
|
max-height: 640px;
|
|
margin: auto;
|
|
padding: var(--span);
|
|
padding-bottom: 0;
|
|
display: flex;
|
|
flex-direction: column;
|
|
justify-content: center;
|
|
}
|
|
#dialog-choices {
|
|
margin: auto;
|
|
padding: var(--span);
|
|
padding-top: 0;
|
|
}
|
|
#choice-input {
|
|
max-width: 100%;
|
|
width: 16em;
|
|
}
|
|
#accessibility {
|
|
text-align: initial;
|
|
display: flex;
|
|
flex-direction: row;
|
|
}
|
|
#accessibility>*:nth-child(1) {
|
|
flex-grow: 1;
|
|
}
|
|
#select-language {
|
|
width: calc(100% - var(--span-double));
|
|
height: 8em;
|
|
border: var(--border) solid var(--fore-color);
|
|
padding: var(--span);
|
|
margin: 0 var(--span);
|
|
box-sizing: border-box;
|
|
}
|
|
#select-language option {
|
|
cursor: pointer;
|
|
}
|
|
#select-language option:hover {
|
|
text-decoration: underline;
|
|
}
|
|
#accessibility>*:nth-child(2) {
|
|
flex-grow: 1;
|
|
white-space: nowrap;
|
|
}
|
|
@keyframes jump {
|
|
0% { transform: translateY(0); }
|
|
50% { transform: translateY(var(--font-size)); }
|
|
100% { transform: translateY(0); }
|
|
}
|
|
#loading-screen {
|
|
position: fixed;
|
|
top: 0;
|
|
left: 0;
|
|
width: 100%;
|
|
height: 100%;
|
|
background-color: var(--back-color);
|
|
display: flex;
|
|
flex-direction: column;
|
|
justify-content: center;
|
|
text-align: center;
|
|
z-index: 1;
|
|
opacity: 1;
|
|
transition: opacity var(--anim-time) var(--curve);
|
|
}
|
|
.logo {
|
|
background-image: url('icon.svg');
|
|
background-position: center;
|
|
background-repeat: no-repeat;
|
|
background-size: contain;
|
|
width: 80%;
|
|
max-width: 16em;
|
|
height: 80%;
|
|
max-height: 16em;
|
|
margin: 0 auto;
|
|
}
|
|
#loading-screen.hidden {
|
|
opacity: 0;
|
|
}
|
|
#loading-screen>.dots {
|
|
display: flex;
|
|
flex-direction: row;
|
|
justify-content: center;
|
|
}
|
|
#loading-screen>.dots>span {
|
|
display: inline-block;
|
|
width: var(--font-size);
|
|
height: var(--font-size);
|
|
margin: var(--font-size);
|
|
background-color: var(--fore-color);
|
|
border-radius: calc(var(--font-size) / 2);
|
|
animation: jump 1s ease 0s infinite;
|
|
}
|
|
#loading-screen>.dots>span:nth-child(1) { animation-delay: 0s; }
|
|
#loading-screen>.dots>span:nth-child(2) { animation-delay: 0.3s; }
|
|
#loading-screen>.dots>span:nth-child(3) { animation-delay: 0.6s; }
|
|
|
|
#keyboard-shortcuts-layer {
|
|
position: fixed;
|
|
top: 0;
|
|
left: 0;
|
|
width: 100%;
|
|
overflow: visible;
|
|
pointer-events: all;
|
|
z-index: 2;
|
|
}
|
|
#keyboard-shortcuts-layer span {
|
|
display: inline-block;
|
|
position: absolute;
|
|
/* border: var(--border) dotted var(--fore-color); */
|
|
background-color: var(--shade);
|
|
padding: var(--span-half) var(--span);
|
|
white-space: pre;
|
|
line-height: 1em;
|
|
font-family: 'DejaVu Sans Mono', 'Consolas', monospace;
|
|
transform: translate(-1em, calc(var(--font-size) * -1));
|
|
}
|
|
|
|
a {
|
|
transition: all var(--anim-time) ease-out;
|
|
}
|
|
@keyframes delay-scrollable {
|
|
from { overflow: hidden; }
|
|
to { overflow: auto; }
|
|
}
|
|
|
|
@media (max-height: 520px) {
|
|
body, main { margin: 0 auto; }
|
|
}
|
|
|
|
@media (max-width: 767.5px) {
|
|
/* My test shows it's Just 768 fit best */
|
|
:root {
|
|
--panel-height: 16em;
|
|
--font-size: 1em;
|
|
}
|
|
main {
|
|
flex-direction: column;
|
|
}
|
|
#title { display: none; }
|
|
main>.canvas-side {
|
|
min-width: unset;
|
|
width: 100%;
|
|
overflow-x: hidden;
|
|
overflow-y: auto;
|
|
position: fixed;
|
|
top: calc(var(--line-height) + var(--span));
|
|
height: calc(100% - var(--panel-height) - var(--compact-menu-height));
|
|
z-index: 0;
|
|
}
|
|
main>.canvas-side>.buttons,
|
|
main>.menu-side>.buttons {
|
|
position: sticky;
|
|
bottom: var(--compact-menu-height);
|
|
width: 100%;
|
|
z-index: 1;
|
|
}
|
|
main>.canvas-side>.buttons button,
|
|
main>.menu-side>.buttons button {
|
|
background-color: var(--back-color);
|
|
}
|
|
main>.menu-side {
|
|
overflow-x: hidden;
|
|
overflow-y: auto;
|
|
position: fixed;
|
|
background-color: var(--back-color);
|
|
top: unset;
|
|
bottom: 0;
|
|
left: 0;
|
|
height: var(--panel-height);
|
|
margin: 0;
|
|
width: 100%;
|
|
box-sizing: border-box;
|
|
}
|
|
main>.menu-side>.menu {
|
|
height: calc(var(--panel-height) - var(--compact-menu-height));
|
|
margin: 0;
|
|
}
|
|
#notice {
|
|
position: fixed;
|
|
top: 0;
|
|
width: 100%;
|
|
}
|
|
main>.menu-side>.compact-menu {
|
|
position: fixed;
|
|
bottom: 0;
|
|
width: 100%;
|
|
z-index: 0;
|
|
}
|
|
.blank {
|
|
height: var(--compact-menu-height);
|
|
}
|
|
}
|
|
@media (max-width: 384px) {
|
|
canvas#preview, canvas#control-canvas, #control-document {
|
|
width: 100%;
|
|
box-sizing: border-box;
|
|
}
|
|
}
|
|
|
|
/* @media (min-resolution: 120dpi) {
|
|
:root { --font-size: calc(1.2rem * var(--dpi-zoom)); }
|
|
}
|
|
@media (min-resolution: 144dpi) {
|
|
:root { --font-size: calc(1.2rem * var(--dpi-zoom) * var(--dpi-zoom)); }
|
|
} */
|
|
|
|
@media (prefers-color-scheme: dark) {
|
|
:root { --fore-color: #eee; --back-color: #333; --shade: rgba(51, 51, 51, 0.5); }
|
|
body, .shade { transition: background-color calc(var(--anim-time) * 2) ease-in; }
|
|
a:link, a:visited { color: #66f; }
|
|
a:hover, a:active { color: #77f; }
|
|
canvas#preview, canvas#control-canvas,
|
|
#control-document, .logo { filter: brightness(0.6); }
|
|
}
|
|
/* so silly... */
|
|
body.dark { --fore-color: #eee; --back-color: #333; --shade: rgba(51, 51, 51, 0.5); }
|
|
body.dark, .shade { transition: background-color calc(var(--anim-time) * 2) ease-in; }
|
|
body.dark a:link, body.dark a:visited { color: #66f; }
|
|
body.dark a:hover, body.dark a:active { color: #77f; }
|
|
body.dark canvas#preview, body.dark canvas#control-canvas,
|
|
body.dark #control-document, body.dark .logo { filter: brightness(0.6); }
|
|
@media (prefers-reduced-motion) {
|
|
body *,
|
|
body *::before,
|
|
body *::after {
|
|
transition-duration: 0ms !important;
|
|
transition: none;
|
|
animation-timing-function: steps(1);
|
|
animation-duration: 0ms !important;
|
|
}
|
|
}
|
|
/* but i have no way... */
|
|
body.no-animation *,
|
|
body.no-animation *::before,
|
|
body.no-animation *::after {
|
|
transition-duration: 0ms !important;
|
|
transition: none;
|
|
animation-timing-function: steps(1);
|
|
animation-duration: 0ms !important;
|
|
}
|
|
|
|
body.large-font,
|
|
#large-font+label {
|
|
font-size: calc(var(--font-size) * 1.2);
|
|
line-height: calc(var(--line-height) * 1.2);
|
|
}
|
|
|
|
body.force-rtl,
|
|
#force-rtl+label {
|
|
direction: rtl;
|
|
}
|
|
.force-ltr {
|
|
direction: ltr;
|
|
}
|
|
body.high-contrast {
|
|
--border: 2px;
|
|
--fore-color: #fff;
|
|
--back-color: #000;
|
|
--target-color: transparent;
|
|
--notice-wait: transparent;
|
|
--notice-note: transparent;
|
|
--notice-warn: transparent;
|
|
--notice-error: transparent;
|
|
--shade: rgba(0, 0, 0, 0.8);
|
|
transition-duration: 0s;
|
|
}
|
|
body.high-contrast .shade { transition-duration: 0s; opacity: 1; }
|
|
/* body.high-contrast * { background-color: var(--back-color); } */
|
|
body.high-contrast .logo, canvas { filter: unset !important; }
|
|
body.high-contrast #notice * { border: var(--border) dashed var(--fore-color); }
|
|
body.high-contrast a:any-link { color: #00f; }
|
|
|
|
@font-face {
|
|
font-family: 'Unifont';
|
|
src: local('Unifont') url('unifont.ttf') url('unifont.otf');
|
|
}
|