<div class="container clear-fix">

   <!-- ERASE BUTTON -->
  <button class="size-button erase-button" id="eraser" value="" onClick="clearCanvas()">
    <i class="fas fa-trash-alt"></i>
  </button>
  <button class="size-button photo-button" onclick="captureA()">
   <i class="fas fa-camera"></i>
  </button>
  
  <!-- COLOR -->
  <table border="0" class="colorPalette" id="no-border">
    <tr>
      <td><div class="colorSelection" id="red" value="#FF0000"></div></td>
      <td><div class="colorSelection" id="blue" value="#0000FF"></div></td>
      <td><div class="colorSelection" id="orange" value="#FFA500"></div></td>
      <td><div class="colorSelection" id="white" value="#FFFFFF"></div></td>
      <td><div class="colorSelection" id="green" value="#00FF00"></div></td>
      <td><div class="colorSelection" id="yellow" value="#FFFF00"></div></td>
      <td><div class="colorSelection" id="pink" value="#FF00FF"></div></td>
      <td><div class="colorSelection" id="purple" value="#8A2BE2"></div></td>
    </tr>
  </table>
  <!--   <input type="color" id="colorPicker"> -->
 
   <!-- CANVAS AREA -->
  <div class="canvas-area">
    <table id="pixelCanvas"></table>
  </div>
  
  <!-- LOGO PHARE -->
 <div class="projectLogo">
    <img src="https://phare-lighthouse.com/wp-content/uploads/2023/12/LePhare_Logo_litebrite04.png" alt="Le Phare">
  </div>

   <!-- POWER BUTTON -->
  <button class="size-button blink-button" id="blinker" onClick="makeGrid()"><i class="fas fa-power-off"></i></button>
</div>



* { 
  -webkit-box-sizing: border-box; /* Safari/Chrome, other WebKit */
  -moz-box-sizing: border-box; /* Firefox, other Gecko */
  box-sizing: border-box; /* Opera/IE 8+ */
}

/*.clear-fix:after, .clear-fix:before {
    content: "";
    display: table;
    clear: both;
}*/

body {
    background-color: #1D4289;
}

p {
  color: #ccc;
  font: bold 10px verdana, sans-serif;
  text-align: center;
}

.container {
    margin: 30px auto;
    background: #fff;
    color: #000;
    width: 750px;
    height: 100%;
    border: 3px solid #fff;
    border-radius: 3%;
    border-style: outset;
    padding: 5px;
    display: grid;
    grid-template-columns: 22px 153px auto 153px 22px;
    grid-template-rows: 40px auto 60px;
    grid-column-gap: 0px;
    grid-row-gap: 5px;
    grid-template-areas: 
        "header header header header"
        "main" "main" "main" "main"
        "footer footer footer footer";
    /* Fixes issues with Firefox */
   -webkit-user-select: none; /* Chrome/Safari */        
   -moz-user-select: none; /* Firefox */
   -ms-user-select: none; /* IE10+ */
}

/* COLOR PALETTE */
 #no-border td {
    border-style: hidden;
}

.colorPalette {
    grid-area: "header";
    justify-self: start;
    align-self: center;
    grid-column-start: 3;
    grid-column-end: 3;
    grid-row-start: 1;
    grid-row-end: 1;
}

#colorPicker, .colorSelection {
    background-color: #BDBBBD;
    width: 25px;
    height: 25px;
    border: 3.2px solid #444;
    border-radius: 100%;
    border-style: outset;  
}

#colorPicker, .colorSelection:hover, .blink-button:hover, .erase-button:hover, .photo-button:hover{
    cursor: pointer;
}
/*
#colorPicker {
    width: 90px ;
    height: 25px;
}
*/
#white {
    background-color: #ffffff;
}

#red {
    background-color: #ff0000;
}

#blue {
    background-color: #0000FF;
}

#orange {
    background-color: #FFA500;
}

#green {
    background-color: #00FF00;
}

#lime {
    background-color: #00FF00;
}

#yellow {
    background-color: #FFFF00;
}

#pink {
    background-color: #FF00FF;
}

#purple {
    background-color: #800080;
}
/*  
h2 {
    margin: 1em 0 0.25em;
}

h2:first-of-type {
    margin-top: 0.5em;
}
*/
/* CANVAS */
.canvas-area {
    background-color: #272729;
    width: 692px;
    height: 400px;
    border: 4px solid #BABEBE;
    border-radius: 3%;
    border-style: inset;
    grid-column-start: 2;
    grid-column-end: five;
    grid-row-start: 2;
    grid-row-end: 3;
    grid-area: "main";
    display: flex;
    justify-content: center;
    align-items: center;
    overflow: hidden;
}

#submit-button, .erase-button, .blink-button, .photo-button{
  background-color: #FFF;
  color: #000;
  margin: 0;
  padding: 10px;
  border-radius: 100%;
  border: 3.2px solid #444;
  border-style: inset;
}

i {
  font-size: 2em;
}

.blink-button {
  background-color: #444;
  color: #fff;
  margin: 20px 0 0 0;
  grid-area: "footer";
  justify-self: center;
  align-self: end;
  grid-column-start: 7;
  grid-column-end: 2;
  grid-row-start: 3;
  grid-row-end: 3;
  outline: none;
}

.erase-button {
  background-color: #444;
  color: #fff;
  font-size: 8px;
  padding: 8px;
  grid-area: "header";
  justify-self: center;
  grid-column-start: 1;
  grid-column-end: 3;
  grid-row-start: 1;
  grid-row-end: 1;
  outline: none;
}

.photo-button {
  background-color: #444;
  color: #fff;
  font-size: 8px;
  padding: 8px;
  grid-area: "header";
  justify-self: center;
  grid-column-start: 6;
  grid-column-end: 7;
  grid-row-start: 1;
  grid-row-end: 1;
  outline: none;
}

.projectLogo {
  margin: 0;
  justify-self: center;
  grid-column-start: 6;
  grid-column-end: 7;
  grid-row-start: 3;
  grid-row-end: 3;
  outline: none;
}
/*
#sizePicker {
  grid-area: "header";
  justify-self: end;
  align-self: center;
  grid-column-start: 6;
  grid-column-end: 3;
  grid-row-start: 1;
  grid-row-end: 1;
}

#inputWidth, #inputHeight {
  background-color: #244218;
  height: 1.4em;
  width: 2em;
  border-radius: 15%;
  color: #FFF;
  text-align: center;
  font-size: 25px;
}

input[type=number]::-webkit-inner-spin-button, 
input[type=number]::-webkit-outer-spin-button { 
  -webkit-appearance: none; 
  margin: 0; 
} 
*/
#pixelCanvas:hover {
  cursor: crosshair;
}

table,
tr,
td {
    border-color: transparent;
    border-radius: 100%;
}

table {
    border-collapse: collapse;
}

tr {
    height: 20px;
}

td {
    width: 20px;
}
/* CANVAS TABLE CELLS */
div .cell-container {
  height: 20px;
  width: 20px;
  border: 1px solid #535353;
  border-radius: 100%;
}

div .circle-cell {
  height: 20px;
  width: 20px;
  border: 0;
  border-radius: 100%;
  overflow: hidden;
}

input[type=number] {
    width: 4em;
}
// (A) USING HTML2CANVAS
function captureA () {
  html2canvas(document.body).then(canvas => {
    let a = document.createElement("a");
    a.download = "allumez_votre_coeur_denfant.png";
    a.href = canvas.toDataURL("image/png");
    a.click(); // MAY NOT ALWAYS WORK!
  });
}

// WIP by beatrize
/*
  - Removed form input for height and width and just made the power button autopopulate the grid.
  - Made power button and screen light up to indicate that it turns on. 
  - Replaced eraser icon with a garbage can so people know they're clearing the entire grid lol.
*/

  let canvas = $("#pixelCanvas"); // targets canvas
  var globalColor;
  let isClicked = false;

  // creates grid
  function makeGrid() {
 /* event.preventDefault(); // prevents reload
    const heightInput = $("#inputHeight").val(); // gets user input value from #inputHeight
    const widthInput = $("#inputWidth").val(); // gets user input value from #inputWidth

    canvas.empty(); // resets canvas */

      for (let i = 0; i < 16; i++) {
      // creates rows and columns
        const row = canvas.append("<tr></tr>"); // rows
      for (let j = 0; j < 29; j++) {
        row.children().last().append('<td><div class="cell-container"><div class="circle-cell"></div><div></td>'); // appends columns with divs
        }
      }
    }

   // Selects color
  $(".colorSelection").on("click", function() {
    let color = $(this).attr("value");
    window["globalColor"] = color;
  });

  canvas.on("click", ".circle-cell", function(evt) {
    isClicked = false;
     $(this).css("background", globalColor);
  });
    canvas.on("click mousedown mouseenter", ".circle-cell", function(evt) {
    if (evt.buttons == 1) {
      $(this).css("background", globalColor);
   }
    
  });

  // erases individual pixels
  canvas.on("dblclick", ".circle-cell", function(evt) {
  $(this).css("background", "");
  });

  // quick erase drag function
  canvas.on("click mouseover", ".circle-cell", function(evt) {
  if (evt.shiftKey) {
//    if (evt.buttons === 1) { 
      $(this).css("background", "");
// } 
    }
  });

  // clears entire canvas
  function clearCanvas() {
    canvas.find(".circle-cell").css("background-color", "");
  }

  // animation
  $("#blinker").on("click", function() {
    $(this).toggleClass("toggled");
      
    if ($(this).hasClass("toggled")) {
     
      let tl = new TimelineMax()
      // lights up color cells
      tl.fromTo(
        ".circle-cell",
        0.7,
        {
          ease: Power3.easeIn,
          opacity: 1,
          pause: false
        },
        {
          ease: Power3.easeIn,
          opacity: 0.6,
          repeat: -1,
          repeatDelay: 0.3
        }, 0.5
      )
      // lights up power button
      tl.fromTo(
      ".blink-button",
      0.5,
      {
        ease: Power1.easeOut,
        css: { color:"#fff" },
        reversed: true
      },
      {
        ease: Power1.easeOut,
        css: { color: "#3CFF2A" }
      }, 0.1
      )
      // lights up canvas area
       tl.fromTo(
      ".canvas-area",
      1,
      {
        ease: RoughEase.ease.config({ 
          template: 
            Power0.easeNone, 
            strength: 1.5, 
            points: 20, 
            taper: "none", 
            randomize: true,
            clamp: true}),
        backgroundColor: "#272729",
        reversed: true
      },
      {
        ease: RoughEase.ease.config({ 
          template: 
            Power0.easeNone, 
            strength: 1.5, 
            points: 20, 
            taper: "none", 
            randomize: true,
            clamp: true}),
        backgroundColor: "#2F2E22"
      }, 0.1
      )
      /* lights up input areas
       tl.fromTo(
      ["#inputHeight", "#inputWidth"],
      0.5,
      {
        ease: Power4.easeIn,
        backgroundColor: "#244218",
        reversed: true
      },
      {
        ease: Power4.easeIn,
        backgroundColor: "#3A7714"
      }, 0.1
      ); */
    } else {
        // kills all tweens and empties canvas
        TweenMax.killAll(true);
     /* TweenMax.reverse(); */
    /*  $("#sizePicker").trigger("reset"); */
        canvas.empty();
    }
  });

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

  1. https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js
  2. https://cdnjs.cloudflare.com/ajax/libs/gsap/latest/TweenMax.min.js
  3. https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.4.1/html2canvas.min.js