{"version":3,"file":"button-ribbon-dab1554b.js","sources":["../../../client/src/javascripts/customer_pages/_utils/fetch-image.js","../../../client/src/javascripts/customer_pages/_utils/img/colour-matrix.js","../../../client/src/javascripts/customer_pages/_utils/img/geometry.js","../../../client/src/javascripts/customer_pages/_utils/img/iu-constants.js","../../../client/src/javascripts/customer_pages/_utils/img/thumbnail-crop-coords.js","../../../client/src/javascripts/customer_pages/_utils/font-colour-converter.js","../../../client/src/javascripts/customer_pages/_utils/img/canvas.js","../../../client/src/javascripts/customer_pages/_utils/img/img-utils.js","../../../client/src/javascripts/customer_pages/_prism-builder/desktop/slot-tools/send-to-google-analytics.js","../../../client/src/javascripts/customer_pages/_utils/button-ribbon.jsx"],"sourcesContent":["import screenAndStyle from './screen-and-style';\n\nfunction isDataURL(url) {\n  return /^(blob|data):/.test(url);\n}\n\nfunction isEL2(url) {\n  return /\\/el2\\//.test(url);\n}\n\nfunction _setURL(src, callback, reportError) {\n  // XMLHttpRequest.responseURL is not currently supported by IE11: Early exit\n  if (isDataURL(src) || screenAndStyle.isInternetExplorer()) {\n    return callback(src);\n  }\n\n  if (isEL2(src)) {\n    // Work around annoying Chrome bug that sets invalid Origin header\n    // on redirect\n    const xhr = new XMLHttpRequest();\n    xhr.open('HEAD', src);\n    xhr.onreadystatechange = function () {\n      if (xhr.readyState === 4) {\n        if (xhr.status === 200) {\n          callback(xhr.responseURL ? xhr.responseURL : src);\n        } else {\n          console.error(`Unable to get source URL for ${src.toString()}`);\n          if (reportError) {\n            reportError({ url: src, status: xhr.status });\n          }\n          callback(src); // just in case it works\n        }\n      }\n    };\n    xhr.onerror = function () {\n      // Ignore and try original anyway.\n      callback(src);\n    };\n    xhr.send();\n  } else {\n    callback(src);\n  }\n}\n\nfunction fetchImage(src, crossOrigin, handleLoad, handleError) {\n  const image = new Image();\n\n  if (!(screenAndStyle.isSafari() && isDataURL(src))) {\n    image.crossOrigin = crossOrigin;\n  }\n\n  image.onload = handleLoad;\n  image.onerror = handleError;\n\n  _setURL(src, setImageSrc, handleError);\n\n  function setImageSrc(src) {\n    if (src.match(/^\\/\\/prism(-testing|-staging)?-wm.livelink.io/)) {\n      src = `https:${src}`;\n    }\n    // The use of createObjectURL is a fix around IE11 deficiencies\n    // http://stackoverflow.com/a/19734516\n    if (screenAndStyle.isInternetExplorer() && isEL2(src) && !isDataURL(src)) {\n      const xhr = new XMLHttpRequest();\n      xhr.open('GET', src, true);\n      xhr.responseType = 'blob';\n      xhr.onload = function () {\n        if (this.status === 200) {\n          image.src = (window.URL || window.webkitURL).createObjectURL(this.response);\n        }\n      };\n      xhr.onerror = function () {\n        image.src = src;\n      };\n      xhr.send();\n    } else {\n      image.src = src;\n    }\n  }\n\n  return image;\n}\n\nexport default fetchImage;\n","const DELTA_INDEX = [\n    0,    0.01, 0.02, 0.04, 0.05, 0.06, 0.07, 0.08, 0.1,  0.11,\n    0.12, 0.14, 0.15, 0.16, 0.17, 0.18, 0.20, 0.21, 0.22, 0.24,\n    0.25, 0.27, 0.28, 0.30, 0.32, 0.34, 0.36, 0.38, 0.40, 0.42,\n    0.44, 0.46, 0.48, 0.5,  0.53, 0.56, 0.59, 0.62, 0.65, 0.68,\n    0.71, 0.74, 0.77, 0.80, 0.83, 0.86, 0.89, 0.92, 0.95, 0.98,\n    1.0,  1.06, 1.12, 1.18, 1.24, 1.30, 1.36, 1.42, 1.48, 1.54,\n    1.60, 1.66, 1.72, 1.78, 1.84, 1.90, 1.96, 2.0,  2.12, 2.25,\n    2.37, 2.50, 2.62, 2.75, 2.87, 3.0,  3.2,  3.4,  3.6,  3.8,\n    4.0,  4.3,  4.7,  4.9,  5.0,  5.5,  6.0,  6.5,  6.8,  7.0,\n    7.3,  7.5,  7.8,  8.0,  8.4,  8.7,  9.0,  9.4,  9.6,  9.8,\n    10.0\n];\n\nconst colourCorrection = {\n  multiply: function(a, b) {\n    var i, j, k, col = [];\n\n    for (i=0;i<5;i++) {\n      for (j=0;j<5;j++) {\n        col[j] = a[j+i*5];\n      }\n      for (j=0;j<5;j++) {\n        var val=0;\n        for (k=0;k<5;k++) {\n          val += b[j+k*5]*col[k];\n        }\n        a[j+i*5] = val;\n      }\n    }\n  },\n\n  colourMatrix: function(imageData, options) {\n    var brightness = options.brightness || 0;\n    var contrast   = options.contrast   || 0;\n\n    var matrix = [\n      1,0,0,0,0,\n      0,1,0,0,0,\n      0,0,1,0,0,\n      0,0,0,1,0,\n      0,0,0,0,1\n    ];\n\n    // Contrast\n    var x;\n    if (contrast < 0) {\n      x = 127 + contrast / 100 * 127;\n    } else {\n      x = contrast % 1;\n\n      if (x == 0) {\n        x = DELTA_INDEX[contrast];\n      } else {\n        x = DELTA_INDEX[(contrast<<0)]*(1-x)+DELTA_INDEX[(contrast<<0)+1] * x;\n      }\n\n      x = x * 127 + 127;\n    }\n\n    this.multiply (matrix, [\n      x/127,0,0,0,0.5*(127-x),\n      0,x/127,0,0,0.5*(127-x),\n      0,0,x/127,0,0.5*(127-x),\n      0,0,0,1,0,\n      0,0,0,0,1\n    ]);\n\n    // Brightness\n    this.multiply (matrix,[\n      1,0,0,0, brightness,\n      0,1,0,0, brightness,\n      0,0,1,0, brightness,\n      0,0,0,1,0,\n      0,0,0,0,1\n    ]);\n\n    // Apply Filter\n    var data = imageData.data;\n    var l = data.length;\n    var r,g,b,a;\n    var m0  =  matrix[0],  m1 = matrix[1],   m2 =  matrix[2],  m3 = matrix[3],   m4 = matrix[4];\n    var m5  =  matrix[5],  m6 = matrix[6],   m7 =  matrix[7],  m8 = matrix[8],   m9 = matrix[9];\n    var m10 = matrix[10], m11 = matrix[11], m12 = matrix[12], m13 = matrix[13], m14 = matrix[14];\n    var m15 = matrix[15], m16 = matrix[16], m17 = matrix[17], m18 = matrix[18], m19 = matrix[19];\n\n    for (var i=0; i<l; i+=4) {\n      r = data[i];\n      g = data[i+1];\n      b = data[i+2];\n      a = data[i+3];\n      data[i] = r*m0+g*m1+b*m2+a*m3+m4; // red\n      data[i+1] = r*m5+g*m6+b*m7+a*m8+m9; // green\n      data[i+2] = r*m10+g*m11+b*m12+a*m13+m14; // blue\n      data[i+3] = r*m15+g*m16+b*m17+a*m18+m19; // alpha\n    }\n\n    return imageData;\n  }\n};\n\nexport default colourCorrection;","const __slice = Array.prototype.slice;\n\nclass Rectangle {\n  /**\n   * Given an aspect ratio, calculates the biggest rectangle that fits within\n   * @param  {Number} ratio numeric aspect ratio for the output (e.g. 6:4 is 1.5)\n   * @param  {Number} iWidth width of the input rectangle (e.g. photo width)\n   * @param  {Number} iHeight height of the input image (e.g. photo height)\n   * @return {Array[Number]} co-ordinates of cropped area within the input\n   */\n  static fitLargestRectangle(ratio, iWidth, iHeight) {\n    let ch;\n    let cw;\n    let x;\n    let y;\n    const rectRatio = iHeight / iWidth;\n\n    if (ratio > rectRatio) {\n      ch = iHeight;\n      cw = iHeight / ratio;\n      y = 0;\n      x = (iWidth - cw) / 2;\n    } else {\n      const { features } = window;\n\n      cw = iWidth;\n      ch = iWidth * ratio;\n      x = 0;\n      y = features?.printsBuilderSetDefaultCropTopAligned\n        ? 0\n        : (iHeight - ch) / 2;\n    }\n\n    return [x, y, cw, ch];\n  }\n\n  static auto() {\n    let args;\n    args = arguments.length >= 1 ? __slice.call(arguments, 0) : [];\n    if (args.length === 4) {\n      return new Rectangle(args[0], args[1], args[2], args[3]);\n    }\n    if (args[0] instanceof Rectangle) {\n      return args[0];\n    }\n    if (args.length === 1 && args[0] instanceof Array) {\n      args = args[0];\n      return new Rectangle(args[0], args[1], args[2], args[3]);\n    }\n  }\n\n  constructor(x, y, width, height) {\n    this.x = x;\n    this.y = y;\n    this.width = width;\n    this.height = height;\n  }\n\n  containsPoint({ x, y }) {\n    return (\n      x >= this.x &&\n      x <= this.x + this.width &&\n      y >= this.y &&\n      y <= this.y + this.height\n    );\n  }\n\n  ratio(rect) {\n    if (rect instanceof Array) {\n      return rect[3] / rect[2];\n    }\n    if (rect.w && rect.h) {\n      return rect.h / rect.w;\n    }\n    if (rect.width && rect.height) {\n      return rect.height / rect.width;\n    }\n  }\n\n  rectIsRatio(rect, ratio) {\n    return Math.equals(this.ratio(rect), ratio);\n  }\n\n  rectMatchesRatio(rect, ratio) {\n    const r_ratio = this.ratio(rect);\n    return (\n      Math.abs(r_ratio - ratio) < 0.01 || Math.abs(r_ratio - 1.0 / ratio) < 0.01\n    );\n  }\n\n  findLargestRectangle(ratio) {\n    let ch;\n    let cw;\n    let x;\n    let y;\n    const rectRatio = this.height / this.width;\n\n    if (ratio > rectRatio) {\n      ch = this.height;\n      cw = this.height / ratio;\n      y = 0;\n      x = (this.width - cw) / 2;\n    } else {\n      cw = this.width;\n      ch = this.width * ratio;\n      x = 0;\n      y = (this.height - ch) / 2;\n    }\n    return [x, y, cw, ch];\n  }\n\n  shrinkToFit(printRatio, bestFit) {\n    let altPrintRatio;\n    let imgRatio;\n    let out;\n    if (bestFit === null) {\n      bestFit = true;\n    }\n    imgRatio = this.height / this.width;\n    altPrintRatio = 1 / printRatio;\n    if (bestFit) {\n      if (\n        Math.abs(altPrintRatio - imgRatio) < Math.abs(printRatio - imgRatio)\n      ) {\n        printRatio = altPrintRatio;\n      }\n    }\n    if (imgRatio > printRatio) {\n      out = {\n        height: this.height,\n        width: Math.ceil(this.height / printRatio),\n      };\n    } else {\n      out = {\n        width: this.width,\n        height: Math.ceil(this.width * printRatio),\n      };\n    }\n    out.x = Math.ceil((out.width - this.width) / 2);\n    out.y = Math.ceil((out.height - this.height) / 2);\n    return [-out.x, -out.y, out.width, out.height];\n  }\n\n  modifyLimits = qtty => {\n    this.x -= qtty;\n    this.y -= qtty;\n    this.height += qtty * 2;\n    this.width += qtty * 2;\n  };\n}\n\nexport default Rectangle;\n","const X = 0;\nconst Y = 1;\nconst WIDTH = 2;\nconst HEIGHT = 3;\n\nexport {\n  X, Y, WIDTH, HEIGHT,\n};\n","const CANVAS_W = 600;\nconst CANVAS_H = 600;\n\nclass ThumbnailCropCords {\n  constructor(rect, outputAspectRatio) {\n    this.outputAspectRatio = outputAspectRatio;\n    this.isFitCrop = rect.some(v => v < 0);\n\n    [this.x, this.y, this.width, this.height] = rect\n      .map('trunc' in Math ? Math.trunc : Math.floor)\n      .map(Math.abs);\n  }\n\n  get canvasWidth() {\n    if (this.isFitCrop) {\n      if (this.tendsLandscape) return this.width;\n      if (this.tendsPortrait) return this.height * this.outputAspectRatio;\n\n      // it's square\n      return this.fitCropSquareOutput;\n    }\n\n    return this.imageIsLandscape\n      ? CANVAS_W\n      : parseInt(CANVAS_W * (this.width / this.height), 10);\n  }\n\n  get canvasHeight() {\n    if (this.isFitCrop) {\n      if (this.tendsPortrait) return this.height;\n      if (this.tendsLandscape) return this.width / this.outputAspectRatio;\n\n      // it's hip to be square\n      return this.fitCropSquareOutput;\n    }\n\n    return this.imageIsLandscape\n      ? parseInt(CANVAS_H * (this.height / this.width), 10)\n      : CANVAS_H;\n  }\n\n  get tendsPortrait() {\n    // returns true if the rendered output will be taller/narrower than the source image\n    // and thus the empty space will show down the sides\n    return this.imageAspectRatio < this.outputAspectRatio;\n  }\n\n  get tendsLandscape() {\n    // returns true if the rendered output will be taller/narrower than the source image\n    // and thus the empty space will show down the sides\n    return this.imageAspectRatio > this.outputAspectRatio;\n  }\n\n  get imageAspectRatio() {\n    return this.width / this.height;\n  }\n\n  get imageIsLandscape() {\n    return this.imageAspectRatio > 1;\n  }\n\n  get fitCropSquareOutput() {\n    if (this.x > 0) {\n      this.height = this.width + this.x * 2;\n    } else {\n      this.width = this.height + this.y * 2;\n    }\n\n    return Math.max(this.width, this.height);\n  }\n}\n\nexport default ThumbnailCropCords;\n","const offset = 100 * (141 / 255);\n\nconst textColourFromNodes = elementNodes => {\n  return Array.from(elementNodes).reduce((colours, textNode) => {\n    colours.push(textNode.style.color);\n    return colours;\n  }, []);\n}\n\nconst lightnessFromRGB = rgb => {\n  let [r, g, b] = rgb.substring(4, rgb.length-1)\n         .replace(/ /g, '')\n         .split(',');\n\n  // Then get lightness from HSL\n  r /= 255;\n  g /= 255;\n  b /= 255;\n  let cmin = Math.min(r,g,b),\n      cmax = Math.max(r,g,b),\n      lightness = 0;\n\n  lightness = (cmax + cmin) / 2;\n  lightness = +(lightness * 100).toFixed(1);\n\n  return lightness;\n}\n\nconst lightnessFromColourArray = colourArray => {\n  return colourArray.map(colour => lightnessFromRGB(colour));\n}\n\nconst filterDuplicates = array => [...new Set(array)];\n\nconst average = array => array.reduce((total, value) => total + value, 0) / array.length;\n\nexport const averageLightness = (colourNodes, useOffset = false) => {\n  const colourArray = textColourFromNodes(colourNodes);\n  const filteredArray = filterDuplicates(colourArray);\n  const lightnessArray = lightnessFromColourArray(filteredArray);\n  const averageLightness = average(lightnessArray);\n\n  return useOffset ? averageLightness + offset : averageLightness;\n}\n\n// Returns #HEX from Hue Saturation Lightness\nexport const hslToHex = (hue, saturation, lightness) => {\n  if (\n    (typeof hue !== 'number' || hue < 0 || hue > 360) ^\n    (typeof saturation !== 'number' || saturation < 0 || saturation > 100) ^\n    (typeof lightness !== 'number' || lightness < 0 || lightness > 100)\n  ) {\n    console.warn(\n      'Supplied HSL values are not numbers or out of range, Hue (0-360):',\n      hue,\n      ' Saturation (0-100): ',\n      saturation,\n      ' Lightness (0-100): ',\n      lightness,\n      ' returning white.',\n    );\n    return '#FFFFFF';\n  }\n\n  const hDecimal = lightness / 100;\n  const a = (saturation * Math.min(hDecimal, 1 - hDecimal)) / 100;\n  const f = (n) => {\n    const k = (n + hue / 30) % 12;\n    const color = hDecimal - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n\n    // Convert to Hex and prefix with \"0\" if required\n    return Math.round(255 * color)\n      .toString(16)\n      .padStart(2, '0');\n  };\n  return `#${f(0)}${f(8)}${f(4)}`;\n};\n","// Import Modules\nimport colourCorrection from './colour-matrix';\nimport Rectangle from './geometry';\nimport { X, Y, WIDTH, HEIGHT } from './iu-constants';\nimport CropCords from './thumbnail-crop-coords';\nimport { hslToHex } from '../font-colour-converter';\n\nconst Morandi = {\n  DEFAULT_RATIO: 6.0 / 4.0,\n  largestAspectRectangle(ratio, width, height) {\n    let bh;\n    let bw;\n    let r_ratio;\n    let x;\n    let y;\n    r_ratio = width / height;\n    if (r_ratio < ratio) {\n      bw = width;\n      bh = width / ratio;\n      y = (height - bh) / 2;\n      return {\n        x: 0,\n        y,\n        width: bw,\n        height: bh,\n      };\n    }\n    bh = height;\n    bw = height * ratio;\n    x = (width - bw) / 2;\n    return {\n      x,\n      y: 0,\n      width: bw,\n      height: bh,\n    };\n  },\n  roundedRectangle(cr, x1, y1, x2, y2, x_radius, y_radius) {\n    let height;\n    let width;\n    let xr1;\n    let xr2;\n    let yr1;\n    let yr2;\n    if (x_radius == null) {\n      x_radius = 4;\n    }\n    if (y_radius == null) {\n      y_radius = null;\n    }\n    width = x2 - x1;\n    height = y2 - y1;\n    if (y_radius == null) {\n      y_radius = x_radius;\n    }\n    if (x_radius * 2 > width) {\n      x_radius = width / 2;\n    }\n    if (y_radius * 2 > height) {\n      y_radius = height / 2;\n    }\n    xr1 = x_radius;\n    xr2 = x_radius / 2.0;\n    yr1 = y_radius;\n    yr2 = y_radius / 2.0;\n    cr.mt(x1 + xr1, y1);\n    cr.lt(x2 - xr1, y1);\n    cr.bt(x2 - xr2, y1, x2, y1 + yr2, x2, y1 + yr1);\n    cr.lt(x2, y2 - yr1);\n    cr.bt(x2, y2 - yr2, x2 - xr2, y2, x2 - xr1, y2);\n    cr.lt(x1 + xr1, y2);\n    cr.bt(x1 + xr2, y2, x1, y2 - yr2, x1, y2 - yr1);\n    cr.lt(x1, y1 + yr1);\n    cr.bt(x1, y1 + yr2, x1 + xr2, y1, x1 + xr1, y1);\n    return cr.cp;\n  },\n  cloneAndCropCanvasAtScale(source, width, height, ratio) {\n    let cr;\n    let img;\n    let largest;\n    let scale;\n    let scale1;\n    let scale2;\n    largest = Morandi.largestAspectRectangle(ratio, source.width, source.height);\n    scale1 = height / largest.height;\n    scale2 = width / largest.width;\n    scale = scale1;\n    if (scale2 < scale1) {\n      scale = scale2;\n    }\n    img = document.createElement('canvas');\n    cr = img.getContext('2d');\n    img.width = largest.width * scale;\n    img.height = largest.height * scale;\n    cr.drawImage(source, largest.x, largest.y, largest.width, largest.height, 0, 0, img.width, img.height);\n    return img;\n  },\n  cloneCanvas(canvas) {\n    const newCanvas = document.createElement('canvas');\n    newCanvas.width = canvas.width;\n    newCanvas.height = canvas.height;\n    const ctx = newCanvas.getContext('2d');\n    ctx.drawImage(canvas, 0, 0);\n\n    return newCanvas;\n  },\n  cloneCanvasAtAngle(canvas, angle) {\n    const newCanvas = document.createElement('canvas');\n\n    if (angle === 90 || angle === 270) {\n      newCanvas.width = canvas.height;\n      newCanvas.height = canvas.width;\n    } else {\n      newCanvas.width = canvas.width;\n      newCanvas.height = canvas.height;\n    }\n\n    const ctx = newCanvas.getContext('2d');\n    ctx.translate(newCanvas.width / 2, newCanvas.height / 2);\n    ctx.rotate((angle * Math.PI) / 180);\n    ctx.translate(canvas.width / -2, canvas.height / -2);\n    ctx.drawImage(canvas, 0, 0);\n    return newCanvas;\n  },\n};\n\nfunction validNumber(val, min, max) {\n  if (typeof val !== 'number') {\n    return false;\n  }\n  if (isNaN(val)) {\n    return false;\n  }\n  if (val < min) {\n    return false;\n  }\n  if (val > max) {\n    return false;\n  }\n  return true;\n}\n\nfunction getDefaultCropRatio(ratio, width, height) {\n  const r1 = fitLargestRectangle(ratio, width, height);\n  const r2 = fitLargestRectangle(1 / ratio, width, height);\n\n  if ((r1[WIDTH] * r1[HEIGHT]) > (r2[WIDTH] * r2[HEIGHT])) {\n    return ratio;\n  }\n  return 1 / ratio;\n}\nfunction getDefaultCrop(ratio, width, height) {\n  const r1 = fitLargestRectangle(ratio, width, height);\n  const r2 = fitLargestRectangle(1 / ratio, width, height);\n  let r;\n\n  if ((r1[WIDTH] * r1[HEIGHT]) > (r2[WIDTH] * r2[HEIGHT])) {\n    r = r1;\n  } else {\n    r = r2;\n  }\n  if (r[X] < 0) {\n    r[X] = 0;\n  }\n  if (r[Y] < 0) {\n    r[Y] = 0;\n  }\n  if (r[WIDTH] + r[X] >= width) {\n    r[WIDTH] = Math.floor(width - r[X] - 1);\n  }\n  if (r[HEIGHT] + r[Y] >= height) {\n    r[HEIGHT] = Math.floor(height - r[Y] - 1);\n  }\n\n  return r;\n}\n\nfunction getFixedCrop(ratio, width, height) {\n  return fitLargestRectangle(ratio, width, height);\n}\n\nfunction scaleRectAroundOrigin(origin, crop, scale) {\n  let i;\n  let tmp;\n  let val;\n  let _len;\n\n  tmp = [crop[X] - origin.x, crop[Y] - origin.y, crop[X] + crop[WIDTH] - origin.x, crop[Y] + crop[HEIGHT] - origin.y];\n\n  for (i = 0, _len = tmp.length; i < _len; i++) {\n    val = tmp[i];\n    tmp[i] = val * scale;\n  }\n\n  return [tmp[X] + origin.x, tmp[Y] + origin.y, tmp[WIDTH] - tmp[X], tmp[HEIGHT] - tmp[Y]];\n}\n\n// baseHSL is an object in format { h: 52, s: 77, l: [74, 56, 68, 47, 73, 45, 62] }\n// h is hue, s is saturation l is array of lightness values to apply across the gradient and a is the alpha\nfunction replaceImageFillWithGradient(image, x, y, baseHSL, canvas, context) {\n  // resize canvas as this can be used for multiple text slots and they can be resized\n  canvas.width = image.width;\n  canvas.height = image.height;\n\n  if (baseHSL.l.length === 1) {\n    console.warn(\n      'lightness array does not contain enough values, please add more, duplicating value as a fallback',\n    );\n    baseHSL.l.push(baseHSL.l[0]);\n  }\n\n  if (\n    !baseHSL.a ||\n    typeof baseHSL.a !== 'number' ||\n    baseHSL.a < 0.0 ||\n    baseHSL.a > 1.0\n  ) {\n    console.warn(\n      'baseHSL.a alpha value is not present, not a number or is out of range (0.0 to 1.0) defaulting to 1.0: ',\n      baseHSL.a,\n    );\n    baseHSL.a = 1.0;\n  }\n\n  // composite fill gradient over whole context\n  context.globalCompositeOperation = 'copy';\n  const linearGradient = context.createLinearGradient(0, 0, x * 3, y * 2);\n  for (let i = 0; i < baseHSL.l.length; i++) {\n    linearGradient.addColorStop(\n      (1 / (baseHSL.l.length - 1)) * i,\n      hslToHex(baseHSL.h, baseHSL.s, baseHSL.l[i]),\n    );\n  }\n  context.fillStyle = linearGradient;\n  context.fillRect(0, 0, canvas.width, canvas.height);\n\n  // composite in transparency from image\n  context.globalCompositeOperation = 'destination-in';\n  context.globalAlpha = baseHSL.a;\n  context.drawImage(image, 0, 0);\n\n  return canvas;\n}\n\nfunction replaceImageFillWithWhiteAndThresholdAlpha(image, canvas, context) {\n  if (canvas.width === 0 || canvas.height === 0) return;\n\n  try {\n    // resize canvas to match image size as this can be used for multiple text slots\n    canvas.width = image.width;\n    canvas.height = image.height;\n\n    context.drawImage(image, 0, 0);\n    context.globalCompositeOperation = 'source-in';\n\n    // IMAGE DATA START\n    const imgData = context.getImageData(0, 0, canvas.width, canvas.height);\n\n    // TODO Test if this is quicker vs draw White to canvas\n    // Loop through pixel data, set rgb to white and apply threshold to alpha\n    const width = imgData.width;\n    const height = imgData.height;\n    for (let y = 0; y < height; y++) {\n      for (let x = 0; x < width; x++) {\n        const pixelNumber = y * width * 4 + x * 4;\n        imgData.data[pixelNumber] = 255;\n        imgData.data[pixelNumber + 1] = 255;\n        imgData.data[pixelNumber + 2] = 255;\n        imgData.data[pixelNumber + 3] >= 200 ? 255 : 0;\n      }\n    }\n    context.putImageData(imgData, 0, 0);\n\n    return canvas;\n  } catch (error) {\n    console.log(error);\n  }\n}\n\nconst CanvasFilters = {\n  colourFX(image, filter, proportion) {\n    var a, b, bm, ctx, data, g, gm, i, img, r, rm, s, v, ct, br, x, y, gammaCorrection;\n    if (proportion === null) proportion = 1.0;\n    if (proportion === 0) return image;\n    if (filter === 'colour') return image;\n    if (!image || !image.getContext) {\n      console.log('image is not suitable for drawing on?');\n      return image;\n    }\n    ctx = image.getContext('2d');\n\n    switch (filter) {\n      case 'greyscale':\n        rm = gm = bm = 0;\n        break;\n      case 'sepia':\n        rm = 25;\n        gm = 5;\n        bm = -25;\n        break;\n      case 'bluetone':\n        rm = -10;\n        gm = 5;\n        bm = 25;\n        break;\n      case 'clarendon':\n        ct = 30; // contrast\n        br = -10; // brightness\n        this.filterLayer(image, filter, ct, br);\n        return image;\n      case 'juno':\n        ct = 40; // contrast\n        br = 0; // brightness\n        this.filterLayer(image, filter, ct, br);\n        return image;\n      case 'ludwig':\n        ct = 20; // contrast\n        br = -20; // brightness\n        this.filterLayer(image, filter, ct, br);\n        return image;\n      case 'lark':\n        ct = 0; // contrast\n        br = 20; // brightness\n        this.filterLayer(image, filter, ct, br);\n        return image;\n      case 'gingham':\n        ct = 0; // contrast\n        br = 5; // brightness\n        this.filterLayer(image, filter, ct, br);\n        return image;\n      case 'lofi':\n        ct = 50; // contrast\n        br = -50; // brightness\n        this.filterLayer(image, filter, ct, br);\n        return image;\n      case 'toaster':\n        ct = 50; // contrast\n        br = -40; // brightness\n        this.filterLayer(image, filter, ct, br);\n        return image;\n      case 'aden':\n        ct = 10; // contrast\n        br = -10; // brightness\n        this.filterLayer(image, filter, ct, br);\n        return image;\n      default:\n      case 'gamma':\n        // ignore\n        gammaCorrection = proportion;\n        break;\n        return;\n    }\n    img = ctx.getImageData(0, 0, image.width, image.height);\n    if (filter === 'gamma') {\n      if (gammaCorrection === 1.0) {\n        return image;\n      }\n      var table = _gammaTable(proportion);\n    }\n    i = 0;\n    data = img.data;\n    y = 0;\n    while (y < img.height) {\n      x = 0;\n      if (i + 4 >= img.length) {\n        break;\n      }\n      while (x < img.width) {\n        if (i + 4 >= img.length) {\n          break;\n        }\n        s = i;\n        r = data[i++];\n        g = data[i++];\n        b = data[i++];\n        a = data[i++];\n        if (filter === 'gamma') {\n          data[s++] = table[r];\n          data[s++] = table[g];\n          data[s++] = table[b];\n        } else {\n          v = 0.5 * r + 0.3 * b + 0.2 * r;\n          data[s++] = Math.clip(Math.clip(v + rm, 0, 255) * proportion + (1 - proportion) * r, 0, 255);\n          data[s++] = Math.clip(Math.clip(v + gm, 0, 255) * proportion + (1 - proportion) * g, 0, 255);\n          data[s++] = Math.clip(Math.clip(v + bm, 0, 255) * proportion + (1 - proportion) * b, 0, 255);\n        }\n        if (s + 4 >= img.length) {\n          break;\n        }\n        x++;\n      }\n      y++;\n    }\n    ctx.putImageData(img, 0, 0);\n    return image;\n  },\n  filterLayer(image, filter, ct, br) {\n    var ctx = image.getContext('2d');\n    ctx.drawImage(image, 0, 0);\n    var overlay = this.overlayFX(image, filter);\n    var screen = this.blend(ctx, overlay, image.width, image.height, function (bottomPixel, topPixel) {\n      return 255 - ((255 - topPixel) * (255 - bottomPixel)) / 255;\n    });\n\n    var colourCorrected = colourCorrection.colourMatrix(screen, { contrast: ct, brightness: br });\n\n    ctx.putImageData(colourCorrected, 0, 0);\n\n    return image;\n  },\n  overlayFX(image, filter) {\n    const texture = document.createElement('canvas');\n    const ctx = texture.getContext('2d');\n    let gradient;\n\n    texture.width = image.width;\n    texture.height = image.height;\n\n    switch (filter) {\n      case 'toaster':\n        gradient = ctx.createRadialGradient(\n          texture.width / 2,\n          texture.height / 2,\n          0,\n          texture.width / 2,\n          texture.height / 2,\n          texture.width * 0.7\n        );\n        gradient.addColorStop(0, '#072A46');\n        gradient.addColorStop(1, '#3b003b');\n        ctx.fillStyle = gradient;\n        ctx.fillRect(0, 0, texture.width, texture.height);\n        break;\n      case 'clarendon':\n        gradient = '(127, 197, 237, 0.3)';\n        ctx.fillStyle = gradient;\n        ctx.fillRect(0, 0, texture.width, texture.height);\n        break;\n      case 'aden':\n        gradient = ctx.createLinearGradient(0, 0, texture.width, 0);\n        gradient.addColorStop(0, '#290609');\n        gradient.addColorStop(1, 'rgba(0, 0, 0, 1)');\n        ctx.fillStyle = gradient;\n        ctx.fillRect(0, 0, texture.width, texture.height);\n        break;\n      case 'lark':\n        gradient = '(25, 50, 50, 0.7)';\n        ctx.fillStyle = gradient;\n        ctx.fillRect(0, 0, texture.width, texture.height);\n        break;\n      case 'lofi':\n        gradient = ctx.createRadialGradient(\n          texture.width / 2,\n          texture.height / 2,\n          0,\n          texture.width / 2,\n          texture.height / 2,\n          texture.width * 0.6\n        );\n        gradient.addColorStop(0.7, 'rgb(55,55,55)');\n        gradient.addColorStop(1, 'rgb(0,0,0)');\n        ctx.fillStyle = gradient;\n        ctx.fillRect(0, 0, texture.width, texture.height);\n        break;\n      case 'gingham':\n        gradient = ctx.createLinearGradient(0, 0, texture.width, 0);\n        gradient.addColorStop(0, '#290609');\n        gradient.addColorStop(1, 'rgba(0, 0, 0, 1)');\n        ctx.fillStyle = gradient;\n        ctx.fillRect(0, 0, texture.width, texture.height);\n        ctx.filter = 'hue-rotate(350)';\n        break;\n      case 'juno':\n        gradient = 'rgb(0,0,0)';\n        ctx.fillStyle = gradient;\n        ctx.fillRect(0, 0, texture.width, texture.height);\n        break;\n      case 'ludwig':\n        gradient = 'rgb(50,10,10)';\n        ctx.fillStyle = gradient;\n        ctx.fillRect(0, 0, texture.width, texture.height);\n        break;\n      default:\n        return ctx;\n    }\n\n    return ctx;\n  },\n  blend(background, foreground, width, height, transform) {\n    const bottom = background.getImageData(0, 0, width, height);\n    const top = foreground.getImageData(0, 0, width, height);\n\n    for (var i = 0, size = top.data.length; i < size; i += 4) {\n      // red\n      top.data[i + 0] = transform(bottom.data[i + 0], top.data[i + 0]);\n      // green\n      top.data[i + 1] = transform(bottom.data[i + 1], top.data[i + 1]);\n      // blue\n      top.data[i + 2] = transform(bottom.data[i + 2], top.data[i + 2]);\n      // the fourth slot is alpha. We don't need that (so skip by 4)\n    }\n\n    return top;\n  },\n  greyscale(image, proportion) {if (proportion === null || proportion === undefined) proportion = 1.0;\n    return this.colourFX(image, 'greyscale', proportion);\n  },\n  sepia(image, proportion) {\n    if (proportion === null || proportion === undefined) {\n      proportion = 1.0;\n    }\n    return this.colourFX(image, 'sepia', proportion);\n  },\n  bluetone(image, proportion) {\n    if (proportion === null || proportion === undefined) {\n      proportion = 1.0;\n    }\n    return this.colourFX(image, 'bluetone', proportion);\n  },\n\n  clarendon(image, proportion) {\n    if (proportion === null || proportion === undefined) proportion = 1.0;\n    return this.colourFX(image, 'clarendon', proportion);\n  },\n  juno(image, proportion) {\n    if (proportion === null || proportion === undefined) proportion = 1.0;\n    return this.colourFX(image, 'juno', proportion);\n  },\n  ludwig(image, proportion) {\n    if (proportion === null || proportion === undefined) proportion = 1.0;\n    return this.colourFX(image, 'ludwig', proportion);\n  },\n  lark(image, proportion) {\n    if (proportion === null || proportion === undefined) proportion = 1.0;\n    return this.colourFX(image, 'lark', proportion);\n  },\n  gingham(image, proportion) {\n    if (proportion === null || proportion === undefined) proportion = 1.0;\n    return this.colourFX(image, 'gingham', proportion);\n  },\n  lofi(image, proportion) {\n    if (proportion === null || proportion === undefined) proportion = 1.0;\n    return this.colourFX(image, 'lofi', proportion);\n  },\n  toaster(image, proportion) {\n    if (proportion === null || proportion === undefined) proportion = 1.0;\n    return this.colourFX(image, 'toaster', proportion);\n  },\n  aden(image, proportion) {\n    if (proportion === null || proportion === undefined) proportion = 1.0;\n    return this.colourFX(image, 'aden', proportion);\n  },\n  none(image, proportion) {\n    if (proportion === null || proportion === undefined) proportion = 1.0;\n    return image;\n  },\n  gamma(image, proportion) {\n    if (proportion === null || proportion === 1.0) {\n      return image;\n    }\n    return this.colourFX(image, 'gamma', proportion);\n  },\n};\n\n/*\nA replacement for context.drawImage\n(args are for source and destination).\n*/\n\nObject.defineProperty(HTMLCanvasElement.prototype, 'naturalWidth', {\n  get() {\n    return this.width;\n  },\n  configurable: true,\n});\n\nObject.defineProperty(HTMLCanvasElement.prototype, 'naturalHeight', {\n  get() {\n    return this.height;\n  },\n  configurable: true,\n});\n\nCanvasRenderingContext2D.prototype.mt = function (x, y) {\n  return this.moveTo(x, y);\n};\n\nCanvasRenderingContext2D.prototype.lt = function (x, y) {\n  return this.lineTo(x, y);\n};\n\nCanvasRenderingContext2D.prototype.bt = function (x1, y1, x2, y2, x, y) {\n  return this.bezierCurveTo(x1, y1, x2, y2, x, y);\n};\n\nCanvasRenderingContext2D.prototype.cp = function () {\n  return this.clip();\n};\n\nCanvasRenderingContext2D.prototype.roundedRect = function (x1, y1, width, height, x_radius, y_radius) {\n  let x2;\n  let xr1;\n  let xr2;\n  let y2;\n  let yr1;\n  let yr2;\n  if (x_radius == null) {\n    x_radius = 4;\n  }\n  if (y_radius == null) {\n    y_radius = null;\n  }\n  x2 = x1 + width;\n  y2 = y1 + height;\n  if (y_radius == null) {\n    y_radius = x_radius;\n  }\n  if (x_radius * 2 > width) {\n    x_radius = width / 2;\n  }\n  if (y_radius * 2 > height) {\n    y_radius = height / 2;\n  }\n  xr1 = x_radius;\n  xr2 = x_radius / 2.0;\n  yr1 = y_radius;\n  yr2 = y_radius / 2.0;\n  this.mt(x1 + xr1, y1);\n  this.lt(x2 - xr1, y1);\n  this.bt(x2 - xr2, y1, x2, y1 + yr2, x2, y1 + yr1);\n  this.lt(x2, y2 - yr1);\n  this.bt(x2, y2 - yr2, x2 - xr2, y2, x2 - xr1, y2);\n  this.lt(x1 + xr1, y2);\n  this.bt(x1 + xr2, y2, x1, y2 - yr2, x1, y2 - yr1);\n  this.lt(x1, y1 + yr1);\n  this.bt(x1, y1 + yr2, x1 + xr2, y1, x1 + xr1, y1);\n  this.cp();\n  return this;\n};\n\nHTMLCanvasElement.prototype.clone = function () {\n  const newCanvas = document.createElement('canvas');\n  newCanvas.width = this.width;\n  newCanvas.height = this.height;\n  const ctx = newCanvas.getContext('2d');\n  ctx.drawImage(this, 0, 0);\n  return newCanvas;\n};\n\nHTMLCanvasElement.prototype.cloneRectangle = function (rect, outputAspectRatio) {\n  const cropCords = new CropCords(rect, outputAspectRatio);\n\n  const other = document.createElement('canvas');\n  other.width = cropCords.canvasWidth;\n  other.height = cropCords.canvasHeight;\n\n  const ctx = other.getContext('2d');\n\n  if (cropCords.isFitCrop) {\n    // draw the entire source image at the given co-ords in the canvas\n    ctx.drawImage(this, cropCords.x, cropCords.y, cropCords.width, cropCords.height);\n  } else {\n    // draw a cropped source image across the entire canvas\n    ctx.drawImage(this, cropCords.x, cropCords.y, cropCords.width, cropCords.height, 0, 0, other.width, other.height);\n  }\n\n  return other;\n};\n\nMath.clip = function (number, min, max) {\n  return Math.max(min, Math.min(number, max));\n};\n\nfunction _gammaTable(gamma) {\n  const table = new Array(256);\n  let i = 0;\n  for (; i < 256; i++) {\n    table[i] = Math.clip(255 * Math.pow(i / 255.0, 1.0 / gamma), 0, 255);\n  }\n  return table;\n}\n\nfunction fitLargestRectangle(ratio, iWidth, iHeight) {\n  return Rectangle.fitLargestRectangle(ratio, iWidth, iHeight).map((item) => Math.floor(item));\n}\n\nexport {\n  Morandi, getDefaultCrop, getDefaultCropRatio, getFixedCrop, validNumber, CanvasFilters, scaleRectAroundOrigin, replaceImageFillWithGradient, replaceImageFillWithWhiteAndThresholdAlpha,\n};\n","// Import Modules\nimport {\n  Morandi, getDefaultCrop, getDefaultCropRatio, getFixedCrop, validNumber, CanvasFilters,\n} from './canvas';\nimport {\n  X, Y, WIDTH, HEIGHT,\n} from './iu-constants';\n\nconst INCH_MM = 25.4;\nconst RIGHT_ANGLE = 90;\nconst DEF_BRIGHTNESS = 10;\nconst DEF_FX = 'colour';\nconst DEF_STRAIGHTEN = 0;\nconst DEF_ZOOM = 1;\nconst MAX_ZOOM = 20;\nconst MIN_ZOOM = 1;\nconst PORTRAIT = 0;\nconst LANDSCAPE = 1;\n\nconst ImageUtils = (() => {\n  const zoomHelpers = (function () {\n    const straightenStorage = {};\n    const brightnessStorage = {};\n    const zoomStorage = {};\n\n    return {\n      defaultCrop(photo) {\n        const { area } = photo.size;\n        const { raw_dimensions: rawDimensions, constraints = {} } = photo;\n\n        let { w, h } = rawDimensions;\n\n        const ratio = constraints.prism\n          ? constraints.ratio  // already rotated\n          : getDefaultCropRatio(area[X] / area[Y], w, h);\n\n        if (photo.straighten % (2 * RIGHT_ANGLE) === RIGHT_ANGLE) {\n          [h, w] = [rawDimensions.w, rawDimensions.h];\n        }\n\n        return getFixedCrop(ratio, w, h);\n      },\n      getCrop(photo) {\n        if (photo.crop && typeof photo.crop === 'object' && photo.crop.length == 4) {\n          return photo.crop;\n        }\n\n        if (photo.crop && typeof photo.crop === 'string') {\n          return photo.crop.split(/,/).map((e) => parseInt(e));\n        }\n      },\n      setStraighten(imageId, value) {\n        value = Number(value);\n        if (isNaN(value)) {\n          value = DEF_STRAIGHTEN;\n        }\n\n        straightenStorage[imageId] = value;\n      },\n      getStraighten(imageId) {\n        let value = DEF_STRAIGHTEN;\n\n        if (straightenStorage.hasOwnProperty(imageId)) {\n          value = straightenStorage[imageId];\n        }\n\n        return value;\n      },\n      setBrightness(imageId, value) {\n        value = Number(value);\n        if (isNaN(value)) {\n          value = DEF_BRIGHTNESS;\n        }\n\n        brightnessStorage[imageId] = value;\n      },\n      getBrightness(imageId) {\n        let value = DEF_BRIGHTNESS;\n\n        if (brightnessStorage.hasOwnProperty(imageId)) {\n          value = brightnessStorage[imageId];\n        }\n\n        return value;\n      },\n      setZoom(imageId, value) {\n        value = Number(value);\n        if (isNaN(value)) {\n          value = DEF_ZOOM;\n        }\n\n        zoomStorage[imageId] = value;\n      },\n      getZoom(imageId) {\n        let value = DEF_ZOOM;\n\n        if (zoomStorage.hasOwnProperty(imageId)) {\n          value = zoomStorage[imageId];\n        }\n\n        return value;\n      },\n      getZoomFromPhotoData(photo) {\n        if (!photo.crop) {\n          return DEF_ZOOM;\n        }\n\n        const defaultCrop = this.defaultCrop(photo);\n        const crop = this.getCrop(photo);\n        const zoom = defaultCrop[WIDTH] / crop[WIDTH];\n\n        if (isNaN(zoom)) {\n          return DEF_ZOOM;\n        }\n\n        if (zoom > MAX_ZOOM) {\n          return MAX_ZOOM;\n        }\n\n        if (zoom < MIN_ZOOM) {\n          return MIN_ZOOM;\n        }\n\n        return zoom;\n      },\n      hasZoom(imageId) {\n        return zoomStorage.hasOwnProperty(imageId);\n      },\n    };\n  }());\n\n  const imgHelpers = (function () {\n    function isMsIe() {\n      const ua = window.navigator.userAgent;\n      const msie = ua.indexOf('MSIE ');\n      return (msie > -1 || !!navigator.userAgent.match(/Trident.*rv\\:11\\./));\n    }\n\n    function urlMunge(url) {\n      if (typeof (url) === 'string') {\n        return url.replace(/^https?:/, '');\n      }\n      try {\n        console.warn('Attempt to clean non-string URL');\n      } catch (e) { }\n      return null;\n    }\n\n    function cleanPrismImageURL(src, filter) {\n      if (!src) return src;\n      var replace = `\\/${filter}[a-z]*$`;\n      var re = new RegExp(replace);\n      return src.replace(re, '/colour');\n    }\n\n    function getDPI(max_mm, max_pixels) {\n      return ((INCH_MM * max_pixels) / (max_mm));\n    }\n\n    function doStraighten(img, inRatio /* Not Used ! */, straighten) {\n      let dup; let ratio; let a_ratio; let rh; let rw; let rotationValueRad; let scale; let scale_w; let\n        ctx;\n      const { width } = img;\n      const { height } = img;\n\n      ratio = width / height;\n      a_ratio = height / width;\n\n      rotationValueRad = straighten * (Math.PI / (2 * RIGHT_ANGLE));\n      const absStraightenRad = Math.abs(rotationValueRad);\n      rh = height / ((ratio * Math.sin(absStraightenRad)) + Math.cos(absStraightenRad));\n      scale = Math.abs(height / rh);\n\n      rw = width / ((a_ratio * Math.sin(absStraightenRad)) + Math.cos(absStraightenRad));\n      scale_w = Math.abs(width / rw);\n      if (scale_w > scale) {\n        scale = scale_w;\n      }\n\n      dup = Morandi.cloneCanvas(img);\n      ctx = dup.getContext('2d');\n      ctx.save();\n      ctx.translate(width / 2, height / 2);\n      ctx.rotate(rotationValueRad);\n      ctx.scale(scale, scale);\n      ctx.translate(width / -2, height / -2);\n      ctx.drawImage(dup, 0, 0);\n      ctx.restore();\n      return dup;\n    }\n\n    function getPhotoCrop(photo) {\n      const { crop } = photo;\n\n      if (crop) {\n        if (typeof crop === 'object') {\n          return crop;\n        }\n\n        if (typeof crop === 'string') {\n          return crop.split(/,/).map((e) => parseInt(e));\n        }\n      }\n\n      return getDefaultCrop(photo.size_area[X] / photo.size_area[Y], photo.raw_dimensions.w, photo.raw_dimensions.h);\n    }\n\n    function getPhotoDPI(photo) {\n      let mm = photo.size_area[X];\n      if (mm < photo.size_area[Y]) {\n        mm = photo.size_area[Y];\n      }\n\n      const crop = getPhotoCrop(photo);\n      let px = crop[WIDTH];\n      if (px < crop[HEIGHT]) {\n        px = crop[HEIGHT];\n      }\n\n      return getDPI(mm, px);\n    }\n\n    function doProcessPhoto(img, props, ratio, scale) {\n      img = Morandi.cloneCanvasAtAngle(img, ((4 * RIGHT_ANGLE) - props.angle) % (4 * RIGHT_ANGLE));\n\n      const ctx = img.getContext('2d');\n      ctx.setTransform(1, 0, 0, 1, 0, 0);\n\n      if (props.straighten) {\n        img = doStraighten(img, ratio, props.straighten);\n      }\n\n      // Scale down for pixel-ops\n      if (scale && (scale > 0) && (scale < 1.0)) {\n        img = Morandi.cloneAndCropCanvasAtScale(img, img.width * scale, img.height * scale, img.width / img.height);\n      }\n\n      // console.log('process: %o', props);\n      if (validNumber(props.gamma, 0.1, 2.0)) {\n        img = CanvasFilters.gamma(img, props.gamma);\n      }\n      if (!!props.fx && props.fx !== 'colour') {\n        img = CanvasFilters[props.fx](img, 1.0);\n      }\n      if (validNumber(props.saturation, 0, 1.0)) {\n        img = CanvasFilters.greyscale(img, 1.0 - props.saturation);\n      }\n\n      if (scale && (scale > 0) && (scale < 1.0)) {\n        img = Morandi.cloneAndCropCanvasAtScale(img, img.width / scale, img.height / scale, img.width / img.height);\n      }\n\n      return img;\n    }\n\n    function getPhotoOrientation(photo) {\n      const { w: width, h: height } = photo.raw_dimensions;\n\n      return width < height ? PORTRAIT : LANDSCAPE;\n    }\n\n    function getPhotoAspectRatio(photo) {\n      const ratio = photo.size.area[X] / photo.size.area[Y];\n      if (getPhotoOrientation(photo) === PORTRAIT) {\n        return 1 / ratio;\n      }\n\n      return ratio;\n    }\n\n    return {\n      getPhotoDPI,\n      getPhotoCrop,\n      doProcessPhoto,\n      getPhotoAspectRatio,\n      cleanPrismImageURL,\n      urlMunge,\n      isMsIe,\n    };\n  }());\n\n  return {\n\n    /* Helper Numbers */\n    X,\n    Y,\n    WIDTH,\n    HEIGHT,\n\n    /* Constants */\n    DEF_STRAIGHTEN,\n    MAX_STRAIGHTEN: 20,\n    MIN_STRAIGHTEN: -20,\n    DEF_BRIGHTNESS,\n    MAX_BRIGHT: 15,\n    MIN_BRIGHT: 5,\n    DEF_GAMMA: 1,\n    DEF_FX,\n    DEF_ZOOM,\n    MAX_ZOOM: 20,\n    MIN_ZOOM: 1,\n    RIGHT_ANGLE,\n    INCH_MM,\n    MAX_PRINTS: 999,\n    EL2_WIDTH: 790,\n    EL2_HEIGHT: 640,\n    CANVAS_W: 600,\n    CANVAS_H: 600,\n\n    /* Functions */\n    zoomHelpers,\n    imgHelpers,\n  };\n})();\n\n// The export is unusual because of _ImageUtils's definition\n// _ImageUtils can be easily refactored such that the below export looks normal\n// e.g. export default _ImageUtils;\nexport default ImageUtils;\n","import { GoogleAnalytics } from '../../../_libs/analytics/google-analytics';\n\nconst sendToGoogleAnalytics = (feature, value) => {\n  const eventBuilder =\n    typeof wkData === 'object' ? 'Prism-Builder' : 'Prints-Builder';\n  const product = typeof wkData === 'object' ? wkData.product.type : '';\n\n  new GoogleAnalytics().sendEvent(eventBuilder, {\n    event_type: feature,\n    event_value: value,\n    event_product: product,\n    event_category: 'FeatureTracking',\n    cohort: '0',\n  });\n\n  return true;\n};\n\nexport default sendToGoogleAnalytics;\n","'use strict';\n\n// Import Libraries\nimport React from 'react';\nimport classNames from 'classnames';\nimport { CSSTransition }  from 'react-transition-group';\n\nexport default class ButtonRibbon extends React.Component {\n  constructor(props) {\n    super(props);\n\n    this.state = {\n      showBack: false,\n      showNext: false,\n      loaderNavIndexShown: 0\n    }\n\n    this.updateChevrons = this.updateChevrons.bind(this);\n    this.slideLeft      = this.slideLeft.bind(this);\n    this.slideRight     = this.slideRight.bind(this);\n  }\n\n  componentDidMount() {\n    window.addEventListener('resize', this.updateChevrons);\n\n    this.updateChevrons();\n  }\n\n  componentWillUnmount() {\n    window.removeEventListener('resize', this.updateChevrons);\n  }\n\n  componentDidUpdate(prevProps) {\n    if (prevProps.children !== this.props.children) {\n      this.updateChevrons();\n    }\n  }\n\n  render() {\n    const Tag = this.props.tag || 'div';\n\n    const className =\n      classNames('button-ribbon d-flex position-relative', this.props.className, {\n        'button-ribbon-trim-edges': !!this.props.trimEdges,\n        'button-ribbon-gradient': !!this.props.gradient\n      });\n\n    return (\n      <Tag className={className} role={this.props.role} tabIndex={this.props.tabIndex}>\n        { this.renderBackChevron() }\n\n        <div\n          className=\"buttons d-flex w-100\"\n          id={this.props.id}\n          key={this.props.id}\n          ref={ref => this.ribbon = ref}\n          role=\"tablist\"\n          onScroll={this.updateChevrons}\n          >\n          { this.props.children }\n        </div>\n\n        { this.renderNextChevron() }\n      </Tag>\n    );\n  }\n\n  renderBackChevron() {\n    return (\n      <CSSTransition in={ this.state.showBack }\n                     timeout={ 200 }\n                     classNames=\"slide\">\n        <div className={classNames('chevron-wrapper left h-100 position-absolute', { hide: !this.state.showBack })}>\n          <button\n            aria-label=\"Scroll left\"\n            className=\"btn btn-link chevron h-100 m-0 border-0\"\n            onClick={this.slideRight}\n          >\n            <i aria-hidden=\"true\" className=\"fas fa-chevron-left\" />\n          </button>\n        </div>\n      </CSSTransition>\n    );\n  }\n\n  renderNextChevron() {\n    return (\n      <CSSTransition in={ this.state.showNext }\n                     timeout={ 200 }\n                     classNames=\"slide\">\n        <div className={classNames('chevron-wrapper right h-100 position-absolute', { hide: !this.state.showNext })}>\n          <button\n            aria-label=\"Scroll right\"\n            className=\"btn btn-link chevron h-100 m-0 border-0\"\n            onClick={this.slideLeft}\n          >\n            <i aria-hidden=\"true\" className=\"fas fa-chevron-right\" />\n          </button>\n        </div>\n      </CSSTransition>\n    );\n  }\n\n  updateChevrons() {\n    this.setState(() => {\n      const { scrollLeft, offsetWidth, scrollWidth } = this.ribbon;\n\n      return {\n        showBack: scrollLeft > 0,\n        showNext: (offsetWidth + scrollLeft) < scrollWidth\n      };\n    });\n  }\n\n  slideLeft() {\n    const scrollLeft = this.props.loaderNav ? this.calculateOffset(1) : this.ribbon.scrollLeft + this.ribbon.offsetWidth;\n\n    $(this.ribbon).animate({ scrollLeft }, 200);\n  }\n\n  slideRight() {\n    const scrollLeft = this.props.loaderNav ? this.calculateOffset(-1) : this.ribbon.scrollLeft - this.ribbon.offsetWidth;\n\n    $(this.ribbon).animate({ scrollLeft }, 200);\n  }\n\n  calculateOffset(plusOrMinus) {\n    let elementSum = 0,\n        scrollLeft;\n\n    for( let i = this.state.loaderNavIndexShown; i >= 0 && i < this.ribbon.children.length; i += plusOrMinus) {\n      if (elementSum + $(this.ribbon.children[i]).outerWidth() > this.ribbon.offsetWidth - $(this.ribbon.children[i]).outerWidth()) {\n         scrollLeft = this.ribbon.scrollLeft + plusOrMinus *  elementSum;\n         this.setState({ loaderNavIndexShown: i });\n         break;\n      } else {\n        elementSum += $(this.ribbon.children[i]).outerWidth();\n      }\n    }\n\n    return scrollLeft;\n  }\n}\n"],"names":["isDataURL","url","isEL2","_setURL","src","callback","reportError","screenAndStyle","xhr","fetchImage","crossOrigin","handleLoad","handleError","image","setImageSrc","DELTA_INDEX","colourCorrection","a","b","i","j","k","col","val","imageData","options","brightness","contrast","matrix","x","data","l","r","g","m0","m1","m2","m3","m4","m5","m6","m7","m8","m9","m10","m11","m12","m13","m14","m15","m16","m17","m18","m19","__slice","Rectangle","y","width","height","__publicField","qtty","ratio","iWidth","iHeight","ch","cw","rectRatio","features","args","rect","r_ratio","printRatio","bestFit","altPrintRatio","imgRatio","out","X","Y","WIDTH","HEIGHT","CANVAS_W","CANVAS_H","ThumbnailCropCords","outputAspectRatio","v","offset","textColourFromNodes","elementNodes","colours","textNode","lightnessFromRGB","rgb","cmin","cmax","lightness","lightnessFromColourArray","colourArray","colour","filterDuplicates","array","average","total","value","averageLightness","colourNodes","useOffset","filteredArray","lightnessArray","hslToHex","hue","saturation","hDecimal","f","n","color","Morandi","bh","bw","cr","x1","y1","x2","y2","x_radius","y_radius","xr1","xr2","yr1","yr2","source","img","largest","scale","scale1","scale2","canvas","newCanvas","angle","ctx","validNumber","min","max","getDefaultCropRatio","r1","fitLargestRectangle","r2","getDefaultCrop","getFixedCrop","scaleRectAroundOrigin","origin","crop","tmp","_len","replaceImageFillWithGradient","baseHSL","context","linearGradient","replaceImageFillWithWhiteAndThresholdAlpha","imgData","pixelNumber","error","CanvasFilters","filter","proportion","bm","gm","rm","s","ct","br","gammaCorrection","table","_gammaTable","overlay","screen","bottomPixel","topPixel","colourCorrected","texture","gradient","background","foreground","transform","bottom","top","size","cropCords","CropCords","other","number","gamma","item","INCH_MM","RIGHT_ANGLE","DEF_BRIGHTNESS","DEF_FX","DEF_STRAIGHTEN","DEF_ZOOM","MAX_ZOOM","MIN_ZOOM","PORTRAIT","LANDSCAPE","ImageUtils","zoomHelpers","straightenStorage","brightnessStorage","zoomStorage","photo","area","rawDimensions","constraints","w","h","e","imageId","defaultCrop","zoom","imgHelpers","isMsIe","urlMunge","cleanPrismImageURL","replace","re","getDPI","max_mm","max_pixels","doStraighten","inRatio","straighten","dup","a_ratio","rh","rw","rotationValueRad","scale_w","absStraightenRad","getPhotoCrop","getPhotoDPI","mm","px","doProcessPhoto","props","getPhotoOrientation","getPhotoAspectRatio","sendToGoogleAnalytics","feature","eventBuilder","product","GoogleAnalytics","ButtonRibbon","React","prevProps","Tag","className","classNames","ref","CSSTransition","scrollLeft","offsetWidth","scrollWidth","plusOrMinus","elementSum"],"mappings":"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"}