add crt-ish css and change font

ptr.pet 1f371223 fc984fe0

verified
Changed files
+207 -6
www
www/public/Web437_EverexME_5x8.woff

This is a binary file and will not be displayed.

+11 -4
www/src/main.ts
··· 46 46 }); 47 47 }; 48 48 49 + await document.fonts.load("16px EverexME"); 50 + 49 51 const term = new Terminal({ 50 52 cursorBlink: true, 51 - cursorStyle: "bar", 53 + cursorStyle: "block", 52 54 cursorInactiveStyle: "block", 53 - fontFamily: '"Comic Mono", monospace', 54 - fontSize: 15, 55 + customGlyphs: true, 56 + fontFamily: "EverexME", 57 + fontSize: 16, 58 + lineHeight: 1, 59 + letterSpacing: 0, 55 60 scrollback: 100000, 56 61 theme: { 57 62 background: "#000000", ··· 313 318 } 314 319 }; 315 320 316 - // 1. Setup Input Handler immediately so terminal isn't blocked 317 321 term.onData(async (e) => { 318 322 // SEARCH MODE INPUT 319 323 if (searchState !== "none" && e >= " " && e <= "~") { ··· 664 668 .catch((e) => { 665 669 term.write(`\r\n\x1b[31mfatal: failed to load engine: ${e}\x1b[0m\r\n`); 666 670 }); 671 + 672 + fitAddon.fit(); 673 + // setTimeout(() => fitAddon.fit(), 1000); 667 674 } 668 675 669 676 bootstrap().catch(console.error);
+196 -2
www/src/style.css
··· 1 + @font-face { 2 + font-family: "EverexME"; 3 + src: url("/Web437_EverexME_5x8.woff") format("woff"); 4 + font-weight: normal; 5 + font-style: normal; 6 + } 7 + 8 + :root { 9 + --screen-background: #121010; 10 + 11 + --flicker-opacity: 0.3; 12 + --flicker-speed: 0.1s; 13 + 14 + --scanline-opacity: 0.25; 15 + --scanline-size: 2px; 16 + 17 + --rgb-red-opacity: 0.12; 18 + --rgb-green-opacity: 0.08; 19 + --rgb-blue-opacity: 0.18; 20 + --rgb-stripe-size: 3px; 21 + 22 + --crt-contrast: 1; 23 + --crt-brightness: 1.2; 24 + --crt-saturation: 1.3; 25 + } 26 + 1 27 body { 2 28 margin: 0; 3 29 padding: 0; 4 - background-color: #000000; 30 + background-color: var(--screen-background); 5 31 height: 100vh; 6 32 width: 100vw; 7 33 overflow: hidden; 8 34 } 9 35 36 + @keyframes flicker { 37 + 0% { 38 + opacity: 0.27861; 39 + } 40 + 3% { 41 + opacity: 0.34769; 42 + } 43 + 6% { 44 + opacity: 0.23604; 45 + } 46 + 7% { 47 + opacity: 0.90626; 48 + } 49 + 8% { 50 + opacity: 0.18128; 51 + } 52 + 11% { 53 + opacity: 0.83891; 54 + } 55 + 19% { 56 + opacity: 0.65583; 57 + } 58 + 20% { 59 + opacity: 0.67807; 60 + } 61 + 24% { 62 + opacity: 0.26559; 63 + } 64 + 27% { 65 + opacity: 0.84693; 66 + } 67 + 40% { 68 + opacity: 0.96019; 69 + } 70 + 41% { 71 + opacity: 0.08594; 72 + } 73 + 43% { 74 + opacity: 0.20313; 75 + } 76 + 53% { 77 + opacity: 0.71988; 78 + } 79 + 57% { 80 + opacity: 0.53455; 81 + } 82 + 64% { 83 + opacity: 0.37288; 84 + } 85 + 68% { 86 + opacity: 0.71428; 87 + } 88 + 76% { 89 + opacity: 0.70419; 90 + } 91 + 81% { 92 + opacity: 0.7003; 93 + } 94 + 86% { 95 + opacity: 0.36108; 96 + } 97 + 95% { 98 + opacity: 0.24387; 99 + } 100 + 100% { 101 + opacity: 0.27861; 102 + } 103 + } 104 + 105 + @keyframes flicker-speed { 106 + 0% { 107 + animation-duration: 0.12s; 108 + } 109 + 10% { 110 + animation-duration: 0.08s; 111 + } 112 + 20% { 113 + animation-duration: 0.15s; 114 + } 115 + 30% { 116 + animation-duration: 0.09s; 117 + } 118 + 40% { 119 + animation-duration: 0.13s; 120 + } 121 + 50% { 122 + animation-duration: 0.11s; 123 + } 124 + 60% { 125 + animation-duration: 0.14s; 126 + } 127 + 70% { 128 + animation-duration: 0.07s; 129 + } 130 + 80% { 131 + animation-duration: 0.16s; 132 + } 133 + 90% { 134 + animation-duration: 0.1s; 135 + } 136 + 100% { 137 + animation-duration: 0.12s; 138 + } 139 + } 140 + 10 141 #terminal { 142 + font-family: "EverexME", monospace; 143 + font-size: 16px; 144 + 145 + image-rendering: pixelated; 146 + -webkit-font-smoothing: none; 147 + -moz-osx-font-smoothing: grayscale; 148 + font-smooth: never; 149 + 150 + position: relative; 151 + overflow: hidden; 152 + filter: contrast(var(--crt-contrast)) brightness(var(--crt-brightness)) 153 + saturate(var(--crt-saturation)); 154 + 155 + width: 100vw; 11 156 height: 100vh; 12 - width: 100vw; 157 + } 158 + 159 + #terminal::after { 160 + content: " "; 161 + display: block; 162 + position: absolute; 163 + top: 0; 164 + left: 0; 165 + bottom: 0; 166 + right: 0; 167 + background: rgba(18, 16, 16, var(--flicker-opacity)); 168 + opacity: 0; 169 + z-index: 2; 170 + pointer-events: none; 171 + animation: 172 + flicker var(--flicker-speed) steps(2, jump-none) infinite, 173 + flicker-speed 3.7s steps(10, jump-none) infinite; 174 + } 175 + 176 + @media (prefers-reduced-motion: reduce) { 177 + #terminal::after { 178 + animation: none; 179 + opacity: 0.1; 180 + } 181 + } 182 + 183 + #terminal::before { 184 + content: " "; 185 + display: block; 186 + position: absolute; 187 + top: 0; 188 + left: 0; 189 + bottom: 0; 190 + right: 0; 191 + background: 192 + linear-gradient( 193 + rgba(18, 16, 16, 0) 50%, 194 + rgba(0, 0, 0, var(--scanline-opacity)) 50% 195 + ), 196 + linear-gradient( 197 + 90deg, 198 + rgba(255, 0, 0, var(--rgb-red-opacity)), 199 + rgba(0, 255, 0, var(--rgb-green-opacity)), 200 + rgba(0, 0, 255, var(--rgb-blue-opacity)) 201 + ); 202 + z-index: 2; 203 + background-size: 204 + 100% var(--scanline-size), 205 + var(--rgb-stripe-size) 100%; 206 + pointer-events: none; 13 207 }