{"version":3,"sources":["library.js","imageSizing.js","MainFrame.js","Nav.js","fancy-arrow.svg","QRVirus.js","ErrorBoundary.js","PhotoShell.js","imageSupport.js","ShellShell.js","App.js","index.js"],"names":["setPropertyPx","cssVar","value","document","documentElement","style","setProperty","MONTHS","ordinal","no","selectImage","images","figureWidth","figureHeight","verticalBig","i","length","height","horizontalBig","width","Math","min","MainFrame","props","componentDidMount","a","registerAdapt","adaptToSize","componentWillUnmount","undefined","navWidth","articleWidth","config","pathname","dimensions","state","titleHeight","bottomHeight","window","innerHeight","imageDimension","figureDimension","imgX","imgY","figureX","figureY","ratioX","ratioY","fitImageToFigure","fitX","fitY","scaledX","devicePixelRatio","scaledY","selectedImage","setState","isReady","imageURL","name","render","date_taken","subtitle","copyright_type","photographer","contact","title","split","map","x","parseInt","yyyy","mm","dd","className","src","alt","PureComponent","page_title","Nav","entries","visiblePageName","entry","tooltip","href","hash","require","cleanQRL","url","that","protocol","toUpperCase","hostname","port","OptionalA","children","others","PreparedBy","prepared_by","version","QRVirus","date_prepared","prepared_link","barcode_url","location","imgUrl","FancyArrow","ErrorBoundary","error","errorInfo","console","log","DONT_COPY","Set","page_class","PhotoShell","addEventListener","removeEventListener","innerWidth","childAdaptMethod","configureEntries","visiblePageIndex","makeHashTable","innerConfig","configureVisiblePage","Page","page","this","pages","k","has","push","toString","table","WebpIsSupported","createImageBitmap","fetch","then","r","blob","applications","filterImages","data","imageFormats","outerOther","other","byFormat","img","parts","extension","format","valid","ShellShell","imageFormat","get","response","application","Application","withRouter","App","path","Component","here","match","startsWith","ReactDOM","StrictMode","getElementById"],"mappings":"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","file":"static/js/main.a76e4ae4.chunk.js","sourcesContent":["export const setProperty = (cssVar, value) => document.documentElement.style.setProperty(cssVar, value)\r\n\r\nexport const setPropertyPx = (cssVar, value) => setProperty(cssVar, value + \"px\");\r\n\r\nconst MONTHS = [\r\n \"January\", \"February\", \"March\", \"April\", \"May\", \"June\",\r\n \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"\r\n]\r\n\r\nexport const month = (no) => MONTHS[no - 1]\r\n\r\nexport const ordinal = (no) => {\r\n if (no === 2)\r\n return \"nd\"\r\n if (no === 3)\r\n return \"rd\"\r\n if (no % 10 === 1 && no % 100 !== 1) {\r\n return \"st\"\r\n }\r\n return \"th\"\r\n}\r\n","//\r\n// out of a list of images it picks the smallest image that has\r\n// more pixels than required to fill both the height and width\r\n// dimensions without considering the aspect ratio scaling of\r\n// the image (if the image has an aspect ratio like 200x100,\r\n// it will really fill a 200x100 box even if we have a 300x100\r\n// space to put the image... the coordinates supplied here\r\n// are post-scaling\r\n//\r\n\r\nexport const selectImage = (images, figureWidth, figureHeight) => {\r\n let verticalBig = 0;\r\n for (let i = 0; i < images.length; i++) {\r\n if (images[i].height < figureHeight)\r\n break;\r\n verticalBig = i;\r\n }\r\n let horizontalBig = 0;\r\n for (let i = 0; i < images.length; i++) {\r\n if (images[i].width < figureWidth)\r\n break;\r\n horizontalBig = i;\r\n }\r\n return images[Math.min(horizontalBig, verticalBig)]\r\n}\r\n\r\nexport const fitImageToFigure = (imageDimension, figureDimension) => {\r\n const [imgX, imgY] = imageDimension\r\n const [figureX, figureY] = figureDimension\r\n const ratioX = imgX / figureX\r\n const ratioY = imgY / figureY\r\n if(ratioX>ratioY) {\r\n return [figureX, imgY / ratioX]\r\n } else {\r\n return [imgX / ratioY, figureY]\r\n }\r\n}\r\n\r\nexport const isTallImage = (image, figureWidth, figureHeight) => {\r\n const ratio = image.height * figureWidth / (image.width * figureHeight)\r\n return ratio > 1\r\n}\r\n","import {month, ordinal, setPropertyPx} from \"./library\";\r\nimport {PureComponent} from \"react\";\r\nimport {fitImageToFigure, selectImage} from \"./imageSizing\";\r\n\r\n// returns true if the image is taller than the figure, otherwise returns false\r\n\r\nclass MainFrame extends PureComponent {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n imageURL: false,\r\n dimensions: {\r\n \"titleHeight\": 85,\r\n \"bottomHeight\": 110,\r\n }\r\n };\r\n }\r\n\r\n componentDidMount = async () => {\r\n this.props.registerAdapt(this.adaptToSize)\r\n }\r\n\r\n componentWillUnmount = () => {\r\n this.props.registerAdapt(undefined)\r\n }\r\n\r\n adaptToSize = ({navWidth, articleWidth}) => {\r\n const { config , pathname } = this.props\r\n const { images } = config\r\n const { dimensions } = this.state\r\n const { titleHeight, bottomHeight } = dimensions\r\n\r\n setPropertyPx('--titleHeight', titleHeight)\r\n setPropertyPx('--bottomHeight', bottomHeight)\r\n\r\n const figureHeight = window.innerHeight - titleHeight - bottomHeight\r\n setPropertyPx('--imgHeight', figureHeight)\r\n const imgSize = [images[0].width, images[0].height]\r\n const [fitX, fitY] = fitImageToFigure(imgSize, [articleWidth, figureHeight])\r\n const scaledX = fitX * window.devicePixelRatio\r\n const scaledY = fitY * window.devicePixelRatio\r\n const selectedImage = selectImage(images, scaledX, scaledY)\r\n this.setState({\r\n isReady: true,\r\n imageURL: pathname + selectedImage.name\r\n })\r\n }\r\n\r\n render = () => {\r\n const {imageURL} = this.state\r\n const { config } = this.props\r\n const {date_taken, subtitle, copyright_type,\r\n photographer, contact, title} = config\r\n\r\n const [yyyy, mm, dd] = date_taken.split(\"-\").map(x => parseInt(x))\r\n\r\n return
\r\n

{title}

\r\n
{imageURL ? {title}/ : undefined}
\r\n
\r\n
{month(mm)} {dd}{ordinal(dd)} {yyyy}
\r\n
{subtitle}
\r\n
© {yyyy} {copyright_type} by {photographer}; contact {contact}
\r\n
\r\n
;\r\n }\r\n\r\n static page_title = \"Photograph\"\r\n}\r\n\r\nexport default MainFrame;\r\n","\r\n\r\nconst {PureComponent} = require(\"react\");\r\n\r\nclass Nav extends PureComponent {\r\n render = () => {\r\n const { entries, visiblePageName } = this.props\r\n return \r\n }\r\n}\r\n\r\nexport default Nav\r\n","export default __webpack_public_path__ + \"static/media/fancy-arrow.80fc3e4e.svg\";","import React, {PureComponent} from \"react\"\r\nimport QRCode from \"react-qr-code\";\r\nimport FancyArrow from \"./fancy-arrow.svg\";\r\nimport {selectImage} from \"./imageSizing\";\r\n\r\n//\r\n// url is a location object or a URL\r\n//\r\n// converts case-insenstive parts to uppercase, removes hash and query parts\r\n// to make something suitable for a high density QR code assuming you use\r\n// only QR-alphanumeric characters in your URL\r\n//\r\n\r\nconst cleanQRL = (url) => {\r\n var that = url.protocol.toUpperCase()\r\n that = that + \"//\"\r\n that = that + url.hostname.toUpperCase()\r\n if (url.port) {\r\n that = that + \":\" + url.port\r\n }\r\n that = that + url.pathname\r\n return that\r\n}\r\n\r\nconst OptionalA = (props) => {\r\n const {children, ...others} = props\r\n if(props.href) {\r\n return {children};\r\n }\r\n\r\n return {children}\r\n}\r\n\r\nconst PreparedBy = (props) => {\r\n let { prepared_by } = props\r\n if (typeof prepared_by === \"string\") {\r\n prepared_by = {name: prepared_by}\r\n }\r\n const { name, version } = prepared_by\r\n return <>{name} {version}\r\n}\r\n\r\n//\r\n// unfortunately the component doesn't support the alphanumeric QR\r\n// code encoding; this breaks the design rules for 3-sided cards but that's\r\n// the least of what's wrong with this system\r\n//\r\n\r\nclass QRVirus extends PureComponent {\r\n render = () => {\r\n const { config, pathname } = this.props\r\n const { images, date_prepared, prepared_by, prepared_link } = config\r\n const barcode_url = cleanQRL(window.location)\r\n const selectedImage = selectImage(images, 256, 256)\r\n const imgUrl = pathname + selectedImage.name\r\n\r\n return
\r\n

Scan QR Code to view this photo on a mobile device

\r\n
\r\n
\r\n
{\"will
\r\n
{\"this
\r\n
\r\n
\r\n
Apollo/Gorgon photo shell v1.0; images and data prepared by {\" \"}\r\n \r\n {\" \"} at {date_prepared}.
\r\n
© 2021 by Ontology2 All Rights Reserved
\r\n
\r\n
\r\n }\r\n\r\n static page_title = \"QR Code\"\r\n}\r\n\r\nexport default QRVirus;\r\n\r\n","import React, {PureComponent} from \"react\";\r\n\r\nclass ErrorBoundary extends PureComponent {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n error: false\r\n }\r\n }\r\n\r\n static getDerivedStateFromError(error) {\r\n return { error: true };\r\n }\r\n\r\n componentDidCatch(error, errorInfo) {\r\n console.log(error, errorInfo)\r\n }\r\n\r\n render = () => {\r\n const { props, state } = this\r\n const { children } = props\r\n const { error } = state;\r\n\r\n if(error) {\r\n return
Failed to load page
\r\n }\r\n\r\n return children;\r\n }\r\n}\r\n\r\nexport default ErrorBoundary;\r\n","import React, {PureComponent} from \"react\";\r\nimport MainFrame from \"./MainFrame\";\r\nimport {Helmet} from \"react-helmet-async\";\r\nimport Nav from \"./Nav\";\r\nimport QRVirus from \"./QRVirus\";\r\nimport {setPropertyPx} from \"./library\";\r\nimport ErrorBoundary from \"./ErrorBoundary\";\r\n\r\nconst DONT_COPY = new Set([\"pages\"])\r\n\r\nconst page_class = {\r\n MainFrame, QRVirus\r\n}\r\n\r\n\r\nclass PhotoShell extends PureComponent {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n dimensions: {\r\n \"navWidth\": 50\r\n },\r\n }\r\n this.childAdaptMethod = undefined\r\n }\r\n\r\n componentDidMount = async () => {\r\n window.addEventListener(\"resize\", this.adaptToSize)\r\n this.adaptToSize()\r\n }\r\n\r\n componentWillUnmount = () => {\r\n window.removeEventListener(\"resize\", this.adaptToSize)\r\n }\r\n\r\n adaptToSize = () => {\r\n const {navWidth} = this.state.dimensions\r\n setPropertyPx('--innerHeight', window.innerHeight);\r\n setPropertyPx('--navWidth', navWidth);\r\n const articleWidth = window.innerWidth - navWidth;\r\n setPropertyPx('--articleWidth', articleWidth)\r\n if(this.childAdaptMethod) {\r\n this.childAdaptMethod({navWidth, articleWidth})\r\n }\r\n }\r\n\r\n registerAdapt = (childAdaptMethod) => {\r\n this.childAdaptMethod = childAdaptMethod\r\n this.adaptToSize()\r\n }\r\n\r\n render = () => {\r\n const { dimensions } = this.state\r\n const { pathname, hash, config } = this.props\r\n const { title } = config\r\n\r\n const entries = this.configureEntries()\r\n const hashTable = this.makeHashTable(entries)\r\n const visiblePageIndex = hashTable[hash ? hash: \"#\"]\r\n const visiblePageName = entries[visiblePageIndex].name\r\n\r\n const innerConfig = this.configureVisiblePage(visiblePageIndex)\r\n const Page = page_class[innerConfig.page]\r\n\r\n return
\r\n \r\n {title}\r\n \r\n
;\r\n }\r\n\r\n configureVisiblePage(visiblePageIndex) {\r\n const { config } = this.props\r\n const { pages } = config\r\n\r\n const innerConfig = {...pages[visiblePageIndex]}\r\n for (const k in config) {\r\n if (!DONT_COPY.has(k)) {\r\n if (!(k in innerConfig)) {\r\n innerConfig[k] = config[k]\r\n }\r\n }\r\n }\r\n return innerConfig;\r\n }\r\n\r\n configureEntries() {\r\n const { config } = this.props\r\n const { pages } = config\r\n\r\n const entries = []\r\n for(let i=0;i r.blob());\r\n\r\n // If the createImageBitmap method succeeds, return true, otherwise false\r\n return window.createImageBitmap(blob).then(() => true, () => false);\r\n}\r\n","import {get} from \"axios\";\r\nimport {withRouter} from \"react-router-dom\";\r\nimport React, {PureComponent} from \"react\";\r\nimport PhotoShell from \"./PhotoShell\";\r\nimport {WebpIsSupported} from \"./imageSupport\";\r\n\r\nconst applications = {\r\n PhotoShell: PhotoShell\r\n}\r\n\r\n//\r\n// we adapt to what image formats are available on the client here: this function rewrites the\r\n//\r\n// data.config.images\r\n//\r\n// to contain just one set of image files in the format that this function chooses. Supported\r\n// image formats are supplied in the array imageFormats in order of preference.\r\n//\r\n\r\nexport const filterImages = (data, imageFormats) => {\r\n const { config, ...outerOther } = data\r\n const { images, ...other} = config\r\n const byFormat = {}\r\n for(const img of images) {\r\n const {name} = img\r\n const parts = name.split(\".\")\r\n const extension = parts[parts.length-1].toUpperCase()\r\n if (extension in byFormat) {\r\n byFormat[extension].push(img)\r\n } else {\r\n byFormat[extension] = [img]\r\n }\r\n\r\n }\r\n for(const format of imageFormats) {\r\n if(format in byFormat) {\r\n return {\r\n config: {images: byFormat[format], ...other},\r\n valid: true,\r\n ...outerOther\r\n }\r\n }\r\n }\r\n return { valid: false };\r\n}\r\n\r\n//\r\n// ShellShell is a shell for a shell; the enclosing App contains the react-router\r\n// components that cause the pathname to be assigned to this component. This\r\n// component is wrapped in an HoC and then fetches the configuration for the\r\n// application it contains (such as the PhotoShell) so that the application itself\r\n// can be civilized; at least to boot up it receives all of its configuration in\r\n// a prop so it is nice and testable\r\n//\r\n\r\nclass ShellShell extends PureComponent {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n data: null,\r\n }\r\n }\r\n\r\n componentDidMount = async () => {\r\n const { location } = this.props\r\n const { pathname } = location\r\n const imageFormat = await WebpIsSupported() ? [\"WEBP\", \"JPG\"] : [\"JPG\"]\r\n const response = await get(pathname+\"DATA/CONFIG.JSON\")\r\n this.setState({\r\n data: filterImages(response.data, imageFormat)\r\n })\r\n }\r\n\r\n render = () => {\r\n const { location } = this.props\r\n const { data } = this.state\r\n const { pathname, hash } = location\r\n\r\n if (!data) {\r\n return
Loading...
\r\n } else {\r\n const { application, config } = data\r\n const Application = applications[application]\r\n if (Application) {\r\n return \r\n } else {\r\n return
Did not find a valid application
\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport default withRouter(ShellShell);\r\n","import './PhotoShell.scss';\nimport React, {Component} from \"react\";\nimport {\n BrowserRouter as Router, Switch, Route\n} from \"react-router-dom\";\nimport ShellShell from \"./ShellShell\";\nimport {HelmetProvider} from \"react-helmet-async\";\n\nclass App extends Component {\n render = () => \n \n \n \n \n \n \n \n \n}\n\nexport default App;\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport './index.css';\nimport App from './App';\n\nconst here=window.location\n\n//\n// If the URL is localhost or numeric (not looked up in DNS) we assume that this\n// is running in development mode and redirect to a test page\n//\n\nlet DEV_HOSTNAME = /^(localhost|[0-9.]+)$/i\n\nif(here.hostname.match(DEV_HOSTNAME)) {\n if(!here.pathname.startsWith(\"/$/\")) {\n here.pathname = \"/$/3TK$LMS0TFPT7JGCY/\"\n }\n}\n\nReactDOM.render(\n \n \n ,\n document.getElementById('root')\n);\n\n"],"sourceRoot":""}