{"version":3,"file":"69676638855d2e6ef57431ac44fa0b6b80faa336-73e4928b1e0f7fb07621.js","mappings":"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","sources":["webpack://fluffle/./src/components/banner.tsx","webpack://fluffle/./src/components/gallery-thumbnail.module.scss","webpack://fluffle/./src/components/gallery-thumbnail.tsx","webpack://fluffle/./src/components/progress-bar-part.module.scss","webpack://fluffle/./src/components/progress-bar-part.tsx","webpack://fluffle/./src/components/progress-bar.tsx","webpack://fluffle/./src/services/gallery.ts","webpack://fluffle/./src/components/search-result-desktop.tsx","webpack://fluffle/./src/services/search-config.ts","webpack://fluffle/./src/components/search-result-mobile.tsx","webpack://fluffle/./src/pages/index.module.scss","webpack://fluffle/./src/pages/index.tsx","webpack://fluffle/./node_modules/@babel/runtime/helpers/esm/createClass.js"],"sourcesContent":["import * as React from 'react'\nimport svg from '../services/svg'\n\nconst Banner = () => {\n return (\n \"Fluffle\n )\n}\n\nexport default Banner","// extracted by mini-css-extract-plugin\nexport var Skeleton = \"gallery-thumbnail-module--Skeleton--nver1\";\nexport var blur = \"gallery-thumbnail-module--blur--qVN0H\";\nexport var galleryThumbnail = \"gallery-thumbnail-module--gallery-thumbnail--LkmK5\";\nexport var skeleton = \"gallery-thumbnail-module--skeleton--PeWDl\";","import * as React from 'react'\nimport { galleryThumbnail, blur, skeleton } from './gallery-thumbnail.module.scss'\nimport { SearchResultThumbnail } from '../services/api'\nimport classNames from 'classnames';\n\ninterface GalleryThumbnailProps {\n thumbnail: SearchResultThumbnail,\n hasBlur: boolean\n}\n\nconst GalleryThumbnail = ({ thumbnail, hasBlur }: GalleryThumbnailProps) => {\n const [hasBeenLoaded, setHasBeenLoaded] = React.useState(false);\n const [error, setError] = React.useState(null);\n\n function load(element: HTMLImageElement) {\n if (element == null) return;\n\n const image = new Image();\n image.onload = () => {\n element.src = image.src;\n setHasBeenLoaded(true);\n setError(null);\n };\n\n image.onerror = () => {\n setError('Fluffle offline');\n };\n\n image.src = thumbnail.location;\n }\n\n return (\n
\n load(element)} />\n
\n {error}\n
\n
\n
\n )\n}\n\nexport default GalleryThumbnail\n","// extracted by mini-css-extract-plugin\nexport var progressBar = \"progress-bar-part-module--progress-bar--7kGtk\";\nexport var progressBarAnimated = \"progress-bar-part-module--progress-bar-animated--EaAjm\";\nexport var progressBarStriped = \"progress-bar-part-module--progress-bar-striped--QRFI4\";\nexport var progressBarStripes = \"progress-bar-part-module--progress-bar-stripes--+d4Bi\";","import classNames from 'classnames'\nimport * as React from 'react'\nimport { progressBar, progressBarStriped, progressBarAnimated } from './progress-bar-part.module.scss'\n\ninterface ProgressBarProps {\n color: string;\n percentage: number;\n isStriped: boolean;\n isAnimated: boolean;\n}\n\nconst ProgressBarPart = ({ color, percentage, isStriped, isAnimated }: ProgressBarProps) => {\n const classes = [\n progressBar,\n ...isStriped ? [progressBarStriped] : [],\n ...isAnimated ? [progressBarAnimated] : [],\n color\n ]\n\n return (\n
\n )\n}\n\nProgressBarPart.defaultProps = {\n isStriped: false,\n isAnimated: false\n}\n\nexport default ProgressBarPart\n","import * as React from 'react'\n\nconst ProgressBar = ({ children }) => {\n return (\n
\n
\n {children}\n
\n
\n )\n}\n\nexport default ProgressBar\n","export class Gallery {\n images: GalleryImage[] = [];\n\n constructor(private _targetHeight: number, private _maximumHeight: number) {\n }\n\n set targetHeight(targetHeight: number) {\n this._targetHeight = targetHeight;\n }\n\n public addImage(width: number, height: number, data: any = null) {\n this.images.push(new GalleryImage(width, height, data));\n }\n\n public clear() {\n this.images = [];\n }\n\n public render(targetWidth: number, targetMargin: number, shouldFit: boolean = true): GalleryRow[] {\n let rows: GalleryRow[] = [];\n\n let row = new GalleryRow(targetWidth, this._targetHeight, this._maximumHeight, targetMargin)\n for (let image of this.images) {\n if (!row.tryAddImage(image)) {\n rows.push(row);\n\n row = new GalleryRow(targetWidth, this._targetHeight, this._maximumHeight, targetMargin);\n row.tryAddImage(image);\n }\n }\n\n // Add the final row if it isn't empty\n if (row.any()) {\n rows.push(row);\n }\n\n if (shouldFit) {\n for (let row of rows) {\n row.fit();\n }\n }\n\n if (rows.length > 0) {\n rows[rows.length - 1].isLast = true;\n }\n\n return rows;\n }\n}\n\nexport class GalleryRow {\n public images: GalleryRowImage[] = [];\n public couldFit: boolean;\n\n constructor(private _targetWidth: number, private _targetHeight: number,\n private _maximumHeight: number, private _targetMargin: number, public isLast: boolean = false) {\n }\n\n public tryAddImage(image: GalleryImage): boolean {\n if (!this.hasSpaceFor(image)) {\n return false;\n }\n\n this.images.push(new GalleryRowImage(this.calculateTheoreticalSpaceTaken(image), this._targetHeight, image.aspectRatio, image.data));\n\n return true;\n }\n\n public calculateTheoreticalSpaceTakenIncludingMargin(image: GalleryImage): number {\n let imageWidth = this.calculateTheoreticalSpaceTaken(image);\n let spaceTakenByImageWithMargin = imageWidth + (this._targetMargin * 2);\n\n if (spaceTakenByImageWithMargin > this._targetWidth) {\n return this._targetWidth;\n }\n\n return spaceTakenByImageWithMargin;\n }\n\n public calculateTheoreticalSpaceTaken(image: GalleryImage): number {\n return Math.round(image.aspectRatio * this._targetHeight);\n }\n\n public any(): boolean {\n return this.images.length > 0;\n }\n\n public hasSpaceFor(image: GalleryImage): boolean {\n let spaceTaken = this.calculateSpaceTaken();\n let spaceTakenByImage = this.calculateTheoreticalSpaceTakenIncludingMargin(image);\n let newWidth = spaceTaken + spaceTakenByImage;\n\n return newWidth <= this._targetWidth\n }\n\n public calculateSpaceLeft(): number {\n let spaceTakenInRow = this.calculateSpaceTaken();\n\n return this._targetWidth - spaceTakenInRow;\n }\n\n public fit() {\n this.couldFit = true;\n\n let spaceLeft = this.calculateSpaceLeft();\n\n let totalAspectRatio = 0;\n for (let image of this.images) {\n totalAspectRatio += image.aspectRatio;\n }\n\n for (let image of this.images) {\n let fractionOfTotalAspectRatio = image.aspectRatio / totalAspectRatio;\n let extraWidth = fractionOfTotalAspectRatio * spaceLeft;\n let widthIncreaseFactor = extraWidth / image.width;\n\n extraWidth = Math.floor(extraWidth)\n let extraHeight = Math.floor(widthIncreaseFactor * image.height);\n\n if (image.height + extraHeight >= this._maximumHeight) {\n this.fitMaximumHeight();\n\n let percentageLeft = this.calculateSpaceLeft() / this._targetWidth * 100;\n this.couldFit = percentageLeft <= 10;\n break;\n }\n\n image.width += extraWidth;\n image.height += extraHeight;\n }\n }\n\n private fitMaximumHeight() {\n let growFactor = this._maximumHeight / this._targetHeight;\n\n for (let image of this.images) {\n image.width = Math.floor(image.width * growFactor);\n image.height = this._maximumHeight;\n }\n }\n\n public calculateSpaceTaken(): number {\n let width = 0;\n\n for (let image of this.images) {\n width += image.width;\n }\n\n if (this.images.length > 1) {\n // The two images on the side don't require any margin from its parent. We need to remove that\n let margin = (this.images.length * 2 - 2) * this._targetMargin;\n\n width += margin\n }\n\n return width;\n }\n}\n\nexport class GalleryImage {\n constructor(public width: number, public height: number, public data: TSrc) {\n }\n\n get aspectRatio(): number {\n return this.width / this.height;\n }\n}\n\nexport class GalleryRowImage {\n constructor(public width: number, public height: number, public aspectRatio: number, public data: TSrc) {\n }\n}\n","import * as React from 'react'\nimport { SearchResult, SearchResultItem } from '../services/api'\nimport { Gallery, GalleryRow, GalleryRowImage } from '../services/gallery'\nimport GalleryThumbnail from './gallery-thumbnail'\nimport Icon from './icon'\n\nconst GalleryDesktopCard = ({ image, shouldBlur }: { image: GalleryRowImage, shouldBlur: boolean }) => {\n const [hasHover, setHasHover] = React.useState(false);\n\n return (\n setHasHover(true)} onMouseLeave={() => setHasHover(false)} className=\"relative rounded overflow-hidden select-none force-light-100\" style={{ width: image.width, height: image.height }}>\n
\n \n \n \n
{(image.data.score * 100).toFixed(2)}%
\n
\n
\n
\n {image.data.credits && By {image.data.credits}}\n {!image.data.credits && Unknown artist}\n
\n \n
\n )\n}\n\nconst GalleryDesktop = ({ data, width, targetHeight, maximumHeight, shouldBlur }: { data: SearchResultItem[], width: number, targetHeight: number, maximumHeight: number, shouldBlur: boolean }) => {\n const gallery = new Gallery(targetHeight, maximumHeight);\n const [render, setRender] = React.useState[]>()\n\n React.useEffect(() => {\n renderGallery();\n }, [width]);\n\n function renderGallery() {\n data.forEach(result => {\n let aspectRatio = result.thumbnail.width / result.thumbnail.height;\n\n let width = result.thumbnail.width;\n let height = result.thumbnail.height;\n\n // Images which are either very tall or wide, can screw with the gallery's\n // ability to fit them nicely in the grid. So, in order to fix that, we\n // force those images to be displayed as squares instead, just like on the mobile UI.\n if (aspectRatio < 0.6 || aspectRatio > 2) {\n width = 250;\n height = 250;\n }\n\n gallery.addImage(width, height, result);\n });\n\n const newRender = gallery.render(width, 6);\n\n const minNumberOfImages = 12;\n const minNumberOfRows = 3;\n let currentNumberOfImages = 0;\n let i = 0;\n for (; i < newRender.length; i++) {\n var currentRow = newRender[i];\n currentNumberOfImages += currentRow.images.length;\n\n if (currentNumberOfImages >= minNumberOfImages && minNumberOfRows <= i + 1) {\n break;\n }\n }\n\n setRender(newRender.slice(0, i + 1));\n }\n\n return (\n
\n {render != null && render.map(row => (\n
i.data.id).join(\"-\")} className={`flex ${row.couldFit ? \"justify-between\" : \"justify-start space-x-3\"}`}>\n {row.images.map(image => (\n \n ))}\n
\n ))}\n
\n )\n}\n\nconst SearchResultDesktop = ({ data }: { data: SearchResult }) => {\n const [hideImprobable, setHideImprobable] = React.useState(true);\n const [width, setWidth] = React.useState(0);\n const containerRef: React.RefObject = React.useRef();\n\n function onResize() {\n setWidth(containerRef.current.clientWidth);\n }\n\n React.useEffect(() => {\n onResize();\n window.addEventListener('resize', onResize);\n\n return () => {\n window.removeEventListener('resize', onResize);\n };\n }, []);\n\n return (\n
\n
\n \n
\n
\n Searched {data.stats.count.toLocaleString()} images in {data.stats.elapsedMilliseconds.toLocaleString()} ms\n
\n
\n {\n {\n 0: \"Looks like we couldn't find what you're looking for\",\n 1: \"We found an image similar to the one you submitted\"\n }[data.probableResults.length] || \"We found images similar to the one you submitted\"\n }\n
\n
\n
\n {width != 0 && data.probableResults.length > 0 &&\n \n }\n {width != 0 && data.improbableResults.length > 0 &&\n
\n
\n \n \n
\n \n
\n }\n
\n )\n}\n\nexport default SearchResultDesktop\n","import * as React from 'react'\n\nconst ImageRating = {\n Safe: 'SAFE',\n Explicit: 'EXPLICIT'\n};\n\nconst SearchConfig = function () {\n if (typeof localStorage === 'undefined') {\n return {}\n }\n\n function readIncludeNsfw() {\n if (localStorage.getItem('rating') != null) {\n return localStorage.getItem('rating') === ImageRating.Explicit;\n }\n\n return false;\n }\n\n const [includeNsfw, setIncludeNsfw] = React.useState(readIncludeNsfw());\n\n return {\n includeNsfw,\n setIncludeNsfw(includeNsfw: boolean) {\n localStorage.setItem('rating', includeNsfw ? ImageRating.Explicit : ImageRating.Safe);\n setIncludeNsfw(includeNsfw);\n }\n }\n};\n\nexport default SearchConfig\n","import * as React from 'react'\nimport { Match, SearchResult, SearchResultItem } from '../services/api';\nimport GalleryThumbnail from './gallery-thumbnail';\nimport Icon from './icon';\n\nconst GalleryCard = ({ data, enableBlur, onClick, seq }: { data: SearchResultItem, enableBlur: boolean, onClick: Function, seq: number }) => {\n const [hasBeenClicked, setHasBeenClicked] = React.useState(false);\n\n React.useEffect(() => {\n setHasBeenClicked(false);\n }, [seq]);\n\n const [hasBlur, setHasBlur] = React.useState(false);\n React.useEffect(() => {\n setHasBlur(enableBlur && !hasBeenClicked);\n }, [hasBeenClicked, enableBlur]);\n\n function handleClick(e: React.MouseEvent) {\n if (!hasBlur) {\n return;\n }\n\n setHasBeenClicked(true);\n e.preventDefault();\n onClick();\n }\n\n return (\n \n
\n
\n
\n \n
\n
\n {data.credits && By {data.credits}}\n {!data.credits && Unknown artist}\n
\n
\n \n
\n
\n
\n
\n )\n}\n\nconst GalleryMobile = ({ results, hideImprobable, onClick, seq }: { results: SearchResultItem[], hideImprobable: boolean, onClick: Function, seq: number }) => {\n return (\n
\n {results.slice(0, 12).map(item => (\n \n ))}\n
\n )\n}\n\nconst SearchResultMobile = ({ data }: { data: SearchResult }) => {\n const [hideImprobable, setHideImprobable] = React.useState(true);\n const [shouldHide, setShouldHide] = React.useState(false);\n const [seq, setSeq] = React.useState(0);\n\n function onClick() {\n setShouldHide(true);\n }\n\n function toggleHide() {\n setHideImprobable(shouldHide);\n setShouldHide(!shouldHide);\n setSeq(seq + 1);\n }\n\n return (\n
\n
\n \n
\n
\n Searched {data.stats.count.toLocaleString()} images in {data.stats.elapsedMilliseconds.toLocaleString()} ms\n
\n
\n {\n {\n 0: \"Couldn't find what you're looking for\",\n 1: \"We found a similar image\"\n }[data.probableResults.length] || \"We found similar images\"\n }\n
\n
\n
\n
\n
\n
\n
\n We've hidden improbable matches to keep you from viewing content you might experience as unpleasant\n
\n \n
\n \n
\n
\n
\n )\n};\n\nexport default SearchResultMobile\n","// extracted by mini-css-extract-plugin\nexport var dropZone = \"index-module--drop-zone--fWn+W\";\nexport var dropZoneActive = \"index-module--drop-zone-active--MIkqx\";","import * as React from 'react'\nimport Layout from '../components/layout'\nimport Banner from '../components/banner'\nimport { Link } from 'gatsby'\nimport ProgressBar from '../components/progress-bar'\nimport ProgressBarPart from '../components/progress-bar-part'\nimport Api, { SearchResult } from '../services/api'\nimport SearchResultDesktop from '../components/search-result-desktop'\nimport { Helmet } from 'react-helmet'\nimport Icon from '../components/icon'\nimport SearchConfig from '../services/search-config'\nimport SearchResultMobile from '../components/search-result-mobile'\nimport classNames from 'classnames'\nimport { dropZone, dropZoneActive } from './index.module.scss'\n\nconst State = {\n ERROR: -1,\n IDLE: 0,\n WAITING_FOR_BROWSER_EXTENSION: 1,\n PREPROCESSING: 2,\n UPLOADING: 3,\n PROCESSING: 4,\n DONE: 5\n};\n\nconst SearchPage = ({ forBrowserExtension }) => {\n let searchConfig = SearchConfig();\n\n const canvasRef: React.RefObject = React.useRef();\n const containerRef: React.RefObject = React.useRef();\n const dataUrlRef: React.RefObject = React.useRef();\n\n const [state, setState] = React.useState(forBrowserExtension ? State.WAITING_FOR_BROWSER_EXTENSION : State.IDLE);\n const [data, setData] = React.useState(null);\n const [errorMessage, setErrorMessage] = React.useState(null);\n const [progress, setProgress] = React.useState(0);\n const [hasDrag, setHasDrag] = React.useState(false);\n\n function setError(message) {\n setErrorMessage(message);\n setState(State.ERROR);\n }\n\n function calculateThumbnailSize(width, height, target) {\n let determineSize = (sizeOne, sizeTwo, sizeOneTarget) => {\n var aspectRatio = sizeOneTarget / sizeOne;\n\n return Math.round(aspectRatio * sizeTwo);\n };\n\n if (width === height) {\n return [target, target];\n }\n\n return width > height\n ? [determineSize(height, width, target), target]\n : [target, determineSize(width, height, target)];\n }\n\n function search(value: FileList | Blob) {\n setState(State.IDLE);\n setData(null);\n setErrorMessage(null);\n setProgress(0);\n\n let file: Blob;\n if (value instanceof FileList) {\n if (value.length > 1) {\n setError('You can only reverse search one image at a time.');\n return;\n }\n file = value[0];\n } else {\n file = value;\n }\n\n setState(State.PREPROCESSING);\n\n const image = new Image();\n const canvas = canvasRef.current;\n image.onload = () => {\n const target = 256;\n const thumbnailSize = calculateThumbnailSize(image.width, image.height, target);\n\n // In the first place we scaled down the image to a fixed size (250x250), but that\n // caused such a significant loss in image quality in some instances that we had to\n // scale preserving the aspect ratio of the original image \n canvas.width = thumbnailSize[0];\n canvas.height = thumbnailSize[1];\n const ctx = canvas.getContext('2d');\n ctx.drawImage(image, 0, 0, canvas.width, canvas.height);\n\n // Convert image drawn on canvas to blob\n const dataUri = canvas.toDataURL('image/png');\n fetch(dataUri).then(response => response.blob()).then(thumbnail => {\n searchInternal(file, thumbnail);\n });\n };\n\n // The error might simply be that the image format isn't supported by the canvas.\n // Therefore, we should still send it to the server.\n image.onerror = () => {\n searchInternal(file, file);\n }\n\n image.src = URL.createObjectURL(file);\n }\n\n function searchInternal(file: Blob, thumbnail: Blob) {\n setState(State.UPLOADING);\n Api.search(file, thumbnail, searchConfig.includeNsfw, 32, {\n onUploadProgress: e => {\n const progress = Math.round(e.loaded / e.total * 100);\n\n setProgress(progress);\n\n if (progress === 100) {\n setState(State.PROCESSING);\n }\n }\n }).then(data => {\n setData(data);\n setState(State.DONE);\n\n // TODO: Using a timeout has proven unreliable in the Angular version of the application\n setTimeout(() => {\n containerRef.current.scrollIntoView({\n behavior: 'smooth'\n });\n }, 250);\n }).catch(message => {\n setError(message);\n });\n }\n\n function onSelect(event) {\n search(event.target.files);\n }\n\n function onProgrammaticSubmit(event) {\n const dataUrl = dataUrlRef.current.value;\n fetch(dataUrl).then(request => request.blob()).then(blob => {\n search(blob);\n });\n }\n\n function onDragover(event) {\n setHasDrag(true);\n event.preventDefault();\n }\n\n function onDragLeave(event) {\n setHasDrag(false);\n event.preventDefault();\n }\n\n function onDrop(event) {\n // Prevent file from being opened\n event.preventDefault();\n setHasDrag(false);\n\n if (event.dataTransfer.files.length == 0) {\n setError('Did you drop a file which originates from the browser? Due to your browser its limitations, Fluffle cannot access those files. Save the file to your device first, then submit this file instead.')\n return;\n }\n\n search(event.dataTransfer.files);\n }\n\n // Safari doesn't handle clickable elements the same way as other browsers.\n // We need to explicitly cancel the opening of a file dialog when another element\n // is clicked on. We use a custom ignore attribute for that.\n function onLabelClick(event) {\n if (event.target.hasAttribute('data-ignore')) {\n event.preventDefault();\n }\n }\n\n return (\n \n \n \n \n
\n
\n
\n \n \n \n \n
\n
\n A reverse image search service tailored to the furry community\n
\n
\n \n \n \n \n {![State.PREPROCESSING, State.UPLOADING, State.PROCESSING].includes(state) &&\n
\n {state === State.ERROR &&\n
\n \n {errorMessage}\n
\n }\n \n
\n }\n\n {[State.WAITING_FOR_BROWSER_EXTENSION, State.PREPROCESSING, State.UPLOADING, State.PROCESSING].includes(state) &&\n
\n \n \n \n {state === State.WAITING_FOR_BROWSER_EXTENSION ? 'Waiting for the browser extension to download the image' : state === State.PREPROCESSING ? \"Preprocessing\" : state === State.UPLOADING ? \"Uploading\" : \"Processing\"}...\n
\n }\n\n {state === State.DONE &&\n
\n \n \n
\n }\n
\n
\n )\n}\n\nSearchPage.defaultProps = {\n forBrowserExtension: false\n}\n\nexport default SearchPage\n","function _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nexport default function _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n Object.defineProperty(Constructor, \"prototype\", {\n writable: false\n });\n return Constructor;\n}"],"names":["React","className","style","maxWidth","src","svg","alt","galleryThumbnail","thumbnail","hasBlur","hasBeenLoaded","setHasBeenLoaded","error","setError","classNames","objectPosition","centerX","centerY","opacity","ref","element","image","Image","onload","onerror","location","load","hidden","progressBar","ProgressBarPart","color","percentage","isStriped","isAnimated","classes","width","defaultProps","children","Gallery","_targetHeight","_maximumHeight","images","addImage","height","data","this","push","GalleryImage","clear","render","targetWidth","targetMargin","shouldFit","rows","row","GalleryRow","tryAddImage","any","fit","length","isLast","targetHeight","_targetWidth","_targetMargin","hasSpaceFor","GalleryRowImage","calculateTheoreticalSpaceTaken","aspectRatio","calculateTheoreticalSpaceTakenIncludingMargin","spaceTakenByImageWithMargin","Math","round","calculateSpaceTaken","calculateSpaceLeft","spaceTakenInRow","couldFit","spaceLeft","totalAspectRatio","extraWidth","widthIncreaseFactor","floor","extraHeight","fitMaximumHeight","percentageLeft","growFactor","_createClass","GalleryDesktopCard","shouldBlur","hasHover","setHasHover","href","rel","target","onMouseEnter","onMouseLeave","match","class","Icon","name","platform","score","toFixed","credits","GalleryThumbnail","GalleryDesktop","maximumHeight","gallery","setRender","forEach","result","newRender","minNumberOfImages","minNumberOfRows","currentNumberOfImages","i","slice","renderGallery","map","key","id","join","hideImprobable","setHideImprobable","setWidth","containerRef","onResize","current","clientWidth","window","addEventListener","removeEventListener","parameters","imageUrl","maxHeight","stats","count","toLocaleString","elapsedMilliseconds","probableResults","improbableResults","lineHeight","onClick","ImageRating","localStorage","getItem","includeNsfw","setIncludeNsfw","setItem","GalleryCard","enableBlur","seq","hasBeenClicked","setHasBeenClicked","setHasBlur","e","preventDefault","GalleryMobile","results","item","Match","shouldHide","setShouldHide","setSeq","concat","dropZone","State","ERROR","IDLE","WAITING_FOR_BROWSER_EXTENSION","PREPROCESSING","UPLOADING","PROCESSING","DONE","SearchPage","forBrowserExtension","searchConfig","SearchConfig","canvasRef","dataUrlRef","state","setState","setData","errorMessage","setErrorMessage","progress","setProgress","hasDrag","setHasDrag","message","search","value","file","FileList","canvas","thumbnailSize","determineSize","sizeOne","sizeTwo","sizeOneTarget","calculateThumbnailSize","getContext","drawImage","dataUri","toDataURL","fetch","then","response","blob","searchInternal","URL","createObjectURL","Api","onUploadProgress","loaded","total","setTimeout","scrollIntoView","behavior","catch","Layout","center","requireBrowser","title","Helmet","content","Link","to","Banner","process","type","onChange","event","files","dataUrl","request","includes","htmlFor","hasAttribute","onDragOver","onDrop","dataTransfer","onDragLeave","ProgressBar","SearchResultDesktop","SearchResultMobile","_defineProperties","props","descriptor","enumerable","configurable","writable","Object","defineProperty","Constructor","protoProps","staticProps","prototype"],"sourceRoot":""}