Attractor

			var resolution;
			var grid;
			var blank;
			const guiSize = 150;
			var colorBox = [];
			var colorInfo = [];
			var hueVal, satVal, briVal;
			var hue, saturation, brightness;
			var maxWidth;
			var resolutionW;


			function setup() {
			  if(windowWidth < windowHeight) {
			    maxWidth = windowWidth;
			    resolutionW = maxWidth-guiSize;
			  } else {
			    maxWidth = windowHeight;
			    resolutionW = maxWidth*0.8-guiSize;
			  }
			  createCanvas(maxWidth, windowHeight);
			  colorMode(HSB);
			  rectMode(CENTER);
			  createGUI();
			  noStroke();
			}

			function draw() {
			  background(0);
			  translate(resolution/2, resolution/2 + height*0.1);
			  grid = s_grid.value();
			  resolution = (resolutionW)/grid;
			  blank = resolution * 0.1;

			  if(hueVal != s_hue.value()) {
			    s_hue_max.value(s_hue.value());
			    s_hue_min.value(s_hue.value());
			  }
			  if(satVal != s_sat.value()) {
			    s_sat_max.value(s_sat.value());
			    s_sat_min.value(s_sat.value());
			  }
			  if(briVal != s_bri.value()) {
			    s_bri_max.value(s_bri.value());
			    s_bri_min.value(s_bri.value());
			  }

			  hueVal = s_hue.value();
			  satVal = s_sat.value();
			  briVal = s_bri.value();

			  for(var y = 0; y < grid; y++) {
			    for(var x = 0; x < grid; x++) {
			      hue = map(x, 0, grid-1, s_hue_min.value(), s_hue_max.value());
			      saturation = map(y, 0, grid-1, s_sat_min.value(), s_sat_max.value());
			      brigthness = map(y, 0, (grid-1),  s_bri_min.value(),  s_bri_max.value());
			      fill(hue, saturation, brigthness, 255);
			      rect(x*resolution, y*resolution, resolution-blank, resolution-blank);
			    }
			  }
			}

			function inBox(mx, my) {
			  my = my-height*0.1;
			  var hitBox = false;
			  for(var y = 0; y < grid; y++) {
			    for(var x = 0; x < grid; x++) {
			      if(x*resolution+blank/2 < mx && (x+1)*resolution-blank/2 > mx &&
			      y*resolution+blank/2 < my && (y+1)*resolution-blank/2 > my) {
			        hitBox = true;
			        break;
			      }
			    }
			  }
			  return hitBox;
			}

			function mousePressed() {
			  if(inBox(mouseX, mouseY)) {
			    var col = get(mouseX, mouseY);

			    var r = parseInt(col[0]).toString(16);
			    var g = parseInt(col[1]).toString(16);
			    var b = parseInt(col[2]).toString(16);

			    if(r.length == 1) r = "0"+r;
			    if(g.length == 1) g = "0"+g;
			    if(b.length == 1) b = "0"+b;


			    var hex = "#"+r+g+b;
			    var id = colorBox.length;

			    colorBox.push(createP(' '))
			    colorBox[id].parent("wrapper")
			    colorBox[id].style("color","rgb(255,255,255)")
			    colorBox[id].style("background",hex)
			    colorBox[id].style("width",20+"px")
			    colorBox[id].style("height",20+"px")


			    colorInfo.push(createP(hex))
			    colorInfo[id].parent("wrapper")
			    colorInfo[id].style("color","rgb(255,255,255)")
			    colorInfo[id].style("background","transparent")


			    for(var i = 0; i < id+1; i++) {
			      colorBox[i].position(0, (id-i)*30)
			      colorInfo[i].position(30, (id-i)*30)
			    }
			  }
			}

			function reset() {
			  var len = colorBox.length;
			  if(len > 0) {
			    for(var i = 0; i < len; i++) {
			      colorBox[i].remove();
			      colorInfo[i].remove();
			    }
			    colorBox.splice(0, len);

			    colorInfo.splice(0, len);
			    console.log(colorBox);
			  }
			}

			function createGUI() {
			  var scal = 0.9;
			  var pY = windowHeight*scal - guiSize ;
			  var sliderY1 = pY + 45;
			  var sliderY2 = sliderY1 + 30;
			  var sliderY3 = sliderY1 + 60;
			  var stepX = (width/4)*scal;
			  var sw = stepX*scal;
			  var blankLeft = (width/4)*(1-scal);


			  var colorInfoWrapper = createDiv("");
			  colorInfoWrapper.id("wrapper");
			  colorInfoWrapper.position(width-guiSize + 30, height*0.1);
			  colorInfoWrapper.style("background", "#000");
			  colorInfoWrapper.style("width", (guiSize-30)+"px");
			  colorInfoWrapper.style("height", (height*0.8-guiSize)+"px");
			  colorInfoWrapper.style("overflow-y", "auto");



			  b_reset = createButton("Reset");
			  b_reset.mousePressed(reset);
			  b_reset.style("width", "100px");
			  b_reset.style("height", "30px");
			  b_reset.style("background", "#000");
			  b_reset.style("color", "#fff");
			  b_reset.style("border", "solid 3px #fff");
			  b_reset.position(width-b_reset.width, (height*scal))

			  s_hue = createSlider(0, 360, 30);
			  s_hue.position(blankLeft, sliderY3)
			  s_hue.size(sw,AUTO)

			  s_hue_min = createSlider(0, 360, 20);
			  s_hue_min.position(blankLeft, sliderY1)
			  s_hue_min.size(sw,AUTO)

			  s_hue_max = createSlider(0, 360, 60);
			  s_hue_max.position(blankLeft, sliderY2)
			  s_hue_max.size(sw,AUTO)

			  l_hue = createP('hue ')
			  l_hue.style("color","rgb(255,255,255)")
			  l_hue.position(blankLeft, pY)

			  s_sat = createSlider(0, 100, 85);
			  s_sat.position(blankLeft + stepX, sliderY3)
			  s_sat.size(sw,AUTO)

			  s_sat_min = createSlider(0, 100, 30);
			  s_sat_min.position(blankLeft + stepX, sliderY1)
			  s_sat_min.size(sw,AUTO)

			  s_sat_max = createSlider(0, 100, 85);
			  s_sat_max.position(blankLeft + stepX, sliderY2)
			  s_sat_max.size(sw,AUTO)

			  l_sat = createP('saturation ')
			  l_sat.style("color","rgb(255,255,255)")
			  l_sat.position(blankLeft + stepX, pY)

			  s_bri = createSlider(0, 100, 95);
			  s_bri.position(blankLeft + stepX*2, sliderY3)
			  s_bri.size(sw,AUTO)

			  s_bri_min = createSlider(0, 100, 95);
			  s_bri_min.position(blankLeft + stepX*2, sliderY1)
			  s_bri_min.size(sw,AUTO)

			  s_bri_max = createSlider(0, 100, 85);
			  s_bri_max.position(blankLeft + stepX*2, sliderY2)
			  s_bri_max.size(sw,AUTO)

			  l_bri = createP('brightness ')
			  l_bri.style("color","rgb(255,255,255)")
			  l_bri.position(blankLeft + stepX*2, pY)

			  s_grid = createSlider(1, 20, 4);
			  s_grid.position(blankLeft + stepX*3, sliderY1)
			  s_grid.size(sw,AUTO)
			  l_grid = createP('grid ')
			  l_grid.style("color","rgb(255,255,255)")
			  l_grid.position(blankLeft + stepX*3, pY)

				if(windowWidth < 640) {
					allP = selectAll("p");
					for(var i = 0; i < allP.length; i++) {
						allP[i].style("font-size", "12px");
			          	allP[i].style("text-transform", "capitalize")
					}
				}

			  hueVal = s_hue.value();
			  satVal = s_sat.value();
			  briVal = s_bri.value();
			}