paint-by-numbers

Relaxing paint-by-numbers game  https://p.ce9e.org/paint-by-numbers/
git clone https://git.ce9e.org/paint-by-numbers.git

commit
88eb1272011d2bef38b76df8f06832a5189de595
parent
7214c716e5c84054c99b16f4fccfaa5ef03ab713
Author
Tobias Bengfort <tobias.bengfort@posteo.de>
Date
2023-02-12 19:16
display available colors

Diffstat

M index.html 1 +
M paint.js 25 +++++++++++++++++++++++++
M style.css 23 ++++++++++++++++++++++-

3 files changed, 48 insertions, 1 deletions


diff --git a/index.html b/index.html

@@ -10,6 +10,7 @@
   10    10 		<input type="file">
   11    11 	</div>
   12    12 	<canvas></canvas>
   -1    13 	<form class="palette"></form>
   13    14 	<script src="paint.js" type="module"></script>
   14    15 </body>
   15    16 </html>

diff --git a/paint.js b/paint.js

@@ -1,4 +1,5 @@
    1     1 var input = document.querySelector('input');
   -1     2 var palette = document.querySelector('.palette');
    2     3 
    3     4 var canvas = document.querySelector('canvas');
    4     5 var ctx = canvas.getContext('2d');
@@ -130,6 +131,26 @@ input.addEventListener('change', () => {
  130   131         octx.textAlign = 'center';
  131   132         octx.textBaseline = 'middle';
  132   133 
   -1   134         palette.innerHTML = '';
   -1   135         for (var i = 0; i < data.colors.length; i++) {
   -1   136             var label = document.createElement('label');
   -1   137             var radio = document.createElement('input');
   -1   138             radio.type = 'radio';
   -1   139             radio.name = 'pencil';
   -1   140             radio.value = i;
   -1   141             var span = document.createElement('span');
   -1   142             span.textContent = i;
   -1   143             label.append(radio);
   -1   144             label.append(span);
   -1   145             span.style.color = data.contrasts[i];
   -1   146             span.style.backgroundColor = data.colors[i];
   -1   147             palette.append(label);
   -1   148             radio.addEventListener('change', event => {
   -1   149                 pencil = parseInt(event.target.value, 10);
   -1   150             });
   -1   151         }
   -1   152         resizeCanvas();
   -1   153 
  133   154         zoom = canvas.height / offcanvas.height * 0.8;
  134   155         dx = (canvas.width - offcanvas.width * zoom) / 2;
  135   156         dy = (canvas.height - offcanvas.height * zoom) / 2;
@@ -209,8 +230,12 @@ window.addEventListener('keydown', event => {
  209   230         applySpeed();
  210   231     } else if (event.key === 'q') {
  211   232         pencil -= 1;
   -1   233         palette.pencil.value = pencil;
   -1   234         palette.querySelector(':checked').parentElement.scrollIntoView();
  212   235     } else if (event.key === 'e') {
  213   236         pencil += 1;
   -1   237         palette.pencil.value = pencil;
   -1   238         palette.querySelector(':checked').parentElement.scrollIntoView();
  214   239     }
  215   240     render();
  216   241 });

diff --git a/style.css b/style.css

@@ -6,7 +6,7 @@ body {
    6     6 
    7     7 body {
    8     8 	display: grid;
    9    -1 	grid-template-rows: min-content 1fr;
   -1     9 	grid-template-rows: min-content 1fr min-content;
   10    10 	height: 100vh;
   11    11 }
   12    12 
@@ -14,3 +14,24 @@ canvas {
   14    14 	width: 100%;
   15    15 	height: 100%;
   16    16 }
   -1    17 
   -1    18 .palette {
   -1    19 	overflow-x: auto;
   -1    20 	white-space: nowrap;
   -1    21 }
   -1    22 .palette input {
   -1    23 	clip: rect(0, 0, 0, 0);
   -1    24 	position: absolute;
   -1    25 }
   -1    26 .palette span {
   -1    27 	display: inline-block;
   -1    28 	border: 1px solid;
   -1    29 	text-align: center;
   -1    30 	min-width: 3em;
   -1    31 	line-height: 3;
   -1    32 	border-radius: 0.3em;
   -1    33 	margin: 0.2em;
   -1    34 }
   -1    35 .palette input:not(:checked) + span {
   -1    36 	opacity: 0.5;
   -1    37 }