{"version":3,"file":"component---src-pages-websites-tsx-a22815bfd30086b84706.js","mappings":"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","sources":["webpack://axon-division/./src/content/projects/hoponhopoff.project.ts","webpack://axon-division/./src/components/QuoteSection/QuoteSection.tsx","webpack://axon-division/./src/content/projects/majestic-ireland.project.ts","webpack://axon-division/./src/components/GridRow/GridRow.tsx","webpack://axon-division/./src/content/projects/escape-to-marlborough.project.ts","webpack://axon-division/./src/content/projects/turn2me.project.ts","webpack://axon-division/./src/content/projects/the-gables.project.ts","webpack://axon-division/./src/content/projects/mjhudson-bridge.project.ts","webpack://axon-division/./src/components/GridRow/GridRowEndColumn.tsx","webpack://axon-division/./src/content/projects/jim-ocallaghan.project.ts","webpack://axon-division/./src/content/projects/gcn.project.ts","webpack://axon-division/./src/content/projects/bunzlcss.project.ts","webpack://axon-division/./src/content/projects/cannonball.project.ts","webpack://axon-division/./src/content/projects/carraighill.project.ts","webpack://axon-division/./src/content/projects/earth2earth.project.ts","webpack://axon-division/./src/content/projects/elyxr.project.ts","webpack://axon-division/./src/content/projects/motorsport-knowledge-institute.project.ts","webpack://axon-division/./src/content/projects/tougheroil.project.ts","webpack://axon-division/./src/content/projects/xmusic.project.ts","webpack://axon-division/./src/components/SectorSelector/SectorSelector.tsx","webpack://axon-division/./src/components/SimpleImageFrame/SimpleImageFrame.tsx","webpack://axon-division/./src/components/ProjectArchive/ProjectArchive.tsx","webpack://axon-division/./src/content/projects/_projects.index.ts","webpack://axon-division/./src/pages/websites.tsx","webpack://axon-division/./src/content/projects/klh.project.ts","webpack://axon-division/./src/content/projects/celtic-woodland-yoga-festival.project.ts"],"sourcesContent":["import { graphql, useStaticQuery } from \"gatsby\";\nimport { Category } from \"../../constants/categories.constants\";\nimport { Hashtag } from \"../../constants/hashtags.constants\";\nimport { Sector } from \"../../constants/sectors.constants\";\nimport { ImageWithMetaInfo, ProjectMetaInfo, ProjectMetaInfoWithQueriedResources } from \"../../types/app.types\";\nimport { HopOnHopOffImagesQuery } from \"../../types/generated\";\n\nexport const ProjectMetaInfoHopOnHopOff: ProjectMetaInfo = {\n name: \"hoponhopoff\",\n displayName: \"Hop On Hop Off Wine Tours\",\n abbreviation: \"HopOnHopOff\",\n subtitle: \"New Zealand Bus Tour Company\",\n // TODO\n description: \"New Zealand is a stunning country, and their wines deserve equal attention as the breathtaking nature. We designed the branding and website for the wine tour bus service, together with many peripheral designs such as the tour map and more. This is easily one of our favourite projects!\",\n url: 'https://hoponhopoffwinetours.com/',\n categories: [\n Category.websites,\n ],\n sectors: [\n Sector.tourism,\n ],\n hasPage: true,\n hashtags: [\n Hashtag.branding,\n Hashtag.digitalDesign,\n Hashtag.printDesign,\n ],\n keywords: [\n 'branding design',\n 'web design',\n 'print design',\n 'WordPress',\n 'New Zealand',\n 'Bus Tours',\n 'Wine Tours',\n 'tourism',\n ],\n}\nexport const useHopOnHopOffInfo = () => {\n const HopOnHopOffImages: HopOnHopOffImagesQuery = useStaticQuery(graphql`\n query HopOnHopOffImages {\n featuredImage: file(relativePath: {eq: \"images/hoponhopoff/hoponhopoff-bus-parked-in-front-of-gibbston-valley-winery.jpg\"}) {\n childImageSharp {\n gatsbyImageData(width: 1280, height: 720)\n }\n }\n gallery: allFile(\n sort: {fields: name},\n filter: {\n extension: {regex: \"/(jpg)|(jpeg)|(png)/\"},\n relativeDirectory: {eq: \"images/hoponhopoff/gallery\"}\n }\n ) {\n edges {\n node {\n name\n childImageSharp {\n gatsbyImageData(width: 2560)\n }\n }\n }\n }\n mobileScreenshots: allFile(\n sort: {fields: name},\n filter: {\n extension: {regex: \"/(jpg)|(jpeg)|(png)/\"},\n relativeDirectory: {eq: \"images/hoponhopoff/mobile-screenshots\"}\n }\n ) {\n edges {\n node {\n name\n childImageSharp {\n gatsbyImageData(\n width: 238\n )\n }\n }\n }\n }\n }`\n )\n const imageMetaData: Partial[] = [\n {\n title: \"Hop On Hop Off: Homepage Screenshot\",\n alt: \"Hop On Hop Off: Homepage Screenshot, desktop version\",\n },\n {\n title: \"Hop On Hop Off: Office Exterior Wrappings Design\",\n alt: \"Hop On Hop Off: Office Exterior Wrappings Design\",\n },\n ]\n const info: ProjectMetaInfoWithQueriedResources = {\n ...ProjectMetaInfoHopOnHopOff,\n featuredImage: {\n image: HopOnHopOffImages.featuredImage!.childImageSharp,\n title: 'Hop On Hop Off Bus',\n alt: 'A black Hop On Hop Off wine tour bus outside of a winery restaurant',\n },\n gallery: HopOnHopOffImages.gallery.edges.map((edge, i) => ({\n image: edge.node.childImageSharp?.gatsbyImageData,\n ...imageMetaData[i]\n })),\n // TODO: provide better title / alt values,\n mobileScreenshots: HopOnHopOffImages.mobileScreenshots.edges.map((edge, i) => ({\n image: edge.node.childImageSharp,\n title: edge.node.name,\n alt: edge.node.name,\n }))\n }\n return info;\n}","import React from 'react';\nimport { AnimateTextEnterByLineProps, useAnimateTextEnterByLine } from '../../hooks/useAnimateTextEnterByLine.hook';\nimport { useObservableRef } from '../../hooks/useObservableRef.hook';\nimport joinClassName from '../../utils/className.utils';\nimport { isString } from '../../utils/typeChecks.utils';\nimport Line from '../Line/Line';\nimport PageSection from '../PageSection/PageSection';\nimport Widowless from '../Widowless/Widowless';\nimport './QuoteSection.scss';\n\ntype QuoteSectionProps = {\n id: string,\n className: string,\n content: string | string[],\n addLineBefore?: boolean,\n addLineAfter?: boolean,\n} & AnimateTextEnterByLineProps\n\nconst QuoteSection: React.FC = props => {\n return \n {props.addLineBefore && }\n
\n \n
\n {props.addLineAfter && }\n
\n}\n\nconst QuoteSectionBlockquote = (props: QuoteSectionProps) => {\n const ref = useObservableRef();\n useAnimateTextEnterByLine(ref, {\n ...props,\n animateTextEnter: { onlyWhenParentSectionVisible: true, delay: 380, }\n });\n return
\n {isString(props.content) ?\n {props.content} :\n props.content.map((p, i) => {p})\n }\n
\n}\n\nexport default QuoteSection;","import { graphql, useStaticQuery } from \"gatsby\";\nimport { Category } from \"../../constants/categories.constants\";\nimport { Sector } from \"../../constants/sectors.constants\";\nimport { ImageWithMetaInfo, ProjectMetaInfo, ProjectMetaInfoWithQueriedResources } from \"../../types/app.types\";\nimport { MajesticIrelandImagesQuery } from \"../../types/generated\";\n\nexport const ProjectMetaInfoMajesticIreland: ProjectMetaInfo = {\n name: \"majestic-ireland\",\n displayName: \"Majestic Ireland\",\n abbreviation: \"Majestic Ireland\",\n subtitle: \"Irish Luxury Tourism Company\",\n description: \"We really enjoyed the cooperation with the team from Majestic Ireland in creating this beautiful website that shows off the most beautiful scenes throughout the island Ireland. Majestic Ireland Road Trips is an Irish tourism company that provides tailor-made self drive or chauffeur driven luxury vacations with an extensive range of super cars or high-end motoring options.\",\n categories: [\n Category.websites,\n ],\n sectors: [\n Sector.tourism,\n ],\n url: \"https://majesticirelandroadtrips.com/\",\n hasPage: true,\n keywords: [\n 'Majestic Ireland',\n 'Road Trips',\n 'tourism',\n 'Irish Travel',\n 'Ireland',\n 'web design',\n 'web development',\n 'WordPress',\n ],\n}\nexport const useMajesticIrelandInfo = () => {\n const MajesticIrelandImages: MajesticIrelandImagesQuery = useStaticQuery(graphql`\n query MajesticIrelandImages {\n featuredImage: file(relativePath: {eq: \"images/majestic-ireland/majestic-ireland-skellig-michael.jpg\"}) {\n childImageSharp {\n gatsbyImageData(width: 1280, height: 720)\n }\n }\n gallery: allFile(\n sort: {fields: name},\n filter: {\n extension: {regex: \"/(jpg)|(jpeg)|(png)/\"}, \n relativeDirectory: {eq: \"images/majestic-ireland/gallery\"}\n }\n ) {\n edges {\n node {\n name\n childImageSharp {\n gatsbyImageData(width: 2560, height: 1440)\n }\n }\n }\n }\n mobileScreenshots: allFile(\n sort: {fields: name},\n filter: {\n extension: {regex: \"/(jpg)|(jpeg)|(png)/\"},\n relativeDirectory: {eq: \"images/majestic-ireland/mobile-screenshots\"}\n }\n ) {\n edges {\n node {\n name\n childImageSharp {\n gatsbyImageData(\n width: 238\n )\n }\n }\n }\n }\n }\n `)\n const imageMetaData: Partial[] = [\n {\n title: 'Majestic Ireland Homepage Screenshot',\n alt: 'Majestic Ireland Homepage Screenshot, desktop version',\n },\n {\n title: 'Majestic Ireland: Wishlist Feature',\n alt: 'Majestic Ireland: Wishlist Screen, desktop version',\n },\n ]\n const info: ProjectMetaInfoWithQueriedResources = {\n ...ProjectMetaInfoMajesticIreland,\n featuredImage: {\n image: MajesticIrelandImages.featuredImage!.childImageSharp!,\n alt: 'Majestic Ireland Road Trips',\n title: 'Majestic Ireland: Skellig Michael under stormy clouds',\n },\n gallery: MajesticIrelandImages.gallery.edges.map((edge, i) => ({\n image: edge.node.childImageSharp?.gatsbyImageData,\n ...imageMetaData[i]\n })),\n // TODO: provide better title / alt values,\n mobileScreenshots: MajesticIrelandImages.mobileScreenshots.edges.map((edge, i) => ({\n image: edge.node.childImageSharp,\n title: edge.node.name,\n alt: edge.node.name,\n }))\n }\n return info;\n}","import React from 'react';\nimport joinClassName from '../../utils/className.utils';\nimport './GridRow.scss';\n\ntype GridRowProps = {\n className?: string,\n}\n\nconst GridRow: React.FC = props => {\n return
\n {props.children}\n
\n}\n\nexport default GridRow;","import { graphql, useStaticQuery } from \"gatsby\";\nimport { Category } from \"../../constants/categories.constants\";\nimport { Hashtag } from \"../../constants/hashtags.constants\";\nimport { Sector } from \"../../constants/sectors.constants\";\nimport { ImageWithMetaInfo, ProjectMetaInfo, ProjectMetaInfoWithQueriedResources } from \"../../types/app.types\";\nimport { EscapeToMarlboroughImagesQuery } from \"../../types/generated\";\n\nexport const ProjectMetaInfoEscapeToMarlborough: ProjectMetaInfo = {\n name: \"escape-to-marlborough\",\n displayName: \"Escape to Marlborough\",\n abbreviation: \"E2M\",\n subtitle: \"New Zealand Luxury Wine Tour Operator\",\n description: \"Escape to Marlborough specialise in tours within the Marlborough region in New Zealand. A complete branding solution with a new website was developed, featuring one of the first interactive maps for tours companies of the same kind in the country.\",\n url: 'http://escapetomarlborough.co.nz/',\n categories: [\n Category.websites,\n Category.design,\n ],\n sectors: [\n Sector.tourism,\n ],\n hasPage: false,\n hashtags: [\n Hashtag.branding,\n Hashtag.digitalDesign,\n Hashtag.printDesign,\n ],\n keywords: [\n 'branding design',\n 'web design',\n 'print design',\n 'WordPress',\n 'New Zealand',\n 'Bus Tours',\n 'Wine Tours',\n 'Private Wine Tours',\n 'tourism',\n ],\n}\nexport const useEscapeToMarlboroughInfo = () => {\n const EscapeToMarlboroughImages: EscapeToMarlboroughImagesQuery = useStaticQuery(graphql`\n query EscapeToMarlboroughImages {\n featuredImage: file(relativePath: {eq: \"images/escape-to-marlborough/escape-to-marlborough-wineries-view-from-top-of-mountain.jpg\"}) {\n childImageSharp {\n gatsbyImageData(width: 1280, height: 720)\n }\n }\n gallery: allFile(\n sort: {fields: name},\n filter: {\n extension: {regex: \"/(jpg)|(jpeg)|(png)/\"},\n relativeDirectory: {eq: \"images/escape-to-marlborough/gallery\"}\n }\n ) {\n edges {\n node {\n name\n childImageSharp {\n gatsbyImageData(width: 2560)\n }\n }\n }\n }\n }`\n )\n const imageMetaData: Partial[] = [\n {\n title: \"Escape to Marlborough: Homepage Screenshot\",\n alt: \"Escape to Marlborough: Homepage Screenshot, desktop version\",\n },\n {\n title: \"Escape to Marlborough: Interactive Maps Design\",\n alt: \"Escape to Marlborough: Interactive Maps Design\",\n },\n ]\n const info: ProjectMetaInfoWithQueriedResources = {\n ...ProjectMetaInfoEscapeToMarlborough,\n featuredImage: {\n image: EscapeToMarlboroughImages.featuredImage!.childImageSharp,\n title: 'Escape to Marlborough Bus',\n alt: 'A black Escape to Marlborough wine tour bus outside of a winery restaurant',\n },\n gallery: EscapeToMarlboroughImages.gallery.edges.map((edge, i) => ({\n image: edge.node.childImageSharp?.gatsbyImageData,\n ...imageMetaData[i]\n }))\n }\n return info;\n}","import { graphql, useStaticQuery } from \"gatsby\";\nimport { Category } from \"../../constants/categories.constants\";\nimport { Sector } from \"../../constants/sectors.constants\";\nimport { EntryMetaInfoWithQueriedResources, ImageWithMetaInfo, ProjectMetaInfo } from \"../../types/app.types\";\nimport { Turn2meImagesQuery } from \"../../types/generated\";\n\nexport const ProjectMetaInfoTurn2me: ProjectMetaInfo = {\n name: \"turn2me\",\n displayName: \"turn2me.ie\",\n abbreviation: \"turn2me\",\n subtitle: \"Leading Irish Mental Health Online Service\",\n description: \"We assist turn2me.ie in delivering professional, inclusive and confidential counselling services to people in need in this unprecedented global crisis. As of April 30, 2021, a total of 22,811 new users joined turn2me.ie since the beginning of 2020, a significant surge for the mental health service, and the counselling hours has increased by 386%.\",\n categories: [\n Category.apps,\n Category.websites,\n ],\n sectors: [\n Sector.healthAndFitness,\n ],\n url: \"https://turn2me.ie/\",\n hasPage: true,\n keywords: [\n 'turn2me',\n 'mental health platform',\n 'app development',\n 'web design',\n 'HSE',\n 'online counselling platform',\n ],\n theme: {\n backgroundColor: '#009FE3',\n foregroundColor: '#ffffff',\n backgroundImageOpacity: 1,\n primaryColor: '#ffffff',\n }\n // entryRenderer: Turn2meAppScreenshotSlider\n}\nexport const useTurn2meInfo = () => {\n const Turn2meImages: Turn2meImagesQuery = useStaticQuery(graphql`\n query Turn2meImages {\n featuredImage: file(relativePath: {eq: \"images/turn2me/turn2me-featured-image-speech-bubble-background.png\"}) {\n childImageSharp {\n gatsbyImageData(width: 1280, height: 720)\n }\n }\n gallery: allFile(\n sort: {fields: name},\n filter: {\n extension: {regex: \"/(jpg)|(jpeg)|(png)/\"},\n relativeDirectory: {eq: \"images/turn2me/gallery\"}\n }\n ) {\n edges {\n node {\n name\n childImageSharp {\n gatsbyImageData(width: 2560, height: 1440)\n }\n }\n }\n }\n mobileScreenshots: allFile(\n sort: {fields: name},\n filter: {\n extension: {regex: \"/(jpg)|(jpeg)|(png)/\"},\n relativeDirectory: {eq: \"images/turn2me/mobile-screenshots\"}\n }\n ) {\n edges {\n node {\n name\n childImageSharp {\n gatsbyImageData(\n width: 238\n )\n }\n }\n }\n }\n }\n `)\n const imageMetaData: Partial[] = [\n {\n title: \"turn2me Homepage Screenshot\",\n alt: \"turn2me Homepage Screenshot, desktop version\",\n },\n ]\n const info: EntryMetaInfoWithQueriedResources = {\n ...ProjectMetaInfoTurn2me,\n featuredImage: {\n image: Turn2meImages.featuredImage!.childImageSharp,\n title: 'turn2me Homepage',\n alt: 'turn2me Homepage Design'\n },\n gallery: Turn2meImages.gallery.edges.map((edge, i) => ({\n image: edge.node.childImageSharp?.gatsbyImageData,\n ...imageMetaData[i]\n })),\n // TODO: provide better title / alt values,\n mobileScreenshots: Turn2meImages.mobileScreenshots.edges.map((edge, i) => ({\n image: edge.node.childImageSharp,\n title: edge.node.name,\n alt: edge.node.name,\n }))\n }\n return info;\n}","import { graphql, useStaticQuery } from \"gatsby\";\nimport { Category } from \"../../constants/categories.constants\";\nimport { Hashtag } from \"../../constants/hashtags.constants\";\nimport { Sector } from \"../../constants/sectors.constants\";\nimport { ImageWithMetaInfo, ProjectMetaInfo, ProjectMetaInfoWithQueriedResources } from \"../../types/app.types\";\nimport { TheGablesImagesQuery } from \"../../types/generated\";\n\nexport const ProjectMetaInfoTheGables: ProjectMetaInfo = {\n name: \"the-gables\",\n displayName: \"The Gables B&B\",\n abbreviation: \"The Gables\",\n subtitle: \"Branding & Website for The Gables B&B\",\n description: \"The Gables is a charming historic residence in Picton that was converted to a Bed & Breakfast, located in the scenic town of Picton in the South Island of New Zealand.\",\n url: 'https://thegables.co.nz/',\n categories: [\n Category.websites,\n Category.design,\n ],\n sectors: [\n Sector.tourism,\n ],\n hasPage: true,\n hashtags: [\n Hashtag.branding,\n ],\n keywords: [\n 'web design',\n 'web development',\n 'branding design',\n 'WordPress',\n ],\n // logos: {\n // default: TheGablesLogoDefault,\n // reversed: TheGablesLogoReversed,\n // }\n}\nexport const useTheGablesInfo = () => {\n const TheGablesImages: TheGablesImagesQuery = useStaticQuery(graphql`\n query TheGablesImages {\n featuredImage: file(relativePath: {eq: \"images/the-gables/the-gables-bnb-lounge-dining-table-view.jpg\"}) {\n childImageSharp {\n gatsbyImageData(width: 1280, height: 720)\n }\n }\n gallery: allFile(\n sort: {fields: name},\n filter: {\n extension: {regex: \"/(jpg)|(jpeg)|(png)/\"},\n relativeDirectory: {eq: \"images/the-gables/gallery\"}\n }\n ) {\n edges {\n node {\n name\n childImageSharp {\n gatsbyImageData(width: 2560, height: 1440)\n }\n }\n }\n }\n }\n `)\n const imageMetaData: Partial[] = [\n {\n title: \"The Gables B&B Homepage Screenshot\",\n alt: \"The Gables Homepage Screenshot, desktop version\",\n },\n ]\n const info: ProjectMetaInfoWithQueriedResources = {\n ...ProjectMetaInfoTheGables,\n featuredImage: {\n image: TheGablesImages.featuredImage!.childImageSharp,\n title: \"The Gables B&B Lounge View\",\n alt: \"The Gables B&B lounge view from the dining table\",\n },\n gallery: TheGablesImages.gallery.edges.map((edge, i) => ({\n image: edge.node.childImageSharp?.gatsbyImageData,\n ...imageMetaData[i]\n }))\n }\n return info;\n}","import { graphql, useStaticQuery } from \"gatsby\";\nimport { Category } from \"../../constants/categories.constants\";\nimport { Hashtag } from \"../../constants/hashtags.constants\";\nimport { Sector } from \"../../constants/sectors.constants\";\nimport { ImageWithMetaInfo, ProjectMetaInfo, ProjectMetaInfoWithQueriedResources } from \"../../types/app.types\";\nimport { MjHudsonBridgeImagesQuery } from \"../../types/generated\";\n\nexport const ProjectMetaInfoMJHudsonBridge: ProjectMetaInfo = {\n name: \"mjhudson-bridge\",\n displayName: \"MJ Hudson: Bridge Consulting\",\n abbreviation: \"Bridge Consulting\",\n subtitle: \"Irish Specialist Financial Consulting Firm\",\n description: \"Bridge Consulting, a well renowned specialist in financial services consultation and compliance, entrusted with the task of a comprehensive overhaul of the company’s brand; updating their online platform and creating a distinct and engaging website specifically tailored to their brand goals. It has recently joined MJ Hudson, a global asset management consultancy.\",\n url: 'https://bridgeconsulting.ie/',\n categories: [\n Category.websites,\n ],\n sectors: [\n Sector.finance,\n ],\n hasPage: false,\n hashtags: [\n Hashtag.branding,\n Hashtag.digitalDesign,\n Hashtag.printDesign,\n ],\n keywords: [\n 'branding design',\n 'web design',\n 'print design',\n 'WordPress',\n 'financial consulting company',\n ],\n}\nexport const useMJHudsonBridgeInfo = () => {\n const MJHudsonBridgeImages: MjHudsonBridgeImagesQuery = useStaticQuery(graphql`\n query MJHudsonBridgeImages {\n featuredImage: file(relativePath: {eq: \"images/mjhudson-bridge/samuel-beckett-bridge-in-twilight-river-liffey-dublin.jpg\"}) {\n childImageSharp {\n gatsbyImageData(width: 1280, height: 720)\n }\n }\n gallery: allFile(\n sort: {fields: name},\n filter: {\n extension: {regex: \"/(jpg)|(jpeg)|(png)/\"},\n relativeDirectory: {eq: \"images/mjhudson-bridge/gallery\"}\n }\n ) {\n edges {\n node {\n name\n childImageSharp {\n gatsbyImageData(width: 2560, height: 1440)\n }\n }\n }\n }\n }`\n )\n const imageMetaData: Partial[] = [\n {\n title: \"Bridge Consulting Homepage Screenshot\",\n alt: \"Bridge Consulting Homepage Screenshot, desktop version\",\n },\n ]\n const info: ProjectMetaInfoWithQueriedResources = {\n ...ProjectMetaInfoMJHudsonBridge,\n featuredImage: {\n image: MJHudsonBridgeImages.featuredImage!.childImageSharp,\n title: 'MJ Hudson – Bridge Consulting',\n alt: 'Samuel Beckett Bridge in twilight, River Liffey, Dublin'\n },\n gallery: MJHudsonBridgeImages.gallery.edges.map((edge, i) => ({\n image: edge.node.childImageSharp?.gatsbyImageData,\n ...imageMetaData[i]\n }))\n }\n return info;\n}","import React from 'react';\n\ntype GridRowEndColumnProps = {}\n\nconst GridRowEndColumn: React.FC = props => {\n return
\n {props.children}\n
\n}\n\nexport default GridRowEndColumn;","import { graphql, useStaticQuery } from \"gatsby\";\nimport { Category } from \"../../constants/categories.constants\";\nimport { Hashtag } from \"../../constants/hashtags.constants\";\nimport { Sector } from \"../../constants/sectors.constants\";\nimport { ImageWithMetaInfo, ProjectMetaInfo, ProjectMetaInfoWithQueriedResources } from \"../../types/app.types\";\nimport { JimOCallaghanImagesQuery } from \"../../types/generated\";\n\nexport const ProjectMetaInfoJimOCallaghan: ProjectMetaInfo = {\n name: \"jim-ocallaghan\",\n displayName: \"Jim O'Callaghan\",\n abbreviation: \"Jim O'Callaghan\",\n subtitle: \"Leading Irish Politician (Fianna Fáil)\",\n description: \"A leading politician in Ireland, Jim O'Callaghan entrusted us to design a new personal branding and a website.\",\n categories: [\n Category.websites,\n ],\n sectors: [\n Sector.governmentAndNPO,\n ],\n hashtags: [\n Hashtag.branding,\n ],\n url: \"https://jimocallaghan.com/\",\n hasPage: true,\n keywords: [\n \"Jim O'Callaghan\",\n 'Fianna Fáil',\n 'Ireland',\n 'web design',\n 'web development',\n 'WordPress',\n 'Responsive web designs',\n 'branding'\n ],\n}\nexport const useJimOCallaghanInfo = () => {\n const JimOCallaghanImages: JimOCallaghanImagesQuery = useStaticQuery(graphql`\n query JimOCallaghanImages {\n featuredImage: file(relativePath: {eq: \"images/jim-ocallaghan/jim-ocallaghan-walking-among-group-of-young-people-alongside-canal-in-dublin-ireland.jpg\"}) {\n childImageSharp {\n gatsbyImageData(width: 1280, height: 720)\n }\n }\n gallery: allFile(\n sort: {fields: name},\n filter: {\n extension: {regex: \"/(jpg)|(jpeg)|(png)/\"},\n relativeDirectory: {eq: \"images/jim-ocallaghan/gallery\"}\n }\n ) {\n edges {\n node {\n name\n childImageSharp {\n gatsbyImageData(width: 2560, height: 1440)\n }\n }\n }\n }\n }\n `);\n const imageMetaData: Partial[] = [\n {\n title: \"Jim O'Callaghan Homepage Screenshot\",\n alt: \"Jim O'Callaghan Homepage Screenshot, desktop version\",\n },\n ]\n const info: ProjectMetaInfoWithQueriedResources = {\n ...ProjectMetaInfoJimOCallaghan,\n featuredImage: {\n image: JimOCallaghanImages.featuredImage!.childImageSharp,\n title: \"Jim O'Callaghan\",\n alt: \"Jim O'Callaghan walking among a group of young people alongside Dublin canal.\"\n },\n gallery: JimOCallaghanImages.gallery.edges.map((edge, i) => ({\n image: edge.node.childImageSharp?.gatsbyImageData,\n ...imageMetaData[i]\n }))\n }\n return info;\n}","import { graphql, useStaticQuery } from \"gatsby\";\nimport { Category } from \"../../constants/categories.constants\";\nimport { Sector } from \"../../constants/sectors.constants\";\nimport { ImageWithMetaInfo, ProjectMetaInfo, ProjectMetaInfoWithQueriedResources } from \"../../types/app.types\";\nimport { GcnImagesQuery } from \"../../types/generated\";\n\nexport const ProjectMetaInfoGCN: ProjectMetaInfo = {\n name: \"gcn\",\n displayName: \"GCN\",\n abbreviation: \"GCN\",\n subtitle: \"Gay Community News Ireland\",\n description: \"As one of the major LGBT news magazine in Ireland, GCN celebrated their 30th birthday on 2017 with an exciting new brand identity. We are proud to have been entrusted with the complete redesign and development of their website, gcn.ie.\",\n yearStart: 2017,\n categories: [\n Category.websites,\n ],\n sectors: [\n Sector.lgbtq,\n Sector.newsAndMedia,\n ],\n url: \"https://gcn.ie/\",\n hasPage: true,\n theme: {\n backgroundImageOpacity: .6\n },\n keywords: [\n 'GCN',\n 'web design',\n 'web development',\n 'WordPress',\n 'Responsive web designs',\n 'News website design',\n 'Gay',\n 'Lesbian',\n 'LGBT',\n 'LGBTQ+',\n 'Ireland',\n 'Gay Community News Ireland',\n 'Irish Magazines Award 2017', \n ],\n}\nexport const useGCNInfo = () => {\n const GCNImages: GcnImagesQuery = useStaticQuery(graphql`\n query GCNImages {\n featuredImage: file(relativePath: {eq: \"images/gcn/lgbtq-pride-people-waving-flag.jpg\"}) {\n childImageSharp {\n gatsbyImageData(width: 1280, height: 720)\n }\n }\n gallery: allFile(\n sort: {fields: name}, \n filter: {\n extension: {regex: \"/(jpg)|(jpeg)|(png)/\"}, \n relativeDirectory: {eq: \"images/gcn/gallery\"}\n }\n ) {\n edges {\n node {\n name\n childImageSharp {\n gatsbyImageData(width: 2560, height: 1440)\n }\n }\n }\n }\n mobileScreenshots: allFile(\n sort: {fields: name},\n filter: {\n extension: {regex: \"/(jpg)|(jpeg)|(png)/\"},\n relativeDirectory: {eq: \"images/gcn/mobile-screenshots\"}\n }\n ) {\n edges {\n node {\n name\n childImageSharp {\n gatsbyImageData(\n width: 238\n )\n }\n }\n }\n }\n }`\n )\n const imageMetaData: Partial[] = [\n {\n title: 'GCN Homepage Screenshot',\n alt: 'GCN Homepage Screenshot, desktop version',\n },\n ]\n const info: ProjectMetaInfoWithQueriedResources = {\n ...ProjectMetaInfoGCN,\n featuredImage: {\n image: GCNImages.featuredImage?.childImageSharp,\n alt: 'People Waving LGBTQ+ Flag',\n title: 'GCN Project Featured Image',\n },\n gallery: GCNImages.gallery.edges.map((edge, i) => ({\n image: edge.node.childImageSharp?.gatsbyImageData,\n ...imageMetaData[i]\n })),\n // TODO: provide better title / alt values,\n mobileScreenshots: GCNImages.mobileScreenshots.edges.map((edge, i) => ({\n image: edge.node.childImageSharp,\n title: edge.node.name,\n alt: edge.node.name,\n }))\n }\n return info;\n}","import { graphql, useStaticQuery } from \"gatsby\";\nimport { Category } from \"../../constants/categories.constants\";\nimport { Sector } from \"../../constants/sectors.constants\";\nimport { ImageWithMetaInfo, ProjectMetaInfo, ProjectMetaInfoWithQueriedResources } from \"../../types/app.types\";\nimport { BunzlCssImagesQuery } from \"../../types/generated\";\n\nexport const ProjectMetaInfoBunzlCSS: ProjectMetaInfo = {\n name: \"bunzlcss\",\n displayName: \"Bunzl CSS\",\n abbreviation: \"Bunzl CSS\",\n subtitle: \"Bunzl Cleaning & Safety Supplies\",\n description: \"Bunzl Cleaning & Safety Supplies is a trading division of Bunzl Ireland Ltd. and forms part of Bunzl PLC, a multinational distribution and outsourcing company with annual revenues in excess of GBP £7.4bn and a constituent of the FTSE 100 index. We designed and developed this clean and informative website to bring their online presence to the next level.\",\n categories: [\n Category.websites,\n ],\n sectors: [\n Sector.eCommerceAndRetail,\n ],\n url: \"https://www.bunzlcss.com/\",\n hasPage: false,\n keywords: [\n 'Bunzl CSS',\n 'web design',\n 'web development',\n 'WordPress',\n ],\n}\nexport const useBunzlCSSInfo = () => {\n const BunzlCSSImages: BunzlCssImagesQuery = useStaticQuery(graphql`\n query BunzlCSSImages {\n featuredImage: file(relativePath: {eq: \"images/bunzlcss/surface-cleaning-with-antibacterial-sanitizing-spray.png\"}) {\n childImageSharp {\n gatsbyImageData(width: 1280, height: 720)\n }\n }\n gallery: allFile(\n sort: {fields: name},\n filter: {\n extension: {regex: \"/(jpg)|(jpeg)|(png)/\"}, \n relativeDirectory: {eq: \"images/bunzlcss/gallery\"}\n }\n ) {\n edges {\n node {\n name\n childImageSharp {\n gatsbyImageData(width: 2560, height: 1440)\n }\n }\n }\n }\n }\n `)\n const imageMetaData: Partial[] = [\n {\n title: 'Bunzl CSS Homepage Screenshot',\n alt: 'Bunzl CSS Homepage Screenshot, desktop version',\n },\n ]\n const info: ProjectMetaInfoWithQueriedResources = {\n ...ProjectMetaInfoBunzlCSS,\n featuredImage: {\n image: BunzlCSSImages.featuredImage!.childImageSharp!,\n alt: 'Bunzl CSS Project Featured Image',\n title: 'Bunzl CSS Project Featured Image',\n },\n gallery: BunzlCSSImages.gallery.edges.map((edge, i) => ({\n image: edge.node.childImageSharp?.gatsbyImageData,\n ...imageMetaData[i]\n }))\n }\n return info;\n}","import { graphql, useStaticQuery } from \"gatsby\";\nimport { Category } from \"../../constants/categories.constants\";\nimport { Sector } from \"../../constants/sectors.constants\";\nimport { ImageWithMetaInfo, ProjectMetaInfo, ProjectMetaInfoWithQueriedResources } from \"../../types/app.types\";\nimport { CannonballImagesQuery } from \"../../types/generated\";\n\nexport const ProjectMetaInfoCannonball: ProjectMetaInfo = {\n name: \"cannonball\",\n displayName: \"Cannonball Ireland\",\n abbreviation: \"Cannonball\",\n subtitle: \"Cannonball Road Trips\",\n description: \"Cannonball is the most unique super car fraternity in the world and it all began in Ireland … of the hundred thousand welcomes!\",\n categories: [\n Category.websites,\n ],\n sectors: [\n Sector.entertainmentAndEvents,\n Sector.motorsports,\n ],\n url: \"https://cannonball.ie/\",\n hasPage: false,\n keywords: [\n 'Cannonball',\n 'Cannonball.ie',\n 'web design',\n 'web development',\n 'WordPress',\n 'super cars',\n 'events',\n ],\n}\nexport const useCannonballInfo = () => {\n const CannonballImages: CannonballImagesQuery = useStaticQuery(graphql`\n query CannonballImages {\n featuredImage: file(relativePath: {eq: \"images/cannonball/cannonball-ireland-2019-race-car-among-cheering-crowd.jpg\"}) {\n childImageSharp {\n gatsbyImageData(width: 1280, height: 720)\n }\n }\n gallery: allFile(\n sort: {fields: name},\n filter: {\n extension: {regex: \"/(jpg)|(jpeg)|(png)/\"},\n relativeDirectory: {eq: \"images/cannonball/gallery\"}\n }\n ) {\n edges {\n node {\n name\n childImageSharp {\n gatsbyImageData(width: 2560, height: 1440)\n }\n }\n }\n }\n }\n `)\n const imageMetaData: Partial[] = [\n {\n title: 'Cannonball Ireland Homepage Screenshot',\n alt: 'Cannonball Ireland Homepage Screenshot, desktop version',\n },\n ]\n const info: ProjectMetaInfoWithQueriedResources = {\n ...ProjectMetaInfoCannonball,\n featuredImage: {\n image: CannonballImages.featuredImage!.childImageSharp,\n title: 'Cannonball Ireland Project Featured Image',\n alt: 'Cannonball Ireland 2019: A race car among cheering crowd',\n },\n gallery: CannonballImages.gallery.edges.map((edge, i) => ({\n image: edge.node.childImageSharp?.gatsbyImageData,\n ...imageMetaData[i]\n }))\n }\n return info;\n}","import { graphql, useStaticQuery } from \"gatsby\";\nimport { Category } from \"../../constants/categories.constants\";\nimport { Sector } from \"../../constants/sectors.constants\";\nimport { ImageWithMetaInfo, ProjectMetaInfo, ProjectMetaInfoWithQueriedResources } from \"../../types/app.types\";\nimport { MjHudsonBridgeImagesQuery } from \"../../types/generated\";\n\nexport const ProjectMetaInfoCarraighill: ProjectMetaInfo = {\n name: \"carraighill\",\n displayName: \"Carraighill\",\n abbreviation: \"Carraighill\",\n subtitle: \"International Financial Research Provider\",\n description: \"Carraighill is an independent research provider focusing on financial systems and select equities. We designed and developed their website, which also features a members area for secure access of financial reports, and a comprehensive administration backend for the content managers.\",\n url: 'https://carraighill.com/',\n categories: [\n Category.websites,\n ],\n sectors: [\n Sector.finance,\n ],\n hasPage: false,\n hashtags: [\n ],\n keywords: [\n 'web design',\n 'WordPress',\n ],\n}\nexport const useCarraighillInfo = () => {\n const CarraighillImages: MjHudsonBridgeImagesQuery = useStaticQuery(graphql`\n query CarraighillImages {\n featuredImage: file(relativePath: {eq: \"images/carraighill/carraighill-project-abstract-background.jpg\"}) {\n childImageSharp {\n gatsbyImageData(width: 1280, height: 720)\n }\n }\n gallery: allFile(\n sort: {fields: name},\n filter: {\n extension: {regex: \"/(jpg)|(jpeg)|(png)/\"},\n relativeDirectory: {eq: \"images/carraighill/gallery\"}\n }\n ) {\n edges {\n node {\n name\n childImageSharp {\n gatsbyImageData(width: 2560, height: 1440)\n }\n }\n }\n }\n }`\n )\n const imageMetaData: Partial[] = [\n {\n title: \"Carraighill Homepage Screenshot\",\n alt: \"Carraighill Homepage Screenshot, desktop version\",\n },\n ]\n const info: ProjectMetaInfoWithQueriedResources = {\n ...ProjectMetaInfoCarraighill,\n featuredImage: {\n image: CarraighillImages.featuredImage!.childImageSharp,\n title: 'Carraighill',\n alt: 'Carraighill Project Abstract Background Image'\n },\n gallery: CarraighillImages.gallery.edges.map((edge, i) => ({\n image: edge.node.childImageSharp?.gatsbyImageData,\n ...imageMetaData[i]\n }))\n }\n return info;\n}","import { graphql, useStaticQuery } from \"gatsby\";\nimport { Category } from \"../../constants/categories.constants\";\nimport { Sector } from \"../../constants/sectors.constants\";\nimport { ImageWithMetaInfo, ProjectMetaInfo, ProjectMetaInfoWithQueriedResources } from \"../../types/app.types\";\nimport { Earth2EarthImagesQuery } from \"../../types/generated\";\n\nexport const ProjectMetaInfoEarth2Earth: ProjectMetaInfo = {\n name: \"earth2earth\",\n displayName: \"earth2earth\",\n abbreviation: \"earth2earth\",\n subtitle: \"Innovative environment-friendly product supplier\",\n description: \"earth2earth® is a brand of Thorn Environmental Ltd one of the largest and most innovative producers of refuse sacks, bin-liners and packaging films in Ireland. We designed and developed a minimalistic website for earth2earth to showcase their excellent products.\",\n categories: [\n Category.websites,\n ],\n sectors: [\n Sector.eCommerceAndRetail,\n ],\n url: \"https://www.earth2earth.com/\",\n hasPage: false,\n keywords: [\n 'earth2earth',\n 'web design',\n 'web development',\n 'WordPress',\n ],\n}\nexport const useEarth2EarthInfo = () => {\n const Earth2EarthImages: Earth2EarthImagesQuery = useStaticQuery(graphql`\n query Earth2EarthImages {\n featuredImage: file(relativePath: {eq: \"images/earth2earth/earth2earth-background-sugarcanes.jpg\"}) {\n childImageSharp {\n gatsbyImageData(width: 1280, height: 720)\n }\n }\n gallery: allFile(\n sort: {fields: name},\n filter: {\n extension: {regex: \"/(jpg)|(jpeg)|(png)/\"}, \n relativeDirectory: {eq: \"images/earth2earth/gallery\"}\n }\n ) {\n edges {\n node {\n name\n childImageSharp {\n gatsbyImageData(width: 2560, height: 1440)\n }\n }\n }\n }\n }\n `)\n const imageMetaData: Partial[] = [\n {\n title: 'Earth2Earth Product Page Screenshot',\n alt: 'Earth2Earth Product Page Screenshot, desktop version',\n },\n ]\n const info: ProjectMetaInfoWithQueriedResources = {\n ...ProjectMetaInfoEarth2Earth,\n featuredImage: {\n image: Earth2EarthImages.featuredImage!.childImageSharp!,\n alt: 'earth2earth Project Featured Image',\n title: 'earth2earth Project Featured Image',\n },\n gallery: Earth2EarthImages.gallery.edges.map((edge, i) => ({\n image: edge.node.childImageSharp?.gatsbyImageData,\n ...imageMetaData[i]\n }))\n }\n return info;\n}","import { graphql, useStaticQuery } from \"gatsby\";\nimport { Category } from \"../../constants/categories.constants\";\nimport { Sector } from \"../../constants/sectors.constants\";\nimport { ImageWithMetaInfo, ProjectMetaInfo, ProjectMetaInfoWithQueriedResources } from \"../../types/app.types\";\nimport { ElyxrImagesQuery } from \"../../types/generated\";\n\nexport const ProjectMetaInfoElyxr: ProjectMetaInfo = {\n name: \"elyxr\",\n displayName: \"Elyxr Audio\",\n abbreviation: \"Elyxr\",\n subtitle: \"Lifestyle Audio Equipment Company\",\n description: \"Elyxr Audio is a modern, luxury audio brand that specialises in earphone and headphone technology. A refreshed, contemporary and responsive website was needed to accompany their launch of high quality earphones. With free reign over the design direction, we designed the new site for Elyxr with a focus on the brand, engaging interaction and conversion into sales.\",\n categories: [\n Category.websites,\n ],\n sectors: [\n Sector.eCommerceAndRetail,\n Sector.musicAndAudio,\n ],\n hasPage: false,\n keywords: [\n 'Elyxr',\n 'Elyxr Audio',\n 'web design',\n 'web development',\n 'WordPress',\n 'eCommerce',\n ],\n}\nexport const useElyxrInfo = () => {\n const ElyxrImages: ElyxrImagesQuery = useStaticQuery(graphql`\n query ElyxrImages {\n featuredImage: file(relativePath: {eq: \"images/elyxr/elyxr-fusion-featured-image.jpg\"}) {\n childImageSharp {\n gatsbyImageData(width: 1280, height: 720)\n }\n }\n gallery: allFile(\n sort: {fields: name},\n filter: {\n extension: {regex: \"/(jpg)|(jpeg)|(png)/\"},\n relativeDirectory: {eq: \"images/elyxr/gallery\"}\n }\n ) {\n edges {\n node {\n name\n childImageSharp {\n gatsbyImageData(width: 2560, height: 1440)\n }\n }\n }\n }\n }\n `)\n const imageMetaData: Partial[] = [\n {\n title: \"Elyxr Audio Homepage Design, explained as 3D Layers\",\n alt: \"Elyxr Audio Homepage Design, explained as 3D Layers\",\n },\n ]\n const info: ProjectMetaInfoWithQueriedResources = {\n ...ProjectMetaInfoElyxr,\n featuredImage: {\n image: ElyxrImages.featuredImage!.childImageSharp,\n title: 'Elyxr Audio',\n alt: 'Elyxr Audio product lifestyle photo: a musician wearing a pair of black Elyxr Fusion over-ear headphones around his neck.'\n },\n gallery: ElyxrImages.gallery.edges.map((edge, i) => ({\n image: edge.node.childImageSharp?.gatsbyImageData,\n ...imageMetaData[i]\n }))\n }\n return info;\n}","import { graphql, useStaticQuery } from \"gatsby\";\nimport { Category } from \"../../constants/categories.constants\";\nimport { Sector } from \"../../constants/sectors.constants\";\nimport { ImageWithMetaInfo, ProjectMetaInfo, ProjectMetaInfoWithQueriedResources } from \"../../types/app.types\";\nimport { MkiImagesQuery } from \"../../types/generated\";\n\nexport const ProjectMetaInfoMKI: ProjectMetaInfo = {\n name: \"motorsport-knowledge-institute\",\n displayName: \"Motorsport Knowledge Institute\",\n abbreviation: \"Motorsport Knowledge Institute\",\n subtitle: \"Global Motorsport Multilingual Training Services Provider\",\n description: \"The Motorsport Knowledge Institute (MKI) was established in 2011 as the dedicated education, training and research division of the Emirates Motorsports Organization (EMSO). This project includes MKI's main website, as well as a host of e-learning club subsites in different countries.\",\n url: 'https://motorsportknowledgeinstitute.org/',\n categories: [\n Category.websites,\n ],\n sectors: [\n Sector.eLearning,\n Sector.motorsports,\n // Sector.construction,\n ],\n hasPage: false,\n hashtags: [\n ],\n keywords: [\n 'web design',\n 'WordPress',\n 'eLearning',\n ],\n}\nexport const useMKIInfo = () => {\n const MKIImages: MkiImagesQuery = useStaticQuery(graphql`\n query MKIImages {\n featuredImage: file(relativePath: {eq: \"images/motorsport-knowledge-institute/yas-marina-circuit-vehicle-recovery-crane.jpg\"}) {\n childImageSharp {\n gatsbyImageData(width: 1280, height: 720)\n }\n }\n gallery: allFile(\n sort: {fields: name},\n filter: {\n extension: {regex: \"/(jpg)|(jpeg)|(png)/\"},\n relativeDirectory: {eq: \"images/motorsport-knowledge-institute/gallery\"}\n }\n ) {\n edges {\n node {\n name\n childImageSharp {\n gatsbyImageData(width: 2560)\n }\n }\n }\n }\n }`\n )\n const imageMetaData: Partial[] = [\n {\n title: \"Motorsport Knowledge Institute: Homepage Screenshot\",\n alt: \"Motorsport Knowledge Institute: Homepage Screenshot, desktop version\",\n },\n // {\n // title: \"Motorsport Knowledge Institute\",\n // alt: \"Motorsport Knowledge Institute\",\n // },\n ]\n const info: ProjectMetaInfoWithQueriedResources = {\n ...ProjectMetaInfoMKI,\n featuredImage: {\n image: MKIImages.featuredImage!.childImageSharp,\n title: 'Motorsport Knowledge Institute',\n alt: 'Yas Marina Cicruit: Vehicle Recovery Scene',\n },\n gallery: MKIImages.gallery.edges.map((edge, i) => ({\n image: edge.node.childImageSharp?.gatsbyImageData,\n ...imageMetaData[i]\n }))\n }\n return info;\n}","import { graphql, useStaticQuery } from \"gatsby\";\nimport { Category } from \"../../constants/categories.constants\";\nimport { Sector } from \"../../constants/sectors.constants\";\nimport { ImageWithMetaInfo, ProjectMetaInfo, ProjectMetaInfoWithQueriedResources } from \"../../types/app.types\";\nimport { TougherOilImagesQuery } from \"../../types/generated\";\n\nexport const ProjectMetaInfoTougherOil: ProjectMetaInfo = {\n name: \"tougheroil\",\n displayName: \"Tougher Oil\",\n abbreviation: \"Tougher Oil\",\n subtitle: \"Established Irish Oil & Fuels Supplier\",\n description: \"Tougher Oil is a new supplier of home-heating oil in Ireland. We cooperated with their enthusiastic team and built a brand new, bespoke website for easily placing orders, together with one of the most vibrant brand identities we have designed so far.\",\n categories: [\n Category.websites,\n ],\n sectors: [\n Sector.energy,\n Sector.eCommerceAndRetail,\n ],\n url: \"https://www.tougheroil.ie/\",\n hasPage: false,\n keywords: [\n 'TougherOil',\n 'web design',\n 'web development',\n 'laravel',\n 'eCommerce',\n ],\n}\nexport const useTougherOilInfo = () => {\n const TougherOilImages: TougherOilImagesQuery = useStaticQuery(graphql`\n query TougherOilImages {\n featuredImage: file(relativePath: {eq: \"images/tougheroil/tougheroil-project-featured-image-truck-driving-in-sunset.jpg\"}) {\n childImageSharp {\n gatsbyImageData(width: 1280, height: 720)\n }\n }\n gallery: allFile(\n sort: {fields: name},\n filter: {\n extension: {regex: \"/(jpg)|(jpeg)|(png)/\"},\n relativeDirectory: {eq: \"images/tougheroil/gallery\"}\n }\n ) {\n edges {\n node {\n name\n childImageSharp {\n gatsbyImageData(width: 2560, height: 1440)\n }\n }\n }\n }\n }\n `)\n const imageMetaData: Partial[] = [\n {\n title: 'TougherOil Homepage Screenshot',\n alt: 'TougherOil Homepage Screenshot, desktop version',\n },\n ]\n const info: ProjectMetaInfoWithQueriedResources = {\n ...ProjectMetaInfoTougherOil,\n featuredImage: {\n image: TougherOilImages.featuredImage!.childImageSharp,\n title: 'TougherOil Project Featured Image',\n alt: 'A red fuel-delivery truck driving in the sunset',\n },\n gallery: TougherOilImages.gallery.edges.map((edge, i) => ({\n image: edge.node.childImageSharp?.gatsbyImageData,\n ...imageMetaData[i]\n }))\n }\n return info;\n}","import { graphql, useStaticQuery } from \"gatsby\";\nimport { Category } from \"../../constants/categories.constants\";\nimport { Sector } from \"../../constants/sectors.constants\";\nimport { ImageWithMetaInfo, ProjectMetaInfo, ProjectMetaInfoWithQueriedResources } from \"../../types/app.types\";\nimport { XMusicImagesQuery } from \"../../types/generated\";\n\nexport const ProjectMetaInfoXMusic: ProjectMetaInfo = {\n name: \"xmusic\",\n displayName: \"XMusic\",\n abbreviation: \"XMusic\",\n subtitle: \"Ireland’s largest musical instruments stores\",\n description: `XMusic is Ireland's largest musical instrument megastore. We designed and developed the new eCommerce website for XMusic, together with a branding refresh based on their original logo.`,\n categories: [\n Category.websites,\n ],\n sectors: [\n Sector.eCommerceAndRetail,\n Sector.musicAndAudio,\n ],\n url: \"https://xmusic.ie/\",\n hasPage: false,\n keywords: [\n 'XMusic',\n 'xmusic.ie',\n 'web design',\n 'web development',\n 'WordPress',\n 'musical instruments',\n 'eCommerce',\n 'WooCommerce',\n ],\n}\nexport const useXMusicInfo = () => {\n const XMusicImages: XMusicImagesQuery = useStaticQuery(graphql`\n query XMusicImages {\n featuredImage: file(relativePath: {eq: \"images/xmusic/xmusic-red-cow-storefront-twilight.jpg\"}) {\n childImageSharp {\n gatsbyImageData(width: 1280, height: 720)\n }\n }\n gallery: allFile(\n sort: {fields: name},\n filter: {\n extension: {regex: \"/(jpg)|(jpeg)|(png)/\"},\n relativeDirectory: {eq: \"images/xmusic/gallery\"}\n }\n ) {\n edges {\n node {\n name\n childImageSharp {\n gatsbyImageData(width: 2560, height: 1440)\n }\n }\n }\n }\n }\n `)\n const imageMetaData: Partial[] = [\n {\n title: \"XMusic Homepage Screenshot\",\n alt: \"XMusic Homepage Screenshot, desktop version\",\n },\n ]\n const info: ProjectMetaInfoWithQueriedResources = {\n ...ProjectMetaInfoXMusic,\n featuredImage: {\n image: XMusicImages.featuredImage!.childImageSharp,\n title: 'XMusic Storefront',\n alt: 'XMusic Storefront at dusk (Red Cow store, Dublin)'\n },\n gallery: XMusicImages.gallery.edges.map((edge, i) => ({\n image: edge.node.childImageSharp?.gatsbyImageData,\n ...imageMetaData[i]\n }))\n }\n return info;\n}","import { Back, TweenLite } from 'gsap';\nimport { action, reaction } from 'mobx';\nimport { Observer } from 'mobx-react-lite';\nimport React, { useEffect } from 'react';\nimport { StringParam, useQueryParam } from 'use-query-params';\nimport { sectorDefinitions, sectorsPreferredOrder } from '../../constants/sectors.constants';\nimport { isBrowser, isBuildTime } from '../../env';\nimport { useOnMount } from '../../hooks/lifecycle.hooks';\nimport { useObservableRef } from '../../hooks/useObservableRef.hook';\nimport { makeDisposerController } from '../../utils/disposer.utils';\nimport { useStore } from '../../utils/mobx.utils';\nimport { AnimatedLink } from '../AnimatedLink/AnimatedLink';\nimport Line from '../Line/Line';\nimport './SectorSelector.scss';\n\ntype SectorSelectorProps = {\n baseUrl?: string,\n onChange?: (animationOrigin: 'left' | 'right') => void;\n}\n\nconst SectorSelector: React.FC = props => {\n\n const [sector, setSector] = useQueryParam('sector', StringParam);\n\n const s = useStore(() => ({\n previousSector: sector,\n sector,\n lastPositionLeft: 0,\n }))\n\n const selectorRef = useObservableRef();\n const selectorInnerRef = useObservableRef();\n const highlighterRef = useObservableRef();\n\n useEffect(action(() => { s.sector = sector }));\n \n useOnMount(() => {\n const updateHighlighterPosition = action(() => {\n if (!highlighterRef.current || !selectorInnerRef.current) return;\n const targetTab = selectorRef.current?.querySelector(`a[data-slug=\"${s.sector ?? 'all'}\"]`);\n if (!targetTab) return;\n const { paddingLeft } = getComputedStyle(targetTab);\n const { left } = targetTab.getBoundingClientRect();\n const paddingX = parseInt(paddingLeft);\n const parentPaddingLeft = parseInt(getComputedStyle(selectorInnerRef.current).paddingLeft);\n const animationOrigin = left - s.lastPositionLeft >= 0 ? 'left' : 'right';\n s.lastPositionLeft = left;\n if (s.previousSector !== s.sector && !!s.sector) props.onChange?.(animationOrigin);\n s.previousSector = s.sector;\n if (isBuildTime) {\n TweenLite.set(highlighterRef.current, {\n width: targetTab.clientWidth - paddingX * 2,\n left: left + paddingX * 2 - parentPaddingLeft + (document.querySelector('.SectorSelector')?.scrollLeft ?? 0),\n });\n } else {\n TweenLite.to(highlighterRef.current, .25, {\n ease: Back.easeOut,\n width: targetTab.clientWidth - paddingX * 2,\n left: left + paddingX * 2 - parentPaddingLeft + (document.querySelector('.SectorSelector')?.scrollLeft ?? 0),\n });\n }\n })\n updateHighlighterPosition();\n if (isBuildTime) return;\n const d = makeDisposerController();\n window.addEventListener('resize', updateHighlighterPosition);\n d.add(reaction(() => s.sector, updateHighlighterPosition));\n d.add(() => window.removeEventListener('resize', updateHighlighterPosition));\n return d.disposer;\n })\n\n return (\n
\n
\n
\n { sectorsPreferredOrder.map(sect => {\n const def = sectorDefinitions[sect];\n return setSector(def.slug)}\n >{def.abbreviation ?? def.name}\n }) }\n { isBrowser &&
}\n
\n \n
\n
\n )} />\n\n}\n\nexport default SectorSelector;","import { Observer } from 'mobx-react-lite';\nimport React from 'react';\nimport { ImageDataLike } from '../../types/gatsby.types';\nimport GatsbyImageAdaptor from '../GatsbyImageAdaptor/GatsbyImageAdaptor';\nimport './SimpleImageFrame.scss';\n\ntype SimpleImageFrameProps = {\n image: ImageDataLike,\n title: string,\n alt?: string,\n}\n\n/**\n * Just a simple image frame for Gatsby Image,\n * but adding a backdrop color and forcing the image to always be 100% width of the parent container\n */\nconst SimpleImageFrame: React.FC = props => {\n return (\n
\n { props.image && }\n
\n )} />\n}\n\nexport default SimpleImageFrame;","import { Expo, TweenLite } from 'gsap';\nimport * as React from \"react\";\nimport { StringParam, useQueryParam } from \"use-query-params\";\nimport { Category } from \"../../constants/categories.constants\";\nimport { getSectorFromSlug, getSectorName, Sector } from '../../constants/sectors.constants';\nimport { ProjectMetaInfoMajesticIreland, useMajesticIrelandInfo } from \"../../content/projects/majestic-ireland.project\";\nimport { useAllProjectMetaInfo } from \"../../content/projects/_projects.index\";\nimport { useAppContext } from '../../controllers/app.controller';\nimport { getEntryPagePath } from \"../../utils/entry.utils\";\nimport { AnimatedLink } from '../AnimatedLink/AnimatedLink';\nimport CTAButton from '../CTAButton/CTAButton';\nimport EntryMetaInfoHeader from \"../EntryMetaInfoHeader/EntryMetaInfoHeader\";\nimport GridRowEndColumn from '../GridRow/GridRowEndColumn';\nimport PageSection from '../PageSection/PageSection';\nimport ProjectEntryList from '../ProjectEntryList/ProjectEntryList';\nimport QuoteSection from \"../QuoteSection/QuoteSection\";\nimport SectorSelector from \"../SectorSelector/SectorSelector\";\nimport SimpleImageFrame from \"../SimpleImageFrame/SimpleImageFrame\";\nimport Spacer from '../Spacer/Spacer';\nimport './ProjectArchive.scss';\n\ntype ProjectArchiveProps = {\n categories?: Category[],\n baseUrl?: string,\n}\n\n/**\n * Seen on the \"websites\" page, lists all projects with a sector filter.\n * It can accept a list of categories as filters.\n */\nconst ProjectArchive: React.FC = props => {\n\n const { UI } = useAppContext();\n const [ sectorParam ] = useQueryParam('sector', StringParam);\n const projects = useAllProjectMetaInfo({ categories: props.categories });\n const sector = getSectorFromSlug(sectorParam);\n const showAll = !sectorParam || sectorParam === Sector.all;\n const filteredProjects = showAll ? projects : projects.filter(p => p.sectors.includes(sector!));\n const containerRef = React.useRef(null);\n const headingRef = React.useRef(null);\n const listRef = React.useRef(null);\n \n const animateContentEnter = (towards: 'left' | 'right') => {\n if (!headingRef.current) return;\n const originXSign = towards === 'left' ? -1 : 1;\n TweenLite.from(headingRef.current, .5, {\n opacity: 0,\n x: originXSign * 120,\n ease: Expo.easeOut,\n })\n if (!listRef.current) return;\n TweenLite.set(listRef.current.children, { opacity: 0 })\n TweenLite.fromTo(listRef.current.children, UI.viewport.width >= 768 ? .62 : .38, {\n opacity: 0,\n x: originXSign * 80,\n }, {\n opacity: 1,\n x: 0,\n ease: Expo.easeOut,\n stagger: .05,\n })\n if (containerRef.current) {\n const containerOffsetTop = containerRef.current?.offsetTop ?? 0;\n // const navBarHeight = document.getElementById('NavBar')?.clientHeight ?? 0;\n // const fontSize = getFontSize(containerRef.current, 14);\n window.scrollTo({ \n /** the SectorSelector component is sticky at (navBarHeight - 2em). */\n // top: Math.max(0, containerOffsetTop - navBarHeight + fontSize * 2),\n top: containerOffsetTop,\n });\n }\n }\n\n return
\n \n \n \n \n { showAll && }\n \n { showAll ? :
\n

{getSectorName(sectorParam)}

\n
}\n \n
\n {/* \n \n */}\n
\n}\n\nconst FeaturedWebsites = () => {\n const majesticIreland = useMajesticIrelandInfo();\n const image = majesticIreland.gallery![0];\n return <>\n \n
\n {image && \n \n }\n
\n
\n \n \n \n \n
\n \n View Details\n \n
\n
\n
\n \n \n}\n\nexport default ProjectArchive;","import { Category } from \"../../constants/categories.constants\";\nimport { hasIntersection } from \"../../utils/array.utils\";\nimport { useAAAIDPAnimationInfo } from \"./aaa-idp-animation.project\";\nimport { useBunzlCSSInfo } from \"./bunzlcss.project\";\nimport { useCannonballInfo } from \"./cannonball.project\";\nimport { useCarnetDePassagesInfo } from \"./carnet-de-passages.project\";\nimport { useCarraighillInfo } from \"./carraighill.project\";\nimport { useCelticWoodlandYogaFestivalInfo } from \"./celtic-woodland-yoga-festival.project\";\nimport { useEarth2EarthInfo } from \"./earth2earth.project\";\nimport { useElyxrInfo } from \"./elyxr.project\";\nimport { useEscapeToMarlboroughInfo } from \"./escape-to-marlborough.project\";\nimport { useGCNInfo } from \"./gcn.project\";\nimport { useHopOnHopOffInfo } from \"./hoponhopoff.project\";\nimport { useIDPInfo } from \"./idp.project\";\nimport { useJimOCallaghanInfo } from \"./jim-ocallaghan.project\";\nimport { useKLHInfo } from \"./klh.project\";\nimport { useMajesticIrelandInfo } from \"./majestic-ireland.project\";\nimport { useMJHudsonBridgeInfo } from \"./mjhudson-bridge.project\";\nimport { useMKIInfo } from \"./motorsport-knowledge-institute.project\";\nimport { useTheGablesInfo } from \"./the-gables.project\";\nimport { useTougherOilInfo } from \"./tougheroil.project\";\nimport { useTurn2meInfo } from \"./turn2me.project\";\nimport { useXMusicInfo } from \"./xmusic.project\";\n\nexport const useAllProjectMetaInfo = (\n filters?: {\n categories?: Category[]\n }\n) => {\n\n /**\n * The order of the following array will directly influence \n * how the projects are ordered in the index lists in the `/websites` page\n */\n const projects = [\n useTurn2meInfo(),\n useGCNInfo(),\n useJimOCallaghanInfo(),\n useKLHInfo(),\n useAAAIDPAnimationInfo(),\n useCannonballInfo(),\n useTheGablesInfo(),\n useIDPInfo(),\n useMajesticIrelandInfo(),\n useMJHudsonBridgeInfo(),\n useEscapeToMarlboroughInfo(),\n useHopOnHopOffInfo(),\n useCelticWoodlandYogaFestivalInfo(),\n useXMusicInfo(),\n useTougherOilInfo(),\n useEarth2EarthInfo(),\n useElyxrInfo(),\n useBunzlCSSInfo(),\n useMKIInfo(),\n useCarraighillInfo(),\n useCarnetDePassagesInfo(),\n // useOneStopHandlingInfo(),\n ];\n\n if (filters?.categories) {\n return projects.filter(p => p.categories.length === 0 || hasIntersection(p.categories, filters.categories!));\n }\n \n return projects;\n \n}","import { Observer } from \"mobx-react-lite\"\nimport * as React from \"react\"\nimport CTAButton from \"../components/CTAButton/CTAButton\"\nimport DefaultPageHeader from \"../components/DefaultPageHeader/DefaultPageHeader\"\nimport GridRow from \"../components/GridRow/GridRow\"\nimport GridRowEndColumn from \"../components/GridRow/GridRowEndColumn\"\nimport Line from \"../components/Line/Line\"\nimport PageEndCTASection from \"../components/PageEndCTASection/PageEndCTASection\"\nimport PageTemplate from \"../components/PageTemplate/PageTemplate\"\nimport ProjectArchive from \"../components/ProjectArchive/ProjectArchive\"\nimport Spacer from \"../components/Spacer/Spacer\"\nimport StandardTextBlock from \"../components/StandardTextBlock/StandardTextBlock\"\nimport TricolorMorphDef from \"../components/TricolorMorphDef/TricolorMorphDef\"\nimport Widowless from \"../components/Widowless/Widowless\"\nimport { Category } from \"../constants/categories.constants\"\nimport { useAppContext } from \"../controllers/app.controller\"\nimport { PageComponent } from \"../types/gatsby.types\"\nimport { isIE } from \"../utils/browsers.utils\"\nimport './websites.scss'\n\nconst PageWebsites: PageComponent = props => {\n\n const { UI } = useAppContext();\n \n return (\n \n\n {/* */}\n\n \n \n \n \n Modern websites are comprised of thousands of moving parts, and businesses have the most radical ideas they need to present to the world in a highly competitive online environment.\n \n \n Our talented design team works with both you and our excellent engineers to give your visitors an unparalleled digital experience.\n \n { \n !isIE && <>\n {!UI.cssFeatures.grid &&
}\n {!UI.cssFeatures.grid && UI.viewport.width >= 1440 &&
}\n \n }\n \n Contact Us\n \n \n \n\n \n\n \n\n \n\n \n {/* */}\n\n \n )} />\n \n}\n\nexport default PageWebsites\n","import { graphql, useStaticQuery } from \"gatsby\";\nimport { Category } from \"../../constants/categories.constants\";\nimport { Sector } from \"../../constants/sectors.constants\";\nimport { ImageWithMetaInfo, ProjectMetaInfo, ProjectMetaInfoWithQueriedResources } from \"../../types/app.types\";\nimport { KlhImagesQuery } from \"../../types/generated\";\n\nexport const ProjectMetaInfoKLH: ProjectMetaInfo = {\n name: \"klh\",\n displayName: \"KLH Audio\",\n abbreviation: \"KLH\",\n subtitle: \"KLH Audio Speakers Website (Europe)\",\n description: \"Founded in 1957 in Cambridge, Massachusetts, KLH is a company of ground-breaking firsts and has created some of the bestselling speakers in the world.\",\n categories: [\n Category.websites,\n ],\n sectors: [\n Sector.eCommerceAndRetail,\n Sector.musicAndAudio\n ],\n url: \"https://www.klhaudio.eu/\",\n hasPage: true,\n keywords: [\n 'KLH',\n 'KLH Audio',\n 'web design',\n 'web development',\n 'Laravel',\n 'eCommerce',\n 'audio equipments',\n ],\n}\n\nexport const useKLHInfo = () => {\n const KLHImages: KlhImagesQuery = useStaticQuery(graphql`\n query KLHImages {\n featuredImage: file(relativePath: {eq: \"images/klh/klh-speakers-in-lounge.jpg\"}) {\n childImageSharp {\n gatsbyImageData(width: 1280, height: 720)\n }\n }\n gallery: allFile(\n sort: {fields: name},\n filter: {\n extension: {regex: \"/(jpg)|(jpeg)|(png)/\"},\n relativeDirectory: {eq: \"images/klh/gallery\"}\n }\n ) {\n edges {\n node {\n name\n childImageSharp {\n gatsbyImageData(width: 2560, height: 1440)\n }\n }\n }\n }\n mobileScreenshots: allFile(\n sort: {fields: name},\n filter: {\n extension: {regex: \"/(jpg)|(jpeg)|(png)/\"},\n relativeDirectory: {eq: \"images/klh/mobile-screenshots\"}\n }\n ) {\n edges {\n node {\n name\n childImageSharp {\n gatsbyImageData(\n width: 238\n )\n }\n }\n }\n }\n }\n `)\n const imageMetaData: Partial[] = [\n {\n title: \"KLH Audio EU Homepage Screenshot\",\n alt: \"KLH Audio EU Homepage Screenshot, desktop version\",\n },\n ]\n const info: ProjectMetaInfoWithQueriedResources = {\n ...ProjectMetaInfoKLH,\n featuredImage: {\n image: KLHImages.featuredImage!.childImageSharp,\n title: 'KLH Audio EU Website Homepage Desktop',\n alt: 'KLH Audio EU Website Homepage Desktop',\n },\n gallery: KLHImages.gallery.edges.map((edge, i) => ({\n image: edge.node.childImageSharp?.gatsbyImageData,\n ...imageMetaData[i]\n })),\n // TODO: provide better title / alt values,\n mobileScreenshots: KLHImages.mobileScreenshots.edges.map((edge, i) => ({\n image: edge.node.childImageSharp,\n title: edge.node.name,\n alt: edge.node.name,\n }))\n }\n return info;\n}","import { graphql, useStaticQuery } from \"gatsby\";\nimport { Category } from \"../../constants/categories.constants\";\nimport { Sector } from \"../../constants/sectors.constants\";\nimport { ImageWithMetaInfo, ProjectMetaInfo, ProjectMetaInfoWithQueriedResources } from \"../../types/app.types\";\nimport { CelticWoodlandYogaFestivalImagesQuery } from \"../../types/generated\";\n\nexport const ProjectMetaInfoCelticWoodlandYogaFestival: ProjectMetaInfo = {\n name: \"celtic-woodland-yoga-festival\",\n displayName: \"Celtic Woodland Yoga Festival\",\n abbreviation: \"CWYF\",\n subtitle: \"Website Design & Build Project\",\n description: \"The Celtic Woodland Yoga festival is dedicated to broad-mindedness, diversity and conscious exploration, and aims to grow this yoga into the future as a living, breathing spiritual art form. The platform was first developed to host its first virtual yoga festival in 2020.\",\n categories: [\n Category.websites,\n ],\n sectors: [\n Sector.healthAndFitness,\n Sector.entertainmentAndEvents,\n ],\n url: \"https://celticwoodlandyogafestival.com/\",\n hasPage: true,\n keywords: [\n 'Celtic Woodland Yoga Festival',\n 'web design',\n 'web development',\n 'Yoga',\n 'Yoga Festival',\n 'live event streaming',\n 'WordPress',\n 'events',\n ],\n}\nexport const useCelticWoodlandYogaFestivalInfo = () => {\n const CelticWoodlandYogaFestivalImages: CelticWoodlandYogaFestivalImagesQuery = useStaticQuery(graphql`\n query CelticWoodlandYogaFestivalImages {\n featuredImage: file(relativePath: {eq: \"images/celtic-woodland-yoga-festival/celtic-woodland-yoga-festival-library-class.jpg\"}) {\n childImageSharp {\n gatsbyImageData(width: 1280, height: 720)\n }\n }\n gallery: allFile(\n sort: {fields: name},\n filter: {\n extension: {regex: \"/(jpg)|(jpeg)|(png)/\"},\n relativeDirectory: {eq: \"images/celtic-woodland-yoga-festival/gallery\"}\n }\n ) {\n edges {\n node {\n name\n childImageSharp {\n gatsbyImageData(width: 2560, height: 1440)\n }\n }\n }\n }\n }\n `)\n const imageMetaData: Partial[] = [\n {\n title: 'Celtic Woodland Yoga Festival Homepage Screenshot',\n alt: 'Celtic Woodland Yoga Festival Homepage Screenshot, desktop version',\n },\n ]\n const info: ProjectMetaInfoWithQueriedResources = {\n ...ProjectMetaInfoCelticWoodlandYogaFestival,\n featuredImage: {\n image: CelticWoodlandYogaFestivalImages.featuredImage!.childImageSharp,\n title: 'Celtic Woodland Yoga Festival',\n alt: 'Yogis having a group class in Townley Hall during Celtic Woodland Yoga Festival 2019',\n },\n gallery: CelticWoodlandYogaFestivalImages.gallery.edges.map((edge, i) => ({\n image: edge.node.childImageSharp?.gatsbyImageData,\n ...imageMetaData[i]\n }))\n }\n return info;\n}"],"names":["ProjectMetaInfoHopOnHopOff","name","displayName","abbreviation","subtitle","description","url","categories","Category","websites","sectors","Sector","tourism","hasPage","hashtags","Hashtag","branding","digitalDesign","printDesign","keywords","useHopOnHopOffInfo","HopOnHopOffImages","useStaticQuery","imageMetaData","title","alt","_objectSpread","featuredImage","image","childImageSharp","gallery","edges","map","edge","i","_edge$node$childImage","node","gatsbyImageData","mobileScreenshots","QuoteSectionBlockquote","props","ref","useObservableRef","useAnimateTextEnterByLine","animateTextEnter","onlyWhenParentSectionVisible","delay","_jsx","children","isString","content","Widowless","p","_jsxs","PageSection","id","className","joinClassName","observeVisibility","addLineBefore","Line","addLineAfter","ProjectMetaInfoMajesticIreland","useMajesticIrelandInfo","MajesticIrelandImages","ProjectMetaInfoEscapeToMarlborough","design","useEscapeToMarlboroughInfo","EscapeToMarlboroughImages","ProjectMetaInfoTurn2me","apps","healthAndFitness","theme","backgroundColor","foregroundColor","backgroundImageOpacity","primaryColor","useTurn2meInfo","Turn2meImages","ProjectMetaInfoTheGables","useTheGablesInfo","TheGablesImages","ProjectMetaInfoMJHudsonBridge","finance","useMJHudsonBridgeInfo","MJHudsonBridgeImages","ProjectMetaInfoJimOCallaghan","governmentAndNPO","useJimOCallaghanInfo","JimOCallaghanImages","ProjectMetaInfoGCN","yearStart","lgbtq","newsAndMedia","useGCNInfo","_GCNImages$featuredIm","GCNImages","ProjectMetaInfoBunzlCSS","eCommerceAndRetail","useBunzlCSSInfo","BunzlCSSImages","ProjectMetaInfoCannonball","entertainmentAndEvents","motorsports","useCannonballInfo","CannonballImages","ProjectMetaInfoCarraighill","useCarraighillInfo","CarraighillImages","ProjectMetaInfoEarth2Earth","useEarth2EarthInfo","Earth2EarthImages","ProjectMetaInfoElyxr","musicAndAudio","useElyxrInfo","ElyxrImages","ProjectMetaInfoMKI","eLearning","useMKIInfo","MKIImages","ProjectMetaInfoTougherOil","energy","useTougherOilInfo","TougherOilImages","ProjectMetaInfoXMusic","useXMusicInfo","XMusicImages","sector","setSector","useQueryParam","StringParam","s","useStore","previousSector","lastPositionLeft","selectorRef","selectorInnerRef","highlighterRef","useEffect","action","useOnMount","updateHighlighterPosition","_selectorRef$current","_s$sector","_props$onChange","current","targetTab","querySelector","paddingLeft","getComputedStyle","left","getBoundingClientRect","paddingX","parseInt","parentPaddingLeft","animationOrigin","_document$querySelect","_document$querySelect2","_document$querySelect3","_document$querySelect4","onChange","call","isBuildTime","TweenLite","set","width","clientWidth","document","scrollLeft","to","ease","Back","easeOut","d","makeDisposerController","window","addEventListener","add","reaction","removeEventListener","disposer","Observer","sectorsPreferredOrder","sect","_props$baseUrl","_def$abbreviation","def","sectorDefinitions","AnimatedLink","slug","undefined","baseUrl","onClick","isBrowser","_props$alt","GatsbyImageAdaptor","FeaturedWebsites","majesticIreland","_Fragment","getEntryPagePath","SimpleImageFrame","height","viewBox","fill","EntryMetaInfoHeader","entry","GridRowEndColumn","CTAButton","drawLine","ribbons","QuoteSection","UI","useAppContext","sectorParam","projects","filters","useKLHInfo","useAAAIDPAnimationInfo","useIDPInfo","useCelticWoodlandYogaFestivalInfo","useCarnetDePassagesInfo","filter","length","hasIntersection","useAllProjectMetaInfo","getSectorFromSlug","showAll","all","filteredProjects","includes","containerRef","React","headingRef","listRef","SectorSelector","towards","originXSign","from","opacity","x","Expo","fromTo","viewport","stagger","_containerRef$current","_containerRef$current2","containerOffsetTop","offsetTop","scrollTo","top","Spacer","size","getSectorName","ProjectEntryList","PageTemplate","TricolorMorphDef","mobile","R","G","B","desktop","DefaultPageHeader","GridRow","StandardTextBlock","isIE","cssFeatures","grid","ProjectArchive","PageEndCTASection","preSelectTopic","ProjectMetaInfoKLH","KLHImages","ProjectMetaInfoCelticWoodlandYogaFestival","CelticWoodlandYogaFestivalImages"],"sourceRoot":""}