{"version":3,"sources":["redux/filters/actions.ts","redux/filters/reducer.ts","redux/global/actions.ts","redux/global/reducer.ts","redux/menu/actions.ts","redux/menu/reducer.ts","redux/search/actions.ts","redux/search/reducer.ts","redux/reducers.ts","constants/env.ts","constants/api.ts","services/generic.service.ts","services/search.service.ts","constants/routes.ts","utils/menu.ts","redux/filters/saga.ts","services/products.service.ts","redux/menu/saga.ts","redux/search/saga.ts","redux/sagas.ts","redux/store.ts","components/Analytics/index.tsx","styles/index.ts","styles/breakpoints.js","styles/global.ts","components/GlobalStyles/index.tsx","components/uielements/genericModal/styles.tsx","components/uielements/genericModal/index.tsx","routes/handlers/InactivityHandler.tsx","utils/analytics.ts","styles/mixins.ts","components/Tag/styles.tsx","components/Tag/index.tsx","components/FilterOverlay/styles.ts","components/FilterOverlay/index.tsx","components/FilterOverlay/form.tsx","components/FilterStatus/styles.tsx","components/FilterStatus/index.tsx","components/Footer/styles.ts","components/Footer/index.tsx","components/SearchBar/styles.tsx","components/SearchBar/index.tsx","components/Header/styles.ts","components/Header/filterToggle.tsx","components/Header/logo.tsx","components/Header/index.tsx","utils/imageHelper.ts","components/MenuGrid/styles.ts","components/MenuGrid/index.tsx","components/SubNav/styles.ts","components/SubNav/index.tsx","components/TopNav/styles.ts","components/TopNav/index.tsx","routes/handlers/menuHandler.tsx","routes/handlers/pageHandler.tsx","routes/Menu/index.tsx","components/BackToMenu/styles.ts","components/BackToMenu/index.tsx","components/ProductDetail/styles.ts","components/ProductDetail/index.tsx","routes/Product/index.tsx","components/SearchGrid/index.tsx","constants/config.ts","components/SearchStatus/styles.ts","components/SearchStatus/index.tsx","routes/Search/index.tsx","components/Welcome/styles.ts","components/Welcome/index.tsx","routes/Splash/index.tsx","routes/index.tsx","serviceWorker.ts","index.tsx"],"names":["filterActions","TOGGLE_ALLERGEN","toggleAllergen","safeName","type","TOGGLE_DIET","toggleDiet","APPLY_FILTERS","applyFilters","values","redoSearch","pushToMenu","SET_FILTER_RESULTS","setFilterResults","initialState","loading","allergens","diets","ingredients","filtersReducer","state","arguments","length","undefined","action","actions","Object","assign","globalActions","FILTER_OVERLAY_VISIBLE","toggleFilterOverlay","visible","FILTERS_APPLIED","filtersApplied","applied","SEARCH_VISIBLE","toggleSearch","filterOverlayVisible","searchVisible","globalReducer","menuActions","FETCH_FAIL","FETCH_MENU","fetchMenu","params","supressRedirect","FETCH_MENU_SUCCESS","fetchMenuSuccess","menu","dietaryFilters","menuIndex","data","menuReducer","searchActions","SEARCH_MENU","searchMenu","args","SET_SEARCH_RESULTS","setSearchResults","value","results","searchReducer","rootReducer","history","combineReducers","filters","global","router","connectRouter","search","ENV_CONFIG","REACT_APP_API_BASE_URL","REACT_APP_API_KEY","REACT_APP_API_VERSION","REACT_APP_API_SCHEME","REACT_APP_FRONTEND_BASE_URL","REACT_APP_FRONTEND_SCHEME","ENV","url","concat","scheme","key","routes","genericHttpService","options","axios","catch","error","response","console","log","status","headers","request","message","config","filterProducts","localStorage","getItem","query","keys","filter","k","map","result","Array","isArray","join","encodeURIComponent","URIEncode","httpService","method","API","KEY","X-Type","pathParams","occasionId","categoryId","productId","searchTerm","splash","base","occasion","category","product","verbose","determineFirstCategoryId","occasionName","item","safe_name","foundOccasion","categories","_","get","determineShowIcon","prod","is_vegan","is_vegetarian","interpolateMOCPath","replace","interpolateProductPath","deriveDefaultMenuRoute","menuIndexByProductId","productsArr","m","products","c","push","flattenedProducts","flattenDeep","reduce","obj","p","external_id","filterMenuSaga","rootSaga","searchValue","regenerator_default","a","wrap","_context","prev","next","select","sent","put","keywords","call","dietary_filters","t0","stop","_marked","_context2","takeLatest","_marked2","fetchProducts","_ref","firstOccasionName","firstCategoryId","saga_marked","saga_marked2","searchMenuSaga","flattenedArgs","flat","search_saga_marked","search_saga_marked2","getState","all","filtersSagas","menuSagas","searchSagas","sagas_marked","createBrowserHistory","sagaMiddleware","createSagaMiddleware","configureStore","middlewares","routerMiddleware","enhancers","applyMiddleware","apply","composeEnhancers","window","__REDUX_DEVTOOLS_EXTENSION_COMPOSE__","compose","store","createStore","objectSpread","runSaga","run","GoogleAnalytics","location","gtag","pathname","this","props","page_path","React","Component","withRouter","RED","COLORS","LAYOUT","MAXWIDTH","GUTTER","MOBILE_GUTTER","H_SPACING","HEADER","M_HEIGHT","T_HEIGHT","D_HEIGHT","NAV","SUBNAV","FONTS","PRIMARY_FONT_FAMILY","PRIMARY_TEXT_SIZE","PRIMARY","PRIMARY_LIGHT","PRIMARY_REGULAR","PRIMARY_MEDIUM","PRIMARY_BOLD","SECONDARY","BreakpointWidth","desktop","desktopLarge","desktopXLarge","desktopXXLarge","smallScreen","tablet","tabletLarge","tabletXLarge","media","mediaQueries","label","defineProperty","_len","_key","css","_templateObject","breakpoints_this","isMobile","breakpoint","innerWidth","GlobalStyles","createGlobalStyle","global_templateObject","_templateObject2","_templateObject3","disableFocus","Globals","mouseDown","_this","setState","keyDown","document","addEventListener","removeEventListener","react_default","createElement","StyledGenericModal","styled","div","styles_templateObject","StyledGenericModalContent","styles_templateObject2","StyledGenericModalFooterForm","form","styles_templateObject3","StyledPrimaryButton","button","_templateObject4","StyledSecondaryButton","_templateObject5","GenericModal","_this$props","cancelMessage","confirmMessage","modalOpen","toggleModal","focus_trap_react_default","focusTrapOptions","initialFocus","data-cy","className","children","id","onClick","e","preventDefault","cancelAction","InactivityHandler","warningInterval","redirectInterval","warningHandle","redirectHandle","warnTimerElapsed","openModal","firstLoad","events","restartTimers","throttle","removeAllTimers","startTimers","hideModal","activate","forEach","eventType","deactivate","clearTimeout","setTimeout","redirect","href","react","genericModal","gaCategories","gaActions","fireGaEvent","mergedParams","event_category","event_label","event_value","NavButton","Link","mixins_templateObject","active","ContainerBlock","mixins_templateObject2","mixins_templateObject3","VisuallyHiddenButton","mixins_templateObject4","deriveMediaQueriesFromHeaderHeight","property","mixins_templateObject5","toString","_templateObject6","_templateObject7","StyledNoResults","_templateObject8","_templateObject9","_templateObject10","StyledTag","Tag_styles_templateObject","isSelected","darken","lighten","Tag","testId","StyledApplyButton","FilterOverlay_styles_templateObject","StyledClearFiltersButton","FilterOverlay_styles_templateObject2","StyledButtonsContainer","FilterOverlay_styles_templateObject3","kiosk","StyledOverlay","styles_templateObject4","StyledOverlayContent","styles_templateObject5","styles_templateObject6","styles_templateObject7","styles_templateObject8","styles_templateObject9","styles_templateObject10","_templateObject11","_templateObject12","_templateObject13","StyledOverlayHeader","_templateObject14","_templateObject15","StyledTagContainer","_templateObject16","_templateObject17","_templateObject18","StyledCloseButton","_templateObject19","_templateObject20","_templateObject21","_templateObject22","_templateObject23","_templateObject24","StyledDisclaimerHolder","_templateObject25","_templateObject26","_templateObject27","StyledDisclaimerBody","_templateObject28","_templateObject29","_templateObject30","StyledDisclaimerHeader","_templateObject31","_templateObject32","_templateObject33","connect","dispatch","useEffect","body","style","overflowY","close","evt","keyCode","closeFilterOverlay","Fragment","role","alt","src","applyIsSelected","arr","settings","resetApplied","indexOf","assembleSubmitKeyArray","formatIngredients","allergenFilters","ingredientsFilters","dietFilters","filtersLoading","selectRef","_useState","useState","_useState2","slicedToArray","selectInputVal","setSelectInputVal","_useState3","_useState4","reset","setReset","_useState5","formattedIngredients","filteredIngredients","input","cb","exactMatch","toLowerCase","startsWith","includes","handleInputChange","handleRef","formik_esm","initialValues","onSubmit","render","_ref2","setFieldValue","resetForm","name","_ref3","allergen","index","styles_StyledTag","Async_default","placeholder","defaultOptions","loadOptions","isMulti","ref","onChange","focus","option","removedValue","onInputChange","styles","container","flex","multiValue","backgroundColor","borderRadius","color","padding","multiValueLabel","control","boxShadow","theme","colors","primary25","primary","neutral20","neutral30","neutral40","neutral50","neutral60","spacing","controlHeight","_ref4","diet","StyledFilterStatusContainer","FilterStatus_styles_templateObject","StyledFilterStatus","FilterStatus_styles_templateObject2","FilterStatus_styles_templateObject3","StyledFilterTags","FilterStatus_styles_templateObject4","FilterStatus_styles_templateObject5","FilterStatus_styles_templateObject6","StyledMoreFilters","FilterStatus_styles_templateObject7","FilterStatus_styles_templateObject8","menuAllergens","menuDietaryFilters","menuIngredients","menuFilters","appliedFilters","totalFilters","maxCount","maxContainerWidth","maxTagsPerRow","maxTagWidth","maxTagDisplayArea","Math","floor","determineMaxFiltersDisplay","currentCount","FilterStatus_styles_StyledTag","removeFilter","filterObject","find","deriveNameFromSafeName","aria-label","StyledLayout","Footer_styles_templateObject","StyledFooterContainer","ul","Footer_styles_templateObject2","Footer_styles_templateObject3","StyledCopyright","Footer_styles_templateObject4","Footer_styles_templateObject5","Links","link","Footer","StyledSearch","SearchBar_styles_templateObject","SearchBar_styles_templateObject2","SearchBar_styles_templateObject3","StyledSearchContent","SearchBar_styles_templateObject4","SearchBar_styles_templateObject5","SearchBar_styles_templateObject6","SearchBar_styles_templateObject7","StyledSearchButton","SearchBar_styles_templateObject8","StyledSearchInput","SearchBar_styles_templateObject9","SearchBar_styles_templateObject10","term","searchLoading","pushToSearch","closeSearch","setSearch","clickOutsideDeactivates","as","styles_StyledCloseButton","target","required","autoFocus","StyledHeader","nav","Header_styles_templateObject","StyledHeaderContent","Header_styles_templateObject2","StyledLogo","img","Header_styles_templateObject3","Header_styles_templateObject4","Header_styles_templateObject5","HeaderButton","Header_styles_templateObject6","Header_styles_templateObject7","Header_styles_templateObject8","Header_styles_templateObject9","StyledFilterButton","Header_styles_templateObject10","styles_templateObject11","react_router_dom","to","showSearch","setShowSearch","toggle","components_SearchBar","styles_StyledSearchButton","logo","filterToggle","IMAGE_RESIZER","resizeImage","height","width","quality","crop","split","StyledItemImage","MenuGrid_styles_templateObject","backgroundUrl","StyledDietaryIcon","MenuGrid_styles_templateObject2","StyledNewIcon","MenuGrid_styles_templateObject3","MenuGrid_styles_templateObject4","StyledMenuGrid","MenuGrid_styles_templateObject5","StyledMenuGridContainer","MenuGrid_styles_templateObject6","StyledItemCardContainer","MenuGrid_styles_templateObject7","MenuGrid_styles_templateObject8","MenuGrid_styles_templateObject9","MenuGrid_styles_templateObject10","MenuGrid_styles_templateObject11","StyledProductLink","styles_templateObject12","StyledItemLabel","h1","styles_templateObject13","StyledAllergensLabel","h2","styles_templateObject14","StyledMenuLoading","styles_templateObject15","styles_templateObject16","styles_templateObject17","MenuItemCard","image_url","is_new","title","icon","allergens_description","MenuGrid","matchParams","menuLoading","catId","selectedProducts","selectedOccasionMenuCatsObj","selectedOccasionMenuCats","selectedProductOptions","cat","renderMenu","MenuGrid_MenuItemCard","StyledCategoryLink","SubNav_styles_templateObject","SubNav_styles_templateObject2","SubNav_styles_templateObject3","Container","SubNav_styles_templateObject4","ContainerWrapper","SubNav_styles_templateObject5","SubNav_styles_templateObject6","SubNav_styles_templateObject7","MenuNav","renderCategories","categoriesObj","foundCategories","navState","StyledOccasionLink","TopNav_styles_templateObject","TopNav_styles_templateObject2","TopNav_styles_templateObject3","StyledContent","TopNav_styles_templateObject4","StyledContainer","TopNav_styles_templateObject5","TopNav_styles_templateObject6","TopNav_styles_templateObject7","TopNav","menuHandler","WrappedComponent","PageComponent","_React$Component","_getPrototypeOf2","classCallCheck","possibleConstructorReturn","getPrototypeOf","reconcileAmbiguousUrl","menuData","_this$props$match$par","match","inherits","createClass","_this$props2","arg","path","pageHandler","transitionPage","scrollTo","goBackOrRedirect","goBack","Menu","components_Header","components_TopNav","SubNav","components_FilterStatus","components_MenuGrid","components_FilterOverlay","FilterOverlay_form","components_Footer","StyledBackToMenuLink","BackToMenu_styles_templateObject","BackToMenu_styles_templateObject2","BackToMenu","ProductDetail_styles_templateObject","StyledTopLeftContainer","ProductDetail_styles_templateObject2","ProductDetail_styles_templateObject3","ProductDetail_styles_templateObject4","ProductDetail_styles_templateObject5","ProductDetail_styles_templateObject6","ProductDetail_styles_templateObject7","ProductDetail_styles_templateObject8","StyledTopRightContainer","ProductDetail_styles_templateObject9","ProductDetail_styles_templateObject10","ProductDetail_styles_templateObject11","ProductDetail_styles_templateObject12","StyledTopContainer","ProductDetail_styles_templateObject13","ProductDetail_styles_templateObject14","StyledBottomLeftContainer","ProductDetail_styles_templateObject15","ProductDetail_styles_templateObject16","ProductDetail_styles_templateObject17","styles_templateObject18","styles_templateObject19","StyledBottomRightContainer","styles_templateObject20","styles_templateObject21","styles_templateObject22","styles_templateObject23","StyledBottomContainer","styles_templateObject24","styles_templateObject25","styles_templateObject26","StyledNutrientContainer","styles_templateObject27","styles_templateObject28","styles_templateObject29","styles_templateObject30","StyledBadgeLabelBlock","styles_templateObject31","ProductDetail","styles_StyledContainer","BackToMenu_BackToMenu","styles_StyledItemImage","styles_StyledNewIcon","marketing_name","badge_description","marketing_description","dangerouslySetInnerHTML","__html","ingredients_description","average_weight","nutrients","nutrient","determineMetric","per_100_g","per_serving","Product","components_ProductDetail","alert","removeItem","searchPayload","menu_safe_name","category_external_id","StyledSearchStatus","SearchStatus_styles_templateObject","SearchStatus_styles_templateObject2","searchResults","Search","components_SearchStatus","components_SearchGrid","Welcome_styles_templateObject","Welcome_styles_templateObject2","Welcome_styles_templateObject3","StyledWelcomeContainer","Welcome_styles_templateObject4","StyledImageContainer","Welcome_styles_templateObject5","Welcome_styles_templateObject6","Welcome_styles_templateObject7","StyledTextContainer","Welcome_styles_templateObject8","Welcome_styles_templateObject9","Welcome_styles_templateObject10","Welcome","styles_StyledLogo","SplashPage","setItem","Welcome_Welcome","AppContainer","esm","GlobalStyles_Globals","react_router","exact","component","Splash","routes_Product","routes_Search","handlers_InactivityHandler","Analytics","Boolean","hostname","ReactDOM","react_fastclick_alt_default","es","src_routes","getElementById","navigator","serviceWorker","ready","then","registration","unregister","Cypress"],"mappings":"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","file":"static/js/main.19b9d453.chunk.js","sourcesContent":["const filterActions = {\n TOGGLE_ALLERGEN: '/pret-allergens/filters/TOGGLE_ALLERGEN',\n toggleAllergen: (safeName: string) => ({\n type: filterActions.TOGGLE_ALLERGEN,\n safeName,\n }),\n\n TOGGLE_DIET: '/pret-allergens/filters/TOGGLE_DIET',\n toggleDiet: (safeName: string) => ({\n type: filterActions.TOGGLE_DIET,\n safeName,\n }),\n\n APPLY_FILTERS: '/pret-allergens/filters/APPLY_FILTERS',\n applyFilters: (values: {}, redoSearch: boolean, pushToMenu: boolean) => ({\n type: filterActions.APPLY_FILTERS,\n values,\n redoSearch,\n pushToMenu,\n }),\n\n SET_FILTER_RESULTS: '/pret-allergens/filters/SET_FILTER_RESULTS',\n setFilterResults: (values: {}) => ({\n type: filterActions.SET_FILTER_RESULTS,\n values,\n }),\n};\n\nexport default filterActions;\n","import { AnyAction, Reducer } from 'redux';\n\n// Actions\nimport actions from './actions';\n\nexport interface ReducerState {\n allergens: string[];\n diets: string[];\n ingredients: string[];\n loading: boolean;\n}\nconst initialState: ReducerState = {\n // Client\n loading: false,\n allergens: [],\n diets: [],\n ingredients: [],\n\n // Results are pushed directly into the menu reducer...\n};\n\nexport const filtersReducer: Reducer = (state = initialState, action: AnyAction) => {\n switch (action.type) {\n case actions.APPLY_FILTERS: {\n return Object.assign({}, state, {\n loading: true,\n });\n }\n case actions.SET_FILTER_RESULTS: {\n return Object.assign({}, state, {\n allergens: action.values.allergens,\n diets: action.values.diets,\n ingredients: action.values.ingredients,\n loading: false,\n });\n }\n default:\n return state;\n }\n};\n","const globalActions = {\n\n FILTER_OVERLAY_VISIBLE: '/pret-allergens/global/FILTER_OVERLAY_VISIBLE',\n toggleFilterOverlay: (visible: boolean) => ({\n type: globalActions.FILTER_OVERLAY_VISIBLE,\n visible,\n }),\n\n FILTERS_APPLIED: '/pret-allergens/global/FILTERS_APPLIED',\n filtersApplied: (applied: boolean) => ({\n type: globalActions.FILTERS_APPLIED,\n applied,\n }),\n\n SEARCH_VISIBLE: '/pret-allergens/global/SEARCH_VISIBLE',\n toggleSearch: (visible: boolean) => ({\n type: globalActions.SEARCH_VISIBLE,\n visible,\n }),\n};\n\nexport default globalActions;\n","import { AnyAction, Reducer } from 'redux';\n\n// Actions\nimport filterActions from '../filters/actions';\nimport actions from './actions';\n\nexport interface ReducerState {\n filterOverlayVisible: boolean;\n searchVisible: boolean;\n}\nconst initialState: ReducerState = {\n filterOverlayVisible: false,\n searchVisible: false,\n};\n\nexport const globalReducer: Reducer = (state = initialState, action: AnyAction) => {\n switch (action.type) {\n case actions.FILTER_OVERLAY_VISIBLE:\n return Object.assign({}, state, {\n filterOverlayVisible: action.visible,\n });\n case actions.SEARCH_VISIBLE:\n return Object.assign({}, state, {\n searchVisible: action.visible,\n });\n\n // Filter actions affecting global redux\n case filterActions.SET_FILTER_RESULTS:\n return Object.assign({}, state, {\n filterOverlayVisible: false,\n });\n default:\n return state;\n }\n};\n","const menuActions = {\n FETCH_FAIL: '/pret-allergens/menu/FETCH_FAIL',\n FETCH_MENU: '/pret-allergens/menu/FETCH_MENU',\n fetchMenu: (params: object, supressRedirect?: boolean) => ({\n type: menuActions.FETCH_MENU,\n params,\n supressRedirect,\n }),\n FETCH_MENU_SUCCESS: '/pret-allergens/menu/FETCH_MENU_SUCCESS',\n fetchMenuSuccess: (menu, allergens, dietaryFilters, ingredients, menuIndex) => ({\n type: menuActions.FETCH_MENU_SUCCESS,\n menu,\n allergens,\n dietaryFilters,\n ingredients,\n menuIndex,\n }),\n};\n\nexport default menuActions;\n","import { AnyAction, Reducer } from 'redux';\n\n// Actions\nimport filterActions from '../filters/actions';\nimport actions from './actions';\n\nexport interface InterfaceDiet {\n name: string;\n safe_name: string;\n}\nexport interface InterfaceAllergen {\n name: string;\n safe_name: string;\n}\n// @TODO type unfiltered menu once json struct is confirmed\nexport interface MenuItem {\n external_id: number;\n name: string;\n image: string;\n dietary_icon: string;\n allergens_description: string;\n}\nexport interface Category {\n name: string;\n external_id: number;\n safe_name: string;\n}\nexport interface ReducerState {\n data: any[];\n allergens: InterfaceAllergen[];\n dietaryFilters: InterfaceDiet[];\n ingredients: string[];\n loading: boolean;\n menuIndex: object;\n}\nconst initialState: ReducerState = {\n data: [],\n allergens: [],\n dietaryFilters: [],\n ingredients: [],\n loading: false,\n menuIndex: {},\n};\n\nexport const menuReducer: Reducer = (state = initialState, action: AnyAction) => {\n switch (action.type) {\n case actions.FETCH_MENU:\n case filterActions.APPLY_FILTERS:\n return Object.assign({}, state, {\n loading: true,\n });\n case actions.FETCH_MENU_SUCCESS:\n return Object.assign({}, state, {\n data: action.menu,\n allergens: action.allergens,\n dietaryFilters: action.dietaryFilters,\n ingredients: action.ingredients,\n menuIndex: action.menuIndex,\n loading: false,\n });\n case actions.FETCH_FAIL:\n return Object.assign({}, state, {\n loading: false,\n });\n default:\n return state;\n }\n};\n","const searchActions = {\n SEARCH_MENU: '/pret-allergens/search/SEARCH_MENU',\n searchMenu: (args: object) => ({\n type: searchActions.SEARCH_MENU,\n args,\n }),\n\n SET_SEARCH_RESULTS: '/pret-allergens/search/SET_SEARCH_RESULTS',\n setSearchResults: (value, results) => ({\n type: searchActions.SET_SEARCH_RESULTS,\n value,\n results,\n }),\n};\n\nexport default searchActions;\n","import { AnyAction, Reducer } from 'redux';\n\n// Menu Actions\nimport menuActions from '../menu/actions';\n// Search Actions\nimport actions from './actions';\n\nexport interface ReducerState {\n loading: boolean;\n results: any[];\n value: string;\n}\n\nconst initialState: ReducerState = {\n // Client\n loading: false,\n value: '',\n\n // API\n results: [],\n};\n\nexport const searchReducer: Reducer = (state = initialState, action: AnyAction) => {\n switch (action.type) {\n case actions.SEARCH_MENU:\n return Object.assign({}, state, {\n loading: true,\n results: [], // TODO - Reset existing search results on new search. The UI isn't totally ideal here though...\n });\n case actions.SET_SEARCH_RESULTS:\n return Object.assign({}, state, {\n loading: false,\n value: action.value,\n results: action.results,\n });\n case menuActions.FETCH_FAIL:\n return Object.assign({}, state, {\n loading: false,\n });\n default:\n return state;\n }\n};\n","import { connectRouter, RouterState } from 'connected-react-router';\nimport { combineReducers } from 'redux';\n\n/*\n * Type Application state\n*/\nexport interface ApplicationState {\n filters: FiltersState;\n global: GlobalState;\n menu: MenuState;\n router: RouterState;\n search: SearchState;\n}\n\n/*\n * Import reducers and reducer types\n*/\nimport { filtersReducer, ReducerState as FiltersState } from './filters/reducer';\nimport { globalReducer, ReducerState as GlobalState } from './global/reducer';\nimport { menuReducer, ReducerState as MenuState} from './menu/reducer';\nimport { ReducerState as SearchState, searchReducer } from './search/reducer';\n\n// Combines all reducers to a single reducer function\nconst rootReducer = history => combineReducers({\n filters: filtersReducer,\n global: globalReducer,\n menu: menuReducer,\n router: connectRouter(history),\n search: searchReducer,\n});\n\nexport default rootReducer;\n","const ENV_CONFIG = {\n local: {\n REACT_APP_API_BASE_URL: 'dev.api.pret.fuzzhq.com',\n REACT_APP_API_KEY: 'BH81VT6S5UB8TP5DNPTD',\n REACT_APP_API_VERSION: 'v1',\n REACT_APP_API_SCHEME: 'https://',\n REACT_APP_FRONTEND_BASE_URL: 'localhost:3000',\n REACT_APP_FRONTEND_SCHEME: 'http://',\n },\n dev: {\n REACT_APP_API_BASE_URL: 'dev.api.pret.fuzzhq.com',\n REACT_APP_API_KEY: 'BH81VT6S5UB8TP5DNPTD',\n REACT_APP_API_VERSION: 'v1',\n REACT_APP_API_SCHEME: 'https://',\n REACT_APP_FRONTEND_BASE_URL: 'dev.app.pret.fuzzhq.com',\n REACT_APP_FRONTEND_SCHEME: 'http://',\n },\n staging: {\n REACT_APP_API_BASE_URL: 'staging.api.pret.fuzzhq.com',\n REACT_APP_API_KEY: 'JGMTm5Na5ql22NIyyxot',\n REACT_APP_API_VERSION: 'v1',\n REACT_APP_API_SCHEME: 'https://',\n REACT_APP_FRONTEND_BASE_URL: 'staging.app.pret.fuzzhq.com',\n REACT_APP_FRONTEND_SCHEME: 'http://',\n },\n production: {\n REACT_APP_API_BASE_URL: 'api.product.pret.co.uk',\n REACT_APP_API_KEY: 'Oq53ibYzoFq2pHffMyFV',\n REACT_APP_API_VERSION: 'v1',\n REACT_APP_API_SCHEME: 'https://',\n REACT_APP_FRONTEND_BASE_URL: 'app.pret.fuzzhq.com',\n REACT_APP_FRONTEND_SCHEME: 'http://',\n },\n};\n\nconst currentEnv = (process.env.REACT_APP_STATIC_ENV ? process.env.REACT_APP_STATIC_ENV : 'local');\n\nexport default ENV_CONFIG[currentEnv];\n","import ENV_CONFIG from '../constants/env';\n\nconst API = {\n routes: {\n menu: '/catalog/UK/',\n },\n};\n// @TODO update after api is versioned\nconst ENV = {\n // url: `${ENV_CONFIG.REACT_APP_API_BASE_URL}/${ENV_CONFIG.REACT_APP_API_VERSION}`,\n url: `${ENV_CONFIG.REACT_APP_API_BASE_URL}`,\n scheme: ENV_CONFIG.REACT_APP_API_SCHEME,\n key: ENV_CONFIG.REACT_APP_API_KEY,\n};\n\nexport default Object.assign({}, API, ENV);\n","// Generic Service\nimport axios from 'axios';\n\n// Requests a URL, returning a promise\nexport default function genericHttpService(options) {\n return axios(options)\n .catch(error => {\n if (error.response) {\n // The request was made and the server responded with a status code\n // that falls out of the range of 2xx\n console.log('error.response.data', error.response.data);\n console.log('error.response.status', error.response.status);\n console.log('error.response.headers', error.response.headers);\n\n } else if (error.request) {\n // The request was made but no response was received\n // `error.request` is an instance of XMLHttpRequest in the browser and an instance of\n // http.ClientRequest in node.js\n console.log('error.request', error.request);\n } else {\n // Something happened in setting up the request that triggered an Error\n console.log('Error in request settings', error.message);\n }\n console.log('error.config', error.config);\n throw error;\n });\n}\n\n/**\n * Basic URIEncode helper\n *\n * @return {string}\n */\nexport const URIEncode = (params = {}) => (\n Object.keys(params)\n .filter(k => params[k] !== undefined && params[k] !== null && params[k].length)\n .map(k => {\n const result = Array.isArray(params[k]) ? params[k].join('|') : params[k];\n return `${encodeURIComponent(k)}=${encodeURIComponent(result)}`;\n })\n .join('&')\n);\n","// Config\nimport API from '../constants/api';\n\n// Generic Service\nimport httpService, { URIEncode } from './generic.service';\n\n/**\n * Filter products\n *\n */\nexport const filterProducts = (args: any) => {\n console.log('args in filterProducts service', args);\n const type = localStorage.getItem('kiosk') ? 'kiosk' : 'web';\n const query = URIEncode(args);\n return httpService({\n method: 'GET',\n url: `${API.scheme}${API.url}${API.routes.menu}?${query}`,\n headers: {\n 'KEY': `${API.key}`,\n 'X-Type': `${type}`,\n },\n });\n};\n","export const pathParams = {\n occasionId: 'occasionId',\n categoryId: 'categoryId',\n productId: 'productId',\n searchTerm: 'searchTerm',\n};\n\nexport const routes = {\n splash: {\n base: '/app',\n },\n menu: {\n base: '/',\n occasion: {\n base: `/o/:${pathParams.occasionId}`,\n category: `/o/:${pathParams.occasionId}/c/:${pathParams.categoryId}`,\n },\n },\n product: {\n base: `/p/:${pathParams.productId}`,\n verbose: `/o/:${pathParams.occasionId}/c/:${pathParams.categoryId}/p/:${pathParams.productId}`,\n },\n search: {\n base: `/search/:${pathParams.searchTerm}`,\n },\n};\n","import _ from 'lodash';\n\n// Routes\nimport { pathParams, routes } from '../constants/routes';\n\nexport const determineFirstCategoryId = (occasionName, menu) => {\n if (menu && menu.length > 0) {\n const occasion = menu.filter(item => item.safe_name === occasionName);\n if (occasion.length > 0) {\n const foundOccasion = occasion[0];\n const categories = _.get(foundOccasion, 'categories');\n const firstCategoryId = _.get(categories[0], 'external_id');\n return firstCategoryId;\n }\n }\n};\n\nexport const determineShowIcon = (prod: any) => {\n if (prod.is_vegan) {\n return 'vegan';\n } else if (prod.is_vegetarian) {\n return 'vegetarian';\n } else {\n return '';\n }\n};\n\nexport const interpolateMOCPath = (occasionId: string, categoryId: string) => {\n if (!occasionId || !categoryId) {\n return '';\n }\n\n return routes.menu.occasion.category.replace(`:${pathParams.occasionId}`, occasionId).replace(`:${pathParams.categoryId}`, categoryId);\n};\n\nexport const interpolateProductPath = (occasionId: string, categoryId: string, productId: string) => {\n if (!occasionId || !categoryId || !productId) {\n return '';\n }\n\n return routes.product.verbose.replace(`:${pathParams.occasionId}`, occasionId).replace(`:${pathParams.categoryId}`, categoryId).replace(`:${pathParams.productId}`, productId);\n};\n\nexport const deriveDefaultMenuRoute = (menu: any) => {\n if (!menu) {\n return routes.menu.base;\n }\n\n const occasionId = _.get(menu, '[0].safe_name');\n const categoryId = _.get(menu, '[0].categories[0].external_id');\n\n return interpolateMOCPath(occasionId, categoryId);\n};\n\nexport const filterMenuByProductId = (menu, occasionName, categoryId, productId) => {\n let product = null;\n product = _\n .chain(menu)\n .filter(m => m.safe_name === occasionName)\n .first()\n .get('categories')\n .filter(c => c.external_id === categoryId)\n .first()\n .get('products')\n .filter(p => p.external_id === productId)\n .first()\n .value();\n return product;\n};\n\n// Returns an index of menu products where keys are product external ids\nexport const menuIndexByProductId = menu => {\n const productsArr: any[] = [];\n _.map(menu, m => {\n const categories = m.categories;\n const products = _.map(categories, c => c.products);\n productsArr.push(products);\n });\n const flattenedProducts = _.flattenDeep(productsArr);\n const transformed = _.reduce(flattenedProducts, (obj, p) => {\n obj[p.external_id] = p;\n return obj;\n },\n {});\n return transformed;\n};\n","import { push } from 'connected-react-router';\nimport { AnyAction } from 'redux';\nimport { call, put, select, takeLatest } from 'redux-saga/effects';\n\n// Services\nimport { filterProducts } from '../../services/search.service';\n// Utils\nimport { deriveDefaultMenuRoute, menuIndexByProductId } from '../../utils/menu';\n// Menu Actions\nimport menuActions from '../menu/actions';\nimport searchActions from '../search/actions';\nimport actions from './actions';\n\nexport function* filterMenuSaga(action: AnyAction) {\n try {\n\n // If filtering from a search results page, also run a keywords search\n if (action.redoSearch) {\n const searchValue = yield select(state => state.search.value);\n\n yield put(searchActions.searchMenu(Object.assign({}, action.values, {\n keywords: [searchValue],\n })));\n }\n\n // Run the menu filter as well\n const response = yield call(filterProducts, action.values);\n\n // Set applied filters\n yield put(actions.setFilterResults(action.values));\n\n // Set the menu response\n const menu = response.data.menu;\n const allergens = response.data.allergens;\n const dietaryFilters = response.data.dietary_filters;\n const ingredients = response.data.ingredients;\n const menuIndex = yield call(menuIndexByProductId, menu);\n yield put(menuActions.fetchMenuSuccess(menu, allergens, dietaryFilters, ingredients, menuIndex));\n\n //\n if (action.pushToMenu) {\n yield put(push(deriveDefaultMenuRoute(menu)));\n }\n } catch (error) {\n // Error Notification\n console.log('error in filterMenu saga', error);\n }\n}\n\nexport default function* rootSaga() {\n yield takeLatest(actions.APPLY_FILTERS, filterMenuSaga);\n}\n","// Config\nimport API from '../constants/api';\n// Generic Service\nimport httpService from './generic.service';\n\n/**\n * Fetch products\n */\nexport const fetchProducts = () => {\n const type = localStorage.getItem('kiosk') ? 'kiosk' : 'web';\n return httpService({\n method: 'GET',\n url: `${API.scheme}${API.url}${API.routes.menu}`,\n headers: {\n 'KEY': `${API.key}`,\n 'X-Type': `${type}`,\n },\n });\n};\n","import { push } from 'connected-react-router';\nimport { AnyAction } from 'redux';\nimport { call, put, takeLatest } from 'redux-saga/effects';\n\n// Routes\nimport { pathParams } from '../../constants/routes';\n// Services\nimport { fetchProducts } from '../../services/products.service';\n// Utils\nimport {\n determineFirstCategoryId, interpolateMOCPath, menuIndexByProductId,\n} from '../../utils/menu';\n// Actions\nimport actions from './actions';\n\n// TODO - type these params!\nexport function* fetchMenu({ params, supressRedirect }: AnyAction) {\n try {\n const response = yield call(fetchProducts);\n const menu = response.data.menu;\n const allergens = response.data.allergens;\n const dietaryFilters = response.data.dietary_filters;\n const ingredients = response.data.ingredients;\n const menuIndex = yield call(menuIndexByProductId, menu);\n let firstOccasionName = params[pathParams.occasionId];\n let firstCategoryId = params[pathParams.categoryId];\n\n // If we're loading the menu from a non-menu page\n if (!firstOccasionName || !firstCategoryId) {\n firstOccasionName = menu.map((item: any) => item.safe_name)[0];\n firstCategoryId = determineFirstCategoryId(firstOccasionName, menu);\n\n // Redirect to default menu view unless the menu is simply loading in the background\n if (!supressRedirect) {\n yield put(push(interpolateMOCPath(firstOccasionName, firstCategoryId)));\n }\n }\n\n yield put(actions.fetchMenuSuccess(menu, allergens, dietaryFilters, ingredients, menuIndex));\n } catch (error) {\n // Error Notification\n yield put({ type: actions.FETCH_FAIL });\n console.log('error in fetchMenu saga', error);\n }\n}\n\nexport default function* rootSaga() {\n yield takeLatest(actions.FETCH_MENU, fetchMenu);\n}\n","import get from 'lodash/get';\nimport { AnyAction } from 'redux';\nimport {\n call,\n put,\n takeLatest,\n} from 'redux-saga/effects';\n\n// Actions\nimport actions from './actions';\n\n// Services\nimport { filterProducts } from '../../services/search.service';\n\nexport function* searchMenuSaga(action: AnyAction) {\n try {\n const flattenedArgs = Object.assign({}, action.args, {\n flat: ['true'],\n });\n\n const response = yield call(filterProducts, flattenedArgs);\n\n // Extract search keyword from args\n const searchTerm = get(action.args, 'keywords[0]', '');\n\n // Set search results\n yield put(actions.setSearchResults(searchTerm, response.data.products));\n } catch (error) {\n // Error Notification\n console.log('error in searchMenu saga', error);\n }\n}\n\nexport default function* rootSaga() {\n yield takeLatest(actions.SEARCH_MENU, searchMenuSaga);\n}\n","import { all } from 'redux-saga/effects';\nimport filtersSagas from './filters/saga';\nimport menuSagas from './menu/saga';\nimport searchSagas from './search/saga';\n\nexport default function* rootSaga(getState: any) {\n yield all([\n filtersSagas(),\n menuSagas(),\n searchSagas(),\n ]);\n}\n","import { routerMiddleware } from 'connected-react-router';\nimport { createBrowserHistory } from 'history';\nimport { applyMiddleware, compose, createStore } from 'redux';\nimport createSagaMiddleware from 'redux-saga';\n\nimport rootReducer from './reducers';\nimport rootSaga from './sagas';\n\nexport const history = createBrowserHistory();\n\nconst sagaMiddleware = createSagaMiddleware();\n\ndeclare global {\n interface Window { __REDUX_DEVTOOLS_EXTENSION_COMPOSE__: any; }\n}\n\n// Returns the store instance\nconst configureStore = () => {\n const middlewares = [\n sagaMiddleware,\n routerMiddleware(history),\n ];\n\n const enhancers = [\n applyMiddleware(...middlewares),\n ];\n\n /* eslint-disable no-underscore-dangle */\n const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;\n /* eslint-enable */\n\n const store = createStore(\n rootReducer(history),\n composeEnhancers(...enhancers),\n );\n\n return {\n ...store,\n runSaga: sagaMiddleware.run(rootSaga, []),\n };\n};\n\nexport default configureStore;\n","import React from 'react';\nimport { RouteComponentProps } from 'react-router';\nimport { withRouter } from 'react-router-dom';\n\ndeclare global {\n interface Window {\n gtag: any;\n Cypress: any;\n store: any;\n }\n}\n\nclass GoogleAnalytics extends React.Component<{ location: any } & RouteComponentProps> {\n componentWillUpdate({ location, history }) {\n const gtag = window.gtag;\n\n if (location.pathname === this.props.location.pathname) {\n return;\n }\n\n if (history.action === 'PUSH' && typeof(gtag) === 'function') {\n window.gtag('event', 'page_view', {\n page_path: location.pathname + location.search,\n });\n }\n }\n\n render() {\n return null;\n }\n}\n\nexport default withRouter(GoogleAnalytics);\n","/*\n * Colors\n */\nconst WHITE = '#ffffff';\nconst BLACK = '#000000';\nconst BACKGROUNDGRAY = 'rgba(255, 255, 255, 0.4)';\nconst GRAY = '#404040';\nconst LIGHT_GRAY = 'rgba(151, 151, 151, 0.19)';\nconst LIGHTER_GRAY = '#f7f7f7';\nconst DARK_NAVY = '#303e47';\nconst LIGHT_NAVY = '#f4f5f6';\nconst GREEN = '#42f47a';\nconst ERROR_RED = '#ff2d44';\nconst RED = '#9f1b32';\nconst DARKER_RED = '#94192f';\n\n/*\n * Fonts\n */\nconst PRIMARY_FONT_FAMILY = '\"linotype-sabon\", \"Times\", \"serif\"';\nconst PRIMARY_LIGHT = '\"Avenir\"';\nconst PRIMARY_REGULAR = '\"Avenir\"';\nconst PRIMARY_MEDIUM = '\"AvenirNext-DemiBold\"';\nconst PRIMARY_BOLD = '\"AvenirNext-DemiBold\"';\nconst PRIMARY_TEXT_SIZE = 16;\n\nconst SECONDARY_FONT_FAMILY = '\"Interstate\"';\n\nexport const COLORS = {\n PRIMARY: RED,\n SECONDARY: GRAY,\n BLACK,\n DARK_NAVY,\n DARKER_RED,\n RED,\n ERROR_RED,\n GRAY,\n BACKGROUNDGRAY,\n GREEN,\n LIGHT_GRAY,\n LIGHTER_GRAY,\n LIGHT_NAVY,\n WHITE,\n\n BODY: WHITE,\n NAV: WHITE,\n CONTENT: LIGHT_GRAY,\n PRIMARY_TEXT_COLOR: GRAY,\n PRIMARY_ACTIVE_COLOR: RED,\n\n PRIMARY_CTA_BACKGROUND_COLOR: RED,\n PRIMARY_CTA_BORDER_COLOR: RED,\n PRIMARY_CTA_TEXT_COLOR: WHITE,\n};\n\nexport const LAYOUT = {\n MAXWIDTH: 1284,\n GUTTER: 34,\n MOBILE_GUTTER: 12,\n H_SPACING: 50,\n\n HEADER: {\n M_HEIGHT: 63,\n T_HEIGHT: 73,\n D_HEIGHT: 97,\n },\n NAV: {\n M_HEIGHT: 63,\n T_HEIGHT: 63,\n D_HEIGHT: 66,\n },\n SUBNAV: {\n M_HEIGHT: 57,\n T_HEIGHT: 60,\n D_HEIGHT: 64,\n },\n};\n\nexport const FONTS = {\n PRIMARY_FONT_FAMILY,\n PRIMARY_TEXT_SIZE,\n\n PRIMARY: PRIMARY_FONT_FAMILY,\n PRIMARY_LIGHT,\n PRIMARY_REGULAR,\n PRIMARY_MEDIUM,\n PRIMARY_BOLD,\n\n SECONDARY: SECONDARY_FONT_FAMILY,\n};\n\nexport const ORDER = {\n MODAL: 8,\n LOADING: 7,\n SKIP_TO_CONTENT: 6,\n NAV: 5,\n};\n","import { css } from \"styled-components\";\n\nexport const BreakpointWidth = {\n desktop: 800,\n desktopLarge: 1024,\n desktopXLarge: 1440,\n desktopXXLarge: 1920,\n smallScreen: 380,\n tablet: 580,\n tabletLarge: 640,\n tabletXLarge: 768,\n};\n\n/**\n * Open Issue https://github.com/Microsoft/TypeScript/issues/28010\n * Typescript spread args throws wrong argument count error with dynamic argument count so this file is in js not ts\n */\nexport const media = Object.keys(BreakpointWidth).reduce(\n (mediaQueries, label) => (\n {\n ...mediaQueries,\n [label]: (...args) => css`\n @media (min-width: ${BreakpointWidth[label]}px) {\n ${css.call(this, ...args)}\n }\n `,\n }\n ),\n {},\n);\n\n/*\n Is Mobile?\n*/\nexport const isMobile = (breakpoint = \"tabletXLarge\") => {\n return window.innerWidth < BreakpointWidth[breakpoint];\n};\n","import { createGlobalStyle } from 'styled-components';\n\n// Globals\nimport { COLORS, FONTS, LAYOUT } from './';\nimport { media } from './breakpoints';\n\nexport const GlobalStyles = createGlobalStyle`\n * {\n box-sizing:border-box;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n -webkit-tap-highlight-color: rgba(255, 255, 255, 0);\n }\n\n /*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */\n\n /* Document\n ========================================================================== */\n\n /**\n * 1. Correct the line height in all browsers.\n * 2. Prevent adjustments of font size after orientation changes in iOS.\n */\n\n html {\n line-height: 1.15; /* 1 */\n -ms-touch-action: manipulation;\n touch-action: manipulation;\n -webkit-text-size-adjust: 100%; /* 2 */\n }\n\n /* Sections\n ========================================================================== */\n\n /**\n * Remove the margin in all browsers.\n */\n\n\n body {\n color: ${COLORS.GRAY};\n background: ${COLORS.WHITE};\n font-family: ${FONTS.SECONDARY};\n margin: ${LAYOUT.HEADER.M_HEIGHT}px 0 0 0;\n\n ${media.tabletXLarge`\n margin-top: ${LAYOUT.HEADER.T_HEIGHT}px;\n `}\n\n ${media.desktopLarge`\n margin-top: ${LAYOUT.HEADER.D_HEIGHT}px;\n `}\n }\n\n /**\n * Render the main element consistently in IE.\n */\n\n main {\n display: block;\n }\n\n /**\n * Correct the font size and margin on h1 elements within section and\n * article contexts in Chrome, Firefox, and Safari.\n */\n\n h1, h2, h3, h4, h5, h6, p {\n margin: 0;\n }\n\n ${(props: { disableFocus: boolean }) => props.disableFocus ? `\n a, button, input {\n outline: none;\n }\n ` : ''}\n\n /* Grouping content\n ===============================a=========================================== */\n\n /**\n * 1. Add the correct box sizing in Firefox.\n * 2. Show the overflow in Edge and IE.\n */\n\n hr {\n box-sizing: content-box; /* 1 */\n height: 0; /* 1 */\n overflow: visible; /* 2 */\n }\n\n /**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd em font sizing in all browsers.\n */\n\n pre {\n font-family: monospace, monospace; /* 1 */\n font-size: 1em; /* 2 */\n }\n\n /* Text-level semantics\n ========================================================================== */\n\n /**\n * Remove the gray background on active links in IE 10.\n */\n\n a {\n background-color: transparent;\n text-decoration: none;\n }\n\n /**\n * 1. Remove the bottom border in Chrome 57-\n * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n */\n\n abbr[title] {\n border-bottom: none; /* 1 */\n text-decoration: underline; /* 2 */\n text-decoration: underline dotted; /* 2 */\n }\n\n /**\n * Add the correct font weight in Chrome, Edge, and Safari.\n */\n\n b,\n strong {\n font-weight: bolder;\n }\n\n /**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd em font sizing in all browsers.\n */\n\n code,\n kbd,\n samp {\n font-family: monospace, monospace; /* 1 */\n font-size: 1em; /* 2 */\n }\n\n /**\n * Add the correct font size in all browsers.\n */\n\n small {\n font-size: 80%;\n }\n\n /**\n * Prevent sub and sup elements from affecting the line height in\n * all browsers.\n */\n\n sub,\n sup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n }\n\n sub {\n bottom: -0.25em;\n }\n\n sup {\n top: -0.5em;\n }\n\n /* Embedded content\n ========================================================================== */\n\n /**\n * Remove the border on images inside links in IE 10.\n */\n\n img {\n border-style: none;\n }\n\n /* Forms\n ========================================================================== */\n\n /**\n * 1. Change the font styles in all browsers.\n * 2. Remove the margin in Firefox and Safari.\n */\n\n button,\n input,\n optgroup,\n select,\n textarea {\n font-family: inherit; /* 1 */\n font-size: 100%; /* 1 */\n line-height: 1.15; /* 1 */\n margin: 0; /* 2 */\n }\n\n /**\n * Show the overflow in IE.\n * 1. Show the overflow in Edge.\n */\n\n button,\n input { /* 1 */\n overflow: visible;\n }\n\n /**\n * Remove the inheritance of text transform in Edge, Firefox, and IE.\n * 1. Remove the inheritance of text transform in Firefox.\n */\n\n button,\n select { /* 1 */\n text-transform: none;\n }\n\n /**\n * Correct the inability to style clickable types in iOS and Safari.\n */\n\n button,\n [type=\"button\"],\n [type=\"reset\"],\n [type=\"submit\"] {\n -webkit-appearance: button;\n }\n\n /**\n * Remove the inner border and padding in Firefox.\n */\n\n button::-moz-focus-inner,\n [type=\"button\"]::-moz-focus-inner,\n [type=\"reset\"]::-moz-focus-inner,\n [type=\"submit\"]::-moz-focus-inner {\n border-style: none;\n padding: 0;\n }\n\n /**\n * Restore the focus styles unset by the previous rule.\n */\n\n button:-moz-focusring,\n [type=\"button\"]:-moz-focusring,\n [type=\"reset\"]:-moz-focusring,\n [type=\"submit\"]:-moz-focusring {\n outline: 1px dotted ButtonText;\n }\n\n /**\n * Correct the padding in Firefox.\n */\n\n fieldset {\n padding: 0.35em 0.75em 0.625em;\n }\n\n /**\n * 1. Correct the text wrapping in Edge and IE.\n * 2. Correct the color inheritance from fieldset elements in IE.\n * 3. Remove the padding so developers are not caught out when they zero out\n * fieldset elements in all browsers.\n */\n\n legend {\n box-sizing: border-box; /* 1 */\n color: inherit; /* 2 */\n display: table; /* 1 */\n max-width: 100%; /* 1 */\n padding: 0; /* 3 */\n white-space: normal; /* 1 */\n }\n\n /**\n * Add the correct vertical alignment in Chrome, Firefox, and Opera.\n */\n\n progress {\n vertical-align: baseline;\n }\n\n /**\n * Remove the default vertical scrollbar in IE 10+.\n */\n\n textarea {\n overflow: auto;\n }\n\n /**\n * 1. Add the correct box sizing in IE 10.\n * 2. Remove the padding in IE 10.\n */\n\n [type=\"checkbox\"],\n [type=\"radio\"] {\n box-sizing: border-box; /* 1 */\n padding: 0; /* 2 */\n }\n\n /**\n * Correct the cursor style of increment and decrement buttons in Chrome.\n */\n\n [type=\"number\"]::-webkit-inner-spin-button,\n [type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n }\n\n /**\n * 1. Correct the odd appearance in Chrome and Safari.\n * 2. Correct the outline style in Safari.\n */\n\n [type=\"search\"] {\n -webkit-appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n }\n\n /**\n * Remove the inner padding in Chrome and Safari on macOS.\n */\n\n [type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n }\n\n /**\n * 1. Correct the inability to style clickable types in iOS and Safari.\n * 2. Change font properties to inherit in Safari.\n */\n\n ::-webkit-file-upload-button {\n -webkit-appearance: button; /* 1 */\n font: inherit; /* 2 */\n }\n\n /* Interactive\n ========================================================================== */\n\n /*\n * Add the correct display in Edge, IE 10+, and Firefox.\n */\n\n details {\n display: block;\n }\n\n /*\n * Add the correct display in all browsers.\n */\n\n summary {\n display: list-item;\n }\n\n /* Misc\n ========================================================================== */\n\n /**\n * Add the correct display in IE 10+.\n */\n\n template {\n display: none;\n }\n\n /**\n * Add the correct display in IE 10.\n */\n\n [hidden] {\n display: none;\n }\n`;\n","import React from 'react';\n\n// Global Styles\nimport { GlobalStyles } from '../../styles/global';\n\ntype State = {\n disableFocus: boolean;\n};\n\nexport default class Globals extends React.Component<{}, State> {\n state = {\n disableFocus: false,\n };\n\n componentDidMount() {\n document.addEventListener('mousedown', this.mouseDown);\n document.addEventListener('keydown', this.keyDown);\n }\n\n componentWillUnmount() {\n document.removeEventListener('mousedown', this.mouseDown);\n document.removeEventListener('keydown', this.keyDown);\n }\n\n mouseDown = () => {\n this.setState({\n disableFocus: true,\n });\n }\n\n keyDown = () => {\n this.setState({\n disableFocus: false,\n });\n }\n\n render() {\n return ;\n }\n}\n","import styled from 'styled-components';\n\n// Constants\nimport { COLORS, FONTS, LAYOUT, ORDER } from '../../../styles';\n\nexport const StyledGenericModal = styled.div`\n background: ${COLORS.BACKGROUNDGRAY};\n left: 0;\n height: 100vh;\n position: fixed;\n top: 0;\n width: 100%;\n z-index: ${ORDER.MODAL};\n`;\n\nexport const StyledGenericModalContent = styled.div`\n background: ${COLORS.RED};\n max-width: 550px;\n position: relative;\n top: 25%;\n margin: 0 auto 0 auto;\n\n .message {\n padding: ${LAYOUT.GUTTER * 2}px ${LAYOUT.GUTTER}px ${LAYOUT.GUTTER}px;\n color: ${COLORS.WHITE};\n font-family: ${FONTS.PRIMARY};\n font-size: 22px;\n text-align: center;\n\n h2, h3, p {\n margin-top: 0;\n\n span {\n font-weight: normal;\n -webkit-text-stroke: 0.65px;\n }\n }\n }\n`;\n\nexport const StyledGenericModalFooterForm = styled.form`\n bottom: 0px;\n padding: 0 ${LAYOUT.GUTTER * 3}px ${LAYOUT.GUTTER * 2}px;\n width: 100%;\n\n a {\n cursor: pointer;\n }\n\n display: flex;\n\n p {\n font-family: ${FONTS.PRIMARY};\n font-size: 16px;\n margin: 0 0 10px;\n }\n`;\n\nexport const StyledPrimaryButton = styled.button`\n background: ${COLORS.WHITE};\n border: none;\n border-radius: 2px;\n color: ${COLORS.RED};\n cursor: pointer;\n font-size: 16px;\n font-weight: bold;\n margin-right: 20px;\n padding: 12px;\n width: 100%;\n`;\n\nexport const StyledSecondaryButton = styled.button`\n background: transparent;\n border: 1px solid white;\n color: ${COLORS.WHITE};\n cursor: pointer;\n font-size: 16px;\n font-weight: bold;\n margin-left: 20px;\n padding: 12px;\n width: 100%;\n`;\n","import FocusTrap from 'focus-trap-react';\nimport React from 'react';\n\n// Styles\nimport {\n StyledGenericModal,\n StyledGenericModalContent,\n StyledGenericModalFooterForm,\n StyledPrimaryButton,\n StyledSecondaryButton,\n} from './styles';\n\ninterface Props {\n modalOpen: boolean;\n toggleModal: () => void;\n cancelAction: () => void;\n confirmMessage?: string;\n cancelMessage?: string;\n}\n\nclass GenericModal extends React.Component {\n\n render() {\n const { cancelMessage, confirmMessage, modalOpen, toggleModal } = this.props;\n\n if (!modalOpen) {\n return ;\n }\n\n return (\n \n \n \n
\n {this.props.children}\n
\n \n {\n e.preventDefault();\n toggleModal();\n }}\n data-cy=\"confirm\"\n >\n {confirmMessage ? confirmMessage : 'Confirm'}\n \n this.props.cancelAction()} data-cy=\"cancel\">\n {cancelMessage ? cancelMessage : 'Cancel'}\n \n \n
\n
\n
\n );\n }\n}\n\nexport default GenericModal;\n","import { throttle } from 'frame-throttle';\nimport * as React from 'react';\n// NOTE: location prop needed\nimport { withRouter } from 'react-router';\n\n// Components\nimport GenericModal from '../../components/uielements/genericModal';\n// Routes\nimport { routes } from '../../constants/routes';\n\ntype StoreProps = {\n location: any;\n};\n\nclass InactivityHandler extends React.Component {\n warningInterval: number = 60 * 1000;\n redirectInterval: number = 75 * 1000;\n\n warningHandle: any = null;\n redirectHandle: any = null;\n\n state = {\n warnTimerElapsed: false,\n openModal: false,\n firstLoad: true,\n };\n\n events = [\n 'load',\n 'mousemove',\n 'mousedown',\n 'click',\n 'scroll',\n 'keydown',\n 'keypress',\n 'touchmove',\n 'touchstart',\n 'touchend',\n ];\n\n restartTimers = throttle(() => {\n console.log('reseting timer...');\n this.removeAllTimers();\n this.startTimers();\n });\n\n hideModal = () => {\n this.setState({\n openModal: false,\n });\n this.removeAllTimers();\n this.startTimers();\n }\n\n componentDidUpdate() {\n if (localStorage.getItem('kiosk') && this.state.firstLoad && this.props.location.pathname !== routes.splash.base) {\n this.activate();\n this.setState({\n firstLoad: false,\n });\n }\n }\n\n activate = () => {\n this.events.forEach(\n eventType => window.addEventListener(eventType, this.restartTimers));\n }\n\n // @TODO\n deactivate = () => {\n this.events.forEach(\n eventType => window.removeEventListener(eventType, this.restartTimers));\n }\n\n removeAllTimers = () => {\n if (this.warningHandle) {\n clearTimeout(this.warningHandle);\n }\n\n if (this.redirectHandle) {\n clearTimeout(this.redirectHandle);\n }\n }\n\n startTimers = () => {\n this.warningHandle = setTimeout(this.openModal, this.warningInterval);\n this.redirectHandle = setTimeout(this.redirect, this.redirectInterval);\n }\n\n openModal = () => {\n this.setState({\n openModal: true,\n });\n }\n\n redirect = () => {\n window.location.href = routes.splash.base;\n }\n\n render() {\n return (\n <>\n \n

\n Do you need more time?\n

\n \n \n );\n }\n}\n\nexport default withRouter((InactivityHandler) as any);\n","export const gaCategories = {\n appliedFilters: 'Applied Filters',\n filterOverlay: 'Filter Overlay',\n search: 'Search',\n};\n\nexport const gaActions = {\n closeFilterOverlay: 'Close Filter Overlay',\n openFilterOverlay: 'Open Filter Overlay',\n closeSearch: 'Close Search',\n openSearch: 'Open Search',\n performSearch: 'Perform Search',\n applyFilters: 'Apply Filters',\n removeFilter: 'Remove Filter',\n addAllergen: 'Add Allergen',\n removeAllergen: 'Remove Allergen',\n updateIngredients: 'Update Ingredients',\n addDiet: 'Add Diet',\n removeDiet: 'Remove Diet',\n};\n\n/*\n Fire a GA event\n\n @param {String} category\n @param {String} action\n @param {Object} params\n label\n value\n nonInteraction\n transport\n*/\nexport const fireGaEvent = (category, action, params: { label?: string, value?: string } = {}) => {\n // Fire GTM if enabled\n // window.dataLayer = window.dataLayer || [];\n // window.dataLayer.push({ event: action });\n\n // Conditionally fire GA\n if (typeof window.gtag !== 'function') {\n return;\n }\n\n const mergedParams = {\n event_category: category,\n event_label: params.label,\n event_value: params.value,\n };\n\n window.gtag('event', action, mergedParams);\n};\n","import { Link } from 'react-router-dom';\nimport styled, { css } from 'styled-components';\n\n// Globals\nimport { COLORS, LAYOUT } from '../styles';\nimport { media } from '../styles/breakpoints';\n\nexport const NavButton = styled(Link)`\n span {\n border-bottom: 1px solid transparent;\n }\n\n ${(props: {active?: boolean }) => props.active && `\n span {\n color: ${COLORS.RED};\n border-bottom: 1px solid ${COLORS.RED};\n }\n `}\n\n &:hover {\n color: ${COLORS.RED};\n }\n`;\n\n/*\n * Accounts for max-width and gutters across all breakpoints\n */\nexport const ContainerBlock = styled.div`\n margin: 0 auto;\n max-width: ${LAYOUT.MAXWIDTH}px;\n padding-left: ${LAYOUT.MOBILE_GUTTER}px;\n padding-right: ${LAYOUT.MOBILE_GUTTER}px;\n width: 100%;\n\n ${media.tabletXLarge`\n padding-left: ${LAYOUT.GUTTER}px;\n padding-right: ${LAYOUT.GUTTER}px;\n `}\n`;\n\nexport const VisuallyHiddenButton = styled.button`\n position: absolute;\n left: -10000px;\n top: auto;\n width: 1px;\n height: 1px;\n overflow: hidden;\n`;\n\nexport const deriveMediaQueriesFromHeaderHeight = (property: string) => css`\n ${property.replace('$s1$', LAYOUT.HEADER.M_HEIGHT.toString())}\n\n ${media.tabletXLarge`\n ${property.replace('$s1$', LAYOUT.HEADER.T_HEIGHT.toString())}\n `}\n\n ${media.desktopLarge`\n ${property.replace('$s1$', LAYOUT.HEADER.D_HEIGHT.toString())}\n `}\n`;\n\nexport const StyledNoResults = styled(ContainerBlock)`\n padding-top: 10%;\n text-align: center;\n min-height: calc(100vh - ${LAYOUT.HEADER.M_HEIGHT}px);\n\n h3, p {\n display: block;\n margin: 0;\n }\n\n h3 {\n font-size: 22px;\n font-weight: normal;\n margin-bottom: 20px;\n -webkit-text-stroke: 0.65px;\n }\n\n p {\n font-size: 16px;\n }\n ${media.tabletXLarge`\n min-height: calc(100vh - ${LAYOUT.HEADER.T_HEIGHT}px);\n `}\n\n ${media.desktopLarge`\n min-height: calc(100vh - ${LAYOUT.HEADER.D_HEIGHT}px);\n `}\n`;\n","import { darken, lighten } from 'polished';\nimport styled from 'styled-components';\n\n// Styles\nimport { COLORS } from '../../styles';\n\nexport const StyledTag = styled.button`\n border: 1px solid ${COLORS.RED};\n border-radius: 4px;\n background: ${(props: { isSelected?: boolean }) => props.isSelected ? COLORS.RED : COLORS.WHITE};\n color: ${(props: { isSelected?: boolean }) => props.isSelected ? COLORS.WHITE : COLORS.RED};\n cursor: pointer;\n font-size: 16px;\n min-height: 48px;\n padding: 5px;\n -webkit-text-stroke: 0.65px;\n\n &:hover {\n background: ${(props: { isSelected?: boolean }) => props.isSelected ? `${darken(0.025, COLORS.RED)}` : COLORS.WHITE};\n color: ${(props: { isSelected?: boolean }) => props.isSelected ? COLORS.WHITE : `${lighten(0.075, COLORS.RED)}`};\n border: ${(props: { isSelected?: boolean }) => props.isSelected ? `1px solid ${COLORS.RED}` : `1px solid ${lighten(0.075, COLORS.RED)}`};\n }\n`;\n","import React from 'react';\n\n// Styles\nimport { StyledTag } from './styles';\n\ninterface TagProps {\n className?: string;\n isSelected: boolean;\n onClick: () => void;\n children: any;\n testId?: string;\n}\n\nconst Tag = ({ children, className, isSelected, onClick, testId }: TagProps) => {\n return (\n \n {children}\n \n );\n};\n\nexport default Tag;\n","import { lighten } from 'polished';\nimport styled from 'styled-components';\n\n// Styles\nimport { COLORS, FONTS, LAYOUT } from '../../styles';\n// Breakpoints\nimport { media } from '../../styles/breakpoints';\nimport { ContainerBlock, deriveMediaQueriesFromHeaderHeight } from '../../styles/mixins';\n// Component\nimport Tag from '../Tag';\n\nexport const StyledApplyButton = styled.button`\n background: ${COLORS.RED};\n border: none;\n border-radius: 4px;\n color: ${COLORS.WHITE};\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 16px;\n padding: 14px 5px;\n width: 100%;\n -webkit-text-stroke: 0.65px;\n #label {\n padding: 3px 0;\n }\n img {\n padding-right: 5px;\n }\n`;\n\nexport const StyledClearFiltersButton = styled.button`\n background: ${COLORS.WHITE};\n border: none;\n color: ${COLORS.RED};\n cursor: pointer;\n font-weight: bold;\n padding: 30px 5px;\n width: 100%;\n &:hover {\n color: ${lighten(0.075, COLORS.RED)};\n text-decoration: underline;\n }\n`;\n\nexport const StyledButtonsContainer = styled.div`\n margin-top: auto;\n button {\n min-height: ${(props: { kiosk: string | null }) => props.kiosk ? '80px' : '38px'};\n }\n`;\n\nexport const StyledOverlay = styled.div`\n background: ${COLORS.WHITE};\n height: 100%;\n left: 0;\n overflow: scroll;\n -webkit-overflow-scrolling: touch;\n position: fixed;\n top: 0;\n width: 100%;\n z-index: 2;\n`;\n\nexport const StyledOverlayContent = styled(ContainerBlock)`\n padding-bottom: 20px;\n padding-top: 20px;\n position: relative;\n\n ${media.tabletXLarge`\n padding-top: 0px;\n height: calc(100% - ${LAYOUT.HEADER.T_HEIGHT}px);\n form {\n display: flex;\n flex-direction: column;\n min-height: 100%;\n }\n `}\n\n ${media.desktopLarge`\n height: calc(100% - ${LAYOUT.HEADER.D_HEIGHT}px);\n `}\n\n h1, h2 {\n font-family: ${FONTS.PRIMARY_FONT_FAMILY};\n font-weight: bold;\n }\n\n h1 {\n font-size: 24px;\n margin: 0 0 20px;\n\n ${media.tabletXLarge`\n font-size: 36px;\n `}\n\n ${media.desktopLarge`\n font-size: 42px;\n margin-bottom: 40px;\n `}\n }\n\n h2 {\n font-size: 18px;\n\n ${media.tabletXLarge`\n font-size: 20px;\n `}\n\n ${media.desktopLarge`\n font-size: 24px;\n `}\n }\n\n h3 {\n font-size: 14px;\n font-weight: normal;\n margin-top: 10px;\n -webkit-text-stroke: 0.65px;\n ${media.tabletXLarge`\n font-size: 18px;\n `}\n ${media.desktopLarge`\n margin-top: 20px;\n `}\n }\n`;\n\nexport const StyledOverlayHeader = styled(ContainerBlock)`\n background: white;\n border-bottom: 1px solid ${COLORS.LIGHT_GRAY};\n display: flex;\n flex-direction: row-reverse;\n justify-content: right;\n position: sticky;\n top: 0px;\n width: 100%;\n z-index: 1;\n\n ${deriveMediaQueriesFromHeaderHeight('height: $s1$px;')}\n\n ${media.tabletXLarge`\n border-bottom: 1px solid transparent;\n `}\n`;\n\nexport const StyledTagContainer = styled.div`\n display: flex;\n flex-wrap: wrap;\n padding-bottom: 30px;\n width: 100%;\n ${(props: { kiosk: string | null }) => props.kiosk ? media.tabletXLarge`\n padding-bottom: 150px` : media.tabletXLarge`\n padding-bottom: 60px;\n `}\n`;\n\nexport const StyledCloseButton = styled.button`\n align-items: center;\n background: transparent;\n border: none;\n color: ${COLORS.RED};\n cursor: pointer;\n display: flex;\n flex-direction: row-reverse;\n font-size: 16px;\n justify-content: space-between;\n padding: 0;\n -webkit-text-stroke: 0.65px;\n width: 100%;\n\n ${media.tabletXLarge`\n flex-direction: row;\n width: auto;\n\n span {\n padding-left: 10px;\n }\n `}\n`;\n\nexport const StyledTag = styled(Tag)`\n flex-basis: calc(50% - ${LAYOUT.MOBILE_GUTTER / 2}px);\n max-width: calc(50% - ${LAYOUT.MOBILE_GUTTER / 2}px);\n margin: 0 ${LAYOUT.MOBILE_GUTTER}px ${LAYOUT.MOBILE_GUTTER}px 0;\n\n &:nth-child(2n){\n margin-right: 0;\n }\n\n ${media.tabletXLarge`\n flex-basis: calc(33.33% - 20px);\n max-width: calc(33.33% - 20px);\n margin: 0 30px 20px 0;\n\n &:nth-child(2n){\n margin-right: 30px;\n }\n\n &:nth-child(3n){\n margin-right: 0px;\n }\n `}\n\n ${(props: { kiosk?: string | null }) => props.kiosk ? (\n media.desktopLarge`\n flex-basis: calc(33.33% - 20px);\n max-width: calc(33.33% - 20px);\n min-height: 80px;\n margin: 0 30px 20px 0;\n\n &:nth-child(2n){\n margin-right: 30px;\n }\n\n &:nth-child(3n){\n margin-right: 0px;\n }\n `) : (\n media.desktopLarge`\n flex-basis: calc(25% - 15px);\n max-width: calc(25% - 15px);\n margin: 0 20px 20px 0;\n\n &:nth-child(2n){\n margin-right: 20px;\n }\n\n &:nth-child(3n){\n margin-right: 20px;\n }\n\n &:nth-child(4n){\n margin-right: 0;\n }\n `)\n }\n`;\n\nexport const StyledDisclaimerHolder = styled.div`\n width: 100%;\n background-color: rgba(64, 64, 64, 0.05);\n padding: 16px;\n margin-top: 12px;\n margin-bottom: 12px;\n\n ${media.tabletXLarge`\n margin-top: 15px;\n margin-bottom: 15px;\n `}\n\n ${media.desktopLarge`\n margin-top: 15px;\n margin-bottom: 15px;\n `}\n\n`;\n\nexport const StyledDisclaimerBody = styled.p`\n width: 100%;\n color: #404040;\n font-size: 12px;\n font-weight: bold;\n font-family: Interstate;\n line-height: 130%;\n\n ${media.tabletXLarge`\n font-size: 14px;\n line-height: 110%;\n `}\n\n ${media.desktopLarge`\n font-size: 14px;\n line-height: 110%;\n `}\n`;\n\nexport const StyledDisclaimerHeader = styled.p`\n width: 100%;\n color: #404040;\n font-size: 14px;\n font-weight: bold;\n font-style: italic;\n font-family: Interstate;\n margin-bottom: 0.5em;\n\n ${media.tabletXLarge`\n font-size: 16px;\n `}\n\n ${media.desktopLarge`\n font-size: 16px;\n `}\n`;\n","import FocusTrap from 'focus-trap-react';\nimport React, { useEffect } from 'react';\nimport { connect } from 'react-redux';\n\n// Actions\nimport globalActions from '../../redux/global/actions';\n// Utils\nimport { fireGaEvent, gaActions, gaCategories } from '../../utils/analytics';\n// Styles\nimport {\n StyledCloseButton, StyledOverlay, StyledOverlayContent, StyledOverlayHeader,\n} from './styles';\n\ninterface PassProps {\n children: any;\n}\n\ninterface FilterProps {\n filterOverlayVisible: boolean;\n toggleFilterOverlay: (visible: boolean) => void;\n}\n\nconst FilterOverlay = ({ filterOverlayVisible, children, toggleFilterOverlay }: PassProps & FilterProps) => {\n // Lock the body scroll when the filter overlay is open\n useEffect(() => {\n document.body.style.overflowY = filterOverlayVisible ? 'hidden' : 'scroll';\n window.addEventListener('keydown', close);\n\n return () => {\n window.removeEventListener('keydown', close);\n };\n }, [filterOverlayVisible]);\n\n const close = (evt: { keyCode: number }) => {\n // Close filter overlay on 'esc' press\n if (filterOverlayVisible && evt.keyCode === 27) {\n closeFilterOverlay();\n }\n };\n\n const closeFilterOverlay = () => {\n toggleFilterOverlay(!filterOverlayVisible);\n fireGaEvent(gaCategories.filterOverlay, gaActions.closeFilterOverlay, { label: 'From Filter Overlay' });\n };\n\n return (\n <>\n {filterOverlayVisible && (\n \n \n \n closeFilterOverlay()}\n data-cy=\"filter-dismiss\"\n >\n \n Filters\n \n \n \n {children}\n \n \n \n )}\n \n );\n};\n\nconst mapStateToProps = state => ({\n filterOverlayVisible: state.global.filterOverlayVisible,\n});\n\nconst mapDispatchToProps = dispatch => ({\n toggleFilterOverlay: (visible: boolean) => dispatch(globalActions.toggleFilterOverlay(visible)),\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(FilterOverlay);\n","import { FieldArray, Form, Formik } from 'formik';\nimport React, { useState } from 'react';\nimport { connect } from 'react-redux';\n\nimport AsyncSelect from 'react-select/lib/Async';\n// Actions\nimport filterActions from '../../redux/filters/actions';\n// Types\nimport { InterfaceAllergen, InterfaceDiet } from '../../redux/menu/reducer';\n// Styles\nimport { COLORS } from '../../styles';\n// Utils\nimport { fireGaEvent, gaActions, gaCategories } from '../../utils/analytics';\nimport {\n StyledApplyButton, StyledButtonsContainer, StyledClearFiltersButton, StyledDisclaimerBody, StyledDisclaimerHeader, StyledDisclaimerHolder,\n StyledTag, StyledTagContainer,\n} from './styles';\n\ninterface InterfaceFormAllergens extends InterfaceAllergen {\n isSelected: boolean;\n}\n\ninterface InterfaceFormDiets extends InterfaceDiet {\n isSelected: boolean;\n}\n\ninterface InterfaceSelectIngredients {\n value: string;\n label: string;\n}\n\ninterface FormSubmitValues {\n allergens: string[];\n diets: string[];\n ingredients: string[];\n flat?: boolean;\n}\n\ntype PassProps = {\n redoSearch?: boolean;\n pushToMenu?: boolean;\n};\n\ntype StoreProps = {\n applyFilters: (values: FormSubmitValues, redoSearch: boolean, pushToMenu: boolean) => void;\n filtersLoading: boolean;\n\n // Applied filters\n allergenFilters: string[];\n ingredientsFilters: string[];\n dietFilters: string[];\n\n // Options\n allergens: InterfaceAllergen[];\n ingredients: string[];\n dietaryFilters: InterfaceDiet[];\n};\n\ntype Option = {\n value: string;\n label: string;\n};\n\nconst applyIsSelected = (arr, filters, settings?) => arr.map((item: InterfaceAllergen | InterfaceDiet) => (\n Object.assign({}, item, {\n isSelected: settings && settings.resetApplied ? false : filters.indexOf(item.safe_name) > -1,\n })\n));\n\nconst assembleSubmitKeyArray = arr => arr.filter((item: InterfaceFormDiets | InterfaceFormAllergens) => item.isSelected).map((item: InterfaceFormDiets | InterfaceFormAllergens) => item.safe_name);\n\n// React-select expects options to\nconst formatIngredients = (arr: string[]) => arr.map((item: string) => ({ value: item, label: item }));\n\nconst FilterForm = ({\n allergens,\n allergenFilters,\n applyFilters,\n dietaryFilters,\n dietFilters,\n filtersLoading,\n ingredients,\n ingredientsFilters,\n pushToMenu,\n redoSearch,\n}: StoreProps & PassProps) => {\n\n const [selectInputVal, setSelectInputVal] = useState('');\n const [reset, setReset] = useState(false);\n const [formattedIngredients] = useState(formatIngredients(ingredients));\n\n const filteredIngredients = (input: string, cb: (arg: Option[]) => void) => {\n // filter for exact match with input value\n const exactMatch = ingredients.filter((item: string) => selectInputVal.toLowerCase() === item.toLowerCase());\n // filter for starts with input value\n const startsWith = ingredients.filter((item: string) => selectInputVal.toLowerCase() !== item.toLowerCase() && item.toLowerCase().startsWith(selectInputVal.toLowerCase()));\n // filter for includes input value\n const includes = ingredients.filter((item: string) => selectInputVal.toLowerCase() !== item.toLowerCase() && item.toLowerCase().includes(selectInputVal.toLowerCase()) && !item.toLowerCase().startsWith(selectInputVal.toLowerCase()));\n // combine results of 3 arrs\n const results = exactMatch.concat(startsWith).concat(includes);\n // format results for React-select\n const formattedResults = formatIngredients(results);\n return cb(formattedResults);\n };\n\n const handleInputChange = value => {\n setSelectInputVal(value);\n };\n\n let selectRef;\n const handleRef = value => {\n selectRef = value;\n };\n\n // In other words, the menu hasn't loaded yet\n if (!allergens.length || !dietaryFilters.length) {\n return ;\n }\n\n const kiosk = localStorage.getItem('kiosk');\n\n return (\n <>\n {\n // Reformat formik values for API\n let filters = {\n allergens: assembleSubmitKeyArray(values.allergens),\n diets: assembleSubmitKeyArray(values.diets),\n ingredients: values.ingredients.map((obj: InterfaceSelectIngredients) => obj.value),\n };\n if (reset) {\n filters = {\n allergens: [],\n diets: [],\n ingredients: [],\n };\n }\n applyFilters(filters, !!redoSearch, !!pushToMenu);\n fireGaEvent(gaCategories.filterOverlay, gaActions.applyFilters);\n }}\n render={({ setFieldValue, values, resetForm }) => (\n
\n {/* Allergens Tags */}\n

Show me items made without...

\n \n (\n <>\n {values.allergens.map((allergen: InterfaceFormAllergens, index) => (\n {\n setReset(false);\n replace(index, Object.assign({}, allergen, {\n isSelected: !allergen.isSelected,\n }));\n fireGaEvent(gaCategories.filterOverlay, !allergen.isSelected ? gaActions.addAllergen : gaActions.removeAllergen, { label: allergen.safe_name });\n }}\n >\n {allergen.name}\n \n ))}\n \n )}\n />\n \n\n {/* Custom Ingredients */}\n \n

Filter out additional ingredients below:

\n \n Please take care:\n In case of typos, misspellings or local variations, always refer to individual product pages for full ingredient information, including listed food allergens.\n \n {\n\n if (params.action && params.action === 'clear') {\n if (selectRef) {\n selectRef.focus();\n }\n }\n\n setReset(false);\n setFieldValue('ingredients', arr);\n\n // GA wrangling\n let label;\n\n // If an add event\n if (params.option) {\n label = { label: params.option.label };\n }\n\n // If a remove event\n if (params.removedValue) {\n label = { label: params.removedValue.label };\n }\n\n fireGaEvent(gaCategories.filterOverlay, params.action, label);\n }}\n onInputChange={handleInputChange}\n value={values.ingredients}\n styles={{\n container: styles => ({\n ...styles,\n flex: 1,\n }),\n multiValue: styles => ({\n ...styles,\n backgroundColor: COLORS.RED,\n borderRadius: 2,\n color: COLORS.WHITE,\n padding: 8,\n }),\n multiValueLabel: styles => ({\n ...styles,\n color: COLORS.WHITE,\n }),\n control: styles => ({\n ...styles,\n boxShadow: 'none',\n })}\n }\n theme={theme => {\n return ({\n ...theme,\n borderRadius: 4,\n colors: {\n ...theme.colors,\n primary25: '#efefef', // hover\n primary: COLORS.RED,\n neutral20: COLORS.RED,\n neutral30: COLORS.RED,\n neutral40: COLORS.RED,\n neutral50: COLORS.RED,\n neutral60: COLORS.RED,\n },\n spacing: {\n ...theme.spacing,\n controlHeight: 48,\n },\n }); }\n }\n />\n
\n\n {/* Dietary Preferences */}\n

My dietary preference is...

\n \n (\n <>\n {values.diets.map((diet: InterfaceFormDiets, index) => (\n {\n replace(index, Object.assign({}, diet, {\n isSelected: !diet.isSelected,\n }));\n fireGaEvent(gaCategories.filterOverlay, !diet.isSelected ? gaActions.addDiet : gaActions.removeDiet, { label: diet.safe_name });\n }}\n >\n {diet.name}\n \n ))}\n \n )}\n />\n \n \n \n {filtersLoading ?\n <>\n \n
Applying...
\n \n :
Apply Filters
\n }\n
\n {\n resetForm({\n allergens: applyIsSelected(allergens, allergenFilters, { resetApplied: true }),\n diets: applyIsSelected(dietaryFilters, dietFilters, { resetApplied: true }),\n ingredients: [],\n });\n setReset(true);\n }}\n data-cy=\"reset\"\n >\n Reset\n \n \n \n )}\n />\n \n );\n};\n\nconst mapStateToProps = state => ({\n // Applied Filters\n allergenFilters: state.filters.allergens,\n ingredientsFilters: state.filters.ingredients,\n dietFilters: state.filters.diets,\n filtersLoading: state.filters.loading,\n\n // Filter options\n allergens: state.menu.allergens,\n ingredients: state.menu.ingredients,\n dietaryFilters: state.menu.dietaryFilters,\n});\n\nconst mapDispatchToProps = dispatch => ({\n applyFilters: (values: FormSubmitValues, redoSearch: boolean, pushToMenu: boolean) => dispatch(filterActions.applyFilters(values, redoSearch, pushToMenu)),\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(FilterForm);\n","import styled from 'styled-components';\n\n// Globals\nimport { COLORS, FONTS } from '../../styles';\n// Breakpoints\nimport { media } from '../../styles/breakpoints';\nimport { ContainerBlock, deriveMediaQueriesFromHeaderHeight } from '../../styles/mixins';\n// Components\nimport Tag from '../Tag';\n\nexport const StyledFilterStatusContainer = styled(ContainerBlock)`\n background: ${COLORS.WHITE};\n display: flex;\n flex-wrap: wrap;\n position: sticky;\n\n ${deriveMediaQueriesFromHeaderHeight('top: $s1$px;')}\n`;\n\nexport const StyledFilterStatus = styled.div`\n border-top: 1px solid ${COLORS.LIGHT_GRAY};\n overflow: hidden;\n width: 100%;\n\n p {\n font-family: ${FONTS.PRIMARY};\n font-size: 18px;\n flex-shrink: 0;\n padding: 10px 20px 0 0;\n\n button {\n background: none;\n color: ${COLORS.RED};\n font-family: ${FONTS.SECONDARY};\n font-size: 14px;\n display: block;\n border: none;\n padding: 4px 0 0 0;\n\n &:hover {\n text-decoration: underline;\n }\n }\n }\n\n ${media.tabletXLarge`\n align-items: center;\n display: flex;\n\n p {\n padding-top: 0\n }\n `}\n`;\n\nexport const StyledFilterTags = styled.div`\n align-items: center;\n display: flex;\n flex-shrink: 0;\n max-width: 100%;\n`;\n\nexport const StyledTag = styled(Tag)`\n font-size: 14px;\n margin: 10px 10px 15px 0;\n max-width: 150px\n min-height: 38px;\n padding: 5px 10px;\n -webkit-text-stroke: 0.65px;\n flex-shrink: 0;\n width: 33.33%;\n\n ${media.tabletXLarge`\n margin-top: 15px;\n min-width: 120px;\n width: 20%;\n `}\n`;\n\nexport const StyledMoreFilters = styled.div`\n flex: 1;\n height: 100%;\n margin-left: 2%;\n width: 400px;\n\n button {\n background: none;\n border: none;\n color: ${COLORS.RED};\n cursor: pointer;\n font-family: ${FONTS.PRIMARY};\n font-size: 14px;\n height: 100%;\n padding: 0;\n\n &:hover {\n text-decoration: underline;\n }\n\n ${media.tabletXLarge`\n font-size: 18px;\n `}\n }\n`;\n","import find from 'lodash/find';\nimport React from 'react';\nimport { connect } from 'react-redux';\n\n// Actions\nimport filterActions from '../../redux/filters/actions';\nimport globalActions from '../../redux/global/actions';\n// Types\nimport { InterfaceAllergen, InterfaceDiet } from '../../redux/menu/reducer';\n// Globals\nimport { isMobile } from '../../styles/breakpoints';\n// Utils\nimport { fireGaEvent, gaActions, gaCategories } from '../../utils/analytics';\nimport {\n StyledFilterStatus, StyledFilterStatusContainer, StyledFilterTags, StyledMoreFilters, StyledTag,\n} from './styles';\n\ntype StoreProps = {\n allergens: InterfaceAllergen[];\n diets: InterfaceDiet[];\n ingredients: string[];\n};\n\ntype MenuStoreProps = {\n menuAllergens: object[];\n menuDietaryFilters: object[];\n menuIngredients: object[];\n};\n\ntype DispatchProps = {\n applyFilters: (values: StoreProps, redoSearch: boolean) => void;\n toggleFilterOverlay: (visible: boolean) => void;\n};\n\ntype PassProps = {\n redoSearch?: boolean;\n};\n\nconst removeFilter = (safeName: string, key: string, filters) => Object.assign({}, filters, {\n [key]: filters[key].filter((filter: string) => filter !== safeName),\n});\n\nconst deriveNameFromSafeName = (safeName: string, filters: any[]) => {\n const filterObject = find(filters, { safe_name: safeName });\n\n if (filterObject) {\n return filterObject.name;\n }\n\n return safeName;\n};\n\nconst determineMaxFiltersDisplay = () => {\n // maxContainerWidth is derived by either the max container width or the current container width if innerWidth is less than the max\n const maxContainerWidth = window.innerWidth > 1216 ? 1216 : window.innerWidth;\n\n // maxTagWidth is 20% of the maxContainerWidth, but maxes out at 160px\n // on mobile, maxTagWidth is 33.33% of maxContainerWidth\n const maxTagsPerRow = isMobile() ? 3 : 5;\n const maxTagWidth = (maxContainerWidth / maxTagsPerRow < 155) ? maxContainerWidth / maxTagsPerRow : 155;\n\n // The filter text will occupy 100px of width, except on mobile\n const filterTextWidth = isMobile() ? 0 : 110;\n\n // Calculate the width the the tags might possibly occupy\n const maxTagDisplayArea = maxContainerWidth - filterTextWidth;\n\n // See how many tags can fit in that space and round that value down\n const maxCount = Math.floor(maxTagDisplayArea / maxTagWidth);\n\n // Subtract 1 to account for the space the '+ X more' text will need to occupy\n return maxCount - 1;\n};\n\nconst FilterStatus = ({\n allergens,\n applyFilters,\n diets,\n ingredients,\n menuAllergens,\n menuDietaryFilters,\n menuIngredients,\n redoSearch,\n toggleFilterOverlay,\n}: StoreProps & DispatchProps & MenuStoreProps & PassProps) => {\n\n const menuFilters = {\n allergens: menuAllergens,\n diets: menuDietaryFilters,\n ingredients: menuIngredients,\n };\n\n const appliedFilters = {\n allergens,\n diets,\n ingredients,\n };\n\n const totalFilters = allergens.length + diets.length + ingredients.length;\n const maxCount = determineMaxFiltersDisplay();\n\n return (\n \n {(allergens.length || diets.length || ingredients.length) ? (\n \n

Filtering

\n\n \n {/* Render all filters */}\n {(() => {\n let currentCount = 0;\n\n return Object.keys(appliedFilters).map((key: string) => (\n appliedFilters[key].map((filter: string, index: string) => {\n ++currentCount;\n\n if (currentCount > maxCount) {\n return null;\n }\n\n return (\n {\n applyFilters(removeFilter(filter, key, appliedFilters), !!redoSearch);\n fireGaEvent(gaCategories.appliedFilters, gaActions.removeFilter, { label: filter });\n }}\n testId=\"active-filter\"\n >\n {deriveNameFromSafeName(filter, menuFilters[key])}\n \n );\n })\n ));\n })()}\n\n {/* Conditionally show additional filters button */}\n {(totalFilters > maxCount) && (\n \n {\n toggleFilterOverlay(true);\n fireGaEvent(gaCategories.filterOverlay, gaActions.openFilterOverlay, { label: 'From Applied Filters' });\n }}\n >\n + {totalFilters - maxCount} more\n \n \n )}\n \n
\n ) : ''}\n
\n );\n};\n\nconst mapStateToProps = state => ({\n // Applied filters\n allergens: state.filters.allergens,\n diets: state.filters.diets,\n ingredients: state.filters.ingredients,\n\n // Filter options\n menuAllergens: state.menu.allergens,\n menuDietaryFilters: state.menu.dietaryFilters,\n menuIngredients: state.menu.ingredients,\n});\n\nconst mapDispatchToProps = dispatch => ({\n applyFilters: (values: StoreProps, redoSearch: boolean) => dispatch(filterActions.applyFilters(values, redoSearch, false)),\n toggleFilterOverlay: (visible: boolean) => dispatch(globalActions.toggleFilterOverlay(visible)),\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(FilterStatus);\n","import { darken } from 'polished';\nimport styled from 'styled-components';\n\n// Styles\nimport { COLORS } from '../../styles';\n// Breakpoints\nimport { media } from '../../styles/breakpoints';\nimport { ContainerBlock } from '../../styles/mixins';\n\nexport const StyledLayout = styled(ContainerBlock)`\n padding-top: 20px;\n padding-bottom: 20px;\n`;\n\nexport const StyledFooterContainer = styled.ul`\n font-weight: bold;\n margin: 0;\n padding: 0;\n text-align: center;\n\n a {\n color: ${COLORS.RED};\n :hover {\n color: ${darken(0.075, COLORS.RED)};\n }\n }\n\n li {\n display: block;\n margin: 5px 0;\n }\n\n ${media.tabletXLarge`\n li {\n display: inline-block;\n color: ${COLORS.RED};\n margin: 5px 20px;\n &:after {\n content: '\\\\2022';\n position: relative;\n top: 1px;\n right: -20px;\n }\n &:last-child {\n &:after {\n content: '';\n }\n }\n }\n `}\n`;\n\nexport const StyledCopyright = styled.div`\n font-size: 12px;\n padding-top: 10px;\n text-align-last: center;\n color: ${COLORS.GRAY};\n line-height: 1.7;\n ${media.desktopLarge`\n max-width: 1000px;\n margin: 0 auto;\n `}\n`;\n","import React from 'react';\n\nimport { StyledCopyright, StyledFooterContainer, StyledLayout } from './styles';\n\ninterface Link {\n label: string;\n link: string;\n}\nconst Links = [\n {\n label: 'Terms and Conditions',\n link: 'https://www.pret.co.uk/en-gb/terms-and-conditions',\n },\n {\n label: 'Privacy Policy',\n link: 'https://www.pret.co.uk/en-gb/privacy-policy',\n },\n {\n label: 'Main Site',\n link: 'https://www.pret.co.uk/en-gb',\n },\n];\n\nconst Footer: React.SFC = () => (\n \n \n {Links.map((item: Link) =>
  • {item.label}
  • )}\n
    \n \n © Pret A Manger 2019. Pret A Manger (Europe) Ltd, Reg. Number 1854213 · Pret A Manger (USA) Ltd, Reg. Number 3836164 · Pret A Manger (Hong Kong) Ltd, Reg. Number 4240964 The above three companies are registered in England and their registered office is at 75B, Verde, 10 Bressenden Place, London SW1E 5DH\n \n
    \n);\n\nexport default Footer;\n","import styled from 'styled-components';\n\n// Styles\nimport { COLORS, LAYOUT } from '../../styles';\n// Breakpoints\nimport { media } from '../../styles/breakpoints';\nimport { ContainerBlock, VisuallyHiddenButton } from '../../styles/mixins';\n\nexport const StyledSearch = styled.div`\n background: ${COLORS.WHITE};\n border-bottom: 1px solid ${COLORS.WHITE};\n box-shadow: 0 2px 31px 0 rgba(0, 0, 0, 0.08);\n display: flex;\n height: ${LAYOUT.HEADER.M_HEIGHT}px;\n position: fixed;\n top: 0;\n width: 100%;\n z-index: 2;\n\n ${media.tabletXLarge`\n height: ${LAYOUT.HEADER.T_HEIGHT}px;\n `}\n\n ${media.desktopLarge`\n height: ${LAYOUT.HEADER.D_HEIGHT}px;\n `}\n`;\n\nexport const StyledSearchContent = styled(ContainerBlock)`\n display: flex;\n flex-direction: row-reverse;\n\n ${media.tabletXLarge`\n flex-direction: row;\n `}\n\n input {\n border: none;\n flex: 1;\n }\n button {\n }\n`;\n\nexport const StyledCloseButton = styled.button`\n background: none;\n border: none;\n color: ${COLORS.RED};\n cursor: pointer;\n font-size: 32px;\n margin: 0 ${LAYOUT.MOBILE_GUTTER * -1}px 0 0;\n padding: 0 ${LAYOUT.MOBILE_GUTTER}px;\n width: 70px;\n\n ${media.tabletXLarge`\n margin: 0 0 0 ${LAYOUT.GUTTER * -1}px;\n padding: 0 ${LAYOUT.GUTTER / 2}px 0 ${LAYOUT.GUTTER}px;\n `}\n`;\n\nexport const StyledSearchButton = styled(VisuallyHiddenButton)``;\n\nexport const StyledSearchInput = styled.input`\n color: ${COLORS.GRAY};\n font-size: 20px;\n\n ${media.tabletXLarge`\n font-size: 24px;\n padding-left: ${LAYOUT.GUTTER / 2}px;\n `}\n`;\n","import { push } from 'connected-react-router';\nimport FocusTrap from 'focus-trap-react';\nimport React, { useEffect, useState } from 'react';\nimport { connect } from 'react-redux';\n\n// Routes\nimport { pathParams, routes } from '../../constants/routes';\n// Utils\nimport { fireGaEvent, gaActions, gaCategories } from '../../utils/analytics';\n// Styles\nimport {\n StyledCloseButton, StyledSearch, StyledSearchButton, StyledSearchContent, StyledSearchInput,\n} from './styles';\n\ninterface SearchProps {\n closeSearch: (arg: boolean) => void;\n pushToSearch: (val: string) => void;\n searchLoading: boolean;\n}\n\nconst SearchBar = ({ closeSearch, pushToSearch, searchLoading }: SearchProps) => {\n const [search, setSearch] = useState('');\n\n const sanitizeSearchTerms = (value: string) => {\n return value.replace(/[^A-Za-z0-9 ]/g, '');\n };\n\n const close = (evt: { keyCode: number }) => {\n // Close search bar on 'esc' press\n if (evt.keyCode === 27) {\n if (closeSearch) {\n closeSearch(false);\n }\n }\n };\n\n useEffect(() => {\n window.addEventListener('keydown', close);\n\n return () => {\n window.removeEventListener('keydown', close);\n };\n }, []);\n\n return (\n \n \n {\n e.preventDefault();\n pushToSearch(search);\n closeSearch(false);\n fireGaEvent(gaCategories.search, gaActions.performSearch, { label: search });\n }}\n >\n closeSearch(false)}\n type=\"button\"\n data-cy=\"search-dismiss\"\n >\n {searchLoading ?\n :\n \n }\n \n setSearch(sanitizeSearchTerms(e.target.value))}\n placeholder=\"Search our menu\"\n type=\"text\"\n required={true}\n autoFocus={true}\n data-cy=\"search-field\"\n />\n \n Search\n \n \n \n \n );\n};\n\nconst mapStateToProps = state => ({\n searchTerm: state.search.term,\n searchLoading: state.search.loading,\n});\n\nconst mapDispatchToProps = dispatch => ({\n pushToSearch: (searchValue: string) => searchValue ? dispatch(push(`${routes.search.base.replace(`:${pathParams.searchTerm}`, searchValue)}`)) : null,\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(SearchBar);\n","import styled from 'styled-components';\n\n// Breakpoints\nimport { media } from '../../styles/breakpoints';\n\n// Styles\nimport { COLORS, FONTS, LAYOUT } from '../../styles';\nimport { ContainerBlock, deriveMediaQueriesFromHeaderHeight } from '../../styles/mixins';\n\nexport const StyledHeader = styled.nav`\n background: ${COLORS.WHITE};\n border-bottom: 1px solid ${COLORS.LIGHT_GRAY};\n color: ${COLORS.RED};\n position: fixed;\n top: 0;\n width: 100%;\n z-index: 1;\n\n ${deriveMediaQueriesFromHeaderHeight('height: $s1$px;')}\n`;\n\nexport const StyledHeaderContent = styled(ContainerBlock)`\n align-items: center;\n display: flex;\n height: 100%;\n justify-content: space-between;\n`;\n\nexport const StyledLogo = styled.img`\n width: 78px;\n\n ${media.tabletXLarge`\n width: 68px;\n `}\n\n ${media.desktopLarge`\n width: 128px;\n `}\n`;\n\nconst HeaderButton = styled.button`\n align-items: center;\n background: none;\n border: none;\n color: ${COLORS.RED};\n cursor: pointer;\n display: flex;\n font-family: ${FONTS};\n font-size: 16px;\n height: 100%;\n -webkit-text-stroke: 0.65px;\n\n > * {\n object-fit: contain;\n }\n\n > span {\n display: none;\n }\n\n ${media.tabletXLarge`\n > span {\n display: block;\n }\n `}\n`;\n\nexport const StyledSearchButton = styled(HeaderButton)`\n margin-left: ${LAYOUT.MOBILE_GUTTER * -1}px;\n padding: 0 0 0 ${LAYOUT.MOBILE_GUTTER}px;\n\n img {\n margin-right: 10px;\n max-height: 20px;\n max-width: 20px;\n }\n\n ${media.tabletXLarge`\n margin-left: ${LAYOUT.GUTTER * -1}px;\n padding-left: ${LAYOUT.GUTTER}px;\n `}\n`;\n\nexport const StyledFilterButton = styled(HeaderButton)`\n margin-right: ${LAYOUT.MOBILE_GUTTER * -1}px;\n padding: 0 ${LAYOUT.MOBILE_GUTTER}px 0 0;\n\n img {\n max-height: 20px;\n max-width: 20px;\n }\n\n ${media.tabletXLarge`\n margin-right: ${LAYOUT.GUTTER * -1}px;\n padding-right: ${LAYOUT.GUTTER}px;\n\n img {\n margin-right: 10px;\n }\n `}\n`;\n","import React from 'react';\nimport { connect } from 'react-redux';\n\n// Actions\nimport globalActions from '../../redux/global/actions';\n\n// Styles\nimport { StyledFilterButton } from './styles';\n\n// Utils\nimport { fireGaEvent, gaActions, gaCategories } from '../../utils/analytics';\n\ninterface FilterProps {\n toggleFilterOverlay: (visible: boolean) => void;\n filterOverlayVisible: boolean;\n}\n\nconst FilterToggle = ({ filterOverlayVisible, toggleFilterOverlay }: FilterProps) => {\n return (\n {\n toggleFilterOverlay(!filterOverlayVisible);\n fireGaEvent(gaCategories.filterOverlay, gaActions.openFilterOverlay, { label: 'From Nav' });\n }}\n data-cy=\"filter\"\n >\n \n Filter Items Without\n \n );\n};\n\nconst mapStateToProps = state => ({\n filterOverlayVisible: state.global.filterOverlayVisible,\n});\n\nconst mapDispatchToProps = dispatch => ({\n toggleFilterOverlay: (visible: boolean) => dispatch(globalActions.toggleFilterOverlay(visible)),\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(FilterToggle);\n","import React from 'react';\nimport { connect } from 'react-redux';\nimport { Link } from 'react-router-dom';\n\n// Styles\nimport { StyledLogo } from './styles';\n\n// Utils\nimport { deriveDefaultMenuRoute } from '../../utils/menu';\n\ninterface StoreProps {\n menu: any;\n}\n\nconst HeaderLogo = ({ menu }: StoreProps) => (\n \n \n \n);\n\nconst mapStateToProps = state => ({\n menu: state.menu.data,\n});\n\nexport default connect(mapStateToProps)(HeaderLogo);\n","import React, { useState } from 'react';\nimport { connect } from 'react-redux';\n\n// Components\nimport SearchBar from '../SearchBar';\nimport FilterToggle from './filterToggle';\nimport Logo from './logo';\n\n// Utils\nimport { fireGaEvent, gaActions, gaCategories } from '../../utils/analytics';\n\n// Styles\nimport {\n StyledHeader,\n StyledHeaderContent,\n StyledSearchButton,\n} from './styles';\n\nconst Header = ({ searchLoading }) => {\n const [showSearch, setShowSearch] = useState(false);\n\n const toggleSearch = (toggle: boolean) => {\n setShowSearch(toggle);\n fireGaEvent(gaCategories.search, toggle ? gaActions.openSearch : gaActions.closeSearch, { label: 'From Nav' });\n };\n\n return (\n <>\n {showSearch && }\n \n \n toggleSearch(!showSearch)}\n data-cy=\"search\"\n >\n {searchLoading ?\n :\n \n }\n Search Menu\n \n \n \n \n \n \n );\n};\n\nconst mapStateToProps = state => ({\n searchLoading: state.search.loading,\n});\n\nexport default connect(mapStateToProps)(Header);\n","const IMAGE_RESIZER = 'https://resizer.product.pret.co.uk';\n/**\n * Take a url and feed it to the image resizer\n *\n * @param {String} str\n * @returns {String|Array}\n */\nexport function resizeImage(url, height = 9999, width = 9999, quality = 85, crop = true) {\n // Ensure url exists\n if (!url) {\n return null;\n }\n\n // Don't try and image resize SVGs\n if (url.split('.')[url.split('.').length - 1] === 'svg') {\n return url;\n }\n\n // Don't resize the image if there is no image resizer\n if (!IMAGE_RESIZER) {\n return url;\n }\n\n return `${IMAGE_RESIZER}/resize?source=${url}&height=${height}&width=${width}&max_quality=${quality}&crop=${crop}`;\n}\n","import { darken } from 'polished';\nimport { Link } from 'react-router-dom';\nimport styled from 'styled-components';\n\n// Globals\nimport { COLORS, FONTS, LAYOUT } from '../../styles';\nimport { media } from '../../styles/breakpoints';\nimport { ContainerBlock } from '../../styles/mixins';\n\nexport const StyledItemImage = styled.div`\n display: block;\n height: auto;\n margin-bottom: 10px;\n width: 100%;\n padding-bottom: 100%;\n background-image: ${(props: { backgroundUrl: string }) => `url(${props.backgroundUrl})`};\n background-color: ${COLORS.LIGHTER_GRAY};\n background-size: contain;\n`;\n\nexport const StyledDietaryIcon = styled.img`\n height: 20px;\n width: 20px;\n margin-bottom: 10px;\n`;\n\nexport const StyledNewIcon = styled.img`\n height: 32px;\n width: 32px;\n margin-top: 5px;\n margin-right: 5px;\n float: right;\n\n ${media.desktop`\n height: 42px;\n width: 42px;\n `}\n`;\n\nexport const StyledMenuGrid = styled.div`\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-start;\n padding-top: 10px;\n`;\n\nexport const StyledMenuGridContainer = styled(ContainerBlock)`\n padding: 0 !important;\n`;\n\nexport const StyledItemCardContainer = styled.div`\n cursor: pointer;\n margin-bottom: 30px;\n text-align: left;\n width: 50%;\n padding: 0 ${LAYOUT.MOBILE_GUTTER}px;\n\n &:hover {\n h1 {\n color: ${darken(0.075, COLORS.RED)};\n }\n h2 {\n color: ${darken(0.30, COLORS.GRAY)};\n }\n #item-image {\n box-shadow: 0 2px 31px 0 rgba(0, 0, 0, 0.08);\n }\n }\n\n ${media.tabletXLarge`\n padding: 0 34px;\n width: 33.3%;\n `}\n\n ${media.desktopLarge`\n width: 25%;\n `}\n\n ${(props: { kiosk: string | null }) => props.kiosk ? (\n media.desktopLarge`\n width: 33.3%;\n `) : (\n media.desktopLarge`\n width: 25%;\n `)\n }\n`;\n\nexport const StyledProductLink = styled(Link)`\n display: block;\n margin-bottom: 10px;\n border-bottom: 1px solid ${COLORS.LIGHT_GRAY};\n height: 100%;\n\n :hover {\n border-bottom: 1px solid ${darken(0.30, COLORS.LIGHT_GRAY)};\n }\n`;\n\nexport const StyledItemLabel = styled.h1`\n color: ${COLORS.RED};\n font-family: ${FONTS.SECONDARY};\n font-size: 20px;\n font-weight: normal;\n -webkit-text-stroke: 0.65px;\n padding-bottom: 10px;\n`;\n\nexport const StyledAllergensLabel = styled.h2`\n color: ${COLORS.GRAY};\n font-family: ${FONTS.SECONDARY};\n font-weight: 400;\n font-size: 14px;\n padding-bottom: 30px;\n`;\n\nexport const StyledMenuLoading = styled.div`\n transition: all 500ms linear;\n align-items: center;\n background: ${COLORS.BODY};\n display: flex;\n font-size: 32px;\n height: calc(100vh - ${LAYOUT.HEADER.M_HEIGHT}px);\n justify-content: center;\n left: 0px;\n opacity: ${(props: { loading: boolean }) => props.loading ? 1 : 0};\n position: fixed;\n top: ${LAYOUT.HEADER.M_HEIGHT}px;\n visibility: ${(props: { loading: boolean }) => props.loading ? 'visible' : 'hidden'};\n width: 100%;\n\n img {\n width: 100px;\n }\n\n ${media.tabletXLarge`\n height: calc(100vh - ${LAYOUT.HEADER.T_HEIGHT}px);\n top: ${LAYOUT.HEADER.T_HEIGHT}px;\n `}\n\n ${media.desktopLarge`\n height: calc(100vh - ${LAYOUT.HEADER.D_HEIGHT}px);\n top: ${LAYOUT.HEADER.D_HEIGHT}px;\n `}\n`;\n","import filter from 'lodash/filter';\nimport get from 'lodash/get';\nimport React from 'react';\n\n// Constants\nimport { pathParams } from '../../constants/routes';\n// Styles\nimport { StyledNoResults } from '../../styles/mixins';\n// Utils\nimport { resizeImage } from '../../utils/imageHelper';\nimport { determineShowIcon, interpolateProductPath } from '../../utils/menu';\nimport {\n StyledAllergensLabel, StyledDietaryIcon, StyledItemCardContainer, StyledItemImage,\n StyledItemLabel, StyledMenuGrid, StyledMenuGridContainer, StyledMenuLoading, StyledNewIcon, StyledProductLink,\n} from './styles';\n\ntype PassProps = {\n item: any;\n to: string;\n};\n\nexport const MenuItemCard = ({ item, to }: PassProps) => {\n const kiosk = localStorage.getItem('kiosk');\n\n return (\n \n \n \n {(() => {\n return item.is_new && ();\n })()}\n \n \n {item.name}\n \n {(() => {\n const icon = determineShowIcon(item);\n return icon && (\n \n );\n })()}\n \n {item.allergens_description}\n \n \n \n );\n};\n\ntype GridPassProps = {\n matchParams: {\n [key: string]: string;\n };\n menu: any;\n menuLoading: boolean;\n};\n\nconst MenuGrid = ({ matchParams, menu, menuLoading }: GridPassProps) => {\n const occasionId = matchParams[pathParams.occasionId];\n const catId = matchParams[pathParams.categoryId];\n let selectedProducts: any = [];\n\n const renderMenu = () => {\n if (menu && menu.length > 0 && occasionId && catId) {\n const selectedOccasionMenuCatsObj = filter(menu, (occasion: any) => occasion.safe_name === occasionId)[0];\n const selectedOccasionMenuCats = get(selectedOccasionMenuCatsObj, 'categories', []);\n const selectedProductOptions = filter(selectedOccasionMenuCats, (cat: any) => cat.external_id === catId)[0];\n selectedProducts = get(selectedProductOptions, 'products', []);\n return true;\n }\n\n return false;\n };\n\n return (\n \n \n \n \n \n\n {!menuLoading && (\n // Results\n (renderMenu() && selectedProducts.length > 0) ? selectedProducts.map((item: any) => (\n \n )) : (\n // No results\n \n

    None of our menu items fit this criteria

    \n

    Try reducing the amount of filters

    \n
    \n ))\n }\n
    \n
    \n );\n};\n\nexport default MenuGrid;\n","import styled from 'styled-components';\n\n// Globals\nimport { COLORS, FONTS, LAYOUT } from '../../styles';\nimport { media } from '../../styles/breakpoints';\nimport { ContainerBlock, NavButton } from '../../styles/mixins';\n\nexport const StyledCategoryLink = styled(NavButton)`\n align-items: center;\n display: flex;\n flex-shrink: 0;\n font-family: ${FONTS.PRIMARY};\n font-size: 18px;\n color: ${COLORS.GRAY};\n height: 100%;\n padding-right: 35px;\n\n ${media.tabletXLarge`\n padding-right: 45px;\n `}\n\n ${media.desktopLarge`\n padding-right: 75px;\n `}\n`;\n\nexport const Container = styled.div`\n width: 100%;\n height: 100%;\n align-items: center;\n display: flex;\n flex-wrap: nowrap;\n overflow-x: scroll;\n -webkit-overflow-scrolling: touch;\n position: sticky;\n top: ${LAYOUT.NAV.M_HEIGHT}px;\n\n ::-webkit-scrollbar {\n width: 0px; /* remove scrollbar space */\n height: 0px; /* remove scrollbar space */\n background: transparent;\n }\n\n -ms-overflow-style: -ms-autohiding-scrollbar;\n background-image:\n linear-gradient(to right, white, white),\n linear-gradient(to left, white, white),\n linear-gradient(to right, rgba(0,0,0,.03), rgba(255,255,255,0)),\n linear-gradient(to left, rgba(0,0,0,.03), rgba(255,255,255,0));\n background-position: left center, right center, left center, right center;\n background-repeat: no-repeat;\n background-color: white;\n background-size: 30px 100%, 30px 100%, 15px 100%, 15px 100%;\n\n /* Opera doesn't support this in the shorthand */\n background-attachment: local, local, scroll, scroll;\n`;\n\nexport const ContainerWrapper = styled(ContainerBlock)`\n align-items: center;\n display: flex;\n flex-wrap: nowrap;\n height: ${LAYOUT.SUBNAV.M_HEIGHT}px;\n position: sticky;\n top: ${LAYOUT.NAV.M_HEIGHT}px;\n\n ::-webkit-scrollbar {\n width: 0px; /* remove scrollbar space */\n height: 0px; /* remove scrollbar space */\n background: transparent;\n }\n\n ${media.tabletXLarge`\n height:${LAYOUT.SUBNAV.T_HEIGHT}px;\n position: static;\n `}\n\n ${media.desktopLarge`\n height:${LAYOUT.SUBNAV.D_HEIGHT}px;\n `}\n`;\n","import _ from 'lodash';\nimport * as React from 'react';\nimport { connect } from 'react-redux';\n\n// Styles\nimport { Container, ContainerWrapper, StyledCategoryLink } from './styles';\n\n// Utils\nimport { pathParams } from '../../constants/routes';\n\ntype StoreProps = {\n menu: any;\n};\n\ntype PassProps = {\n // TODO - extract into type\n matchParams: {\n [key: string]: string;\n };\n};\n\nclass MenuNav extends React.Component {\n renderCategories = (matchParams: any) => {\n const occasionId = matchParams[pathParams.occasionId];\n const catId = matchParams[pathParams.categoryId];\n const { menu } = this.props;\n\n if (menu && menu.length > 0) {\n const categoriesObj = _.filter(menu, (occasion: any) => occasion.safe_name === occasionId)[0];\n const foundCategories = _.get(categoriesObj, 'categories');\n return (foundCategories && foundCategories\n .map((category: any) => (\n \n {category.name}\n \n ))\n );\n }\n }\n\n render() {\n return (\n \n \n {this.renderCategories(this.props.matchParams)}\n \n \n );\n }\n}\n\nconst mapStateToProps = state => ({\n menu: state.menu.data,\n navState: state.nav,\n});\n\nexport default connect(mapStateToProps)(MenuNav);\n","import styled from 'styled-components';\n\n// Globals\nimport { COLORS, FONTS, LAYOUT } from '../../styles';\nimport { media } from '../../styles/breakpoints';\nimport { ContainerBlock, NavButton } from '../../styles/mixins';\n\nexport const StyledOccasionLink = styled(NavButton)`\n align-items: center;\n color: ${COLORS.GRAY};\n display: flex;\n flex-shrink: 0;\n font-family: ${FONTS.PRIMARY};\n font-size: 24px;\n font-style: normal;\n height: 100%;\n padding-right: 52px;\n\n ${media.tabletXLarge`\n padding-right: 52px;\n `}\n\n ${media.desktopLarge`\n padding-right: 75px;\n `}\n`;\n\nexport const StyledContent = styled.div`\n align-items: center;\n border-bottom: 1px solid ${COLORS.LIGHT_GRAY};\n display: flex;\n flex-wrap: nowrap;\n height: 100%;\n`;\n\nexport const StyledContainer = styled(ContainerBlock)`\n background: ${COLORS.WHITE};\n height: ${LAYOUT.NAV.M_HEIGHT}px;\n\n overflow-x: scroll;\n -webkit-overflow-scrolling: touch;\n\n ::-webkit-scrollbar {\n width: 0px; /* remove scrollbar space */\n height: 0px; /* remove scrollbar space */\n background: transparent;\n }\n\n -ms-overflow-style: -ms-autohiding-scrollbar;\n\n ${media.tabletXLarge`\n height: ${LAYOUT.NAV.T_HEIGHT}px;\n `}\n\n ${media.desktopLarge`\n height: ${LAYOUT.NAV.D_HEIGHT}px;\n `}\n`;\n","import * as React from 'react';\nimport { connect } from 'react-redux';\nimport {\n StyledContainer,\n StyledContent,\n StyledOccasionLink,\n} from './styles';\n\n// Routes\nimport { pathParams } from '../../constants/routes';\n\n// Utils\nimport { determineFirstCategoryId } from '../../utils/menu';\n\ntype StoreProps = {\n menu: any;\n};\n\ntype PassProps = {\n // TODO - extract into type\n matchParams: {\n [key: string]: string;\n };\n};\n\nclass TopNav extends React.Component {\n\n render() {\n const occasionId = this.props.matchParams[pathParams.occasionId];\n const { menu } = this.props;\n\n /* On click of occasion name in nav (ie: breakfast, lunch, all-day), subnav will always display first menu category */\n return (\n \n \n {menu && menu.length > 0 && menu\n .map(occasion => (\n \n {occasion.name}\n \n ))\n }\n \n \n );\n }\n}\n\nconst mapStateToProps = state => ({\n menu: state.menu.data,\n});\n\nexport default connect(mapStateToProps)(TopNav);\n","import { push } from 'connected-react-router';\nimport React from 'react';\nimport { connect } from 'react-redux';\n\n// Actions\nimport menuActions from '../../redux/menu/actions';\n\n// Utils\nimport { deriveDefaultMenuRoute } from '../../utils/menu';\n\ntype StoreProps = {\n menuData: [];\n menuIndex: object,\n menuLoading: boolean,\n fetchMenu: (arg: {}, supressRedirect?: boolean) => void;\n};\n\ntype PassProps = {\n push: (path: string) => void;\n match: {\n params: {\n [key: string]: string;\n };\n };\n supressRedirect?: boolean;\n};\n\nexport default function menuHandler(WrappedComponent: any) {\n class PageComponent extends React.Component {\n componentDidMount() {\n const { fetchMenu, menuData, match, supressRedirect } = this.props;\n\n // If no menu, fetch it whilst passing all available path params\n if (!menuData.length) {\n fetchMenu(match.params, supressRedirect);\n } else {\n this.reconcileAmbiguousUrl();\n }\n }\n\n componentDidUpdate() {\n this.reconcileAmbiguousUrl();\n }\n\n reconcileAmbiguousUrl = () => {\n const { menuData, match: { params: { occasionId, categoryId } }, supressRedirect } = this.props;\n\n // If we have the menu, but we don't have any parameters\n if (!supressRedirect && menuData.length && !occasionId && !categoryId) {\n this.props.push(deriveDefaultMenuRoute(menuData));\n }\n }\n\n render() {\n return (\n \n );\n }\n }\n\n const mapStateToProps = (state: any) => ({\n menuData: state.menu.data,\n menuIndex: state.menu.menuIndex,\n menuLoading: state.menu.loading,\n });\n\n const mapDispatchToProps = (dispatch: any) => ({\n fetchMenu: (arg: {}, supressRedirect?: boolean) => dispatch(menuActions.fetchMenu(arg, supressRedirect)),\n push: (path: string) => dispatch(push(path)),\n });\n\n return connect(mapStateToProps, mapDispatchToProps)(PageComponent);\n}\n","import { push } from 'connected-react-router';\nimport React from 'react';\nimport { connect } from 'react-redux';\n\ntype PassProps = {\n history: any;\n};\ntype StoreProps = {\n push: (path: string) => void;\n};\nexport default function pageHandler(WrappedComponent: any) {\n class PageComponent extends React.Component {\n componentDidMount() {\n this.transitionPage();\n }\n\n componentDidUpdate() {\n // TODO - only fire if route has changed\n this.transitionPage();\n }\n\n transitionPage = () => {\n // Ensure user is scrolled to top of view\n window.scrollTo(0, 0);\n }\n\n goBackOrRedirect = () => {\n this.props.history.goBack();\n\n // TODO document.referred isn't reliably working on the test envs\n // Go back if same domain, otherwise, push home.\n // if (document.referrer.split('/')[2] !== window.location.host) {\n // this.props.push(routes.menu.base);\n // } else {\n // this.props.history.goBack();\n // }\n }\n\n render() {\n return (\n \n );\n }\n }\n\n const mapDispatchToProps = (dispatch: any) => ({\n push: (path: string) => dispatch(push(path)),\n });\n\n return connect(null, mapDispatchToProps)(PageComponent);\n}\n","import React, { Component } from 'react';\nimport { compose } from 'redux';\n\n// Natural Components\nimport FilterOverlay from '../../components/FilterOverlay';\nimport FilterForm from '../../components/FilterOverlay/form';\nimport FilterStatus from '../../components/FilterStatus';\nimport Footer from '../../components/Footer';\nimport Header from '../../components/Header';\nimport MenuGrid from '../../components/MenuGrid';\nimport SubNav from '../../components/SubNav';\nimport TopNav from '../../components/TopNav';\n// Handlers\nimport menuHandler from '../handlers/menuHandler';\nimport pageHandler from '../handlers/pageHandler';\n\ntype PassProps = {\n match: {\n // TODO - extract into type\n params: {\n [key: string]: string;\n };\n };\n menuLoading: boolean;\n menuData: any;\n};\nclass Menu extends Component {\n render() {\n return (\n <>\n
    \n \n \n \n \n \n \n \n {this.props.menuData.length > 0 && !this.props.menuLoading && localStorage.getItem('kiosk') === null &&