{"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 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 \n { this.renderBackChevron() }\n\n this.ribbon = ref}\n role=\"tablist\"\n onScroll={this.updateChevrons}\n >\n { this.props.children }\n \n\n { this.renderNextChevron() }\n \n );\n }\n\n renderBackChevron() {\n return (\n \n
\n \n \n \n
\n
\n );\n }\n\n renderNextChevron() {\n return (\n \n
\n \n \n \n
\n
\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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"}