{"version":3,"file":"a58933ee6f548e99d37e34b6eff0430d49f8828b-3c8be955cf1bf42b993b.js","mappings":"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","sources":["webpack://axon-division/./src/constants/categories.constants.ts","webpack://axon-division/./node_modules/scrollbooster/src/index.js","webpack://axon-division/./src/components/AppScreenshotSlider/AppScreenshotSlider.tsx","webpack://axon-division/./src/components/StandardTextBlock/StandardTextBlock.tsx","webpack://axon-division/./src/utils/typography.utils.ts","webpack://axon-division/./src/components/Widowless/Widowless.tsx","webpack://axon-division/./src/constants/sectors.constants.ts","webpack://axon-division/./src/hooks/useAnimateTextEnterByLine.hook.ts"],"sourcesContent":["export enum Category {\n 'apps' = 'apps',\n 'websites' = 'websites',\n 'design' = 'design',\n}\n","const getFullWidth = elem => Math.max(elem.offsetWidth, elem.scrollWidth);\nconst getFullHeight = elem => Math.max(elem.offsetHeight, elem.scrollHeight);\nconst textNodeFromPoint = (element, x, y) => {\n const nodes = element.childNodes;\n const range = document.createRange();\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n if (node.nodeType !== 3) {\n continue;\n }\n range.selectNodeContents(node);\n const rect = range.getBoundingClientRect();\n if (x >= rect.left && y >= rect.top && x <= rect.right && y <= rect.bottom) {\n return node;\n }\n }\n return false;\n};\nconst clearTextSelection = () => {\n const selection = window.getSelection ? window.getSelection() : document.selection;\n if (!selection) {\n return;\n }\n if (selection.removeAllRanges) {\n selection.removeAllRanges();\n } else if (selection.empty) {\n selection.empty();\n }\n};\nconst CLICK_EVENT_THRESHOLD_PX = 5;\nexport default class ScrollBooster {\n /**\n * Create ScrollBooster instance\n * @param {Object} options - options object\n * @param {Element} options.viewport - container element\n * @param {Element} options.content - scrollable content element\n * @param {String} options.direction - scroll direction\n * @param {String} options.pointerMode - mouse or touch support\n * @param {String} options.scrollMode - predefined scrolling technique\n * @param {Boolean} options.bounce - bounce effect\n * @param {Number} options.bounceForce - bounce effect factor\n * @param {Number} options.friction - scroll friction factor\n * @param {Boolean} options.textSelection - enables text selection\n * @param {Boolean} options.inputsFocus - enables focus on input elements\n * @param {Boolean} options.emulateScroll - enables mousewheel emulation\n * @param {Function} options.onClick - click handler\n * @param {Function} options.onUpdate - state update handler\n * @param {Function} options.onWheel - wheel handler\n * @param {Function} options.shouldScroll - predicate to allow or disable scroll\n */\n constructor() {\n let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n const defaults = {\n content: options.viewport.children[0],\n direction: 'all',\n // 'vertical', 'horizontal'\n pointerMode: 'all',\n // 'touch', 'mouse'\n scrollMode: undefined,\n // 'transform', 'native'\n bounce: true,\n bounceForce: 0.1,\n friction: 0.05,\n textSelection: false,\n inputsFocus: true,\n emulateScroll: false,\n preventDefaultOnEmulateScroll: false,\n // 'vertical', 'horizontal'\n preventPointerMoveDefault: true,\n lockScrollOnDragDirection: false,\n // 'vertical', 'horizontal', 'all'\n pointerDownPreventDefault: true,\n dragDirectionTolerance: 40,\n onPointerDown() {},\n onPointerUp() {},\n onPointerMove() {},\n onClick() {},\n onUpdate() {},\n onWheel() {},\n shouldScroll() {\n return true;\n }\n };\n this.props = {\n ...defaults,\n ...options\n };\n if (!this.props.viewport || !(this.props.viewport instanceof Element)) {\n console.error(`ScrollBooster init error: \"viewport\" config property must be present and must be Element`);\n return;\n }\n if (!this.props.content) {\n console.error(`ScrollBooster init error: Viewport does not have any content`);\n return;\n }\n this.isDragging = false;\n this.isTargetScroll = false;\n this.isScrolling = false;\n this.isRunning = false;\n const START_COORDINATES = {\n x: 0,\n y: 0\n };\n this.position = {\n ...START_COORDINATES\n };\n this.velocity = {\n ...START_COORDINATES\n };\n this.dragStartPosition = {\n ...START_COORDINATES\n };\n this.dragOffset = {\n ...START_COORDINATES\n };\n this.clientOffset = {\n ...START_COORDINATES\n };\n this.dragPosition = {\n ...START_COORDINATES\n };\n this.targetPosition = {\n ...START_COORDINATES\n };\n this.scrollOffset = {\n ...START_COORDINATES\n };\n this.rafID = null;\n this.events = {};\n this.updateMetrics();\n this.handleEvents();\n }\n\n /**\n * Update options object with new given values\n */\n updateOptions() {\n let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n this.props = {\n ...this.props,\n ...options\n };\n this.props.onUpdate(this.getState());\n this.startAnimationLoop();\n }\n\n /**\n * Update DOM container elements metrics (width and height)\n */\n updateMetrics() {\n this.viewport = {\n width: this.props.viewport.clientWidth,\n height: this.props.viewport.clientHeight\n };\n this.content = {\n width: getFullWidth(this.props.content),\n height: getFullHeight(this.props.content)\n };\n this.edgeX = {\n from: Math.min(-this.content.width + this.viewport.width, 0),\n to: 0\n };\n this.edgeY = {\n from: Math.min(-this.content.height + this.viewport.height, 0),\n to: 0\n };\n this.props.onUpdate(this.getState());\n this.startAnimationLoop();\n }\n\n /**\n * Run animation loop\n */\n startAnimationLoop() {\n this.isRunning = true;\n cancelAnimationFrame(this.rafID);\n this.rafID = requestAnimationFrame(() => this.animate());\n }\n\n /**\n * Main animation loop\n */\n animate() {\n if (!this.isRunning) {\n return;\n }\n this.updateScrollPosition();\n // stop animation loop if nothing moves\n if (!this.isMoving()) {\n this.isRunning = false;\n this.isTargetScroll = false;\n }\n const state = this.getState();\n this.setContentPosition(state);\n this.props.onUpdate(state);\n this.rafID = requestAnimationFrame(() => this.animate());\n }\n\n /**\n * Calculate and set new scroll position\n */\n updateScrollPosition() {\n this.applyEdgeForce();\n this.applyDragForce();\n this.applyScrollForce();\n this.applyTargetForce();\n const inverseFriction = 1 - this.props.friction;\n this.velocity.x *= inverseFriction;\n this.velocity.y *= inverseFriction;\n if (this.props.direction !== 'vertical') {\n this.position.x += this.velocity.x;\n }\n if (this.props.direction !== 'horizontal') {\n this.position.y += this.velocity.y;\n }\n\n // disable bounce effect\n if ((!this.props.bounce || this.isScrolling) && !this.isTargetScroll) {\n this.position.x = Math.max(Math.min(this.position.x, this.edgeX.to), this.edgeX.from);\n this.position.y = Math.max(Math.min(this.position.y, this.edgeY.to), this.edgeY.from);\n }\n }\n\n /**\n * Increase general scroll velocity by given force amount\n */\n applyForce(force) {\n this.velocity.x += force.x;\n this.velocity.y += force.y;\n }\n\n /**\n * Apply force for bounce effect\n */\n applyEdgeForce() {\n if (!this.props.bounce || this.isDragging) {\n return;\n }\n\n // scrolled past viewport edges\n const beyondXFrom = this.position.x < this.edgeX.from;\n const beyondXTo = this.position.x > this.edgeX.to;\n const beyondYFrom = this.position.y < this.edgeY.from;\n const beyondYTo = this.position.y > this.edgeY.to;\n const beyondX = beyondXFrom || beyondXTo;\n const beyondY = beyondYFrom || beyondYTo;\n if (!beyondX && !beyondY) {\n return;\n }\n const edge = {\n x: beyondXFrom ? this.edgeX.from : this.edgeX.to,\n y: beyondYFrom ? this.edgeY.from : this.edgeY.to\n };\n const distanceToEdge = {\n x: edge.x - this.position.x,\n y: edge.y - this.position.y\n };\n const force = {\n x: distanceToEdge.x * this.props.bounceForce,\n y: distanceToEdge.y * this.props.bounceForce\n };\n const restPosition = {\n x: this.position.x + (this.velocity.x + force.x) / this.props.friction,\n y: this.position.y + (this.velocity.y + force.y) / this.props.friction\n };\n if (beyondXFrom && restPosition.x >= this.edgeX.from || beyondXTo && restPosition.x <= this.edgeX.to) {\n force.x = distanceToEdge.x * this.props.bounceForce - this.velocity.x;\n }\n if (beyondYFrom && restPosition.y >= this.edgeY.from || beyondYTo && restPosition.y <= this.edgeY.to) {\n force.y = distanceToEdge.y * this.props.bounceForce - this.velocity.y;\n }\n this.applyForce({\n x: beyondX ? force.x : 0,\n y: beyondY ? force.y : 0\n });\n }\n\n /**\n * Apply force to move content while dragging with mouse/touch\n */\n applyDragForce() {\n if (!this.isDragging) {\n return;\n }\n const dragVelocity = {\n x: this.dragPosition.x - this.position.x,\n y: this.dragPosition.y - this.position.y\n };\n this.applyForce({\n x: dragVelocity.x - this.velocity.x,\n y: dragVelocity.y - this.velocity.y\n });\n }\n\n /**\n * Apply force to emulate mouse wheel or trackpad\n */\n applyScrollForce() {\n if (!this.isScrolling) {\n return;\n }\n this.applyForce({\n x: this.scrollOffset.x - this.velocity.x,\n y: this.scrollOffset.y - this.velocity.y\n });\n this.scrollOffset.x = 0;\n this.scrollOffset.y = 0;\n }\n\n /**\n * Apply force to scroll to given target coordinate\n */\n applyTargetForce() {\n if (!this.isTargetScroll) {\n return;\n }\n this.applyForce({\n x: (this.targetPosition.x - this.position.x) * 0.08 - this.velocity.x,\n y: (this.targetPosition.y - this.position.y) * 0.08 - this.velocity.y\n });\n }\n\n /**\n * Check if scrolling happening\n */\n isMoving() {\n return this.isDragging || this.isScrolling || Math.abs(this.velocity.x) >= 0.01 || Math.abs(this.velocity.y) >= 0.01;\n }\n\n /**\n * Set scroll target coordinate for smooth scroll\n */\n scrollTo() {\n let position = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n this.isTargetScroll = true;\n this.targetPosition.x = -position.x || 0;\n this.targetPosition.y = -position.y || 0;\n this.startAnimationLoop();\n }\n\n /**\n * Manual position setting\n */\n setPosition() {\n let position = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n this.velocity.x = 0;\n this.velocity.y = 0;\n this.position.x = -position.x || 0;\n this.position.y = -position.y || 0;\n this.startAnimationLoop();\n }\n\n /**\n * Get latest metrics and coordinates\n */\n getState() {\n return {\n isMoving: this.isMoving(),\n isDragging: !!(this.dragOffset.x || this.dragOffset.y),\n position: {\n x: -this.position.x,\n y: -this.position.y\n },\n dragOffset: this.dragOffset,\n dragAngle: this.getDragAngle(this.clientOffset.x, this.clientOffset.y),\n borderCollision: {\n left: this.position.x >= this.edgeX.to,\n right: this.position.x <= this.edgeX.from,\n top: this.position.y >= this.edgeY.to,\n bottom: this.position.y <= this.edgeY.from\n }\n };\n }\n\n /**\n * Get drag angle (up: 180, left: -90, right: 90, down: 0)\n */\n getDragAngle(x, y) {\n return Math.round(Math.atan2(x, y) * (180 / Math.PI));\n }\n\n /**\n * Get drag direction (horizontal or vertical)\n */\n getDragDirection(angle, tolerance) {\n const absAngle = Math.abs(90 - Math.abs(angle));\n if (absAngle <= 90 - tolerance) {\n return 'horizontal';\n } else {\n return 'vertical';\n }\n }\n\n /**\n * Update DOM container elements metrics (width and height)\n */\n setContentPosition(state) {\n if (this.props.scrollMode === 'transform') {\n this.props.content.style.transform = `translate(${-state.position.x}px, ${-state.position.y}px)`;\n }\n if (this.props.scrollMode === 'native') {\n this.props.viewport.scrollTop = state.position.y;\n this.props.viewport.scrollLeft = state.position.x;\n }\n }\n\n /**\n * Register all DOM events\n */\n handleEvents() {\n const dragOrigin = {\n x: 0,\n y: 0\n };\n const clientOrigin = {\n x: 0,\n y: 0\n };\n let dragDirection = null;\n let wheelTimer = null;\n let isTouch = false;\n const setDragPosition = event => {\n if (!this.isDragging) {\n return;\n }\n const eventData = isTouch ? event.touches[0] : event;\n const {\n pageX,\n pageY,\n clientX,\n clientY\n } = eventData;\n this.dragOffset.x = pageX - dragOrigin.x;\n this.dragOffset.y = pageY - dragOrigin.y;\n this.clientOffset.x = clientX - clientOrigin.x;\n this.clientOffset.y = clientY - clientOrigin.y;\n\n // get dragDirection if offset threshold is reached\n if (Math.abs(this.clientOffset.x) > 5 && !dragDirection || Math.abs(this.clientOffset.y) > 5 && !dragDirection) {\n dragDirection = this.getDragDirection(this.getDragAngle(this.clientOffset.x, this.clientOffset.y), this.props.dragDirectionTolerance);\n }\n\n // prevent scroll if not expected scroll direction\n if (this.props.lockScrollOnDragDirection && this.props.lockScrollOnDragDirection !== 'all') {\n if (dragDirection === this.props.lockScrollOnDragDirection && isTouch) {\n this.dragPosition.x = this.dragStartPosition.x + this.dragOffset.x;\n this.dragPosition.y = this.dragStartPosition.y + this.dragOffset.y;\n } else if (!isTouch) {\n this.dragPosition.x = this.dragStartPosition.x + this.dragOffset.x;\n this.dragPosition.y = this.dragStartPosition.y + this.dragOffset.y;\n } else {\n this.dragPosition.x = this.dragStartPosition.x;\n this.dragPosition.y = this.dragStartPosition.y;\n }\n } else {\n this.dragPosition.x = this.dragStartPosition.x + this.dragOffset.x;\n this.dragPosition.y = this.dragStartPosition.y + this.dragOffset.y;\n }\n };\n this.events.pointerdown = event => {\n isTouch = !!(event.touches && event.touches[0]);\n this.props.onPointerDown(this.getState(), event, isTouch);\n const eventData = isTouch ? event.touches[0] : event;\n const {\n pageX,\n pageY,\n clientX,\n clientY\n } = eventData;\n const {\n viewport\n } = this.props;\n const rect = viewport.getBoundingClientRect();\n\n // click on vertical scrollbar\n if (clientX - rect.left >= viewport.clientLeft + viewport.clientWidth) {\n return;\n }\n\n // click on horizontal scrollbar\n if (clientY - rect.top >= viewport.clientTop + viewport.clientHeight) {\n return;\n }\n\n // interaction disabled by user\n if (!this.props.shouldScroll(this.getState(), event)) {\n return;\n }\n\n // disable right mouse button scroll\n if (event.button === 2) {\n return;\n }\n\n // disable on mobile\n if (this.props.pointerMode === 'mouse' && isTouch) {\n return;\n }\n\n // disable on desktop\n if (this.props.pointerMode === 'touch' && !isTouch) {\n return;\n }\n\n // focus on form input elements\n const formNodes = ['input', 'textarea', 'button', 'select', 'label'];\n if (this.props.inputsFocus && formNodes.indexOf(event.target.nodeName.toLowerCase()) > -1) {\n return;\n }\n\n // handle text selection\n if (this.props.textSelection) {\n const textNode = textNodeFromPoint(event.target, clientX, clientY);\n if (textNode) {\n return;\n }\n clearTextSelection();\n }\n this.isDragging = true;\n dragOrigin.x = pageX;\n dragOrigin.y = pageY;\n clientOrigin.x = clientX;\n clientOrigin.y = clientY;\n this.dragStartPosition.x = this.position.x;\n this.dragStartPosition.y = this.position.y;\n setDragPosition(event);\n this.startAnimationLoop();\n if (!isTouch && this.props.pointerDownPreventDefault) {\n event.preventDefault();\n }\n };\n this.events.pointermove = event => {\n // prevent default scroll if scroll direction is locked\n if (event.cancelable && (this.props.lockScrollOnDragDirection === 'all' || this.props.lockScrollOnDragDirection === dragDirection)) {\n event.preventDefault();\n }\n setDragPosition(event);\n this.props.onPointerMove(this.getState(), event, isTouch);\n };\n this.events.pointerup = event => {\n this.isDragging = false;\n dragDirection = null;\n this.props.onPointerUp(this.getState(), event, isTouch);\n };\n this.events.wheel = event => {\n const state = this.getState();\n if (!this.props.emulateScroll) {\n return;\n }\n this.velocity.x = 0;\n this.velocity.y = 0;\n this.isScrolling = true;\n this.scrollOffset.x = -event.deltaX;\n this.scrollOffset.y = -event.deltaY;\n this.props.onWheel(state, event);\n this.startAnimationLoop();\n clearTimeout(wheelTimer);\n wheelTimer = setTimeout(() => this.isScrolling = false, 80);\n\n // get (trackpad) scrollDirection and prevent default events\n if (this.props.preventDefaultOnEmulateScroll && this.getDragDirection(this.getDragAngle(-event.deltaX, -event.deltaY), this.props.dragDirectionTolerance) === this.props.preventDefaultOnEmulateScroll) {\n event.preventDefault();\n }\n };\n this.events.scroll = () => {\n const {\n scrollLeft,\n scrollTop\n } = this.props.viewport;\n if (Math.abs(this.position.x + scrollLeft) > 3) {\n this.position.x = -scrollLeft;\n this.velocity.x = 0;\n }\n if (Math.abs(this.position.y + scrollTop) > 3) {\n this.position.y = -scrollTop;\n this.velocity.y = 0;\n }\n };\n this.events.click = event => {\n const state = this.getState();\n const dragOffsetX = this.props.direction !== 'vertical' ? state.dragOffset.x : 0;\n const dragOffsetY = this.props.direction !== 'horizontal' ? state.dragOffset.y : 0;\n if (Math.max(Math.abs(dragOffsetX), Math.abs(dragOffsetY)) > CLICK_EVENT_THRESHOLD_PX) {\n event.preventDefault();\n event.stopPropagation();\n }\n this.props.onClick(state, event, isTouch);\n };\n this.events.contentLoad = () => this.updateMetrics();\n this.events.resize = () => this.updateMetrics();\n this.props.viewport.addEventListener('mousedown', this.events.pointerdown);\n this.props.viewport.addEventListener('touchstart', this.events.pointerdown, {\n passive: false\n });\n this.props.viewport.addEventListener('click', this.events.click);\n this.props.viewport.addEventListener('wheel', this.events.wheel, {\n passive: false\n });\n this.props.viewport.addEventListener('scroll', this.events.scroll);\n this.props.content.addEventListener('load', this.events.contentLoad, true);\n window.addEventListener('mousemove', this.events.pointermove);\n window.addEventListener('touchmove', this.events.pointermove, {\n passive: false\n });\n window.addEventListener('mouseup', this.events.pointerup);\n window.addEventListener('touchend', this.events.pointerup);\n window.addEventListener('resize', this.events.resize);\n }\n\n /**\n * Unregister all DOM events\n */\n destroy() {\n this.props.viewport.removeEventListener('mousedown', this.events.pointerdown);\n this.props.viewport.removeEventListener('touchstart', this.events.pointerdown);\n this.props.viewport.removeEventListener('click', this.events.click);\n this.props.viewport.removeEventListener('wheel', this.events.wheel);\n this.props.viewport.removeEventListener('scroll', this.events.scroll);\n this.props.content.removeEventListener('load', this.events.contentLoad);\n window.removeEventListener('mousemove', this.events.pointermove);\n window.removeEventListener('touchmove', this.events.pointermove);\n window.removeEventListener('mouseup', this.events.pointerup);\n window.removeEventListener('touchend', this.events.pointerup);\n window.removeEventListener('resize', this.events.resize);\n }\n}","import { GatsbyImage, getImage } from 'gatsby-plugin-image';\nimport { action, observable, when } from 'mobx';\nimport { Observer } from 'mobx-react-lite';\nimport React from 'react';\nimport ScrollBooster from 'scrollbooster';\nimport { useAppContext } from '../../controllers/app.controller';\nimport { isBuildTime } from '../../env';\nimport { useOnMount } from '../../hooks/lifecycle.hooks';\nimport { useObservableRef } from '../../hooks/useObservableRef.hook';\nimport { ImageDataLike } from '../../types/gatsby.types';\nimport { makeDisposerController } from '../../utils/disposer.utils';\nimport { getScrollY } from '../../utils/dom.utils';\nimport { useStore } from '../../utils/mobx.utils';\nimport { registerParallaxEffect } from '../../utils/parallax.utils';\nimport './AppScreenshotSlider.scss';\n\nexport type AppScreenshotSlide = {\n image: ImageDataLike,\n title?: string,\n alt?: string,\n}\ntype AppScreenshotSliderProps = {\n slides: AppScreenshotSlide[],\n}\n\nconst AppScreenSlide: React.FC<{ slide: AppScreenshotSlide }> = props => {\n const image = getImage(props.slide.image);\n return (\n
\n { image && }\n
\n )} />\n}\n\n/**\n * A slider that shows a list of app screenshots. \n * Those screenshots must be exactly equal in size.\n * The slider will move horizontally as user scrolls the page, \n * and remains scrollable (swipable too) should the user wish to view the content\n */\nconst AppScreenshotSlider: React.FC = props => {\n const ref = useObservableRef();\n const innerRef = useObservableRef();\n const { UI } = useAppContext();\n const s = useStore(() => ({\n innerWidth: '100%' as string | number,\n get innerStyle() {\n return {\n width: s.innerWidth,\n }\n }\n }))\n useOnMount(() => {\n if (isBuildTime) return;\n const d = makeDisposerController();\n let prevScrollPosition = getScrollY();\n d.add(registerParallaxEffect(ref, observable({ \n id: 'AppScreenshotSliderInner', \n customFunction: () => {\n const { scrollY } = UI.viewport;\n const delta = scrollY - prevScrollPosition;\n ref.current?.scrollBy({ left: delta / 3 });\n prevScrollPosition = scrollY;\n }\n })));\n d.add(\n when(\n () => UI.viewport.width >= 768 || UI.ui.pointerTypes.includes('mouse'),\n () => {\n new ScrollBooster({\n viewport: ref.current,\n direction: 'horizontal',\n scrollMode: 'native',\n })\n }\n )\n )\n const handleResize = action(() => {\n s.innerWidth = innerRef.current?.scrollWidth ?? 'max-content';\n })\n window.addEventListener('resize', handleResize);\n handleResize();\n d.add(() => window.removeEventListener('resize', handleResize));\n return d.disposer;\n });\n return (\n
\n
\n { props.slides.map(slide => ) }\n
\n
\n )} />\n}\n\nexport default AppScreenshotSlider;","import React from 'react';\nimport { AnimateTextEnterByLineProps, useAnimateTextEnterByLine } from '../../hooks/useAnimateTextEnterByLine.hook';\nimport { useObservableRef } from '../../hooks/useObservableRef.hook';\nimport joinClassName from '../../utils/className.utils';\nimport './StandardTextBlock.scss';\n\ntype StandardTextBlockProps = AnimateTextEnterByLineProps & {\n className?: string\n}\n\nconst StandardTextBlock: React.FC = props => {\n const ref = useObservableRef();\n useAnimateTextEnterByLine(ref, props);\n return
\n {props.children}\n
\n}\n\nexport default StandardTextBlock;","const widowPreventerRegex = /\\s(?=[^\\s]*$)/g;\n\nexport const preventWidows = (s: string) => s.replace(widowPreventerRegex, '\\u00A0');","import React from 'react';\nimport { preventWidows } from '../../utils/typography.utils';\n\ntype WidowlessProps = {\n as?: keyof HTMLElementTagNameMap,\n className?: string,\n children: string,\n onClick?: React.MouseEventHandler,\n}\n\nconst Widowless: React.FC = props => React.createElement(\n props.as ?? 'p', {\n ...props,\n children: preventWidows(props.children)\n }\n)\n\nexport default Widowless;","export enum Sector {\n 'all' = 'all',\n // 'agriculture' = 'agriculture',\n // 'aviation' = 'aviation',\n // 'construction' = 'construction',\n 'eCommerceAndRetail' = 'eCommerceAndRetail',\n 'eLearning' = 'eLearning',\n 'energy' = 'energy',\n 'entertainmentAndEvents' = 'entertainmentAndEvents',\n 'finance' = 'finance',\n 'governmentAndNPO' = 'governmentAndNPO',\n 'healthAndFitness' = 'healthAndFitness',\n 'lgbtq' = 'lgbtq',\n 'motorsports' = 'motorsports',\n 'musicAndAudio' = 'musicAndAudio',\n 'newsAndMedia' = 'newsAndMedia',\n 'tourism' = 'tourism',\n}\n\nexport const sectorsPreferredOrder = [\n Sector.all,\n Sector.healthAndFitness,\n Sector.eCommerceAndRetail,\n Sector.governmentAndNPO,\n Sector.finance,\n Sector.motorsports,\n Sector.tourism,\n Sector.entertainmentAndEvents,\n Sector.eLearning,\n Sector.musicAndAudio,\n Sector.lgbtq,\n // Sector.aviation,\n // Sector.construction,\n // Sector.agriculture,\n Sector.energy,\n Sector.newsAndMedia,\n]\n\nexport type SectorDefinition = {\n name: string,\n abbreviation?: string,\n slug: string,\n}\n\nexport const sectorDefinitions: Record = {\n [Sector.all]: { name: 'All Sectors', slug: 'all' },\n // [Sector.agriculture]: { name: 'Agriculture', slug: 'agriculture' },\n // [Sector.aviation]: { name: 'Aviation', slug: 'aviation' },\n // [Sector.construction]: { name: 'Construction', slug: 'construction' },\n [Sector.eCommerceAndRetail]: { name: 'eCommerce & Retail', slug: 'ecommerce-and-retail' },\n [Sector.eLearning]: { name: 'eLearning', slug: 'elearning' },\n [Sector.energy]: { name: 'Energy', slug: 'energy' },\n [Sector.entertainmentAndEvents]: { name: 'Entertainment & Events', slug: 'entertainment-and-events' },\n [Sector.finance]: { name: 'Finance', slug: 'finance' },\n [Sector.governmentAndNPO]: { name: 'Government & NPO', abbreviation: 'Gov & NPO', slug: 'government-and-npo' },\n [Sector.healthAndFitness]: { name: 'Health & Fitness', slug: 'health-and-fitness' },\n [Sector.lgbtq]: { name: 'LGBTQ+', slug: 'lgbtq' },\n [Sector.motorsports]: { name: 'Motorsports', slug: 'motorsports' },\n [Sector.musicAndAudio]: { name: 'Music & Audio', slug: 'music-and-audio' },\n [Sector.newsAndMedia]: { name: 'News & Media', slug: 'news-and-media' },\n [Sector.tourism]: { name: 'Tourism', slug: 'tourism' },\n}\n\nexport const isSectorEnum = (s: string): s is Sector => s in Sector;\n\nexport const getSectorName = (s?: Sometimes) => {\n if (!s) return undefined;\n if (isSectorEnum(s)) return sectorDefinitions[s].name;\n const [sector, def] = Object.entries(sectorDefinitions).find(([key, value]) => value.slug === s || value.name === s || value.abbreviation === s) || [];\n return def?.name;\n}\nexport const getSectorFromSlug = (s?: Sometimes) => {\n const [sector, def] = Object.entries(sectorDefinitions).find(([key, value]) => value.slug === s) || [];\n return sector as Sector | undefined;\n}","import { Expo, TweenMax } from 'gsap';\nimport { SplitText } from 'gsap/SplitText';\nimport { when } from \"mobx\";\nimport { PageSectionContext, usePageSectionContext } from \"../components/PageSection/PageSection\";\nimport { useAppContext } from '../controllers/app.controller';\nimport { isBrowser, isProduction } from \"../env\";\nimport { makeDisposerController } from \"../utils/disposer.utils\";\nimport { waitForFontsToLoad } from \"../utils/fonts.utils\";\nimport { log } from '../utils/loggers.utils';\nimport { highPerf } from '../utils/performance.utils';\nimport { isObject } from \"../utils/typeChecks.utils\";\nimport tick from \"../utils/waiters.utils\";\nimport { useOnMount } from \"./lifecycle.hooks\";\nimport { ObservableRef } from \"./useObservableRef.hook\";\n\nexport type AnimateTextEnterByLineProps = {\n animateTextEnter?: {\n delay?: number,\n onlyWhenParentSectionVisible?: boolean,\n } | true,\n}\n\nexport const useAnimateTextEnterByLine = (\n ref: ObservableRef, \n props: AnimateTextEnterByLineProps,\n context?: PageSectionContext,\n) => {\n const { UI } = useAppContext();\n const autoContext = usePageSectionContext();\n const pageSection = context ?? autoContext;\n useOnMount(() => {\n if (isProduction && UI.isFirstLoad) return;\n if (!highPerf) return;\n const d = makeDisposerController();\n const animateIn = async () => {\n if (isBrowser) {\n await waitForFontsToLoad();\n if (!ref.current) return;\n const spiltText = new SplitText(ref.current.children, { type: 'lines' });\n TweenMax.set(spiltText.lines, { opacity: 0 });\n if (isObject(props.animateTextEnter)) {\n if (props.animateTextEnter.delay) {\n await tick(props.animateTextEnter.delay);\n }\n if (props.animateTextEnter.onlyWhenParentSectionVisible) {\n await when(() => pageSection.visible);\n log('visible now', pageSection.id);\n }\n }\n if (!ref.current) return;\n const styles = getComputedStyle(ref.current);\n const YOffset = parseInt(styles.fontSize ?? 64) * 1;\n TweenMax.fromTo(spiltText.lines!, .62, {\n opacity: 0,\n y: YOffset,\n }, {\n opacity: 1,\n y: 0,\n ease: Expo.easeOut,\n stagger: .05,\n onComplete: () => spiltText.revert()\n });\n }\n }\n if (props.animateTextEnter) animateIn();\n return d.disposer\n })\n}"],"names":["Category","getFullHeight","elem","Math","max","offsetHeight","scrollHeight","ScrollBooster","constructor","options","arguments","length","undefined","defaults","content","viewport","children","direction","pointerMode","scrollMode","bounce","bounceForce","friction","textSelection","inputsFocus","emulateScroll","preventDefaultOnEmulateScroll","preventPointerMoveDefault","lockScrollOnDragDirection","pointerDownPreventDefault","dragDirectionTolerance","onPointerDown","onPointerUp","onPointerMove","onClick","onUpdate","onWheel","shouldScroll","this","props","Element","console","error","isDragging","isTargetScroll","isScrolling","isRunning","START_COORDINATES","x","y","position","velocity","dragStartPosition","dragOffset","clientOffset","dragPosition","targetPosition","scrollOffset","rafID","events","updateMetrics","handleEvents","updateOptions","getState","startAnimationLoop","width","clientWidth","height","clientHeight","offsetWidth","scrollWidth","edgeX","from","min","to","edgeY","cancelAnimationFrame","requestAnimationFrame","animate","updateScrollPosition","isMoving","state","setContentPosition","applyEdgeForce","applyDragForce","applyScrollForce","applyTargetForce","inverseFriction","applyForce","force","beyondXFrom","beyondXTo","beyondYFrom","beyondYTo","beyondX","beyondY","edge","distanceToEdge","restPosition","dragVelocity","abs","scrollTo","setPosition","dragAngle","getDragAngle","borderCollision","left","right","top","bottom","round","atan2","PI","getDragDirection","angle","tolerance","style","transform","scrollTop","scrollLeft","dragOrigin","clientOrigin","dragDirection","wheelTimer","isTouch","setDragPosition","event","eventData","touches","pageX","pageY","clientX","clientY","pointerdown","rect","getBoundingClientRect","clientLeft","clientTop","button","indexOf","target","nodeName","toLowerCase","textNode","element","nodes","childNodes","range","document","createRange","i","node","nodeType","selectNodeContents","textNodeFromPoint","selection","window","getSelection","removeAllRanges","empty","clearTextSelection","preventDefault","pointermove","cancelable","pointerup","wheel","deltaX","deltaY","clearTimeout","setTimeout","scroll","click","dragOffsetX","dragOffsetY","stopPropagation","contentLoad","resize","addEventListener","passive","destroy","removeEventListener","AppScreenSlide","image","getImage","slide","_jsx","Observer","_ref","_props$slide$alt","className","GatsbyImage","title","alt","ref","useObservableRef","innerRef","UI","useAppContext","s","useStore","innerWidth","innerStyle","useOnMount","isBuildTime","d","makeDisposerController","prevScrollPosition","getScrollY","add","registerParallaxEffect","observable","id","customFunction","_ref$current","scrollY","delta","current","scrollBy","when","ui","pointerTypes","includes","handleResize","action","_innerRef$current$scr","_innerRef$current","disposer","slides","map","useAnimateTextEnterByLine","joinClassName","widowPreventerRegex","_props$as","React","as","_objectSpread","replace","Sector","sectorsPreferredOrder","all","healthAndFitness","eCommerceAndRetail","governmentAndNPO","finance","motorsports","tourism","entertainmentAndEvents","eLearning","musicAndAudio","lgbtq","energy","newsAndMedia","sectorDefinitions","name","slug","abbreviation","getSectorName","isSectorEnum","sector","def","Object","entries","find","key","value","getSectorFromSlug","_ref2","context","autoContext","usePageSectionContext","pageSection","isProduction","isFirstLoad","highPerf","animateTextEnter","async","isBrowser","_styles$fontSize","waitForFontsToLoad","spiltText","SplitText","type","TweenMax","set","lines","opacity","isObject","delay","tick","onlyWhenParentSectionVisible","visible","log","styles","getComputedStyle","YOffset","parseInt","fontSize","fromTo","ease","Expo","easeOut","stagger","onComplete","revert","animateIn"],"sourceRoot":""}