make8bitart.com
at main 665 lines 21 kB view raw
1<!DOCTYPE html> 2<html lang="en"> 3 <head> 4 <meta charset="UTF-8" /> 5 <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 6 <meta 7 name="description" 8 content="make8bitart.com is a fun free in-browser pixel art tool for you!" 9 /> 10 <meta 11 property="og:description" 12 content="make8bitart.com is a fun free in-browser pixel art tool for you!" 13 /> 14 <meta 15 property="og:image" 16 content="https://make8bitart.com/assets/brighton.png" 17 /> 18 <meta property="og:title" content="make 8-bit art!" /> 19 <title>make 8-bit art!</title> 20 <link 21 rel="preload" 22 href="/assets/fonts/8bit-Art-Sans-subset.woff2" 23 as="font" 24 type="font/woff2" 25 crossorigin 26 /> 27 <link 28 rel="preload" 29 href="/assets/fonts/VT323-Regular-subset.woff2" 30 as="font" 31 type="font/woff2" 32 crossorigin 33 /> 34 <link rel="stylesheet" href="make8bitart.min.css" /> 35 <link rel="icon" href="/assets/brighton.png" /> 36 <link rel="manifest" href="/manifest.json" /> 37 <meta name="theme-color" content="#00ffff" /> 38 <script src="app.min.js" defer></script> 39 <script 40 defer 41 data-domain="make8bitart.com" 42 src="https://plausible.io/js/script.js" 43 ></script> 44 </head> 45 46 <!-- 47 ____ 48 ___ .-~. /_"-._ 49 `-._~-. / /_ "~o\ :Y 50 \ \ / : \~x. ` ') 51 ] Y / | Y< ~-.__j ------------------------- 52 / ! _.--~T : l l< /.-~ / \ 53 / / ____.--~ . ` l /~\ \<|Y -----\ JENN SCHIFFER MADE THIS | 54 / / .-~~" /| . ',-~\ \L| \ WOWOWOWOWOWOWOWOW 😈 / 55 / / / .^ \ Y~Y \.^>/l_ "--' \________________________/ 56 / Y .-"( . l__ j_j l_/ /~_.-~ . 57 Y l / \ ) ~~~." / `/"~ / \.__/l_ 58 | \ _.-" ~-{__ l : l._Z~-.___.--~ 59 | ~---~ / ~~"---\_ ' __[> 60 l . _.^ ___ _>-y~ 61 \ \ . .-~ .-~ ~>--" / 62 \ ~---" / ./ _.-' 63 "-.,_____.,_ _.--~\ _.-~ 64 ~~ ( _} 65 `. ~( 66 ) \ 67 /,`--'~\--' 68--> 69 70 <body id="gravity-and-time-are-social-constructs"> 71 <!-- 72 .--.__ 73 .~ (@) ~~~---_ 74 { `-_~,,,,,,) 75 { (_ ', ---- haha nope 76 ~ . = _', 77 ~- '. =-' 78 ~ : 79 . _,.-~ (''); 80 '. .-~ \ \ ; 81 ':-_ _.--~ \ \; _-=,. 82 ~-:-.__ _.-~ { '---- _'-=,. 83 ~-._~--._ __.-~ ~---------=,.` 84 ~~-._~~-----~~~~~~ .+++~~~~~~~~-__ / 85 ~-.,____ { - + } _/ 86 ~~-.______{_ _ -=\ / /_.~ 87 : ~--~ // / ..- 88 : / / // / (( 89 : / / { `-------,. )) 90 : / ''=--------. }o 91 .=._________,' ) )) 92 ) _________ -'' ~~ 93 / / _ _ 94 (_.-.'O'-'. HEADER INFO --> 95 96 <header id="header" class="draggydiv" title="make 8-bit art!" role="banner"> 97 <div class="menu"> 98 <button 99 role="button" 100 class="draggydivs-drag" 101 aria-label="move this box" 102 > 103 &#10021; 104 </button> 105 </div> 106 <main> 107 <div class="inner"> 108 <h1>make 8-bit art!</h1> 109 <ul id="draggydivs-minimized"></ul> 110 </div> 111 </main> 112 </header> 113 114 <!-- 115 _..--+~/@-~--. 116 _-=~ ( . ' 117 _-~ _.--=.\ \'''' --- BOOTY HAD ME LIKE... 118 _~ _- \ \_\ 119 = _= '--' 120 ' = . 121 : : ____ '=_. ___ 122 ___ | ; ____ '~--.~. 123 ; ; _____ } | 124 ___= \ ___ __ __..-...__ ___/__/__ 125 : =_ _.-~~ ~~--.__ 126 _____ \ ~-+-~ ___~=_______ 127 ~@#~~ == ...______ __ ___ _--~~--_ SOCIAL LINKS 128--> 129 130 <section 131 id="what" 132 class="draggydiv draggydivs-init-closed" 133 title="what is this?" 134 data-title="what" 135 > 136 <div class="menu"> 137 <button 138 role="button" 139 class="draggydivs-drag" 140 aria-label="move this box" 141 > 142 &#10021; 143 </button> 144 145 <button 146 role="button" 147 class="draggydivs-minimize" 148 aria-label="minimize this box" 149 > 150 &#10799; 151 </button> 152 </div> 153 154 <h2>what is this?</h2> 155 156 <p> 157 this is a free web-based pixel art drawing tool by 158 <a 159 href="https://jennschiffer.com" 160 title="official website of" 161 target="_blank" 162 >jenn schiffer</a 163 >! 164 </p> 165 166 <p> 167 if you make something cool, i wanna see it – find me on bluesky 168 <a rel="me" href="https://bsky.app/profile/jennschiffer.com" 169 >@jennschiffer.com</a 170 > 171 or email hi@jennschiffer.com! 172 </p> 173 </section> 174 175 <!-- 176 . . 177 / `. .' \ 178 .---. < > < > .---. 179 | \ \ - ~ ~ - / / | 180 ~-..-~ ~-..-~ 181 \~~~\.' `./~~~/ 182 \__/ \__/ 183 / .- . \ 184 _._ _.- .-~ ~-. / } \/~~~/ 185 _.-'q }~ / } { ; \__/ 186 butts --- {'__, / ( / { / `. ,~~| . . 187 `''''='~~-.__( /_ | /- _ `..-' \\ // 188 / \ =/ ~~--~~{ ./| ~-. `-..__\\_//_.-' 189 { \ +\ \ =\ ( ~ - . _ _ _..---~ 190 | | { } \ \_\ 191 '---.o___,' .o___, TOOLBOX --> 192 193 <section 194 id="toolbox" 195 class="draggydiv draggydivs-init-closed" 196 title="canvas/brush tools" 197 data-title="tools" 198 > 199 <div class="menu"> 200 <button 201 role="button" 202 class="draggydivs-drag" 203 aria-label="move this box" 204 > 205 &#10021; 206 </button> 207 208 <button 209 role="button" 210 class="draggydivs-minimize" 211 aria-label="minimize this box" 212 > 213 &#10799; 214 </button> 215 </div> 216 217 <div id="instruments" class="inner"> 218 <h2>instruments</h2> 219 <menu role="toolbar"> 220 <button id="pencil" role="button" class="current-tool icon-button"> 221 <img 222 src="assets/icons/pencil.png" 223 width="45" 224 height="45" 225 alt="draw" 226 /> 227 </button> 228 <button id="paint" role="button" class="icon-button"> 229 <img 230 src="assets/icons/paint.png" 231 width="52" 232 height="45" 233 alt="paint/fill" 234 /> 235 </button> 236 </menu> 237 </div> 238 239 <div id="editing" class="inner"> 240 <h2>editing</h2> 241 <menu role="toolbar"> 242 <button id="cut" role="button" class="icon-button"> 243 <img src="assets/icons/cut.png" width="27" height="45" alt="cut" /> 244 </button> 245 <button id="copy" role="button" class="icon-button"> 246 <img 247 src="assets/icons/copy.png" 248 width="34" 249 height="45" 250 alt="copy" 251 /> 252 </button> 253 <button id="paste" role="button" class="icon-button"> 254 <img 255 src="assets/icons/paste.png" 256 width="30" 257 height="45" 258 alt="paste" 259 /> 260 </button> 261 </menu> 262 263 <ul class="instructions paste"> 264 <li> 265 click on the canvas where you want the top left corner of your 266 copied clip to be pasted. 267 </li> 268 </ul> 269 270 <button role="button" class="text-button" id="undo" disabled="disabled"> 271 undo 272 </button> 273 <button role="button" class="text-button" id="redo" disabled="disabled"> 274 redo 275 </button> 276 <button role="button" class="text-button" id="new-canvas"> 277 new canvas 278 </button> 279 </div> 280 281 <div id="size" class="inner"> 282 <h2>brush size</h2> 283 <input 284 aria-label="pixel size text input" 285 id="pixel-size" 286 class="pixel-size-input" 287 type="number" 288 min="2" 289 max="100" 290 step="1" 291 value="15" 292 /> 293 <input 294 aria-label="pixel size slider" 295 id="pixel-size-slider" 296 class="pixel-size-input" 297 type="range" 298 min="2" 299 max="100" 300 step="1" 301 value="15" 302 /> 303 <div id="pixel-size-demo" class="color-demo"></div> 304 </div> 305 </section> 306 307 <!-- 308 _..-=~=-._ 309 _.-~' ~. 310 __..---~~~~~ ~. 311 _.-~~ _.._ ~. 312 _ -~_ / \ ; 313 ( ` '@) { | : 314 / | | : 315 / /} ( ) | | .- --- farting on 316 / //-=-~-_-_ | | \ ; .' the h8rs 317 / // | =._-| }/ / / /_.==\ ; _.' * 318 ( oo //| = ) ~| /.__..-='| \ :' ** 319 ====||*| / / + ) \ |_.-~`\ : |** 320 |*| * / / / / \ | ([ ]) /|||( 321 * |* /_/ / / ( ] `/ \' /|||_ 322 **(* | (((| /_/ __/_/__ -| |-- _|_|__ 323 *|\| (((| ----- __|_|__ 324 _/(h8rs)|__ ''' ----- 325 _||_|__ FILE BOX --> 326 327 <section 328 id="filebox" 329 class="draggydiv draggydivs-init-closed" 330 title="export/save" 331 data-title="export/save" 332 > 333 <div class="menu"> 334 <button 335 role="button" 336 class="draggydivs-drag" 337 aria-label="move this box" 338 > 339 &#10021; 340 </button> 341 342 <button 343 role="button" 344 class="draggydivs-minimize" 345 aria-label="minimize this box" 346 > 347 &#10799; 348 </button> 349 </div> 350 351 <div id="import" class="inner hidden"> 352 <h2>import art</h2> 353 354 <label for="open-local" class="local" id="open-local-form"> 355 from local storage: 356 <button role="button" class="text-button" id="open-local"> 357 import local art 358 </button> 359 </label> 360 361 <label for="import-pxon" class="pxon" id="import-pxon-form"> 362 import <a href="https://jennmoney.biz/pxon">pxon</a> (WARNING: THIS 363 BREAKS A LOT): 364 <input type="file" id="import-pxon" name="import-pxon" /> 365 </label> 366 </div> 367 368 <div id="export"> 369 <h2>export art</h2> 370 371 <label for="save-full" class="png" id="save-png-form"> 372 to png:<br /> 373 <button role="button" class="text-button" id="save-full"> 374 full page 375 </button> 376 <button role="button" class="text-button" id="save-selection"> 377 selection 378 </button> 379 </label> 380 381 <label for="save-local" class="local" id="save-local-form"> 382 to local storage:<br /> 383 <button role="button" class="text-button local" id="save-local"> 384 local store 385 </button> 386 </label> 387 388 <label for="export-pxon" class="pxon hidden" id="export-pxon-form"> 389 export <a href="https://jennmoney.biz/pxon">pxon</a>:<br /> 390 <button role="button" class="text-button pxon" id="export-pxon"> 391 export pxon 392 </button> 393 </label> 394 </div> 395 396 <ul class="instructions save"> 397 <li> 398 click and drag to select the area of the canvas you want to save. 399 </li> 400 </ul> 401 </section> 402 403 <!-- 404 <\ _ 405 \\ _/{ 406 _ \\ _- -_ 407 /{ / `\ _- - -_ 408 _~ = ( @ \ - - -_ 409 _- - ~-_ \( =\ \ - -_ 410 _~ - ~_ | 1 :\ \ _-~-_ - -_ 411 _- - ~ |V: \ \ _-~ ~-_- -_ 412 _-~ - / | : \ \ ~-_- -_ 413 _-~ - _.._ { | : _-`` ~- _-_ 414 _-~ -__..--~ ~-_ { : \:} --- hi h8rs 415 =~__.--~~ ~-_\ : / 416 \ : /__ 417 //`Y'--\\ 418 <+ \\ 419 \\ WWW 420 MMM COLORBOX --> 421 422 <section 423 id="colorbox" 424 class="draggydiv draggydivs-init-closed" 425 title="color tools" 426 data-title="colors" 427 > 428 <div class="menu"> 429 <button 430 role="button" 431 class="draggydivs-drag" 432 aria-label="move this box" 433 > 434 &#10021; 435 </button> 436 437 <button 438 role="button" 439 class="draggydivs-minimize" 440 aria-label="minimize this box" 441 > 442 &#10799; 443 </button> 444 </div> 445 446 <div class="tabs" role="navigation"> 447 <button role="button" class="pickers active" data-href="#pickers"> 448 color pickers 449 </button> 450 <button role="button" class="palettes" data-href="#custom-palettes"> 451 history/custom palettes 452 </button> 453 </div> 454 455 <div id="pickers"> 456 <div id="hex-picker"> 457 <h2>hex value:</h2> 458 <span class="pound">#</span 459 ><input 460 aria-label="hex color input" 461 type="text" 462 id="hex-color" 463 value="000000" 464 autocomplete="off" 465 autocorrect="off" 466 spellcheck="false" 467 /> 468 469 <button role="button" id="color-dropper" class="icon-button"> 470 <img 471 src="assets/icons/dropper.png" 472 width="45" 473 height="45" 474 alt="color dropper" 475 /> 476 </button> 477 </div> 478 479 <ul class="colors clearfix"> 480 <li> 481 <button 482 role="button" 483 class="button color primary cyan" 484 title="cyan" 485 data-color="rgba(0, 255, 255, 1)" 486 ></button> 487 </li> 488 <li> 489 <button 490 role="button" 491 class="button color primary magenta" 492 title="magenta" 493 data-color="rgba(255, 0, 255, 1)" 494 ></button> 495 </li> 496 <li> 497 <button 498 role="button" 499 class="button color primary yellow" 500 title="yellow" 501 data-color="rgba(255, 255, 0, 1)" 502 ></button> 503 </li> 504 <li> 505 <button 506 role="button" 507 class="button color primary black" 508 title="black" 509 data-color="rgba(0, 0, 0, 1)" 510 ></button> 511 </li> 512 <li> 513 <button 514 role="button" 515 class="button color primary gray" 516 title="gray" 517 data-color="rgba(128, 128, 128, 1)" 518 ></button> 519 </li> 520 <li> 521 <button 522 role="button" 523 class="button color primary white" 524 title="white" 525 data-color="rgba(255, 255, 255, 1)" 526 ></button> 527 </li> 528 <li> 529 <button 530 role="button" 531 class="button color transparent" 532 title="erase" 533 data-color="rgba(0, 0, 0, 0)" 534 ></button> 535 </li> 536 </ul> 537 538 <div id="eight-bit-picker"> 539 <h2 class="eightbit">click to pick:</h2> 540 <canvas id="eight-bit-colors" width="195" height="195"></canvas> 541 <div class="color-demo eightbit"></div> 542 </div> 543 </div> 544 545 <div id="custom-palettes"> 546 <div id="color-history" class="inner"> 547 <h2 class="color-history-label">history:</h2> 548 <ul class="color-history-list colors clearfix"></ul> 549 <div id="color-history-tools"> 550 <button role="button" class="text-button clear"> 551 clear history 552 </button> 553 </div> 554 </div> 555 556 <div id="color-custom" class="palettes inner"> 557 <h2 class="color-upload-label">custom palette:</h2> 558 <ul class="color-custom-list colors clearfix"></ul> 559 <div id="color-custom-tools"> 560 <p> 561 Upload file in "name,hex" csv format, like in 562 <a href="assets/example.csv">example.csv</a>! 563 </p> 564 565 <input type="file" name="upload-palette" class="import" /> 566 <button role="button" class="text-button clear"> 567 clear palette 568 </button> 569 </div> 570 </div> 571 </div> 572 </section> 573 574 <section id="save-modal-container" class="modal hidden"> 575 <div id="save-modal" class="inside-modal"> 576 <div class="controls"> 577 <button role="button" class="ui-hider"> 578 <img 579 src="assets/draggydivs/hider.png" 580 width="30" 581 height="30" 582 alt="move controls window" 583 /> 584 </button> 585 </div> 586 <h2>you saved your art!</h2> 587 <a href="#" target="_blank" download="art.png" 588 ><img id="finished-art" 589 /></a> 590 591 <p>Click or drag your art to your desktop to save!<br /></p> 592 </div> 593 </section> 594 595 <section id="open-modal-container" class="modal hidden"> 596 <div id="open-modal" class="inside-modal"> 597 <div class="controls"> 598 <button role="button" class="ui-hider"> 599 <img 600 src="assets/draggydivs/hider.png" 601 width="30" 602 height="30" 603 alt="move controls window" 604 /> 605 </button> 606 </div> 607 608 <h2>you have some locally saved art!</h2> 609 <h3>wanna open one? click a thumbnail...</h3> 610 611 <ul class="gallery"></ul> 612 </div> 613 </section> 614 615 <section id="pxon-modal-container" class="modal hidden"> 616 <div id="open-modal-pxon" class="inside-modal"> 617 <div class="controls"> 618 <button role="button" class="ui-hider"> 619 <img 620 src="assets/draggydivs/hider.png" 621 width="30" 622 height="30" 623 alt="move controls window" 624 /> 625 </button> 626 </div> 627 628 <h2>export pxon!</h2> 629 <h3> 630 <a href="https://jennmoney.biz/pxon/">what is pxon? read my spec!</a> 631 </h3> 632 633 <p> 634 the gist of it is that pxon is pixel art represented in JSON. the 635 current session of your drawing should be represented in the textarea 636 below - paste into a .json file or app that supports pxon for good 637 fun! 638 </p> 639 640 <textarea name="pxon"></textarea> 641 642 <p> 643 <strong 644 >note: pxon is a draft proposal and a fake idea by me (jenn, creator 645 of make8bitart.com) that's being updated sporadically and sometimes 646 doesn't work. please let me know if it's broken!</strong 647 > 648 </p> 649 </div> 650 </section> 651 652 <script type="text/javascript"> 653 if ("serviceWorker" in navigator) { 654 navigator.serviceWorker 655 .register("service-worker.js") 656 .then(function (reg) { 657 console.log("service worker registered --- " + reg.scope + " :)"); 658 }) 659 .catch(function (err) { 660 console.log("service worker failed: " + err); 661 }); 662 } 663 </script> 664 </body> 665</html>