{"version":3,"sources":["components/SideControls/SideControl.js","components/SideControls/SideToolbar.js","components/Shared/SettingsGroup.js","components/Shared/If.js","components/Shared/Cards/Card.js","components/Shared/Cards/CardWrapper.js","components/Shared/Cards/CardSection.js","components/Shared/Cards/CardToolbar.js","components/Shared/Cards/CardTool.js","components/Shared/Cards/CardIcon.js","components/Shared/Cards/CardPreview.js","components/StyleSettings/StylePreview.js","components/LocationSettings/LocationPreview.js","components/Shared/Panel.js","utils/maps.js","components/Shared/GooglePlacesSearch.js","components/Shared/LocationInput.js","components/LocationSettings/LocationForm.js","components/Shared/PanelCancel.js","components/LocationSettings/LocationPanel.js","components/MarkerSettings/MarkerPreviewIcon.js","components/MarkerSettings/MarkerPreviewRow.js","components/MarkerSettings/MarkerPreview.js","containers/MarkerPreviewContainer.js","components/MarkerSettings/IconPicker.js","components/MarkerSettings/IconStyled.js","components/MarkerSettings/IconUpload.js","components/Shared/Collapse.js","components/MarkerSettings/IconCustom.js","components/MarkerSettings/IconSettings.js","components/MarkerSettings/MarkerForm.js","components/MarkerSettings/MarkerPanel.js","components/InfoWindowSettings/InfoWindowPosition.js","components/InfoWindowSettings/InfoWindowContainer.js","components/InfoWindowSettings/InfoWindowBorder.js","components/InfoWindowSettings/InfoWindowArrow.js","components/InfoWindowSettings/InfoWindowShadow.js","components/InfoWindowSettings/InfoWindowBehavior.js","components/Shared/Forms/RichTextEditor/RichTextEditorLoader.js","components/InfoWindowSettings/InfoWindowForm.js","components/InfoWindowSettings/InfoWindowPanel.js","modules/languages.js","components/AdvancedSettings/AdvancedPreview.js","components/AdvancedSettings/CustomControlSection.js","components/AdvancedSettings/CustomControlsSection.js","components/AdvancedSettings/ControlsSection.js","components/AdvancedSettings/BehaviorSection.js","components/AdvancedSettings/LanguagesSelect.js","components/Loading/SmallLoading.js","components/AdvancedSettings/AdvancedForm.js","components/AdvancedSettings/AdvancedPanel.js","components/Shared/Tabs/Tab.js","components/Shared/Tabs/TabContent.js","components/Shared/Tabs/TabGroup.js","modules/filter-options.js","components/StyleSettings/SearchOptions.js","components/StyleSettings/SearchResultPreview.js","components/StyleSettings/SearchResults.js","components/StyleSettings/SearchTab.js","components/StyleSettings/StylePanel.js","components/Save/SaveForm.js","components/Save/SavePanel.js","utils/urls.js","components/Export/HtmlHighlight.js","components/Export/ExportPanel.js","components/Help/HelpPanel.js","components/SideMenu/SideMenu.js","containers/SettingsContainer.js","components/Shared/SnazzyInfoWindow.js","components/Shared/Map.js","components/Map/MapToolbar/Toolbar.js","components/Map/MapToolbar/Control.js","components/Map/MapToolbar/ZoomDropdown.js","components/Map/MapToolbar/ZoomSlider.js","components/Map/MapWrapperScroll.js","components/Map/MapWrapperGuidelines.js","components/Map/MapWrapperOuter.js","components/Map/MapWrapperInner.js","components/Map/MapWrapper.js","components/Shared/Unavailable.js","components/Shared/Ads/AdElement.js","components/Shared/Ads/FixedLargeMobileBanner.js","components/Map/SaveMapStateOnUnload.js","pages/map-builder.js","components/MarkerSettings/IconOptions.js","components/Shared/Forms/RichTextEditor/RichTextEditorConstants.js","components/InfoWindowSettings/InfoWindowConstants.js","components/Map/MapWrapperHelper.js","modules/infoWindow.js","components/Shared/Forms/RichTextEditor/Quill/ColorPicker.js","components/Shared/Forms/RichTextEditor/Quill/FontPicker.js","components/Shared/Forms/RichTextEditor/Quill/FontSizePicker.js","components/Shared/Forms/RichTextEditor/Quill/FontHeaderPicker.js","components/Shared/Forms/RichTextEditor/Quill/PlainClipboard.js","components/Shared/Forms/RichTextEditor/Quill/Theme.js","components/Shared/Forms/RichTextEditor/QuillRichTextEditor.js"],"names":["StyledControl","styled","button","SCAFFOLDING","GUTTER","ifProp","css","BG","TYPOGRAPHY","LINK_COLOR","BASE","BUTTON_PRIMARY","COLOR","ACTIVE","StyledIcon","Icon","FONT_SIZE","LARGE","StyledLabel","span","GUTTER_FACTOR","BOX_SHADOW","TRANSITION","LENGTH_LONG","BEZIER","StyledLabelNew","LabelNew","SMALL","SideControl","glyph","title","newFeature","toggle","active","onClick","aria-expanded","inverse","StyledSideToolbar","div","COLUMN_WIDTH","BREAKPOINTS","lg","md","connect","state","activePanel","getActivePanel","fullscreen","navigation","isAuthenticated","currentUserAuthenticatedSelector","hasApiKey","map","details","apiKey","dispatch","onPanelOpen","panel","mapSaved","PANELS","SAVE","EXPORT","changePanel","showModal","MODAL","CONFIRM_EXPORT_MAP","NOT_AUTHENTICATED","onPanelClose","closePanel","onMapDelete","CONFIRM_MAP_DELETE","onMapReset","CONFIRM_MAP_RESET","onFullScreenToggle","toggleFullscreen","props","useRecoilState","currentMapIdState","isPanelActive","togglePanel","GLYPHS","CODE","CLOSE_CIRCLE","DELETE","CHEVRON_RIGHT","CHEVRON_LEFT","HELP","SettingsLabel","SettingsContent","SETTINGS_GROUP","PADDING","X","Y","prop","SettingsContentHR","hr","SettingsSubGroup","SETTINGS_INPUTS","SUB","SettingsHelper","HelperBlock","SettingsGroup","name","description","labelClassName","contentClassName","children","spacing","alignCenter","className","value","defaultProps","If","statement","React","Children","only","StyledCardContent","FlexRow","CARDS","StyledFlexContent","CustomWrapper","Card","leftGlyph","leftGlyphColor","rightGlyph","rightGlyphColor","hasGlyph","content","inline","color","primary","CardWrapperCSS","BORDER_RADIUS","LENGTH","StyledCardWrapper","StyledCardWrapperButton","HOVER","CardWrapper","CardSectionCSS","BORDER_COLOR","StyledCardSection","StyledCardSectionButton","CardSection","CardToolbar","CardTool","IconButton","ICON","SIZE","CardIcon","COLOR_REDUCED","PreviewRow","PreviewImage","img","PreviewDesc","style","getStyle","onRemoveStyle","CONFIRM_STYLE_REMOVE","onCardClick","hasStyle","id","imageUrl","hasPreview","createdBy","SEARCH","href","url","OPEN_IN_NEW","target","rel","right","REMOVE_OUTLINE","SNAZZY_MAPS_OUTLINE","Label","strong","Value","Preview","size","zoom","lat","lng","width","widthUnit","height","heightUnit","CENTER","EDIT","location","center","TRANSITION_TYPE","main","onClose","transition","PanelWrapper","section","PanelContent","PanelTitle","h1","ClosePanelButton","Panel","handleScrollToTop","context","colPanelContent","scrollEl","ReactDOM","findDOMNode","smoothScroll","parseInt","this","closeButton","CLOSE","component","FirstChild","transitionName","transitionEnterTimeout","transitionLeaveTimeout","open","ref","el","child","cloneElement","scrollToTop","Component","roundLatLng","latLng","precision","parseFloat","toFixed","AutocompleteItem","formattedSuggestion","mainText","secondaryText","StyledFormGroup","FormGroup","ReactSelectCSS","INPUTS","StyledFormControlHelper","GooglePlacesSearch","search","handleSearch","setState","handleSelect","geocodeByAddress","then","results","length","geometry","input","onChange","catch","notify","error","inputProps","placeholder","autoComplete","htmlFor","classNames","root","autocompleteContainer","autocompleteItem","onSelect","onEnterKeyDown","MODES","LocationInput","mode","defaultMode","address","renderFields","place","showSearch","placeProps","handleToggle","labelInline","required","type","label","step","parseFields","includes","inRange","min","max","parseDecimalInput","hasValue","Math","e","preventDefault","prevState","Fields","names","parse","StyledInput","Input","StyledSelect","Select","StyledSettingsHelper","validRange","unit","MAP_DIMENSION_UNIT","PERCENT","range","mapDispatchToProps","onSizeChange","changeSize","onSaveLocation","saveLocation","initialValues","reduxForm","form","formName","validate","onSubmit","values","onSubmitFail","handleSubmit","onCancel","units","Object","x","FormSection","options","highlight","MIN_ZOOM","MAX_ZOOM","secondary","withCancel","dispatches","PanelComponent","DiscardPanel","isDirty","CONFIRM_PANEL_CLOSE","forEach","action","clearPreviewLocation","padding","StyledMarkerPreview","MarkerImage","MarkerIcon","MarkerPreviewIcon","icon","MARKER_TYPE","DEFAULT","src","STYLED","styledMarkerId","STYLED_MARKER","CUSTOM","image","MarkerPreview","styleImageUrl","StyledFlexRow","MarkerPreviewRow","marker","onHighlightClick","onEditClick","onDeleteClick","onInfoWindowClick","MY_LOCATION","INFO_WINDOW","markers","onAddClick","hasMarkers","MARKER_OUTLINE","outlined","block","getMarkers","getPreviewLocationZoom","changePreviewLocation","MARKER","CONFIRM_MARKER_DELETE","setActiveMarker","MarkerPicker","i","selected","handleClick","StyledContainer","ContentSet","xxl","IconStyled","Field","IconPicker","unitAfter","StyledDropzone","Dropzone","chroma","alpha","COLORS","SUCCESS","DANGER","StyledDropzoneIcon","StyledUploadedFile","StyledUploadedImageWrapper","StyledUploadedImage","StyledUploadedRemove","LinkButton","StyledAnchor","StyledAnchorInner","StyledAnchorBg","StyledAnchorBorder","IconUploadField","handleAccepted","filesToUpload","postFile","handleRejected","handleRemoveFile","renderInnerDropzone","message","isDragActive","isDragReject","CHECK","PUBLISH","anchor","alt","top","y","left","meta","touched","hasError","onDropAccepted","onDropRejected","multiple","maxSize","accept","activeClassName","rejectClassName","renderUploadedFile","IconUpload","isOpened","StyledCollapseContent","CollapseContent","callback","collapseContent","offsetHeight","setAttribute","classList","add","setTimeout","remove","removeAttribute","Collapse","StyledCollapse","IconCustom","handleImageChange","updateIcon","round","handleWidthChange","updateSliderValue","handleHeightChange","property","oldMax","newMax","slider","getScaledValue","newValue","deferred","change","StyledFormSection","IconSettings","isSelected","formValue","formValueSelector","getActiveMarker","v4","anchorX","anchorY","requiredLocation","saveMarker","MarkerPanel","handleClose","clearActiveMarker","InfoWindowPosition","entries","INFO_WINDOW_POSITION","key","obj","titlePlacement","InfoWindowPositionField","InfoWindowContainer","defaultValues","optional","borderRadius","withComponent","InfoWindowBorder","showBorder","toggleSwitch","labelPosition","LABEL_POSITION","LEFT","collapsible","InfoWindowArrow","showArrow","InfoWindowShadow","showShadow","h","v","blur","spread","opacity","StyledCheckbox","Checkbox","InfoWindowBehavior","RIGHT","loaded","require","default","err","RichTextEditorLoader","HasLoaded","styleOptions","INFO_WINDOW_STYLES","k","StyledHR","HR","Subheading","H2","AdvancedToggle","BUTTON","StyledButtonSet","ButtonSet","RichTextError","InfoWindowForm","persistentValues","fontColor","backgroundColor","handleStyleChange","onToggleAdvanced","enabled","showAdvanced","container","border","arrow","shadow","selector","get","activeMarker","position","behavior","maxWidth","maxHeight","infoWindow","mergeFormAndStyle","TOP","openByDefault","closeOnMapClick","closeWhenOthersOpen","getDefaultValues","getState","currentState","formChange","editMarkerInfoWindow","onSubmitSuccess","result","formInitialize","keepDirty","InfoWindowPanel","languagesSelector","a","httpGet","response","languages","languageNameByCodeSelector","selectorFamily","language","matchedLanguage","find","code","Language","HighlightText","COLOR_DANGER","getLanguage","controls","controlsDescription","behaviorDescription","languageMismatch","languageName","useRecoilValue","SETTINGS","opts","keys","positionOptions","controlPositions","mapTypeStyles","typeOptions","mapTypes","INPUT_TOGGLES","WIDTH","SectionHeader","SectionTitle","StyledHelpButton","HelpButton","StyledMultiSelect","MultiSelect","ownProps","help","CustomControlsSection","showCustom","controlsType","HIDE_ALL","BehaviorSection","LanguagesSelect","selectOptions","useMemo","searchable","SmallLoading","styles","loading","circle","stroke","mapTileLanguage","getMapTileLanguage","getAdvancedSettings","saveAdvancedSettings","cancelPanel","mapTypeOptions","charAt","toUpperCase","slice","mapTileLanguageName","fallback","StyledTab","TABS","BORDER","Tab","StyledTabContent","TabContent","isOpen","StyledTabs","TabContentWrapper","TabGroup","tabs","onTabClick","tab","index","Child","filterOptionsSelector","sortOptions","tagOptions","colorOptions","StyledSearchOptions","SECTIONS","StyledButton","TextButton","SearchOptions","handleSearchClicked","sorts","tags","colors","normalize","event","clearable","Style","DARK","StyleImage","StyleDesc","StyleName","StyleBy","StyleCheck","SearchResultPreview","selectStyle","backgroundImage","PaginateContainer","PAGINATION","SELECTED","DISABLED","NoResults","SearchResults","selectedStyle","page","pageCount","handlePageChange","handleStyleSelected","s","initialPage","forcePage","pageRangeDisplayed","marginPagesDisplayed","onPageChange","disableInitialCallback","previousLabel","nextLabel","SearchTab","undefined","searchResult","showLoginMessage","nextProps","searchQuery","onLoginClick","onRegisterClick","text","login","register","tabIndex","renderLoginMessage","debounce","clearPreviewStyleAction","setPreviewStyleAction","searchAction","LOGIN","REGISTER","stateProps","dispatchProps","assign","requiresAuthentication","StyledForm","ScrollWrapper","ScrollContent","ScrollFooter","handleOnMount","selectedTab","handleTabChange","styleScrollContent","StylePanel","mapStyle","previewStyle","otherProps","getPreviewStyle","stylePanel","fields","saveFieldsAction","setStyleAction","setTabAction","getDetails","saveDetails","submitting","mapId","getAbsoluteUrl","relativeUrl","window","origin","hljs","registerLanguage","xml","codeStyle","HtmlHighlight","html","__html","dangerouslySetInnerHTML","CodeBlock","StyledTextButton","StyledHelperBlock","di","onCopy","success","embedUrl","previewUrl","iframeText","HelpPanel","routes","myMaps","path","SideMenuWrapper","StyledPanelTitle","NumberedContentSet","NumberedSettingsGroup","NumberedStylePreview","StylePreview","NumberedLocationPreview","LocationPreview","NumberedMarkerPreview","MarkerPreviewContainer","NumberedAdvancedPreview","AdvancedPreview","LOCATION","MAIN","STYLE","ADVANCED_SETTINGS","SettingsContainer","panelOpen","_destroyed","close","Snazzy","SnazzyInfoWindow","createInfoWindow","that","ANCHOR","callbacks","afterOpen","onLocationChange","panOnOpen","beforeOpen","_opts","shouldRecreate","nextOptions","immutableChanged","immutableProperties","some","p","deepEqual","missingKey","resetOpenState","mapReset","isEditMode","isActive","destroy","nextContext","nextState","nextInfo","oldInfo","oldProps","enterEditMode","exitEditMode","resetMap","isMapReset","prevProps","setContent","draw","resize","reposition","contextTypes","PropTypes","object","SnazzyMap","withScriptjs","withGoogleMap","onPan","onLoad","onZoom","onMarkerDragEnd","onMapTypeChange","noop","onDragEnd","onZoomChanged","onMapTypeIdChanged","draggable","zIndex","getIconOptions","optimized","isIconOptimized","handleMarkerDragEnd","Map","loadingElement","containerElement","mapElement","StyledMapToolbar","Z_INDEX","indexOf","breakpoint","SIDECONTROLS","MapToolbar","guides","onToggleGuides","previewZoom","onChangePreviewZoom","onSnapToCenter","onFitToScreen","RESTORE_MAP","ZOOM_OUT","data-zoom","ZOOM_IN","StyledMapToolbarControl","MAPTOOLBAR","HEIGHT","MapToolbarControl","DropdownToggle","SELECTS","DropdownToggleLabel","DropdownContent","DropdownItem","OPTION","HOVER_BG","MapToolbarDropdown","handleToggleClick","dropdown","zoomDropdown","hide","show","CARET_DOWN","StyledSlider","SliderComponent","MapToolbarSlider","handle","SliderHandle","StyledMapWrapperScroll","MapWrapperScroll","StyledMapWrapperGuidelines","MapWrapperGuidelines","StyledMapWrapperOuter","MapWrapperOuter","StyledMapWrapperInner","MapWrapperInner","StyledMapWrapper","MapWrapper","handleMapLoad","handleLocationChange","currentLocation","getCurrentLocation","onPreviewLocationChange","isLocationPanelActive","markerId","isMarkerPanelActive","onActiveMarkerLocationChange","handleMapTypeChange","isAdvancedSettingsPanelActive","getMapTypeId","handleMapClick","handleScrollUpdate","mapWrapperScroll","childEl","mapWrapperGuidelines","offsetWidth","scrollLeft","scrollTop","handleGuideDimen","dimen","gutter","outerWidth","offset","PIXEL","handleOuterDimen","innerDimen","handleInnerDimen","handleOnChangePreviewZoom","handleOnFitToScreen","wrapper","mapWrapper","wrapperWidth","wrapperHeight","mapWidth","mapHeight","zoomWidth","zoomHeight","previewWidthUnit","previewWidth","previewHeightUnit","previewHeight","handleMapResize","mapInstance","MAP_KEY","google","maps","trigger","panTo","getCenter","getZoom","propsChanged","requestAnimationFrame","LENGTH_LONG_VALUE","googleMapURL","changePreviewZoom","mapType","googleProps","getGoogleMapsProps","mapSize","getMapSize","getPreviewZoom","UnavailableWrapper","Unavailable","AdElement","display","client","slot","layout","layoutKey","format","responsive","pageLevelAds","rest","useEffect","google_ad_client","enable_page_level_ads","adsbygoogle","push","data-ad-client","data-ad-slot","data-ad-layout","data-ad-layout-key","data-ad-format","data-full-width-responsive","FixedLargeMobileBanner","useState","setOpen","useCallback","SaveMapStateOnUnload","useDispatch","save","saveState","addEventListener","removeEventListener","MapBuilder","useRoute","mapBuilderEdit","match","params","currentMapId","setCurrentMapId","currentMapSelector","int","isNaN","parseId","loadedState","setLoadedState","localState","loadState","clearState","setCurrentMap","mapBuilder","isUpgradedUser","useSelector","currentUserIsUpgradedUserSelector","MARKER1","MARKER2","MARKER3","MARKER4","MARKER5","getStyledIconOptions","getCustomIconOptions","test","styledMarker","MARKER_PATHS","scale","getScaleFromSize","STYLED_MARKER_SIZE","fillOpacity","fillColor","strokeOpacity","isInt","scaledSize","Size","Point","DEFAULT_FONT_SIZE","FONT_SIZES","FONTS","fontFamily","DEFAULT_FONT_INDEX","DEFAULT_FONT","RichTextEditorOptions","DefaultFontSize","DefaultFontFamily","BOTTOM","BASE_STYLE","background","parseIndex","styleIndex","formValues","deepExtend","advancedSettings","controlProps","forceEnabled","mapTypeIds","control","custom","types","preview","getPreviewLocation","forceEnableZoomPan","process","getMarkersWithForm","snazzyInfoWindowOptions","clickableIcons","disableDoubleClickZoom","doubleClickToZoom","panning","keyboardShortcuts","scrollwheel","scrollToZoom","eval","json","maxZoom","minZoom","mapTypeId","isActiveMarker","getFormValues","w","aX","aY","placement","getPointerPlacement","defaults","ifSet","defaultValue","pixelFormat","wrapperClass","ReactDOMServer","renderToStaticMarkup","fontSize","pointer","openOnMarkerClick","SnazzyColorPicker","option","item","dataset","innerHTML","Quill","import","SnazzyFontPicker","select","items","querySelector","selectItem","selectedIndex","Parchment","FontStyle","node","canAdd","replace","getFontIndex","fontIndex","Attributor","scope","Scope","INLINE","SnazzyFontSizePicker","FontSizeStyle","getFontSize","FONT_HEADERS","SnazzyFontHeaderPicker","Clipboard","resetAttributes","PlainClipboard","delta","ops","op","attribute","attributes","SnazzyQuillTheme","selects","icons","customPickers","contains","fillSelect","ColorPicker","font","document","createElement","appendChild","fillFontSelect","FontPicker","fillFontSizeSelect","FontSizePicker","FontHeaderPicker","filter","findIndex","pickers","splice","Group","Item","StyledRichTextEditor","StyledCustomToolbar","MENU","LINE_HEIGHT","ACTIVE_BG","ACTIVE_COLOR","CustomReactQuill","setEditorContents","editor","sel","getSelection","clipboard","dangerouslyPasteHTML","setContents","setEditorSelection","ReactQuill","StyledReactQuill","InputCSS","RichTextEditorWrapper","handleOnChange","source","base64ImageRegex","trimmedValue","trimmedDelta","getContents","insert","bind","theme","modules","toolbar","QuillRichTextEditorField"],"mappings":"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","file":"static/js/build-a-map.10effd37.chunk.js","sourcesContent":["import React from 'react';\r\nimport styled, { css } from 'styled-components';\r\nimport { ifProp } from 'styled-tools';\r\n\r\nimport { LabelNew } from 'components/Shared/Scaffolding';\r\nimport { Icon } from 'components/Shared/Icon';\r\nimport { SCAFFOLDING, BUTTON_PRIMARY, TYPOGRAPHY, TRANSITION } from 'theme';\r\n\r\nconst StyledControl = styled.button`\r\n    position: relative;\r\n    width: ${SCAFFOLDING.GUTTER};\r\n    height: 50px;\r\n    padding: 0;\r\n    border: 0;\r\n\r\n    ${ifProp(\r\n        'toggle',\r\n        css`\r\n            flex: 1 0 auto;\r\n            background-color: ${SCAFFOLDING.BG};\r\n            color: ${TYPOGRAPHY.LINK_COLOR.BASE};\r\n        `,\r\n        css`\r\n            background-color: ${BUTTON_PRIMARY.BG.BASE};\r\n            color: ${BUTTON_PRIMARY.COLOR.BASE};\r\n\r\n            svg {\r\n                height: 100%;\r\n            }\r\n        `\r\n    )}\r\n\r\n    ${ifProp(\r\n        'active',\r\n        `\r\n        background-color: ${BUTTON_PRIMARY.BG.ACTIVE};\r\n    `\r\n    )}\r\n`;\r\n\r\nconst StyledIcon = styled(Icon)`\r\n    position: relative;\r\n    z-index: 2;\r\n    font-size: ${TYPOGRAPHY.FONT_SIZE.LARGE};\r\n`;\r\n\r\nconst StyledLabel = styled.span`\r\n    display: block;\r\n    position: absolute;\r\n    top: 0;\r\n    left: 0;\r\n    height: 100%;\r\n    padding-left: ${SCAFFOLDING.GUTTER};\r\n    padding-right: ${SCAFFOLDING.GUTTER_FACTOR(0.25)};\r\n    z-index: 1;\r\n    visibility: hidden;\r\n    background-color: inherit;\r\n    box-shadow: ${SCAFFOLDING.BOX_SHADOW.BASE};\r\n    color: transparent;\r\n    line-height: 50px;\r\n    white-space: nowrap;\r\n    transform: translate(-100%, 0);\r\n    transition: all ${TRANSITION.LENGTH_LONG} ${TRANSITION.BEZIER};\r\n\r\n    button:hover &,\r\n    button:focus & {\r\n        visibility: visible;\r\n        color: inherit;\r\n        transform: translate(0, 0);\r\n    }\r\n`;\r\n\r\nconst StyledLabelNew = styled(LabelNew)`\r\n    margin-left: 6px;\r\n    opacity: 0;\r\n    font-size: ${TYPOGRAPHY.FONT_SIZE.SMALL};\r\n    font-weight: 700;\r\n    transition: opacity ${TRANSITION.LENGTH_LONG} ${TRANSITION.BEZIER};\r\n\r\n    button:hover &,\r\n    button:focus & {\r\n        opacity: 1;\r\n    }\r\n`;\r\n\r\nconst SideControl = ({ glyph, title, newFeature, toggle, active, onClick }) => (\r\n    <StyledControl toggle={toggle} active={active} onClick={onClick} aria-expanded=\"false\">\r\n        <StyledIcon glyph={glyph} />\r\n        {title && (\r\n            <StyledLabel>\r\n                {title}\r\n                {newFeature && <StyledLabelNew inverse>NEW</StyledLabelNew>}\r\n            </StyledLabel>\r\n        )}\r\n    </StyledControl>\r\n);\r\n\r\nexport default SideControl;\r\n","import React from 'react';\r\nimport { connect } from 'react-redux';\r\nimport PropTypes from 'prop-types';\r\nimport styled, { css } from 'styled-components';\r\nimport { ifProp } from 'styled-tools';\r\n\r\nimport SideControl from 'components/SideControls/SideControl';\r\nimport { GLYPHS } from 'components/Shared/Icon';\r\nimport { BREAKPOINTS, SCAFFOLDING, TRANSITION } from 'theme';\r\nimport { PANELS, changePanel, closePanel, getActivePanel } from 'modules/navigation/activePanel';\r\nimport { toggleFullscreen } from 'modules/navigation/fullscreen';\r\nimport { showModal } from 'modules/modal';\r\nimport MODAL from 'components/Shared/Modals';\r\nimport { currentUserAuthenticatedSelector } from 'modules/currentUser';\r\nimport { useRecoilState } from 'recoil';\r\nimport { currentMapIdState } from 'modules/map';\r\n\r\nconst StyledSideToolbar = styled.div`\r\n    display: flex;\r\n    flex-direction: column;\r\n    position: absolute;\r\n    top: 0;\r\n    right: auto;\r\n    bottom: 0;\r\n    left: ${SCAFFOLDING.COLUMN_WIDTH(5)};\r\n    z-index: 1;\r\n    box-shadow: ${SCAFFOLDING.BOX_SHADOW.BASE};\r\n    visibility: visible;\r\n    transform: translate(-125%, 0);\r\n    transition: all ${TRANSITION.LENGTH_LONG} ${TRANSITION.BEZIER};\r\n\r\n    @media (min-width: ${`${BREAKPOINTS.lg}px`}) {\r\n        left: ${SCAFFOLDING.COLUMN_WIDTH(4)};\r\n    }\r\n\r\n    @media (max-width: ${`${BREAKPOINTS.md - 1}px`}) {\r\n        display: none;\r\n    }\r\n\r\n    ${ifProp(\r\n        'active',\r\n        css`\r\n            transform: translate(0, 0) !important;\r\n        `\r\n    )}\r\n\r\n    ${ifProp(\r\n        'fullscreen',\r\n        css`\r\n            left: 0 !important;\r\n        `\r\n    )}\r\n`;\r\n\r\nconst propTypes = {\r\n    activePanel: PropTypes.string,\r\n    isAuthenticated: PropTypes.bool.isRequired,\r\n    hasApiKey: PropTypes.bool.isRequired,\r\n    onPanelClose: PropTypes.func.isRequired,\r\n    onPanelOpen: PropTypes.func.isRequired,\r\n};\r\n\r\nconst SideToolbar = ({ activePanel = null, ...props }) => {\r\n    const {\r\n        onMapDelete,\r\n        onMapReset,\r\n        fullscreen,\r\n        onFullScreenToggle,\r\n        onPanelOpen,\r\n        onPanelClose,\r\n        isAuthenticated,\r\n        hasApiKey,\r\n    } = props;\r\n    const [mapId] = useRecoilState(currentMapIdState);\r\n    const mapSaved = !!mapId;\r\n\r\n    const isPanelActive = (panel) => activePanel === panel;\r\n    const togglePanel = (panel) => {\r\n        if (isPanelActive(panel)) {\r\n            onPanelClose();\r\n        } else {\r\n            onPanelOpen(panel, isAuthenticated, mapSaved, hasApiKey);\r\n        }\r\n    };\r\n\r\n    return (\r\n        <StyledSideToolbar active fullscreen={fullscreen}>\r\n            <SideControl\r\n                title=\"Save\"\r\n                glyph={GLYPHS.SAVE}\r\n                active={isPanelActive(PANELS.SAVE)}\r\n                onClick={() => togglePanel(PANELS.SAVE)}\r\n            />\r\n            <SideControl\r\n                title=\"View Code\"\r\n                glyph={GLYPHS.CODE}\r\n                active={isPanelActive(PANELS.EXPORT)}\r\n                onClick={() => togglePanel(PANELS.EXPORT)}\r\n            />\r\n            <SideControl title=\"Discard Changes\" glyph={GLYPHS.CLOSE_CIRCLE} onClick={onMapReset} />\r\n            {mapSaved && <SideControl title=\"Delete Map\" glyph={GLYPHS.DELETE} onClick={onMapDelete} />}\r\n            <SideControl\r\n                toggle\r\n                glyph={fullscreen ? GLYPHS.CHEVRON_RIGHT : GLYPHS.CHEVRON_LEFT}\r\n                onClick={onFullScreenToggle}\r\n            />\r\n            <SideControl\r\n                title=\"Help\"\r\n                glyph={GLYPHS.HELP}\r\n                active={isPanelActive(PANELS.HELP)}\r\n                onClick={() => togglePanel(PANELS.HELP)}\r\n            />\r\n        </StyledSideToolbar>\r\n    );\r\n};\r\n\r\nSideToolbar.propTypes = propTypes;\r\n\r\nconst mapStateToProps = (state) => ({\r\n    activePanel: getActivePanel(state),\r\n    fullscreen: state.navigation.fullscreen,\r\n    isAuthenticated: currentUserAuthenticatedSelector(state),\r\n    hasApiKey: !!state.map.details.apiKey,\r\n});\r\n\r\nconst mapDispatchToProps = (dispatch) => ({\r\n    onPanelOpen: (panel, isAuthenticated, mapSaved, hasApiKey) => {\r\n        if (panel === PANELS.SAVE || panel === PANELS.EXPORT) {\r\n            if (!isAuthenticated) {\r\n                dispatch(showModal(MODAL.NOT_AUTHENTICATED));\r\n                return;\r\n            }\r\n        }\r\n        if (panel === PANELS.EXPORT && (!mapSaved || !hasApiKey)) {\r\n            dispatch(showModal(MODAL.CONFIRM_EXPORT_MAP));\r\n            return;\r\n        }\r\n        dispatch(changePanel(panel));\r\n    },\r\n    onPanelClose: () => dispatch(closePanel()),\r\n    onMapDelete: () => dispatch(showModal(MODAL.CONFIRM_MAP_DELETE)),\r\n    onMapReset: () => dispatch(showModal(MODAL.CONFIRM_MAP_RESET)),\r\n    onFullScreenToggle: () => dispatch(toggleFullscreen()),\r\n});\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(SideToolbar);\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport styled, { css } from 'styled-components';\r\nimport { ifProp, prop } from 'styled-tools';\r\n\r\nimport { FlexRow, HelperBlock } from 'components/Shared/Scaffolding';\r\nimport { HelpButton } from 'components/Shared/Buttons';\r\nimport { SCAFFOLDING, SETTINGS_GROUP, SETTINGS_INPUTS } from 'theme';\r\n\r\nconst propTypes = {\r\n    name: PropTypes.string.isRequired,\r\n    description: PropTypes.string,\r\n    children: PropTypes.node.isRequired,\r\n};\r\n\r\nconst defaultProps = {\r\n    description: null,\r\n    children: null,\r\n};\r\n\r\nconst SettingsLabel = styled.span`\r\n    font-weight: 700;\r\n    text-transform: uppercase;\r\n`;\r\n\r\nconst SettingsContent = styled.div`\r\n    margin-top: 4px;\r\n    margin-left: -${SETTINGS_GROUP.PADDING.X};\r\n    margin-right: -${SETTINGS_GROUP.PADDING.X};\r\n    padding: ${SETTINGS_GROUP.PADDING.Y} ${SETTINGS_GROUP.PADDING.X};\r\n    background-color: ${SETTINGS_GROUP.BG.BASE};\r\n\r\n    ${ifProp(\r\n        'spacing',\r\n        css`\r\n            > * + * {\r\n                margin-top: ${prop('spacing')};\r\n            }\r\n        `\r\n    )};\r\n`;\r\n\r\nconst SettingsContentHR = styled.hr`\r\n    margin-left: -${SETTINGS_GROUP.PADDING.X};\r\n    margin-right: -${SETTINGS_GROUP.PADDING.X};\r\n    border-top: 1px solid #fff;\r\n`;\r\n\r\nconst SettingsSubGroup = styled.div`\r\n    margin-left: -${SETTINGS_INPUTS.PADDING.X};\r\n    margin-right: -${SETTINGS_INPUTS.PADDING.X};\r\n    padding: ${SCAFFOLDING.GUTTER_FACTOR(0.5)} ${SETTINGS_INPUTS.PADDING.X};\r\n    background-color: ${SETTINGS_INPUTS.BG.SUB};\r\n\r\n    & + & {\r\n        margin-top: 1px;\r\n    }\r\n\r\n    *:not(&) + & {\r\n        margin-top: ${SCAFFOLDING.GUTTER_FACTOR(0.5)};\r\n    }\r\n\r\n    &:last-child {\r\n        margin-bottom: -${SETTINGS_GROUP.PADDING.Y};\r\n    }\r\n\r\n    ${ifProp(\r\n        'collapsible',\r\n        css`\r\n            padding: 0;\r\n\r\n            .ReactCollapse--content {\r\n                padding: ${SCAFFOLDING.GUTTER_FACTOR(0.5)} ${SCAFFOLDING.GUTTER};\r\n            }\r\n        `\r\n    )}\r\n`;\r\n\r\nconst SettingsHelper = styled(HelperBlock)`\r\n    & + *,\r\n    * + & {\r\n        margin-top: ${SETTINGS_GROUP.PADDING.Y};\r\n    }\r\n\r\n    ${ifProp(\r\n        'highlight',\r\n        css`\r\n            margin-left: -${SETTINGS_GROUP.PADDING.X};\r\n            margin-right: -${SETTINGS_GROUP.PADDING.X};\r\n        `\r\n    )}\r\n`;\r\n\r\nconst SettingsGroup = ({ name, description, labelClassName, contentClassName, children, spacing, ...props }) => {\r\n    return (\r\n        <div {...props}>\r\n            <FlexRow alignCenter className={labelClassName} spacing={SCAFFOLDING.GUTTER_FACTOR(0.25)}>\r\n                <SettingsLabel>{name}</SettingsLabel>\r\n                <HelpButton value={description} />\r\n            </FlexRow>\r\n            <SettingsContent className={contentClassName} spacing={spacing}>\r\n                {children}\r\n            </SettingsContent>\r\n        </div>\r\n    );\r\n};\r\n\r\nSettingsGroup.propTypes = propTypes;\r\nSettingsGroup.defaultProps = defaultProps;\r\n\r\nexport default SettingsGroup;\r\nexport { SettingsContentHR, SettingsSubGroup, SettingsHelper };\r\n","import React from 'react';\r\n\r\nconst If = ({ statement, children }) => {\r\n    return statement ? React.Children.only(children) : null;\r\n};\r\n\r\nexport default If;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport styled, { css } from 'styled-components';\r\n\r\nimport { CardWrapper, CardSection, CardIcon } from 'components/Shared/Cards';\r\nimport { CARDS } from 'theme';\r\nimport { CustomWrapper, FlexRow } from 'components/Shared/Scaffolding';\r\n\r\nconst propTypes = {\r\n    onClick: PropTypes.func,\r\n    children: PropTypes.node.isRequired,\r\n};\r\n\r\nconst defaultProps = {\r\n    onClick: null,\r\n};\r\n\r\nconst StyledCardContent = styled(FlexRow)`\r\n    padding: ${CARDS.GUTTER};\r\n`;\r\n\r\nconst StyledFlexContent = CustomWrapper(\r\n    css`\r\n        flex: 1 1 auto;\r\n        width: 100%;\r\n        min-width: 50%;\r\n    `\r\n);\r\n\r\nconst Card = ({ onClick, leftGlyph, leftGlyphColor, rightGlyph, rightGlyphColor, children, ...props }) => {\r\n    const hasGlyph = leftGlyph || rightGlyph;\r\n    const content = <StyledFlexContent inline={!!onClick}>{children}</StyledFlexContent>;\r\n\r\n    return hasGlyph ? (\r\n        <CardWrapper onClick={onClick} {...props}>\r\n            <StyledCardContent alignCenter inline={!!onClick} hasGlyph={hasGlyph}>\r\n                {leftGlyph && <CardIcon glyph={leftGlyph} color={leftGlyphColor} />}\r\n                {content}\r\n                {rightGlyph && <CardIcon primary glyph={rightGlyph} color={rightGlyphColor} />}\r\n            </StyledCardContent>\r\n        </CardWrapper>\r\n    ) : (\r\n        <CardWrapper onClick={onClick} {...props}>\r\n            <CardSection>{children}</CardSection>\r\n        </CardWrapper>\r\n    );\r\n};\r\n\r\nCard.propTypes = propTypes;\r\nCard.defaultProps = defaultProps;\r\n\r\nexport default Card;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport styled, { css } from 'styled-components';\r\nimport { CARDS, TRANSITION } from 'theme';\r\n\r\nconst propTypes = {\r\n    onClick: PropTypes.func,\r\n    children: PropTypes.node.isRequired,\r\n};\r\n\r\nconst defaultProps = {\r\n    onClick: null,\r\n};\r\n\r\nconst CardWrapperCSS = css`\r\n    width: 100%;\r\n    background-color: ${CARDS.BG};\r\n    border: 0;\r\n    border-radius: ${CARDS.BORDER_RADIUS};\r\n    box-shadow: ${CARDS.BOX_SHADOW.BASE};\r\n    text-align: left;\r\n    transition: all ${TRANSITION.LENGTH} ${TRANSITION.BEZIER};\r\n`;\r\n\r\nconst StyledCardWrapper = styled.div`\r\n    ${CardWrapperCSS}\r\n`;\r\n\r\nconst StyledCardWrapperButton = styled.button`\r\n    ${CardWrapperCSS}\r\n    min-height: 5em;\r\n    padding: 0;\r\n    cursor: pointer;\r\n\r\n    &:hover,\r\n    &:focus {\r\n        box-shadow: ${CARDS.BOX_SHADOW.HOVER};\r\n    }\r\n\r\n    &:active {\r\n        box-shadow: ${CARDS.BOX_SHADOW.ACTIVE};\r\n    }\r\n`;\r\n\r\nconst CardWrapper = ({ onClick, children, ...props }) => {\r\n    return onClick ? (\r\n        <StyledCardWrapperButton onClick={onClick} {...props}>\r\n            {children}\r\n        </StyledCardWrapperButton>\r\n    ) : (\r\n        <StyledCardWrapper {...props}>{children}</StyledCardWrapper>\r\n    );\r\n};\r\n\r\nCardWrapper.propTypes = propTypes;\r\nCardWrapper.defaultProps = defaultProps;\r\n\r\nexport default CardWrapper;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport styled, { css } from 'styled-components';\r\nimport { SCAFFOLDING, CARDS } from 'theme';\r\n\r\nconst propTypes = {\r\n    onClick: PropTypes.func,\r\n    children: PropTypes.node.isRequired,\r\n};\r\n\r\nconst defaultProps = {\r\n    onClick: null,\r\n};\r\n\r\nconst CardSectionCSS = css`\r\n    position: relative;\r\n    width: 100%;\r\n    padding: ${CARDS.GUTTER};\r\n\r\n    * + & {\r\n        border-top: 1px solid ${SCAFFOLDING.BORDER_COLOR};\r\n    }\r\n`;\r\n\r\nconst StyledCardSection = styled.div`\r\n    ${CardSectionCSS}\r\n`;\r\n\r\nconst StyledCardSectionButton = styled.button`\r\n    ${CardSectionCSS}\r\n    min-height: 5em;\r\n    background: none;\r\n    border: 0;\r\n    text-align: left;\r\n`;\r\n\r\nconst CardSection = ({ onClick, children, ...props }) => {\r\n    return onClick ? (\r\n        <StyledCardSectionButton onClick={onClick} {...props}>\r\n            {children}\r\n        </StyledCardSectionButton>\r\n    ) : (\r\n        <StyledCardSection {...props}>{children}</StyledCardSection>\r\n    );\r\n};\r\n\r\nCardSection.propTypes = propTypes;\r\nCardSection.defaultProps = defaultProps;\r\n\r\nexport default CardSection;\r\n","import styled from 'styled-components';\r\n\r\nimport { CardSection } from 'components/Shared/Cards';\r\nimport { SCAFFOLDING } from 'theme';\r\n\r\nconst CardToolbar = styled(CardSection)`\r\n    padding: 0 ${SCAFFOLDING.GUTTER_FACTOR(0.25)};\r\n\r\n    &:after {\r\n        content: '';\r\n        display: table;\r\n        clear: both;\r\n    }\r\n`;\r\n\r\nexport default CardToolbar;\r\n","import styled from 'styled-components';\r\nimport { ifProp } from 'styled-tools';\r\n\r\nimport { IconButton } from 'components/Shared/Buttons';\r\nimport { SCAFFOLDING, CARDS, TRANSITION } from 'theme';\r\n\r\nconst CardTool = styled(IconButton)`\r\n    display: inline-block;\r\n    padding: ${SCAFFOLDING.GUTTER_FACTOR(0.25)};\r\n    cursor: pointer;\r\n    font-size: ${CARDS.ICON.SIZE};\r\n    line-height: 0;\r\n    transition: transform ${TRANSITION.LENGTH} ${TRANSITION.BEZIER};\r\n\r\n    ${ifProp(\r\n        'right',\r\n        `\r\n        float: right;\r\n    `\r\n    )}\r\n\r\n    &:hover,\r\n    &:focus {\r\n        transform: scale(1.25);\r\n    }\r\n`;\r\n\r\nexport default CardTool;\r\n","import styled, { css } from 'styled-components';\r\nimport { ifProp } from 'styled-tools';\r\n\r\nimport { Icon } from 'components/Shared/Icon';\r\nimport { TYPOGRAPHY, CARDS, TRANSITION } from 'theme';\r\n\r\nconst CardIcon = styled(Icon)`\r\n    color: ${ifProp('primary', TYPOGRAPHY.LINK_COLOR.BASE, TYPOGRAPHY.COLOR_REDUCED)};\r\n    font-size: ${CARDS.ICON.SIZE};\r\n\r\n    ${ifProp(\r\n        'primary',\r\n        css`\r\n            transition: transform ${TRANSITION.LENGTH} ${TRANSITION.BEZIER};\r\n\r\n            button:hover &,\r\n            button:focus & {\r\n                color: ${TYPOGRAPHY.LINK_COLOR.HOVER};\r\n                transform: scale(1.25);\r\n            }\r\n        `\r\n    )}\r\n`;\r\n\r\nexport default CardIcon;\r\n","import styled, { css } from 'styled-components';\r\nimport { ifProp } from 'styled-tools';\r\n\r\nimport { CardSection } from 'components/Shared/Cards';\r\nimport { SCAFFOLDING } from 'theme';\r\n\r\nexport const PreviewRow = styled(CardSection)`\r\n    display: flex;\r\n    align-items: center;\r\n\r\n    > * + * {\r\n        margin-left: ${SCAFFOLDING.GUTTER_FACTOR(0.5)};\r\n    }\r\n`;\r\n\r\nexport const PreviewImage = styled.span`\r\n    display: block;\r\n    position: absolute;\r\n    top: 0;\r\n    bottom: 0;\r\n    left: 0;\r\n    width: ${SCAFFOLDING.COLUMN_WIDTH(5)};\r\n    background: #eee url(${(props) => props.img}) center no-repeat;\r\n    background-size: cover;\r\n`;\r\n\r\nexport const PreviewDesc = styled.span`\r\n    flex: 1 1 auto;\r\n    display: block;\r\n\r\n    ${ifProp(\r\n        'hasPreview',\r\n        css`\r\n            width: ${SCAFFOLDING.COLUMN_WIDTH(7)};\r\n            min-width: 25%;\r\n            margin-left: ${SCAFFOLDING.COLUMN_WIDTH(5)};\r\n            padding-left: ${SCAFFOLDING.GUTTER_FACTOR(0.5)};\r\n            overflow-wrap: break-word;\r\n            word-wrap: break-word;\r\n            hyphens: auto;\r\n\r\n            > * {\r\n                display: block;\r\n            }\r\n        `,\r\n        css`\r\n            font-weight: 700;\r\n        `\r\n    )}\r\n`;\r\n","import React from 'react';\r\nimport { connect } from 'react-redux';\r\n\r\nimport SettingsGroup from 'components/Shared/SettingsGroup';\r\nimport If from 'components/Shared/If';\r\nimport { ContentSet, FlexRow } from 'components/Shared/Scaffolding';\r\nimport {\r\n    CardWrapper,\r\n    CardSection,\r\n    CardToolbar,\r\n    CardTool,\r\n    CardIcon,\r\n    PreviewRow,\r\n    PreviewImage,\r\n    PreviewDesc,\r\n} from 'components/Shared/Cards';\r\nimport { GLYPHS } from 'components/Shared/Icon';\r\nimport { showModal } from 'modules/modal';\r\nimport MODAL from 'components/Shared/Modals';\r\nimport { getStyle } from 'modules/style';\r\n\r\nconst Preview = ({ style, onCardClick, onRemoveStyle, className, labelClassName, contentClassName }) => {\r\n    const hasStyle = style && style.id;\r\n    return (\r\n        <SettingsGroup\r\n            name=\"Style\"\r\n            description=\"Choose a style for your map\"\r\n            className={className}\r\n            labelClassName={labelClassName}\r\n            contentClassName={contentClassName}\r\n        >\r\n            <ContentSet>\r\n                <If statement={hasStyle}>\r\n                    <CardWrapper>\r\n                        <CardSection onClick={onCardClick}>\r\n                            <FlexRow alignCenter>\r\n                                <PreviewImage img={style.imageUrl} />\r\n                                <PreviewDesc hasPreview={hasStyle}>\r\n                                    <strong>{style.name}</strong>\r\n                                    <em>by {style.createdBy}</em>\r\n                                </PreviewDesc>\r\n                                <CardIcon primary glyph={GLYPHS.SEARCH} />\r\n                            </FlexRow>\r\n                        </CardSection>\r\n                        <CardToolbar>\r\n                            <CardTool\r\n                                title=\"View Style Details\"\r\n                                href={style.url}\r\n                                glyph={GLYPHS.OPEN_IN_NEW}\r\n                                target=\"_blank\"\r\n                                rel=\"noopener noreferrer\"\r\n                            />\r\n                            <CardTool\r\n                                title=\"Remove style\"\r\n                                right\r\n                                glyph={GLYPHS.REMOVE_OUTLINE}\r\n                                onClick={onRemoveStyle}\r\n                            />\r\n                        </CardToolbar>\r\n                    </CardWrapper>\r\n                </If>\r\n                <If statement={!hasStyle}>\r\n                    <CardWrapper onClick={onCardClick}>\r\n                        <PreviewRow>\r\n                            <CardIcon glyph={GLYPHS.SNAZZY_MAPS_OUTLINE} />\r\n                            <PreviewDesc hasPreview={hasStyle}>Choose a Snazzy Maps style</PreviewDesc>\r\n                            <CardIcon primary glyph={GLYPHS.CHEVRON_RIGHT} />\r\n                        </PreviewRow>\r\n                    </CardWrapper>\r\n                </If>\r\n            </ContentSet>\r\n        </SettingsGroup>\r\n    );\r\n};\r\n\r\nconst mapStateToProps = (state) => ({\r\n    style: getStyle(state),\r\n});\r\n\r\nconst mapDispatchToProps = (dispatch) => ({\r\n    onRemoveStyle: () => {\r\n        dispatch(showModal(MODAL.CONFIRM_STYLE_REMOVE));\r\n    },\r\n});\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(Preview);\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { connect } from 'react-redux';\r\nimport styled from 'styled-components';\r\n\r\nimport SettingsGroup from 'components/Shared/SettingsGroup';\r\nimport { FlexRow } from 'components/Shared/Scaffolding';\r\nimport { Card } from 'components/Shared/Cards';\r\nimport { GLYPHS } from 'components/Shared/Icon';\r\nimport { TYPOGRAPHY } from 'theme';\r\n\r\nconst propTypes = {\r\n    size: PropTypes.object.isRequired,\r\n    zoom: PropTypes.number.isRequired,\r\n    lat: PropTypes.number.isRequired,\r\n    lng: PropTypes.number.isRequired,\r\n    onCardClick: PropTypes.func,\r\n};\r\n\r\nconst defaultProps = {\r\n    onCardClick: null,\r\n};\r\n\r\nconst mapStateToProps = (state) => ({\r\n    size: state.map.size,\r\n    zoom: state.map.location.zoom,\r\n    lat: state.map.location.center.lat,\r\n    lng: state.map.location.center.lng,\r\n});\r\n\r\nconst Label = styled.strong`\r\n    flex: 0 0 auto;\r\n`;\r\n\r\nconst Value = styled.span`\r\n    flex: 1 1 auto;\r\n`;\r\n\r\nconst Preview = ({ size, zoom, lat, lng, onCardClick, className, labelClassName, contentClassName }) => {\r\n    const { width, widthUnit, height, heightUnit } = size;\r\n    return (\r\n        <SettingsGroup\r\n            name=\"Size & Location\"\r\n            description=\"Choose a size, default center location, and zoom level for your map\"\r\n            className={className}\r\n            labelClassName={labelClassName}\r\n            contentClassName={contentClassName}\r\n        >\r\n            <Card\r\n                onClick={onCardClick}\r\n                leftGlyph={GLYPHS.CENTER}\r\n                leftGlyphColor={TYPOGRAPHY.COLOR_REDUCED}\r\n                rightGlyph={GLYPHS.EDIT}\r\n            >\r\n                <FlexRow inline spacing=\"4px\">\r\n                    <Label>Size:</Label>\r\n                    <Value>\r\n                        {width}\r\n                        {widthUnit} × {height}\r\n                        {heightUnit}\r\n                    </Value>\r\n                </FlexRow>\r\n                <FlexRow inline spacing=\"4px\">\r\n                    <Label>Center:</Label>\r\n                    <Value>\r\n                        {lat}, {lng}\r\n                    </Value>\r\n                </FlexRow>\r\n                <FlexRow inline spacing=\"4px\">\r\n                    <Label>Zoom Level:</Label>\r\n                    <Value>{zoom}</Value>\r\n                </FlexRow>\r\n            </Card>\r\n        </SettingsGroup>\r\n    );\r\n};\r\n\r\nPreview.propTypes = propTypes;\r\nPreview.defaultProps = defaultProps;\r\n\r\nexport default connect(mapStateToProps)(Preview);\r\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport PropTypes from 'prop-types';\r\nimport styled from 'styled-components';\r\nimport { prop } from 'styled-tools';\r\nimport CSSTransitionGroup from 'react-transition-group/CSSTransitionGroup';\r\nimport smoothScroll from 'smoothscroll';\r\n\r\nimport { IconButton } from 'components/Shared/Buttons';\r\nimport { GLYPHS } from 'components/Shared/Icon';\r\nimport { SCAFFOLDING, TYPOGRAPHY, TRANSITION } from 'theme';\r\nimport { FirstChild } from 'utils/transitions';\r\n\r\nexport const TRANSITION_TYPE = {\r\n    FADE: 'fade',\r\n    SLIDE: 'slide',\r\n};\r\n\r\nconst propTypes = {\r\n    open: PropTypes.bool.isRequired,\r\n    children: PropTypes.node.isRequired,\r\n    main: PropTypes.bool,\r\n    onClose: PropTypes.func,\r\n    transition: PropTypes.oneOf(['fade', 'slide']),\r\n};\r\n\r\nconst defaultProps = {\r\n    main: false,\r\n    onClose: null,\r\n    transition: TRANSITION_TYPE.SLIDE,\r\n};\r\n\r\nexport const PanelWrapper = styled.section`\r\n    position: absolute;\r\n    top: 0;\r\n    bottom: 0;\r\n    width: ${prop('width', SCAFFOLDING.COLUMN_WIDTH(4))};\r\n    float: left;\r\n    z-index: 2;\r\n    background-color: ${SCAFFOLDING.BG};\r\n\r\n    &.${TRANSITION_TYPE.SLIDE} {\r\n        /* Active must come after its previous state */\r\n        &-enter {\r\n            transform: translate3d(0, 100%, 0);\r\n        }\r\n\r\n        &-enter-active {\r\n            transform: translate3d(0, 0, 0);\r\n        }\r\n\r\n        &-leave {\r\n            transform: translate3d(0, 0, 0);\r\n        }\r\n\r\n        &-leave-active {\r\n            transform: translate3d(0, 100%, 0);\r\n        }\r\n\r\n        /* Need the transition on the active classes to animate with react-select */\r\n        &-enter-active,\r\n        &-leave-active {\r\n            transition: transform ${TRANSITION.LENGTH_LONG} ${TRANSITION.BEZIER};\r\n        }\r\n    }\r\n\r\n    &.${TRANSITION_TYPE.FADE} {\r\n        /* Active must come after its previous state */\r\n        &-enter {\r\n            opacity: 0;\r\n        }\r\n\r\n        &-enter-active {\r\n            opacity: 1;\r\n        }\r\n\r\n        &-leave {\r\n            opacity: 1;\r\n        }\r\n\r\n        &-leave-active {\r\n            opacity: 0;\r\n        }\r\n\r\n        /* Need the transition on the active classes to animate with react-select */\r\n        &-enter-active,\r\n        &-leave-active {\r\n            transition: opacity ${TRANSITION.LENGTH_LONG} ${TRANSITION.BEZIER};\r\n        }\r\n    }\r\n`;\r\n\r\nconst PanelContent = styled.div`\r\n    position: relative;\r\n    height: 100%;\r\n    overflow-x: hidden;\r\n    overflow-y: auto;\r\n    z-index: 2;\r\n    -webkit-overflow-scrolling: touch;\r\n`;\r\n\r\nconst PanelTitle = styled.h1`\r\n    margin: 0;\r\n`;\r\n\r\nconst ClosePanelButton = styled(IconButton)`\r\n    position: absolute;\r\n    top: ${SCAFFOLDING.GUTTER_FACTOR(0.25)};\r\n    right: ${SCAFFOLDING.GUTTER_FACTOR(0.25)};\r\n    width: ${SCAFFOLDING.GUTTER};\r\n    height: ${SCAFFOLDING.GUTTER};\r\n    z-index: 3;\r\n    color: ${TYPOGRAPHY.COLOR};\r\n\r\n    &:hover,\r\n    &:focus {\r\n        color: ${TYPOGRAPHY.LINK_COLOR.HOVER};\r\n    }\r\n`;\r\n\r\nclass Panel extends React.Component {\r\n    handleScrollToTop = (context = this.colPanelContent) => {\r\n        const scrollEl = ReactDOM.findDOMNode(context); // eslint-disable-line react/no-find-dom-node\r\n        smoothScroll(0, parseInt(TRANSITION.LENGTH_LONG, 10), null, scrollEl);\r\n    };\r\n\r\n    render() {\r\n        const { main, transition, ...props } = this.props;\r\n\r\n        const closeButton = !main && (\r\n            <ClosePanelButton title=\"Cancel Changes\" glyph={GLYPHS.CLOSE} onClick={props.onClose} />\r\n        );\r\n\r\n        return (\r\n            <CSSTransitionGroup\r\n                component={FirstChild}\r\n                transitionName={transition}\r\n                transitionEnterTimeout={parseInt(TRANSITION.LENGTH_LONG, 10)}\r\n                transitionLeaveTimeout={parseInt(TRANSITION.LENGTH_LONG, 10)}\r\n            >\r\n                {props.open ? (\r\n                    <PanelWrapper width=\"100%\" aria-expanded={props.open} {...props}>\r\n                        {closeButton}\r\n                        <PanelContent\r\n                            ref={(el) => {\r\n                                this.colPanelContent = el;\r\n                            }}\r\n                        >\r\n                            {/* TODO: This requires the children to be components without throwing an unknown prop warning. See if there is a better solution to this.*/}\r\n                            {React.Children.map(props.children, (child) =>\r\n                                React.cloneElement(child, {\r\n                                    scrollToTop: this.handleScrollToTop,\r\n                                })\r\n                            )}\r\n                        </PanelContent>\r\n                    </PanelWrapper>\r\n                ) : null}\r\n            </CSSTransitionGroup>\r\n        );\r\n    }\r\n}\r\n\r\nPanel.propTypes = propTypes;\r\nPanel.defaultProps = defaultProps;\r\n\r\nexport default Panel;\r\nexport { PanelTitle };\r\n","export const roundLatLng = (latLng, precision) => {\r\n    if (!latLng) return undefined;\r\n    return {\r\n        lat: parseFloat(latLng.lat().toFixed(precision || 6)),\r\n        lng: parseFloat(latLng.lng().toFixed(precision || 6)),\r\n    };\r\n};\r\n","import React from 'react';\r\nimport PlacesAutocomplete, { geocodeByAddress } from 'react-places-autocomplete';\r\nimport styled from 'styled-components';\r\nimport { FormGroup, Label, ReactSelectCSS } from 'components/Shared/Forms';\r\nimport { SCAFFOLDING, TYPOGRAPHY, INPUTS } from 'theme';\r\nimport { Icon, GLYPHS } from 'components/Shared/Icon';\r\nimport { roundLatLng } from 'utils/maps';\r\nimport notify from 'utils/notify';\r\n\r\nconst AutocompleteItem = ({ formattedSuggestion }) => (\r\n    <div>\r\n        <strong>{formattedSuggestion.mainText}</strong> <small>{formattedSuggestion.secondaryText}</small>\r\n    </div>\r\n);\r\n\r\nconst StyledFormGroup = styled(FormGroup)`\r\n    ${ReactSelectCSS}\r\n\r\n    .Select-control {\r\n        padding-left: ${SCAFFOLDING.GUTTER};\r\n        outline: none;\r\n        cursor: text;\r\n    }\r\n\r\n    .Select-menu-outer {\r\n        max-height: none;\r\n        padding-bottom: 36px;\r\n        background-image: url('/images/powered_by_google.png');\r\n        background-position: right ${INPUTS.PADDING.X} bottom ${INPUTS.PADDING.X};\r\n        background-repeat: no-repeat;\r\n        background-size: 144px 18px;\r\n    }\r\n\r\n    .Select-option:last-child {\r\n        border-bottom: 1px solid ${SCAFFOLDING.BORDER_COLOR};\r\n    }\r\n`;\r\n\r\nconst StyledFormControlHelper = styled.div`\r\n    position: relative;\r\n`;\r\n\r\nconst StyledIcon = styled(Icon)`\r\n    position: absolute;\r\n    top: 50%;\r\n    left: 0.65em;\r\n    color: ${TYPOGRAPHY.COLOR_REDUCED};\r\n    font-size: ${TYPOGRAPHY.FONT_SIZE.LARGE};\r\n    pointer-events: none;\r\n    transform: translate(0, -50%);\r\n`;\r\n\r\nclass GooglePlacesSearch extends React.Component {\r\n    state = { search: '' };\r\n\r\n    handleSearch = (search) => {\r\n        this.setState({ search });\r\n    };\r\n\r\n    handleSelect = (search) => {\r\n        this.setState({ search }, () => {\r\n            geocodeByAddress(this.state.search)\r\n                .then((results) => {\r\n                    if (results && results.length > 0) {\r\n                        const { location } = results[0].geometry;\r\n                        this.props.input.onChange(roundLatLng(location));\r\n                    }\r\n                })\r\n                .catch(() => notify.error('Failed to find location. Please try again.'));\r\n        });\r\n    };\r\n\r\n    render() {\r\n        const {\r\n            input: { name },\r\n        } = this.props;\r\n        const inputProps = {\r\n            id: name,\r\n            onChange: this.handleSearch,\r\n            value: this.state.search,\r\n            placeholder: 'Enter a name or address',\r\n            autoComplete: 'off',\r\n        };\r\n        return (\r\n            <StyledFormGroup width=\"100%\">\r\n                <Label htmlFor={inputProps.id}>Search for a location</Label>\r\n                <StyledFormControlHelper>\r\n                    <PlacesAutocomplete\r\n                        classNames={{\r\n                            root: 'Select',\r\n                            input: 'Select-control',\r\n                            autocompleteContainer: 'Select-menu-outer',\r\n                            autocompleteItem: 'Select-option',\r\n                        }}\r\n                        onSelect={this.handleSelect}\r\n                        onEnterKeyDown={this.handleSelect}\r\n                        inputProps={inputProps}\r\n                        autocompleteItem={AutocompleteItem}\r\n                    />\r\n                    <StyledIcon glyph={GLYPHS.SEARCH} />\r\n                </StyledFormControlHelper>\r\n            </StyledFormGroup>\r\n        );\r\n    }\r\n}\r\n\r\nexport default GooglePlacesSearch;\r\n","import React from 'react';\r\nimport { Fields } from 'redux-form';\r\n\r\nimport { ContentSet, FlexRow } from 'components/Shared/Scaffolding';\r\nimport { InputField } from 'components/Shared/Forms';\r\nimport GooglePlacesSearch from 'components/Shared/GooglePlacesSearch';\r\nimport { LinkButton } from 'components/Shared/Buttons';\r\nimport { SCAFFOLDING } from 'theme';\r\nimport { parseDecimalInput, hasValue } from 'utils/validation';\r\n\r\nconst MODES = {\r\n    LATLNG: 'latlng',\r\n    SEARCH: 'search',\r\n};\r\n\r\nclass LocationInput extends React.Component {\r\n    state = {\r\n        mode: this.props.defaultMode || MODES.LATLNG,\r\n        address: '',\r\n    };\r\n\r\n    renderFields = ({ lat, lng, place, showSearch }) => {\r\n        // Use the same place props but with our custom onChange handler\r\n        const placeProps = {\r\n            ...place,\r\n            input: {\r\n                ...place.input,\r\n                onChange: (value) => {\r\n                    lat.input.onChange(value.lat);\r\n                    lng.input.onChange(value.lng);\r\n                    this.handleToggle();\r\n                },\r\n            },\r\n        };\r\n\r\n        return (\r\n            <FlexRow>\r\n                {!showSearch && (\r\n                    <InputField\r\n                        {...lat}\r\n                        width=\"100%\"\r\n                        labelInline\r\n                        required\r\n                        type=\"number\"\r\n                        label=\"Latitude\"\r\n                        step=\"0.000001\"\r\n                    />\r\n                )}\r\n                {!showSearch && (\r\n                    <InputField\r\n                        {...lng}\r\n                        width=\"100%\"\r\n                        labelInline\r\n                        required\r\n                        type=\"number\"\r\n                        label=\"Longitude\"\r\n                        step=\"0.000001\"\r\n                    />\r\n                )}\r\n                {showSearch && <GooglePlacesSearch {...placeProps} />}\r\n            </FlexRow>\r\n        );\r\n    };\r\n\r\n    parseFields = (value, name) => {\r\n        if (name.includes('lat')) {\r\n            return this.inRange(value, -90, 90);\r\n        } else if (name.includes('lng')) {\r\n            return this.inRange(value, -180, 180);\r\n        }\r\n        return value;\r\n    };\r\n\r\n    inRange = (value, min, max) => {\r\n        const lat = parseDecimalInput(value);\r\n        if (!hasValue(lat)) return value;\r\n        return Math.min(Math.max(lat, min), max);\r\n    };\r\n\r\n    handleToggle = (e) => {\r\n        if (e) e.preventDefault();\r\n        this.setState((prevState) => ({\r\n            mode: prevState.mode === MODES.LATLNG ? MODES.SEARCH : MODES.LATLNG,\r\n        }));\r\n    };\r\n\r\n    render() {\r\n        return (\r\n            <ContentSet spacing={SCAFFOLDING.GUTTER_FACTOR(0.25)}>\r\n                <Fields\r\n                    names={['lat', 'lng', 'place']}\r\n                    component={this.renderFields}\r\n                    parse={this.parseFields}\r\n                    showSearch={this.state.mode === MODES.SEARCH}\r\n                />\r\n                <LinkButton onClick={this.handleToggle}>\r\n                    {this.state.mode === MODES.LATLNG\r\n                        ? 'Or search for a location'\r\n                        : 'Or enter the latitude and longitude'}\r\n                </LinkButton>\r\n            </ContentSet>\r\n        );\r\n    }\r\n}\r\n\r\nexport default LocationInput;\r\n","import React from 'react';\r\nimport { connect } from 'react-redux';\r\nimport { FormSection, reduxForm, change } from 'redux-form';\r\nimport styled from 'styled-components';\r\n\r\nimport { ContentSet, FlexRow } from 'components/Shared/Scaffolding';\r\nimport SettingsGroup, { SettingsHelper } from 'components/Shared/SettingsGroup';\r\nimport LocationInput from 'components/Shared/LocationInput';\r\nimport { Input, Select, Slider, ButtonSet } from 'components/Shared/Forms';\r\nimport { TextButton } from 'components/Shared/Buttons';\r\nimport { saveLocation, formName, MAX_ZOOM, MIN_ZOOM } from 'modules/location';\r\nimport { required, range, onSubmitFail } from 'utils/validation';\r\nimport { changeSize, MAP_DIMENSION_UNIT } from 'modules/size';\r\nimport { SETTINGS_GROUP } from 'theme';\r\n\r\nconst StyledInput = styled(Input)`\r\n    display: block;\r\n\r\n    input {\r\n        position: relative;\r\n        width: calc(100% - 4.5em);\r\n        z-index: 1;\r\n        border-top-right-radius: 0;\r\n        border-bottom-right-radius: 0;\r\n    }\r\n`;\r\n\r\nconst StyledSelect = styled(Select)`\r\n    position: absolute;\r\n    top: 0;\r\n    right: 0;\r\n    width: calc(4.5em + 1px);\r\n\r\n    .Select-control {\r\n        border-top-left-radius: 0;\r\n        border-bottom-left-radius: 0;\r\n    }\r\n\r\n    .is-focused {\r\n        position: relative;\r\n        z-index: 1;\r\n    }\r\n`;\r\n\r\nconst StyledSettingsHelper = styled(SettingsHelper)`\r\n    margin-bottom: -${SETTINGS_GROUP.PADDING.Y};\r\n`;\r\n\r\nconst LocationForm = ({ handleSubmit, onCancel }) => {\r\n    const units = Object.values(MAP_DIMENSION_UNIT).map((x) => ({\r\n        label: x,\r\n        value: x,\r\n    }));\r\n    return (\r\n        <form onSubmit={handleSubmit}>\r\n            <ContentSet spacing=\"40px\">\r\n                <FormSection name=\"size\">\r\n                    <ContentSet spacing=\"40px\">\r\n                        <SettingsGroup name=\"Size\" description=\"Enter a size for your map\">\r\n                            <FlexRow>\r\n                                <StyledInput name=\"width\" label=\"Width\" type=\"int\" width=\"50%\" required>\r\n                                    <StyledSelect name=\"widthUnit\" options={units} />\r\n                                </StyledInput>\r\n                                <StyledInput name=\"height\" label=\"Height\" type=\"int\" width=\"50%\" required>\r\n                                    <StyledSelect name=\"heightUnit\" options={units} />\r\n                                </StyledInput>\r\n                            </FlexRow>\r\n                            <StyledSettingsHelper highlight=\"info\">\r\n                                <strong>Note:</strong> The actual size of your map may vary depending on the HTML and\r\n                                CSS of your site. Make sure your site can handle the sizing of the map appropriately.\r\n                            </StyledSettingsHelper>\r\n                        </SettingsGroup>\r\n                    </ContentSet>\r\n                </FormSection>\r\n                <FormSection name=\"location\">\r\n                    <ContentSet spacing=\"40px\">\r\n                        <SettingsGroup name=\"Center Location\" description=\"Search for a location\">\r\n                            <FormSection name=\"center\" component={LocationInput} />\r\n                        </SettingsGroup>\r\n                        <SettingsGroup name={`Zoom Level (${MIN_ZOOM}-${MAX_ZOOM})`} description=\"Enter a zoom level\">\r\n                            <Slider name=\"zoom\" min={MIN_ZOOM} max={MAX_ZOOM} />\r\n                        </SettingsGroup>\r\n                    </ContentSet>\r\n                </FormSection>\r\n                <ButtonSet>\r\n                    <TextButton primary type=\"submit\">\r\n                        Apply Changes\r\n                    </TextButton>\r\n                    <TextButton secondary type=\"button\" onClick={onCancel}>\r\n                        Cancel\r\n                    </TextButton>\r\n                </ButtonSet>\r\n            </ContentSet>\r\n        </form>\r\n    );\r\n};\r\n\r\nexport const setLocation = (location) => change(formName, 'location', location);\r\n\r\nconst validRange = (unit) => (unit === MAP_DIMENSION_UNIT.PERCENT ? range(1, 100) : range(100, 2000));\r\n\r\nconst validate = ({ size, location }) => {\r\n    return {\r\n        size: {\r\n            width: size ? validRange(size.widthUnit)(size.width) : null,\r\n            height: size ? validRange(size.heightUnit)(size.height) : null,\r\n        },\r\n        location: {\r\n            center: {\r\n                lat: location && location.center ? required(location.center && location.center.lat) : null,\r\n                lng: location && location.center ? required(location.center && location.center.lng) : null,\r\n            },\r\n        },\r\n    };\r\n};\r\n\r\nconst onSubmit = (values, dispatch, props) => {\r\n    props.onSizeChange(values.size);\r\n    props.onSaveLocation(values.location);\r\n    props.onClose();\r\n};\r\n\r\nconst mapStateToProps = (state) => ({\r\n    initialValues: {\r\n        size: state.map.size,\r\n        location: state.map.location,\r\n    },\r\n});\r\n\r\nconst mapDispatchToProps = {\r\n    onSizeChange: changeSize,\r\n    onSaveLocation: saveLocation,\r\n};\r\n\r\nexport default connect(\r\n    mapStateToProps,\r\n    mapDispatchToProps\r\n)(reduxForm({ form: formName, validate, onSubmit, onSubmitFail })(LocationForm));\r\n","import React from 'react';\r\nimport { connect } from 'react-redux';\r\nimport { isDirty } from 'redux-form';\r\n\r\nimport MODAL from 'components/Shared/Modals';\r\nimport { showModal } from 'modules/modal';\r\n\r\n// HOC that provides a cancel confirmation for panels that have been changed\r\nconst withCancel = ({ form, dispatches }) => (PanelComponent) => {\r\n    class DiscardPanel extends React.Component {\r\n        onCancel = () => {\r\n            const { dispatch, isDirty, onClose } = this.props;\r\n\r\n            if (isDirty) {\r\n                dispatch(showModal(MODAL.CONFIRM_PANEL_CLOSE, { dispatches }));\r\n            } else {\r\n                if (dispatches) {\r\n                    dispatches.forEach((action) => dispatch(action));\r\n                }\r\n                if (onClose) {\r\n                    onClose();\r\n                }\r\n            }\r\n        };\r\n\r\n        render() {\r\n            return <PanelComponent onCancel={this.onCancel} {...this.props} />;\r\n        }\r\n    }\r\n\r\n    const mapStateToProps = (state) => ({\r\n        isDirty: isDirty(form)(state),\r\n    });\r\n\r\n    return connect(mapStateToProps)(DiscardPanel);\r\n};\r\n\r\nexport default withCancel;\r\n","import React from 'react';\r\n\r\nimport { ContentSet } from 'components/Shared/Scaffolding';\r\nimport Panel, { PanelTitle } from 'components/Shared/Panel';\r\nimport LocationForm from 'components/LocationSettings/LocationForm';\r\nimport { SCAFFOLDING } from 'theme';\r\nimport { clearPreviewLocation } from 'modules/navigation/preview';\r\nimport { formName } from 'modules/location';\r\nimport withCancel from 'components/Shared/PanelCancel';\r\n\r\nconst LocationPanel = ({ open, onClose, onCancel }) => (\r\n    <Panel open={open} onClose={onCancel}>\r\n        <ContentSet spacing={SCAFFOLDING.GUTTER} padding={SCAFFOLDING.GUTTER}>\r\n            <PanelTitle>Size & Location</PanelTitle>\r\n            <p>\r\n                Set a custom size for the map that fits well on your website. Pan and zoom the map on the right to your\r\n                desired location. Alternatively, enter the latitude, longitude, and zoom level below.\r\n            </p>\r\n            <LocationForm onClose={onClose} onCancel={onCancel} />\r\n        </ContentSet>\r\n    </Panel>\r\n);\r\n\r\nexport default withCancel({\r\n    form: formName,\r\n    dispatches: [clearPreviewLocation()],\r\n})(LocationPanel);\r\n","import React from 'react';\r\nimport styled from 'styled-components';\r\nimport { prop } from 'styled-tools';\r\n\r\nimport { MARKER_TYPE, STYLED_MARKER } from 'components/MarkerSettings/IconOptions';\r\nimport { Icon } from 'components/Shared/Icon';\r\n\r\nconst StyledMarkerPreview = styled.span`\r\n    flex: 0 0 auto;\r\n    display: block;\r\n    position: relative;\r\n    width: 2.25em;\r\n    height: 2.25em;\r\n    margin: -0.5em;\r\n    padding: 0.5em;\r\n    border-radius: 50%;\r\n    overflow: hidden;\r\n    line-height: 1;\r\n    text-align: center;\r\n\r\n    &:before {\r\n        content: '';\r\n        position: absolute;\r\n        top: -5px;\r\n        right: -5px;\r\n        bottom: -5px;\r\n        left: -5px;\r\n        background: transparent url(${prop('styleImageUrl')}) center no-repeat;\r\n        background-size: cover;\r\n        filter: blur(1px);\r\n    }\r\n`;\r\n\r\nconst MarkerImage = styled.img`\r\n    display: inline-block;\r\n    position: relative;\r\n    max-width: 100%;\r\n    max-height: 100%;\r\n`;\r\n\r\nconst MarkerIcon = styled(Icon)`\r\n    position: relative;\r\n    width: 100%;\r\n    height: 100%;\r\n`;\r\n\r\nconst MarkerPreviewIcon = ({ icon }) => {\r\n    switch (icon.type) {\r\n        case MARKER_TYPE.DEFAULT:\r\n            const src = 'https://maps.gstatic.com/mapfiles/api-3/images/spotlight-poi.png';\r\n            return <MarkerImage src={src} />;\r\n\r\n        case MARKER_TYPE.STYLED:\r\n            const { styledMarkerId, color } = icon;\r\n            const glyph = STYLED_MARKER[styledMarkerId];\r\n            return <MarkerIcon glyph={glyph} color={color} />;\r\n\r\n        case MARKER_TYPE.CUSTOM:\r\n            return <MarkerImage src={icon.image.url} />;\r\n\r\n        default:\r\n            return null;\r\n    }\r\n};\r\n\r\nconst MarkerPreview = ({ styleImageUrl, ...props }) => {\r\n    return (\r\n        <StyledMarkerPreview styleImageUrl={styleImageUrl}>\r\n            <MarkerPreviewIcon {...props} />\r\n        </StyledMarkerPreview>\r\n    );\r\n};\r\n\r\nexport default MarkerPreview;\r\n","import React from 'react';\r\nimport styled from 'styled-components';\r\n\r\nimport { CardWrapper, CardSection, CardToolbar, CardTool, CardIcon } from 'components/Shared/Cards';\r\nimport { FlexRow } from 'components/Shared/Scaffolding';\r\nimport { GLYPHS } from 'components/Shared/Icon';\r\nimport MarkerPreview from 'components/MarkerSettings/MarkerPreviewIcon';\r\n\r\nconst StyledFlexContent = styled.div`\r\n    flex: 1 1 auto;\r\n    width: 100%;\r\n    min-width: 50%;\r\n`;\r\n\r\nconst StyledFlexRow = styled(FlexRow)`\r\n    overflow-wrap: break-word;\r\n    word-wrap: break-word;\r\n    hyphens: auto;\r\n`;\r\n\r\nconst Label = styled.strong`\r\n    flex: 0 0 auto;\r\n`;\r\n\r\nconst Value = styled.span`\r\n    flex: 1 1 auto;\r\n    min-width: 50%;\r\n`;\r\n\r\nconst MarkerPreviewRow = ({\r\n    marker,\r\n    zoom,\r\n    onHighlightClick,\r\n    onEditClick,\r\n    onDeleteClick,\r\n    onInfoWindowClick,\r\n    styleImageUrl,\r\n}) => {\r\n    const {\r\n        name,\r\n        location: { lat, lng },\r\n        icon,\r\n    } = marker;\r\n    return (\r\n        <CardWrapper>\r\n            <CardSection onClick={() => onEditClick(marker, zoom)}>\r\n                <FlexRow alignCenter inline>\r\n                    <MarkerPreview icon={icon} styleImageUrl={styleImageUrl} />\r\n                    <StyledFlexContent spacing=\"4px\">\r\n                        <StyledFlexRow spacing=\"4px\">\r\n                            <Label>Name:</Label>\r\n                            <Value>{name}</Value>\r\n                        </StyledFlexRow>\r\n                        <FlexRow spacing=\"4px\">\r\n                            <Label>Location:</Label>\r\n                            <Value>\r\n                                {lat}, {lng}\r\n                            </Value>\r\n                        </FlexRow>\r\n                    </StyledFlexContent>\r\n                    <CardIcon primary glyph={GLYPHS.EDIT} />\r\n                </FlexRow>\r\n            </CardSection>\r\n            <CardToolbar>\r\n                <CardTool\r\n                    title=\"Snap the map to this marker\"\r\n                    glyph={GLYPHS.MY_LOCATION}\r\n                    onClick={() => onHighlightClick(marker, zoom)}\r\n                />\r\n                <CardTool\r\n                    title=\"Add/Edit a popup for this marker\"\r\n                    glyph={GLYPHS.INFO_WINDOW}\r\n                    onClick={() => onInfoWindowClick(marker, zoom)}\r\n                />\r\n                <CardTool title=\"Delete marker\" right glyph={GLYPHS.DELETE} onClick={() => onDeleteClick(marker)} />\r\n            </CardToolbar>\r\n        </CardWrapper>\r\n    );\r\n};\r\n\r\nexport default MarkerPreviewRow;\r\n","import React from 'react';\r\n\r\nimport SettingsGroup from 'components/Shared/SettingsGroup';\r\nimport { ContentSet } from 'components/Shared/Scaffolding';\r\nimport { TextButton } from 'components/Shared/Buttons';\r\nimport MarkerPreviewRow from 'components/MarkerSettings/MarkerPreviewRow';\r\nimport { CardWrapper, CardIcon, PreviewRow, PreviewDesc } from 'components/Shared/Cards';\r\nimport { GLYPHS } from 'components/Shared/Icon';\r\n\r\nconst MarkerPreview = ({\r\n    markers,\r\n    zoom,\r\n    onAddClick,\r\n    onEditClick,\r\n    onHighlightClick,\r\n    onDeleteClick,\r\n    onInfoWindowClick,\r\n    styleImageUrl,\r\n    className,\r\n    labelClassName,\r\n    contentClassName,\r\n}) => {\r\n    const hasMarkers = markers && markers.length > 0;\r\n    return (\r\n        <SettingsGroup\r\n            name=\"Markers\"\r\n            description=\"Add some custom markers to your map\"\r\n            className={className}\r\n            labelClassName={labelClassName}\r\n            contentClassName={contentClassName}\r\n        >\r\n            <ContentSet>\r\n                {!hasMarkers && (\r\n                    <CardWrapper onClick={onAddClick}>\r\n                        <PreviewRow>\r\n                            <CardIcon glyph={GLYPHS.MARKER_OUTLINE} />\r\n                            <PreviewDesc hasPreview={false}>Add your first marker</PreviewDesc>\r\n                            <CardIcon primary glyph={GLYPHS.CHEVRON_RIGHT} />\r\n                        </PreviewRow>\r\n                    </CardWrapper>\r\n                )}\r\n                {hasMarkers &&\r\n                    markers.map((marker) => (\r\n                        <MarkerPreviewRow\r\n                            key={marker.id}\r\n                            marker={marker}\r\n                            zoom={zoom}\r\n                            onEditClick={onEditClick}\r\n                            onHighlightClick={onHighlightClick}\r\n                            onDeleteClick={onDeleteClick}\r\n                            onInfoWindowClick={onInfoWindowClick}\r\n                            styleImageUrl={styleImageUrl}\r\n                        />\r\n                    ))}\r\n                {hasMarkers && (\r\n                    <TextButton outlined block onClick={onAddClick}>\r\n                        Add a marker\r\n                    </TextButton>\r\n                )}\r\n            </ContentSet>\r\n        </SettingsGroup>\r\n    );\r\n};\r\n\r\nexport default MarkerPreview;\r\n","import { connect } from 'react-redux';\r\n\r\nimport MarkerPreview from 'components/MarkerSettings/MarkerPreview';\r\nimport { changePanel, PANELS } from 'modules/navigation/activePanel';\r\nimport { setActiveMarker } from 'modules/navigation/activeMarker';\r\nimport { getMarkers } from 'modules/markers';\r\nimport { showModal } from 'modules/modal';\r\nimport MODAL from 'components/Shared/Modals';\r\nimport { changePreviewLocation, getPreviewLocationZoom } from 'modules/navigation/preview';\r\nimport { getStyle } from 'modules/style';\r\n\r\nconst mapStateToProps = (state) => ({\r\n    markers: getMarkers(state),\r\n    styleImageUrl: getStyle(state).imageUrl || '/Images/img-style-preview-default.png',\r\n    zoom: getPreviewLocationZoom(state),\r\n});\r\n\r\nconst mapDispatchToProps = (dispatch) => ({\r\n    onHighlightClick: (marker, zoom) => {\r\n        dispatch(changePreviewLocation({ center: marker.location, zoom }));\r\n    },\r\n    onAddClick: () => {\r\n        dispatch(changePanel(PANELS.MARKER));\r\n    },\r\n    onDeleteClick: (marker) => {\r\n        dispatch(showModal(MODAL.CONFIRM_MARKER_DELETE, { id: marker.id }));\r\n    },\r\n    onEditClick: (marker, zoom) => {\r\n        dispatch(setActiveMarker(marker.id));\r\n        dispatch(changePreviewLocation({ center: marker.location, zoom }));\r\n        dispatch(changePanel(PANELS.MARKER));\r\n    },\r\n    onInfoWindowClick: (marker, zoom) => {\r\n        dispatch(setActiveMarker(marker.id));\r\n        dispatch(changePreviewLocation({ center: marker.location, zoom }));\r\n        dispatch(changePanel(PANELS.INFO_WINDOW));\r\n    },\r\n});\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(MarkerPreview);\r\n","import React from 'react';\r\n\r\nimport { FormControl, ButtonGroup, ButtonGroupItem } from 'components/Shared/Forms';\r\nimport { STYLED_MARKER } from 'components/MarkerSettings/IconOptions';\r\n\r\nconst handleClick = (e, onChange, i) => {\r\n    e.preventDefault();\r\n    onChange(i);\r\n};\r\n\r\n// TODO: Replace with the the actual marker picker we want to use\r\nconst MarkerPicker = (props) => {\r\n    const { input, color } = props;\r\n    return (\r\n        <FormControl width=\"100%\" {...props}>\r\n            <ButtonGroup>\r\n                {STYLED_MARKER.map((marker, i) => (\r\n                    <ButtonGroupItem\r\n                        glyph={marker}\r\n                        key={i}\r\n                        color={color}\r\n                        selected={input.value === i}\r\n                        onClick={(e) => handleClick(e, input.onChange, i)}\r\n                    />\r\n                ))}\r\n            </ButtonGroup>\r\n        </FormControl>\r\n    );\r\n};\r\n\r\nexport default MarkerPicker;\r\n","import React from 'react';\r\nimport styled from 'styled-components';\r\nimport { Field } from 'redux-form';\r\n\r\nimport { ContentSet } from 'components/Shared/Scaffolding';\r\nimport { InputRow, Input, ColorPicker } from 'components/Shared/Forms';\r\nimport IconPicker from 'components/MarkerSettings/IconPicker';\r\nimport { BREAKPOINTS, SCAFFOLDING, SETTINGS_INPUTS } from 'theme';\r\n\r\nconst StyledContainer = styled(ContentSet)`\r\n    padding: ${SCAFFOLDING.GUTTER_FACTOR(0.5)} ${SETTINGS_INPUTS.PADDING.X};\r\n    background-color: ${SETTINGS_INPUTS.BG.SUB};\r\n`;\r\n\r\nconst StyledInput = styled(Input)`\r\n    @media (min-width: ${`${BREAKPOINTS.lg}px`}) and (max-width: ${`${BREAKPOINTS.xxl - 1}px`}) {\r\n        width: calc(50% - ${SCAFFOLDING.GUTTER_FACTOR(0.25)});\r\n    }\r\n`;\r\n\r\nconst IconStyled = ({ color }) => (\r\n    <StyledContainer>\r\n        <Field label=\"Symbol\" component={IconPicker} name=\"styledMarkerId\" color={color} />\r\n        <InputRow>\r\n            <ColorPicker name=\"color\" label=\"Color\" />\r\n            <StyledInput label=\"Size\" name=\"size\" type=\"int\" required min={0} unitAfter=\"px\" />\r\n        </InputRow>\r\n    </StyledContainer>\r\n);\r\n\r\nexport default IconStyled;\r\n","import React from 'react';\r\nimport Dropzone from 'react-dropzone';\r\nimport { Field } from 'redux-form';\r\nimport styled from 'styled-components';\r\nimport chroma from 'chroma-js';\r\n\r\nimport { FormControl } from 'components/Shared/Forms';\r\nimport { LinkButton } from 'components/Shared/Buttons';\r\nimport { Icon, GLYPHS } from 'components/Shared/Icon';\r\nimport { COLORS, SCAFFOLDING, TRANSITION, TYPOGRAPHY } from 'theme';\r\nimport notify from 'utils/notify';\r\nimport { postFile } from 'utils/http';\r\n\r\nconst StyledDropzone = styled(Dropzone)`\r\n    padding: ${SCAFFOLDING.GUTTER};\r\n    border: 2px dotted ${chroma(TYPOGRAPHY.COLOR_REDUCED).alpha(0.4).css()};\r\n    cursor: pointer;\r\n    color: ${TYPOGRAPHY.COLOR_REDUCED};\r\n    text-align: center;\r\n    transition: all ${TRANSITION.BEZIER} ${TRANSITION.LENGTH};\r\n\r\n    &:hover {\r\n        border-color: ${chroma(TYPOGRAPHY.COLOR_REDUCED).alpha(0.75).css()};\r\n    }\r\n\r\n    &.active {\r\n        border-color: ${chroma(COLORS.SUCCESS).alpha(0.4).css()};\r\n        color: ${COLORS.SUCCESS};\r\n    }\r\n\r\n    &.reject {\r\n        border-color: ${chroma(COLORS.DANGER).alpha(0.4).css()};\r\n        color: ${COLORS.DANGER};\r\n    }\r\n`;\r\n\r\nconst StyledDropzoneIcon = styled(Icon)`\r\n    margin-bottom: ${SCAFFOLDING.GUTTER_FACTOR(0.125)};\r\n    font-size: 3em;\r\n`;\r\n\r\nconst StyledUploadedFile = styled.div`\r\n    position: relative;\r\n    padding: ${SCAFFOLDING.GUTTER};\r\n    border: 2px dotted ${chroma(TYPOGRAPHY.COLOR_REDUCED).alpha(0.4).css()};\r\n    overflow: auto;\r\n    text-align: center;\r\n`;\r\n\r\nconst StyledUploadedImageWrapper = styled.div`\r\n    display: inline-block;\r\n    position: relative;\r\n`;\r\n\r\nconst StyledUploadedImage = styled.img`\r\n    display: inline-block;\r\n    border: 1px solid #fff;\r\n`;\r\n\r\nconst StyledUploadedRemove = styled(LinkButton)`\r\n    margin-top: 0.125em;\r\n`;\r\n\r\nconst StyledAnchor = styled.div`\r\n    position: absolute;\r\n    width: ${SCAFFOLDING.GUTTER_FACTOR(0.4)};\r\n    height: ${SCAFFOLDING.GUTTER_FACTOR(0.4)};\r\n    transform: translate(-50%, -50%);\r\n`;\r\n\r\nconst StyledAnchorInner = styled.div`\r\n    position: absolute;\r\n    width: 100%;\r\n    height: 100%;\r\n    transform: rotate(45deg);\r\n`;\r\n\r\nconst StyledAnchorBg = styled(StyledAnchorInner)`\r\n    &:before,\r\n    &:after {\r\n        content: '';\r\n        display: block;\r\n        position: absolute;\r\n        background-color: #333;\r\n    }\r\n\r\n    &:before {\r\n        top: 1px;\r\n        bottom: 1px;\r\n        left: 50%;\r\n        width: 2px;\r\n        margin-left: -1px;\r\n    }\r\n\r\n    &:after {\r\n        top: 50%;\r\n        right: 1px;\r\n        left: 1px;\r\n        height: 2px;\r\n        margin-top: -1px;\r\n    }\r\n`;\r\n\r\nconst StyledAnchorBorder = styled(StyledAnchorInner)`\r\n    &:before,\r\n    &:after {\r\n        content: '';\r\n        display: block;\r\n        position: absolute;\r\n        background-color: #fff;\r\n    }\r\n\r\n    &:before {\r\n        top: 0;\r\n        bottom: 0;\r\n        left: 50%;\r\n        width: 4px;\r\n        margin-left: -2px;\r\n    }\r\n\r\n    &:after {\r\n        top: 50%;\r\n        right: 0;\r\n        left: 0;\r\n        height: 4px;\r\n        margin-top: -2px;\r\n    }\r\n`;\r\n\r\nclass IconUploadField extends React.Component {\r\n    handleAccepted = (filesToUpload) => {\r\n        const {\r\n            url,\r\n            input: { onChange },\r\n        } = this.props;\r\n        if (url && filesToUpload && filesToUpload.length > 0) {\r\n            postFile(url, filesToUpload[0])\r\n                .then(onChange)\r\n                .catch(() => {\r\n                    notify.error('Invalid icon upload. Please try a different image');\r\n                });\r\n        }\r\n    };\r\n\r\n    handleRejected = () => {\r\n        notify.error('Please select a valid image file no larger than 3 MB.');\r\n    };\r\n\r\n    handleRemoveFile = (e) => {\r\n        e.preventDefault();\r\n        this.props.input.onChange(null);\r\n    };\r\n\r\n    renderInnerDropzone = ({ isDragActive, isDragReject }) => {\r\n        let message;\r\n        let glyph;\r\n        if (isDragActive) {\r\n            glyph = GLYPHS.CHECK;\r\n            message = 'That file looks good, drop it here to upload!';\r\n        } else if (isDragReject) {\r\n            glyph = GLYPHS.CLOSE;\r\n            message = 'Sorry, that file type is not allowed.';\r\n        } else {\r\n            glyph = GLYPHS.PUBLISH;\r\n            message = 'Click to select an icon to upload, or drag and drop your icon here.';\r\n        }\r\n        return (\r\n            <div>\r\n                <StyledDropzoneIcon glyph={glyph} />\r\n                <div>{message}</div>\r\n            </div>\r\n        );\r\n    };\r\n\r\n    renderUploadedFile(value, size, anchor) {\r\n        return (\r\n            <div>\r\n                <StyledUploadedFile>\r\n                    <StyledUploadedImageWrapper>\r\n                        <StyledUploadedImage\r\n                            src={value.url}\r\n                            alt=\"Marker Icon\"\r\n                            width={size.width}\r\n                            height={size.height}\r\n                        />\r\n                        <StyledAnchor style={{ top: anchor.y, left: anchor.x }}>\r\n                            <StyledAnchorBorder />\r\n                            <StyledAnchorBg />\r\n                        </StyledAnchor>\r\n                    </StyledUploadedImageWrapper>\r\n                </StyledUploadedFile>\r\n                <StyledUploadedRemove onClick={this.handleRemoveFile}>Remove Image</StyledUploadedRemove>\r\n            </div>\r\n        );\r\n    }\r\n\r\n    render() {\r\n        const {\r\n            input: { name, value },\r\n            meta: { touched, error },\r\n            size,\r\n            anchor,\r\n        } = this.props;\r\n        const hasValue = value && value.url;\r\n        const hasError = touched && error;\r\n        return (\r\n            <FormControl width=\"100%\" {...this.props} className=\"reject\">\r\n                {!hasValue && (\r\n                    <StyledDropzone\r\n                        className={hasError ? 'reject' : null}\r\n                        name={name}\r\n                        onDropAccepted={this.handleAccepted}\r\n                        onDropRejected={this.handleRejected}\r\n                        multiple={false}\r\n                        maxSize={3 * 1024 * 1024}\r\n                        accept=\"image/jpeg, image/jpg, image/png, image/gif, image/svg+xml\"\r\n                        activeClassName=\"active\"\r\n                        rejectClassName=\"reject\"\r\n                    >\r\n                        {this.renderInnerDropzone}\r\n                    </StyledDropzone>\r\n                )}\r\n                {hasValue && this.renderUploadedFile(value, size, anchor)}\r\n            </FormControl>\r\n        );\r\n    }\r\n}\r\n\r\nconst IconUpload = (props) => <Field component={IconUploadField} {...props} />;\r\n\r\nexport default IconUpload;\r\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport PropTypes from 'prop-types';\r\nimport styled from 'styled-components';\r\nimport TransitionGroup from 'react-transition-group/TransitionGroup';\r\nimport { FirstChild } from 'utils/transitions';\r\n\r\nimport { TRANSITION } from 'theme';\r\n\r\nconst propTypes = {\r\n    isOpened: PropTypes.bool.isRequired,\r\n    transitionEnterTimeout: PropTypes.number,\r\n    transitionLeaveTimeout: PropTypes.number,\r\n};\r\n\r\nconst defaultProps = {\r\n    isOpened: false,\r\n    transitionEnterTimeout: parseInt(TRANSITION.LENGTH_LONG, 10),\r\n    transitionLeaveTimeout: parseInt(TRANSITION.LENGTH_LONG, 10),\r\n};\r\n\r\nconst StyledCollapseContent = styled.div`\r\n    &.collapse {\r\n        /* Need the transition on the active classes to animate with react-select */\r\n        &-enter-active,\r\n        &-leave-active {\r\n            transform: translateZ(0);\r\n            transition: all ${TRANSITION.LENGTH_LONG} ${TRANSITION.BEZIER};\r\n        }\r\n\r\n        /* Active must come after its previous state */\r\n        &-enter {\r\n            overflow: hidden;\r\n        }\r\n\r\n        &-leave {\r\n            overflow: hidden;\r\n        }\r\n    }\r\n`;\r\n\r\nclass CollapseContent extends React.Component {\r\n    componentWillEnter(callback) {\r\n        const el = ReactDOM.findDOMNode(this.collapseContent); // eslint-disable-line react/no-find-dom-node\r\n        const height = el.offsetHeight;\r\n\r\n        el.setAttribute('style', 'height: 0');\r\n        el.classList.add('collapse-enter');\r\n        setTimeout(() => {\r\n            el.classList.add('collapse-enter-active');\r\n            el.setAttribute('style', `height: ${height}px`);\r\n        }, 0);\r\n\r\n        setTimeout(callback, this.props.transitionEnterTimeout);\r\n    }\r\n\r\n    componentDidEnter() {\r\n        const el = ReactDOM.findDOMNode(this.collapseContent); // eslint-disable-line react/no-find-dom-node\r\n\r\n        // IE 10,11 does not support multiple parameters for remove\r\n        el.classList.remove('collapse-enter-active');\r\n        el.classList.remove('collapse-enter');\r\n\r\n        el.removeAttribute('style');\r\n    }\r\n\r\n    componentWillLeave(callback) {\r\n        const el = ReactDOM.findDOMNode(this.collapseContent); // eslint-disable-line react/no-find-dom-node\r\n\r\n        el.setAttribute('style', `height: ${el.offsetHeight}px`);\r\n        el.classList.add('collapse-leave');\r\n        setTimeout(() => {\r\n            el.classList.add('collapse-leave-active');\r\n            el.setAttribute('style', 'height: 0');\r\n        }, 0);\r\n\r\n        setTimeout(callback, this.props.transitionEnterTimeout);\r\n    }\r\n\r\n    componentDidLeave() {\r\n        const el = ReactDOM.findDOMNode(this.collapseContent); // eslint-disable-line react/no-find-dom-node\r\n\r\n        // IE 10,11 does not support multiple parameters for remove\r\n        el.classList.remove('collapse-leave-active');\r\n        el.classList.remove('collapse-leave');\r\n\r\n        el.removeAttribute('style');\r\n    }\r\n\r\n    render() {\r\n        const { transitionEnterTimeout, transitionLeaveTimeout, children, ...props } = this.props;\r\n        return (\r\n            <StyledCollapseContent\r\n                ref={(el) => {\r\n                    this.collapseContent = el;\r\n                }}\r\n                {...props}\r\n            >\r\n                {children}\r\n            </StyledCollapseContent>\r\n        );\r\n    }\r\n}\r\n\r\nconst Collapse = ({ isOpened, children, ...props }) => {\r\n    return (\r\n        <TransitionGroup component={FirstChild}>\r\n            {isOpened && <CollapseContent {...props}>{children}</CollapseContent>}\r\n        </TransitionGroup>\r\n    );\r\n};\r\n\r\nCollapse.propTypes = propTypes;\r\nCollapse.defaultProps = defaultProps;\r\n\r\nexport default Collapse;\r\n","import React from 'react';\r\nimport styled from 'styled-components';\r\nimport { connect } from 'react-redux';\r\nimport { change } from 'redux-form';\r\n\r\nimport { FlexRow } from 'components/Shared/Scaffolding';\r\nimport { Input, Slider } from 'components/Shared/Forms';\r\nimport { SCAFFOLDING, SETTINGS_INPUTS } from 'theme';\r\nimport { hasValue, required } from 'utils/validation';\r\nimport { formName } from 'modules/markers';\r\nimport IconUpload from 'components/MarkerSettings/IconUpload';\r\nimport Collapse from 'components/Shared/Collapse';\r\nimport { SettingsHelper } from 'components/Shared/SettingsGroup';\r\n\r\nconst StyledContainer = styled.div`\r\n    padding: ${SCAFFOLDING.GUTTER_FACTOR(0.5)} ${SETTINGS_INPUTS.PADDING.X};\r\n    background-color: ${SETTINGS_INPUTS.BG.SUB};\r\n`;\r\n\r\nconst StyledCollapse = styled(Collapse)`\r\n    > * {\r\n        padding-top: ${SCAFFOLDING.GUTTER_FACTOR(0.5)};\r\n    }\r\n`;\r\n\r\nclass IconCustom extends React.Component {\r\n    handleImageChange = (image) => {\r\n        this.updateIcon(\r\n            image && hasValue(image.width) ? image.width : 36,\r\n            image && hasValue(image.height) ? image.height : 36\r\n        );\r\n    };\r\n\r\n    updateIcon = (width, height) => {\r\n        const { onChange } = this.props;\r\n        onChange(formName, 'icon.width', width);\r\n        onChange(formName, 'icon.height', height);\r\n        onChange(formName, 'icon.anchorX', Math.round(width / 2));\r\n        onChange(formName, 'icon.anchorY', height);\r\n    };\r\n\r\n    handleWidthChange = (e, width) => {\r\n        const { anchor, size } = this.props;\r\n        this.updateSliderValue(anchor.x, 'icon.anchorX', size.width, width);\r\n    };\r\n\r\n    handleHeightChange = (e, height) => {\r\n        const { anchor, size } = this.props;\r\n        this.updateSliderValue(anchor.y, 'icon.anchorY', size.height, height);\r\n    };\r\n\r\n    updateSliderValue = (value, property, oldMax, newMax) => {\r\n        if (!hasValue(oldMax)) return;\r\n        const { onChange } = this.props;\r\n        const slider = this.getScaledValue(value, oldMax, newMax);\r\n        onChange(formName, property, slider);\r\n    };\r\n\r\n    getScaledValue = (value, oldMax, newMax) => {\r\n        if (oldMax === 0) return 0;\r\n        const percent = value / oldMax;\r\n        const newValue = newMax * percent;\r\n        return Math.round(newValue);\r\n    };\r\n\r\n    render() {\r\n        const { anchor, size, image } = this.props;\r\n        return (\r\n            <StyledContainer>\r\n                <SettingsHelper>\r\n                    Upload an image that you would like to use for your marker icon. We support .gif, .jpg, .png, and\r\n                    .svg files up to 3 MB. For SVGs, we only support a single path.\r\n                </SettingsHelper>\r\n                <IconUpload\r\n                    name=\"image\"\r\n                    label=\"Image File\"\r\n                    url=\"/build-a-map/upload-marker-icon\"\r\n                    size={size}\r\n                    anchor={anchor}\r\n                    onChange={this.handleImageChange}\r\n                    validate={required}\r\n                />\r\n                <StyledCollapse isOpened={!!image}>\r\n                    <FlexRow>\r\n                        <Input\r\n                            name=\"width\"\r\n                            type=\"int\"\r\n                            label=\"Width\"\r\n                            width=\"50%\"\r\n                            unitAfter=\"px\"\r\n                            min={0}\r\n                            required\r\n                            deferred\r\n                            onChange={this.handleWidthChange}\r\n                        />\r\n                        <Input\r\n                            name=\"height\"\r\n                            type=\"int\"\r\n                            label=\"Height\"\r\n                            width=\"50%\"\r\n                            unitAfter=\"px\"\r\n                            min={0}\r\n                            required\r\n                            deferred\r\n                            onChange={this.handleHeightChange}\r\n                        />\r\n                    </FlexRow>\r\n                    <Slider\r\n                        name=\"anchorX\"\r\n                        label=\"Anchor X Coordinate\"\r\n                        min={0}\r\n                        max={hasValue(size.width) ? size.width : 36}\r\n                        unitAfter=\"px\"\r\n                    />\r\n                    <Slider\r\n                        name=\"anchorY\"\r\n                        label=\"Anchor Y Coordinate\"\r\n                        min={0}\r\n                        max={hasValue(size.height) ? size.height : 36}\r\n                        unitAfter=\"px\"\r\n                    />\r\n                </StyledCollapse>\r\n            </StyledContainer>\r\n        );\r\n    }\r\n}\r\n\r\nconst mapDispatchToProps = {\r\n    onChange: change,\r\n};\r\n\r\nexport default connect(null, mapDispatchToProps)(IconCustom);\r\n","import React from 'react';\r\nimport { FormSection } from 'redux-form';\r\nimport styled from 'styled-components';\r\n\r\nimport IconStyled from 'components/MarkerSettings/IconStyled';\r\nimport IconCustom from 'components/MarkerSettings/IconCustom';\r\nimport { Radio } from 'components/Shared/Forms';\r\nimport { MARKER_TYPE } from 'components/MarkerSettings/IconOptions';\r\nimport Collapse from 'components/Shared/Collapse';\r\nimport { SETTINGS_INPUTS } from 'theme';\r\n\r\nconst StyledFormSection = styled(FormSection)`\r\n    margin: -${SETTINGS_INPUTS.PADDING.Y} -${SETTINGS_INPUTS.PADDING.X};\r\n    padding-left: ${SETTINGS_INPUTS.PADDING.X};\r\n    padding-right: ${SETTINGS_INPUTS.PADDING.X};\r\n`;\r\n\r\nconst StyledCollapse = styled(Collapse)`\r\n    margin-right: -${SETTINGS_INPUTS.PADDING.X};\r\n    margin-left: -${SETTINGS_INPUTS.PADDING.X};\r\n`;\r\n\r\nclass IconSettings extends React.Component {\r\n    isSelected = (type) => {\r\n        return this.props.type === type;\r\n    };\r\n\r\n    render() {\r\n        const { color, size, anchor, image } = this.props;\r\n        return (\r\n            <StyledFormSection name=\"icon\">\r\n                <Radio name=\"type\" label=\"Default Google Maps Marker\" value={MARKER_TYPE.DEFAULT} />\r\n                <Radio name=\"type\" label=\"Styled Marker\" value={MARKER_TYPE.STYLED} />\r\n                <StyledCollapse isOpened={this.isSelected(MARKER_TYPE.STYLED)}>\r\n                    <IconStyled color={color} />\r\n                </StyledCollapse>\r\n                <Radio name=\"type\" label=\"Custom Marker\" value={MARKER_TYPE.CUSTOM} />\r\n                <StyledCollapse isOpened={this.isSelected(MARKER_TYPE.CUSTOM)}>\r\n                    <IconCustom image={image} size={size} anchor={anchor} />\r\n                </StyledCollapse>\r\n            </StyledFormSection>\r\n        );\r\n    }\r\n}\r\n\r\nexport default IconSettings;\r\n","import React from 'react';\r\nimport { v4 } from 'uuid';\r\nimport { connect } from 'react-redux';\r\nimport { FormSection, reduxForm, formValueSelector, change } from 'redux-form';\r\n\r\nimport { ContentSet } from 'components/Shared/Scaffolding';\r\nimport SettingsGroup, { SettingsHelper } from 'components/Shared/SettingsGroup';\r\nimport LocationInput from 'components/Shared/LocationInput';\r\nimport { TextButton } from 'components/Shared/Buttons';\r\nimport IconSettings from 'components/MarkerSettings/IconSettings';\r\nimport { MARKER_TYPE } from 'components/MarkerSettings/IconOptions';\r\nimport { Input, ButtonSet } from 'components/Shared/Forms';\r\nimport { requiredLocation, onSubmitFail } from 'utils/validation';\r\nimport { saveMarker, formName } from 'modules/markers';\r\nimport { getActiveMarker } from 'modules/navigation/activeMarker';\r\n\r\nconst MarkerForm = ({ handleSubmit, icon, onCancel }) => {\r\n    const { type, color, width, height, anchorX, anchorY, image } = icon || {};\r\n    return (\r\n        <form onSubmit={handleSubmit}>\r\n            <ContentSet spacing=\"40px\">\r\n                <ContentSet spacing=\"40px\">\r\n                    <SettingsGroup name=\"Name\" description=\"Enter a name for this marker\">\r\n                        <Input name=\"name\" width=\"100%\" required />\r\n                    </SettingsGroup>\r\n                    <SettingsGroup\r\n                        name=\"Location\"\r\n                        description=\"Please search for a location or enter a latitude and longitude\"\r\n                    >\r\n                        <SettingsHelper>\r\n                            Click anywhere on the map to place a marker or search below for your location. Once placed,\r\n                            you can click and drag the marker to fine-tune its position.\r\n                        </SettingsHelper>\r\n                        <FormSection name=\"location\" component={LocationInput} />\r\n                    </SettingsGroup>\r\n                    <SettingsGroup name=\"Icon\" description=\"Select the type of icon you want to use for this marker\">\r\n                        <IconSettings\r\n                            image={image}\r\n                            type={type}\r\n                            color={color}\r\n                            size={{ width, height }}\r\n                            anchor={{ x: anchorX, y: anchorY }}\r\n                        />\r\n                    </SettingsGroup>\r\n                </ContentSet>\r\n                <ButtonSet>\r\n                    <TextButton primary type=\"submit\">\r\n                        Apply Changes\r\n                    </TextButton>\r\n                    <TextButton secondary type=\"button\" onClick={onCancel}>\r\n                        Cancel\r\n                    </TextButton>\r\n                </ButtonSet>\r\n            </ContentSet>\r\n        </form>\r\n    );\r\n};\r\n\r\nconst getDefaultValues = (id) => ({\r\n    id,\r\n    icon: {\r\n        type: MARKER_TYPE.DEFAULT,\r\n        styledMarkerId: 0,\r\n        color: '#f44336',\r\n        size: 36,\r\n        width: 36,\r\n        height: 36,\r\n        anchorX: 18,\r\n        anchorY: 36,\r\n    },\r\n});\r\n\r\n// Allow other components to change our location in the form\r\nconst setActiveMarkerLocation = (location) => change(formName, 'location', location);\r\n\r\nconst validate = ({ location }) => ({\r\n    location: requiredLocation(location),\r\n});\r\n\r\nconst onSubmit = (values, dispatch, props) => {\r\n    dispatch(saveMarker(values));\r\n    props.onClose();\r\n};\r\n\r\nconst formValue = formValueSelector(formName);\r\nconst mapStateToProps = (state) => ({\r\n    initialValues: getActiveMarker(state) || getDefaultValues(v4()),\r\n    icon: formValue(state, 'icon'),\r\n});\r\n\r\nexport { setActiveMarkerLocation };\r\nexport default connect(mapStateToProps)(reduxForm({ form: formName, validate, onSubmit, onSubmitFail })(MarkerForm));\r\n","import React from 'react';\r\nimport { connect } from 'react-redux';\r\n\r\nimport { ContentSet } from 'components/Shared/Scaffolding';\r\nimport Panel, { PanelTitle } from 'components/Shared/Panel';\r\nimport MarkerForm from 'components/MarkerSettings/MarkerForm';\r\nimport { clearActiveMarker } from 'modules/navigation/activeMarker';\r\nimport { SCAFFOLDING } from 'theme';\r\nimport { formName } from 'modules/markers';\r\nimport withCancel from 'components/Shared/PanelCancel';\r\n\r\nclass MarkerPanel extends React.Component {\r\n    handleClose = () => {\r\n        const { clearActiveMarker, onClose } = this.props;\r\n        clearActiveMarker();\r\n        onClose();\r\n    };\r\n\r\n    render() {\r\n        const { open, onCancel } = this.props;\r\n        return (\r\n            <Panel open={open} onClose={onCancel}>\r\n                <ContentSet spacing={SCAFFOLDING.GUTTER} padding={SCAFFOLDING.GUTTER}>\r\n                    <PanelTitle>Marker</PanelTitle>\r\n                    <MarkerForm onClose={this.handleClose} onCancel={onCancel} />\r\n                </ContentSet>\r\n            </Panel>\r\n        );\r\n    }\r\n}\r\n\r\nconst mapDispatchToProps = {\r\n    clearActiveMarker,\r\n};\r\n\r\nexport default connect(\r\n    null,\r\n    mapDispatchToProps\r\n)(\r\n    withCancel({\r\n        form: formName,\r\n        dispatches: [clearActiveMarker()],\r\n    })(MarkerPanel)\r\n);\r\n","import React from 'react';\r\nimport { Field } from 'redux-form';\r\n\r\nimport { INFO_WINDOW_POSITION } from 'components/InfoWindowSettings/InfoWindowConstants';\r\nimport { ButtonGroup, ButtonGroupItem } from 'components/Shared/Forms';\r\nimport { GLYPHS } from 'components/Shared/Icon';\r\n\r\nconst InfoWindowPosition = ({ input }) => (\r\n    <ButtonGroup>\r\n        {Object.entries(INFO_WINDOW_POSITION).map(([key, obj]) => {\r\n            return (\r\n                <ButtonGroupItem\r\n                    title={obj.label}\r\n                    titlePlacement=\"top\"\r\n                    type=\"button\"\r\n                    key={key}\r\n                    glyph={GLYPHS[`INFO_WINDOW_${key}`]}\r\n                    selected={input.value === key}\r\n                    onClick={() => input.onChange(key)}\r\n                />\r\n            );\r\n        })}\r\n    </ButtonGroup>\r\n);\r\n\r\nconst InfoWindowPositionField = (props) => <Field component={InfoWindowPosition} {...props} />;\r\nexport default InfoWindowPositionField;\r\n","import React from 'react';\r\nimport styled from 'styled-components';\r\nimport { FormSection } from 'redux-form';\r\n\r\nimport { FlexRow } from 'components/Shared/Scaffolding';\r\nimport { Input } from 'components/Shared/Forms';\r\nimport { SCAFFOLDING } from 'theme';\r\n\r\nconst StyledFormSection = styled(FormSection)`\r\n    > * + * {\r\n        margin-top: ${SCAFFOLDING.GUTTER_FACTOR(0.5)};\r\n    }\r\n`;\r\n\r\nconst InfoWindowContainer = ({ defaultValues }) => (\r\n    <StyledFormSection name=\"container\">\r\n        <FlexRow>\r\n            <Input name=\"maxWidth\" label=\"Max Width\" type=\"int\" unitAfter=\"px\" width=\"50%\" min={0} optional />\r\n            <Input name=\"maxHeight\" label=\"Max Height\" type=\"int\" unitAfter=\"px\" width=\"50%\" min={0} optional />\r\n        </FlexRow>\r\n        <FlexRow>\r\n            <Input\r\n                name=\"top\"\r\n                label=\"Top Marker Offset\"\r\n                type=\"int\"\r\n                unitAfter=\"px\"\r\n                width=\"50%\"\r\n                placeholder={defaultValues.top}\r\n            />\r\n            <Input\r\n                name=\"left\"\r\n                label=\"Left Marker Offset\"\r\n                type=\"int\"\r\n                unitAfter=\"px\"\r\n                width=\"50%\"\r\n                placeholder={defaultValues.left}\r\n            />\r\n        </FlexRow>\r\n        <FlexRow>\r\n            <Input\r\n                name=\"padding\"\r\n                label=\"Padding\"\r\n                type=\"int\"\r\n                unitAfter=\"px\"\r\n                width=\"50%\"\r\n                min={0}\r\n                placeholder={defaultValues.padding}\r\n            />\r\n            <Input\r\n                name=\"borderRadius\"\r\n                label=\"Corner Radius\"\r\n                type=\"int\"\r\n                unitAfter=\"px\"\r\n                width=\"50%\"\r\n                min={0}\r\n                placeholder={defaultValues.borderRadius}\r\n            />\r\n        </FlexRow>\r\n    </StyledFormSection>\r\n);\r\n\r\nexport default InfoWindowContainer;\r\n","import React from 'react';\r\nimport { FormSection } from 'redux-form';\r\nimport styled from 'styled-components';\r\n\r\nimport { Checkbox, ColorPicker, Input, LABEL_POSITION } from 'components/Shared/Forms';\r\nimport { SettingsSubGroup } from 'components/Shared/SettingsGroup';\r\nimport Collapse from 'components/Shared/Collapse';\r\nimport { BREAKPOINTS, SCAFFOLDING } from 'theme';\r\n\r\nconst CollapseContent = styled.div`\r\n    padding: ${SCAFFOLDING.GUTTER_FACTOR(0.5)} ${SCAFFOLDING.GUTTER};\r\n\r\n    > * + * {\r\n        margin-top: ${SCAFFOLDING.GUTTER_FACTOR(0.5)};\r\n    }\r\n\r\n    @media (min-width: ${`${BREAKPOINTS.xxl}px`}) {\r\n        display: flex;\r\n\r\n        > * {\r\n            width: 50%;\r\n        }\r\n\r\n        > * + * {\r\n            margin-top: 0;\r\n            margin-left: ${SCAFFOLDING.GUTTER_FACTOR(0.5)};\r\n        }\r\n    }\r\n`;\r\n\r\nconst StyledInput = styled(Input)`\r\n    @media (min-width: ${`${BREAKPOINTS.lg}px`}) and (max-width: ${`${BREAKPOINTS.xxl - 1}px`}) {\r\n        width: calc(50% - ${SCAFFOLDING.GUTTER_FACTOR(0.25)});\r\n    }\r\n`;\r\n\r\nconst StyledCollapse = SettingsSubGroup.withComponent(Collapse);\r\n\r\nconst InfoWindowBorder = ({ showBorder, defaultValues }) => (\r\n    <FormSection name=\"border\">\r\n        <Checkbox toggleSwitch name=\"enabled\" label=\"Show Border\" labelPosition={LABEL_POSITION.LEFT} />\r\n        <StyledCollapse collapsible isOpened={!!showBorder}>\r\n            <CollapseContent>\r\n                <ColorPicker label=\"Border Color\" name=\"color\" />\r\n                <StyledInput\r\n                    name=\"width\"\r\n                    label=\"Border Width\"\r\n                    type=\"int\"\r\n                    unitAfter=\"px\"\r\n                    min={0}\r\n                    placeholder={defaultValues.width}\r\n                />\r\n            </CollapseContent>\r\n        </StyledCollapse>\r\n    </FormSection>\r\n);\r\n\r\nexport default InfoWindowBorder;\r\n","import React from 'react';\r\nimport styled from 'styled-components';\r\nimport { FormSection } from 'redux-form';\r\n\r\nimport { Input, Checkbox, LABEL_POSITION } from 'components/Shared/Forms';\r\nimport { SettingsSubGroup } from 'components/Shared/SettingsGroup';\r\nimport Collapse from 'components/Shared/Collapse';\r\nimport { BREAKPOINTS, SCAFFOLDING } from 'theme';\r\n\r\nconst CollapseContent = styled.div`\r\n    padding: ${SCAFFOLDING.GUTTER_FACTOR(0.5)} ${SCAFFOLDING.GUTTER};\r\n`;\r\n\r\nconst StyledCollapse = SettingsSubGroup.withComponent(Collapse);\r\n\r\nconst StyledInput = styled(Input)`\r\n    width: 100%;\r\n\r\n    @media (min-width: ${`${BREAKPOINTS.lg}px`}) {\r\n        width: calc(50% - ${SCAFFOLDING.GUTTER_FACTOR(0.25)});\r\n    }\r\n`;\r\n\r\nconst InfoWindowArrow = ({ showArrow, defaultValues }) => (\r\n    <FormSection name=\"arrow\">\r\n        <Checkbox toggleSwitch name=\"enabled\" label=\"Show Arrow\" labelPosition={LABEL_POSITION.LEFT} />\r\n\r\n        <StyledCollapse collapsible isOpened={!!showArrow}>\r\n            <CollapseContent>\r\n                <StyledInput\r\n                    name=\"length\"\r\n                    label=\"Arrow Length\"\r\n                    type=\"int\"\r\n                    unitAfter=\"px\"\r\n                    min={0}\r\n                    placeholder={defaultValues.length}\r\n                />\r\n            </CollapseContent>\r\n        </StyledCollapse>\r\n    </FormSection>\r\n);\r\n\r\nexport default InfoWindowArrow;\r\n","import React from 'react';\r\nimport { FormSection } from 'redux-form';\r\nimport styled from 'styled-components';\r\n\r\nimport { ContentSet, FlexRow } from 'components/Shared/Scaffolding';\r\nimport { InputRow, Input, Checkbox, ColorPicker, LABEL_POSITION } from 'components/Shared/Forms';\r\nimport { SettingsSubGroup } from 'components/Shared/SettingsGroup';\r\nimport Collapse from 'components/Shared/Collapse';\r\nimport { BREAKPOINTS, SCAFFOLDING } from 'theme';\r\n\r\nconst CollapseContent = styled(ContentSet)`\r\n    padding: ${SCAFFOLDING.GUTTER_FACTOR(0.5)} ${SCAFFOLDING.GUTTER};\r\n`;\r\n\r\nconst StyledCollapse = SettingsSubGroup.withComponent(Collapse);\r\n\r\nconst StyledInput = styled(Input)`\r\n    @media (min-width: ${`${BREAKPOINTS.lg}px`}) and (max-width: ${`${BREAKPOINTS.xxl - 1}px`}) {\r\n        width: calc(50% - ${SCAFFOLDING.GUTTER_FACTOR(0.25)});\r\n    }\r\n`;\r\n\r\nconst InfoWindowShadow = ({ showShadow, defaultValues }) => (\r\n    <FormSection name=\"shadow\">\r\n        <Checkbox toggleSwitch name=\"enabled\" label=\"Show Shadow\" labelPosition={LABEL_POSITION.LEFT} />\r\n        <StyledCollapse collapsible isOpened={!!showShadow}>\r\n            <CollapseContent>\r\n                <FlexRow>\r\n                    <Input\r\n                        name=\"h\"\r\n                        label=\"Horizontal\"\r\n                        type=\"int\"\r\n                        unitAfter=\"px\"\r\n                        width=\"50%\"\r\n                        placeholder={defaultValues.h}\r\n                    />\r\n                    <Input\r\n                        name=\"v\"\r\n                        label=\"Vertical\"\r\n                        type=\"int\"\r\n                        unitAfter=\"px\"\r\n                        width=\"50%\"\r\n                        placeholder={defaultValues.v}\r\n                    />\r\n                </FlexRow>\r\n                <FlexRow>\r\n                    <Input\r\n                        name=\"blur\"\r\n                        label=\"Blur\"\r\n                        type=\"int\"\r\n                        unitAfter=\"px\"\r\n                        min={0}\r\n                        width=\"50%\"\r\n                        placeholder={defaultValues.blur}\r\n                    />\r\n                    <Input\r\n                        name=\"spread\"\r\n                        label=\"Spread\"\r\n                        type=\"int\"\r\n                        unitAfter=\"px\"\r\n                        min={0}\r\n                        width=\"50%\"\r\n                        placeholder={defaultValues.spread}\r\n                    />\r\n                </FlexRow>\r\n                <InputRow>\r\n                    <ColorPicker name=\"color\" label=\"Color\" />\r\n                    <StyledInput\r\n                        name=\"opacity\"\r\n                        label=\"Opacity\"\r\n                        type=\"decimal\"\r\n                        step={0.01}\r\n                        min={0}\r\n                        max={1}\r\n                        placeholder={defaultValues.opacity}\r\n                    />\r\n                </InputRow>\r\n            </CollapseContent>\r\n        </StyledCollapse>\r\n    </FormSection>\r\n);\r\n\r\nexport default InfoWindowShadow;\r\n","import React from 'react';\r\nimport styled from 'styled-components';\r\nimport { FormSection } from 'redux-form';\r\n\r\nimport { Checkbox, LABEL_POSITION } from 'components/Shared/Forms';\r\nimport { INPUTS } from 'theme';\r\n\r\nconst StyledCheckbox = styled(Checkbox)`\r\n    margin-top: -${INPUTS.PADDING.X};\r\n    margin-bottom: -${INPUTS.PADDING.X};\r\n`;\r\n\r\nconst InfoWindowBehavior = () => (\r\n    <FormSection name=\"behavior\">\r\n        <StyledCheckbox name=\"openByDefault\" label=\"Open by default\" labelPosition={LABEL_POSITION.RIGHT} />\r\n        <StyledCheckbox name=\"closeOnMapClick\" label=\"Close on map click\" labelPosition={LABEL_POSITION.RIGHT} />\r\n        <StyledCheckbox\r\n            name=\"closeWhenOthersOpen\"\r\n            label=\"Close when other popups open\"\r\n            labelPosition={LABEL_POSITION.RIGHT}\r\n        />\r\n    </FormSection>\r\n);\r\n\r\nexport default InfoWindowBehavior;\r\n","// Quilljs throws an error in certain browsers which stops the whole page from loading.\r\nlet loaded = false;\r\nlet component = null;\r\ntry {\r\n    require('react-quill');\r\n    component = require('components/Shared/Forms/RichTextEditor/QuillRichTextEditor').default;\r\n    loaded = true;\r\n} catch (err) {\r\n    loaded = false;\r\n}\r\n\r\nconst RichTextEditorLoader = {\r\n    HasLoaded: loaded,\r\n    Component: component,\r\n};\r\n\r\nexport default RichTextEditorLoader;\r\n","import React from 'react';\r\nimport { connect } from 'react-redux';\r\nimport { reduxForm, formValueSelector } from 'redux-form';\r\nimport { change as formChange, initialize as formInitialize } from 'redux-form';\r\nimport styled from 'styled-components';\r\n\r\nimport InfoWindowPosition from 'components/InfoWindowSettings/InfoWindowPosition';\r\nimport InfoWindowContainer from 'components/InfoWindowSettings/InfoWindowContainer';\r\nimport InfoWindowBorder from 'components/InfoWindowSettings/InfoWindowBorder';\r\nimport InfoWindowArrow from 'components/InfoWindowSettings/InfoWindowArrow';\r\nimport InfoWindowShadow from 'components/InfoWindowSettings/InfoWindowShadow';\r\nimport InfoWindowBehavior from 'components/InfoWindowSettings/InfoWindowBehavior';\r\n\r\nimport { BREAKPOINTS, SCAFFOLDING, TYPOGRAPHY, BUTTON, SETTINGS_GROUP } from 'theme';\r\nimport SettingsGroup, { SettingsContentHR } from 'components/Shared/SettingsGroup';\r\nimport { TextButton, LinkButton } from 'components/Shared/Buttons';\r\nimport { HelperBlock, HR } from 'components/Shared/Scaffolding';\r\nimport { InputRow, Checkbox, ColorPicker, Select, ButtonSet, LABEL_POSITION } from 'components/Shared/Forms';\r\nimport {\r\n    INFO_WINDOW_STYLES,\r\n    mergeFormAndStyle,\r\n    getDefaultValues,\r\n    INFO_WINDOW_POSITION,\r\n} from 'components/InfoWindowSettings/InfoWindowConstants';\r\nimport { editMarkerInfoWindow } from 'modules/markers';\r\nimport { getActiveMarker } from 'modules/navigation/activeMarker';\r\nimport Collapse from 'components/Shared/Collapse';\r\nimport RichTextEditorLoader from 'components/Shared/Forms/RichTextEditor/RichTextEditorLoader';\r\n\r\nconst styleOptions = INFO_WINDOW_STYLES.map((k, i) => ({\r\n    label: k.label,\r\n    value: i,\r\n}));\r\n\r\nconst StyledSelect = styled(Select)`\r\n    width: 100%;\r\n\r\n    @media (min-width: ${`${BREAKPOINTS.xxl}px`}) {\r\n        width: calc(50% - ${SCAFFOLDING.GUTTER_FACTOR(0.25)});\r\n    }\r\n`;\r\n\r\nconst StyledCollapse = styled(Collapse)`\r\n    margin-left: -${SCAFFOLDING.GUTTER};\r\n    margin-right: -${SCAFFOLDING.GUTTER};\r\n    padding-left: ${SCAFFOLDING.GUTTER};\r\n    padding-right: ${SCAFFOLDING.GUTTER};\r\n`;\r\n\r\nconst CollapseContent = styled.div`\r\n    > * {\r\n        margin-top: ${SCAFFOLDING.GUTTER};\r\n    }\r\n`;\r\n\r\nconst StyledHR = styled(HR)`\r\n    margin-top: ${SCAFFOLDING.GUTTER};\r\n    margin-left: -${SCAFFOLDING.GUTTER};\r\n    margin-right: -${SCAFFOLDING.GUTTER};\r\n`;\r\n\r\nconst Subheading = styled.h1`\r\n    font-size: ${TYPOGRAPHY.FONT_SIZE.H2};\r\n`;\r\n\r\nconst AdvancedToggle = styled(LinkButton)`\r\n    padding-top: ${BUTTON.PADDING.Y};\r\n    padding-bottom: ${BUTTON.PADDING.Y};\r\n`;\r\n\r\nconst StyledButtonSet = styled(ButtonSet)`\r\n    margin-top: ${SCAFFOLDING.GUTTER};\r\n`;\r\n\r\nconst RichTextError = styled(HelperBlock)`\r\n    margin: -${SETTINGS_GROUP.PADDING.Y} -${SETTINGS_GROUP.PADDING.X};\r\n`;\r\n\r\nlet InfoWindowForm = ({\r\n    persistentValues,\r\n    defaultValues,\r\n    fontColor,\r\n    backgroundColor,\r\n    showArrow,\r\n    showShadow,\r\n    showBorder,\r\n    handleSubmit,\r\n    handleStyleChange,\r\n    onToggleAdvanced,\r\n    onCancel,\r\n}) => {\r\n    return (\r\n        <form onSubmit={handleSubmit}>\r\n            <SettingsGroup\r\n                name=\"Enable Popup\"\r\n                description=\"Choose if you would like to show a popup window for this marker\"\r\n            >\r\n                <Checkbox\r\n                    inline\r\n                    toggleSwitch\r\n                    name=\"enabled\"\r\n                    label=\"Include a popup and information on the marker\"\r\n                    labelPosition={LABEL_POSITION.LEFT}\r\n                />\r\n            </SettingsGroup>\r\n            <StyledCollapse isOpened={!!persistentValues.enabled}>\r\n                <CollapseContent>\r\n                    <SettingsGroup name=\"Popup Theme\" description=\"Pick how you want your popup to look\">\r\n                        <StyledSelect\r\n                            name=\"style\"\r\n                            options={styleOptions}\r\n                            onChange={(e, value) => handleStyleChange(e, value, persistentValues)}\r\n                        />\r\n                    </SettingsGroup>\r\n                    <SettingsGroup\r\n                        name=\"Content\"\r\n                        description=\"Specify what you want to display inside your popup\"\r\n                        spacing={SCAFFOLDING.GUTTER_FACTOR(0.5)}\r\n                    >\r\n                        {RichTextEditorLoader.HasLoaded && (\r\n                            <div>\r\n                                <InputRow>\r\n                                    <ColorPicker name=\"background\" label=\"Background Color\" />\r\n                                    <ColorPicker name=\"fontColor\" label=\"Default Font Color\" />\r\n                                </InputRow>\r\n                                <SettingsContentHR />\r\n                                <RichTextEditorLoader.Component\r\n                                    name=\"content\"\r\n                                    fontColor={fontColor}\r\n                                    backgroundColor={backgroundColor}\r\n                                />\r\n                            </div>\r\n                        )}\r\n                        {!RichTextEditorLoader.HasLoaded && (\r\n                            <RichTextError highlight=\"danger\" inverse>\r\n                                <p>\r\n                                    <strong>There was an error loading the content editor.</strong>\r\n                                </p>\r\n                                <p>\r\n                                    Please make sure your browser is up to date and try again. If the problem persists,\r\n                                    email us at <a href=\"mailto:support@snazzymaps.com\">support@snazzymaps.com</a>.\r\n                                </p>\r\n                            </RichTextError>\r\n                        )}\r\n                    </SettingsGroup>\r\n                    <SettingsGroup\r\n                        name=\"Position\"\r\n                        description=\"Choose where to display the popup with respect to the marker\"\r\n                    >\r\n                        <InfoWindowPosition name=\"position\" />\r\n                    </SettingsGroup>\r\n                </CollapseContent>\r\n\r\n                <StyledCollapse isOpened={persistentValues.showAdvanced}>\r\n                    <CollapseContent>\r\n                        <StyledHR />\r\n                        <header>\r\n                            <Subheading>Advanced Settings</Subheading>\r\n                            <p>Customize the look of your marker popup further with the options below.</p>\r\n                        </header>\r\n                        <SettingsGroup\r\n                            name=\"Container\"\r\n                            description=\"Specify the settings related to the popup's container\"\r\n                        >\r\n                            <InfoWindowContainer defaultValues={defaultValues.container} />\r\n                        </SettingsGroup>\r\n                        <SettingsGroup name=\"Border\" description=\"Specify the settings related to the popup's border\">\r\n                            <InfoWindowBorder showBorder={showBorder} defaultValues={defaultValues.border} />\r\n                        </SettingsGroup>\r\n                        <SettingsGroup name=\"Arrow\" description=\"Specify the settings related to the popup's arrow\">\r\n                            <InfoWindowArrow showArrow={showArrow} defaultValues={defaultValues.arrow} />\r\n                        </SettingsGroup>\r\n                        <SettingsGroup name=\"Shadow\" description=\"Specify the settings related to the popup's shadow\">\r\n                            <InfoWindowShadow showShadow={showShadow} defaultValues={defaultValues.shadow} />\r\n                        </SettingsGroup>\r\n                        <SettingsGroup\r\n                            name=\"Behavior\"\r\n                            description=\"Specify the settings related to the popup's behavior\"\r\n                        >\r\n                            <InfoWindowBehavior />\r\n                        </SettingsGroup>\r\n                    </CollapseContent>\r\n                </StyledCollapse>\r\n\r\n                <StyledHR />\r\n\r\n                <AdvancedToggle type=\"button\" onClick={onToggleAdvanced}>\r\n                    {persistentValues.showAdvanced ? 'Hide Advanced Settings' : 'Show Advanced Settings'}\r\n                </AdvancedToggle>\r\n            </StyledCollapse>\r\n            <StyledButtonSet>\r\n                <TextButton primary type=\"submit\">\r\n                    Apply Changes\r\n                </TextButton>\r\n                <TextButton secondary type=\"button\" onClick={onCancel}>\r\n                    Cancel\r\n                </TextButton>\r\n            </StyledButtonSet>\r\n        </form>\r\n    );\r\n};\r\n\r\nInfoWindowForm = reduxForm({\r\n    form: 'info-window',\r\n})(InfoWindowForm);\r\n\r\nconst selector = formValueSelector('info-window');\r\nconst mapStateToProps = (state) => {\r\n    const get = (prop) => selector(state, prop);\r\n    const activeMarker = getActiveMarker(state);\r\n    return {\r\n        persistentValues: {\r\n            enabled: get('enabled'),\r\n            showAdvanced: get('showAdvanced'),\r\n            position: get('position'),\r\n            content: get('content'),\r\n            behavior: get('behavior'),\r\n            container: {\r\n                maxWidth: get('container.maxWidth'),\r\n                maxHeight: get('container.maxHeight'),\r\n                top: get('container.top'),\r\n                left: get('container.left'),\r\n            },\r\n        },\r\n        fontColor: get('fontColor'),\r\n        backgroundColor: get('background'),\r\n        showArrow: get('arrow.enabled'),\r\n        showShadow: get('shadow.enabled'),\r\n        showBorder: get('border.enabled'),\r\n        activeMarker,\r\n        initialValues:\r\n            (activeMarker && activeMarker.infoWindow) ||\r\n            mergeFormAndStyle(\r\n                {\r\n                    enabled: false,\r\n                    showAdvanced: false,\r\n                    position: INFO_WINDOW_POSITION.TOP.value,\r\n                    content: 'Your content goes here...',\r\n                    behavior: {\r\n                        openByDefault: false,\r\n                        closeOnMapClick: true,\r\n                        closeWhenOthersOpen: true,\r\n                    },\r\n                },\r\n                0\r\n            ),\r\n        defaultValues: getDefaultValues(get('style')),\r\n    };\r\n};\r\n\r\nconst showAdvanced = () => {\r\n    return (dispatch, getState) => {\r\n        const state = getState();\r\n        const currentState = selector(state, 'showAdvanced');\r\n        dispatch(formChange('info-window', 'showAdvanced', !currentState));\r\n    };\r\n};\r\n\r\nconst mapDispatchToProps = (dispatch) => ({\r\n    onToggleAdvanced: () => {\r\n        dispatch(showAdvanced());\r\n    },\r\n    onSubmit: (values, dispatch, props) => {\r\n        dispatch(editMarkerInfoWindow(props.activeMarker.id, values));\r\n    },\r\n    onSubmitSuccess: (result, dispatch, props) => {\r\n        props.onClose();\r\n    },\r\n    handleStyleChange: (e, value, persistentValues) => {\r\n        dispatch(\r\n            formInitialize('info-window', mergeFormAndStyle(persistentValues, value), {\r\n                keepDirty: false,\r\n            })\r\n        );\r\n    },\r\n});\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(InfoWindowForm);\r\n","import React from 'react';\r\nimport { connect } from 'react-redux';\r\n\r\nimport { ContentSet } from 'components/Shared/Scaffolding';\r\nimport Panel, { PanelTitle } from 'components/Shared/Panel';\r\nimport InfoWindowForm from 'components/InfoWindowSettings/InfoWindowForm';\r\nimport { clearActiveMarker } from 'modules/navigation/activeMarker';\r\nimport { SCAFFOLDING } from 'theme';\r\nimport withCancel from 'components/Shared/PanelCancel';\r\n\r\nclass InfoWindowPanel extends React.Component {\r\n    handleClose = () => {\r\n        const { clearActiveMarker, onClose } = this.props;\r\n        clearActiveMarker();\r\n        onClose();\r\n    };\r\n\r\n    render() {\r\n        const { open, onCancel } = this.props;\r\n        return (\r\n            <Panel open={open} onClose={onCancel}>\r\n                <ContentSet spacing={SCAFFOLDING.GUTTER} padding={SCAFFOLDING.GUTTER}>\r\n                    <PanelTitle>Popup</PanelTitle>\r\n                    {open && <InfoWindowForm onClose={this.handleClose} onCancel={onCancel} />}\r\n                </ContentSet>\r\n            </Panel>\r\n        );\r\n    }\r\n}\r\n\r\nconst mapDispatchToProps = {\r\n    clearActiveMarker,\r\n};\r\n\r\nexport default connect(\r\n    null,\r\n    mapDispatchToProps\r\n)(\r\n    withCancel({\r\n        form: 'info-window',\r\n        dispatches: [clearActiveMarker()],\r\n    })(InfoWindowPanel)\r\n);\r\n","import { selector, selectorFamily } from 'recoil';\r\nimport { httpGet } from 'modules/api';\r\n\r\nexport const languagesSelector = selector({\r\n    key: 'Languages',\r\n    get: async () => {\r\n        try {\r\n            const response = await httpGet('/languages');\r\n            return (response && response.languages) || [];\r\n        } catch {\r\n            return [];\r\n        }\r\n    },\r\n});\r\n\r\nexport const languageNameByCodeSelector = selectorFamily({\r\n    key: 'LanguageNameByCode',\r\n    get: (language) => ({ get }) => {\r\n        const languages = get(languagesSelector);\r\n        const matchedLanguage = languages.find(({ code }) => code === language);\r\n        return matchedLanguage ? matchedLanguage.name : 'English';\r\n    },\r\n});\r\n","import React from 'react';\r\nimport { connect } from 'react-redux';\r\nimport styled from 'styled-components';\r\n\r\nimport SettingsGroup from 'components/Shared/SettingsGroup';\r\nimport { FlexRow } from 'components/Shared/Scaffolding';\r\nimport { Card } from 'components/Shared/Cards';\r\nimport { GLYPHS } from 'components/Shared/Icon';\r\nimport { TYPOGRAPHY } from 'theme';\r\nimport { controlsDescription, behaviorDescription, getLanguage } from 'modules/advancedSettings';\r\nimport { languageMismatch } from 'store';\r\nimport { useRecoilValue } from 'recoil';\r\nimport { languageNameByCodeSelector } from 'modules/languages';\r\n\r\nconst Language = styled.span`\r\n    margin-right: 4px;\r\n`;\r\n\r\nconst HighlightText = styled.span`\r\n    display: inline-block;\r\n    color: ${TYPOGRAPHY.COLOR_DANGER};\r\n`;\r\n\r\nconst Label = styled.strong`\r\n    flex: 0 0 auto;\r\n`;\r\n\r\nconst Value = styled.span`\r\n    flex: 1 1 auto;\r\n    min-width: 50%;\r\n    overflow-wrap: break-word;\r\n    word-wrap: break-word;\r\n    hyphens: auto;\r\n`;\r\n\r\nconst Preview = ({\r\n    onCardClick,\r\n    language,\r\n    controls,\r\n    behavior,\r\n    languageMismatch,\r\n    className,\r\n    labelClassName,\r\n    contentClassName,\r\n}) => {\r\n    const languageName = useRecoilValue(languageNameByCodeSelector(language));\r\n    return (\r\n        <SettingsGroup\r\n            name=\"Advanced Settings\"\r\n            description=\"Adjust specific advanced settings of your map\"\r\n            className={className}\r\n            labelClassName={labelClassName}\r\n            contentClassName={contentClassName}\r\n        >\r\n            <Card\r\n                onClick={onCardClick}\r\n                leftGlyph={GLYPHS.SETTINGS}\r\n                leftGlyphColor={TYPOGRAPHY.COLOR_REDUCED}\r\n                rightGlyph={GLYPHS.EDIT}\r\n            >\r\n                <FlexRow inline spacing=\"4px\">\r\n                    <Label>Language:</Label>\r\n                    <Value>\r\n                        <Language>{languageName}</Language>\r\n                        {languageMismatch ? <HighlightText>**</HighlightText> : ''}\r\n                    </Value>\r\n                </FlexRow>\r\n                <FlexRow inline spacing=\"4px\">\r\n                    <Label>Controls:</Label>\r\n                    <span>{controls}</span>\r\n                </FlexRow>\r\n                <FlexRow inline spacing=\"4px\">\r\n                    <Label>Behavior:</Label>\r\n                    <span>{behavior}</span>\r\n                </FlexRow>\r\n            </Card>\r\n        </SettingsGroup>\r\n    );\r\n};\r\n\r\nconst mapStateToProps = (state) => ({\r\n    language: getLanguage(state),\r\n    controls: controlsDescription(state),\r\n    behavior: behaviorDescription(state),\r\n    languageMismatch: languageMismatch(state),\r\n});\r\n\r\nexport default connect(mapStateToProps)(Preview);\r\n","import React from 'react';\r\nimport { connect } from 'react-redux';\r\nimport { FormSection, formValueSelector } from 'redux-form';\r\nimport styled, { css } from 'styled-components';\r\n\r\nimport If from 'components/Shared/If';\r\nimport { HelpButton } from 'components/Shared/Buttons';\r\nimport { Checkbox, Select, MultiSelect, LABEL_POSITION } from 'components/Shared/Forms';\r\nimport { controlPositions, mapTypes, mapTypeStyles } from 'modules/advancedSettings';\r\nimport Collapse from 'components/Shared/Collapse';\r\nimport { SCAFFOLDING, SETTINGS_INPUTS, INPUT_TOGGLES } from 'theme';\r\n\r\nconst opts = (x) => Object.keys(x).map((y) => ({ label: y, value: y }));\r\nconst positionOptions = opts(controlPositions);\r\nconst styleOptions = opts(mapTypeStyles);\r\nconst typeOptions = opts(mapTypes);\r\n\r\nconst StyledFormSection = styled(FormSection)`\r\n    margin-left: -${SETTINGS_INPUTS.PADDING.X};\r\n    margin-right: -${SETTINGS_INPUTS.PADDING.X};\r\n    padding: ${SCAFFOLDING.GUTTER_FACTOR(0.5)} ${SETTINGS_INPUTS.PADDING.X} ${SCAFFOLDING.GUTTER_FACTOR(0.5)};\r\n    padding-left: ${`calc(${parseInt(SETTINGS_INPUTS.PADDING.X, 10) + 10}px + ${INPUT_TOGGLES.WIDTH})`};\r\n    background-color: ${SETTINGS_INPUTS.BG.SUB};\r\n\r\n    & + & {\r\n        margin-top: 1px;\r\n    }\r\n`;\r\n\r\nconst SectionHeader = styled.div`\r\n    margin-bottom: ${SCAFFOLDING.GUTTER_FACTOR(0.25)};\r\n    font-weight: 700;\r\n`;\r\n\r\nconst SectionTitle = styled.span`\r\n    vertical-align: middle;\r\n`;\r\n\r\nconst StyledHelpButton = styled(HelpButton)`\r\n    margin-left: ${SCAFFOLDING.GUTTER_FACTOR(0.25)};\r\n`;\r\n\r\nconst StyledInput = css`\r\n    padding-top: ${SETTINGS_INPUTS.PADDING.Y};\r\n    padding-bottom: ${SETTINGS_INPUTS.PADDING.Y};\r\n`;\r\n\r\nconst StyledCheckbox = styled(Checkbox)`\r\n    ${StyledInput}\r\n`;\r\n\r\nconst StyledSelect = styled(Select)`\r\n    ${StyledInput}\r\n\r\n    label {\r\n        flex: 0 0 auto;\r\n        width: 4em;\r\n    }\r\n\r\n    .Select {\r\n        min-width: 15em;\r\n    }\r\n`;\r\n\r\nconst StyledMultiSelect = StyledSelect.withComponent(MultiSelect);\r\n\r\nconst CustomControlSection = ({ name, title, label, help, enabled }) => {\r\n    return (\r\n        <StyledFormSection name={name}>\r\n            <SectionHeader>\r\n                <SectionTitle>{title}</SectionTitle>\r\n                {help && <StyledHelpButton value={help} />}\r\n            </SectionHeader>\r\n            <StyledCheckbox inline toggleSwitch name=\"enabled\" label={label} labelPosition={LABEL_POSITION.LEFT} />\r\n            <Collapse isOpened={!!enabled}>\r\n                <If statement={name !== 'scale'}>\r\n                    <StyledSelect\r\n                        name=\"position\"\r\n                        label=\"Position\"\r\n                        labelPosition={LABEL_POSITION.LEFT}\r\n                        options={positionOptions}\r\n                    />\r\n                </If>\r\n                <If statement={name === 'mapType'}>\r\n                    <StyledSelect\r\n                        name=\"style\"\r\n                        label=\"Style\"\r\n                        labelPosition={LABEL_POSITION.LEFT}\r\n                        options={styleOptions}\r\n                    />\r\n                </If>\r\n                <If statement={name === 'mapType'}>\r\n                    <StyledMultiSelect\r\n                        name=\"types\"\r\n                        label=\"Type\"\r\n                        labelPosition={LABEL_POSITION.LEFT}\r\n                        options={typeOptions}\r\n                    />\r\n                </If>\r\n            </Collapse>\r\n        </StyledFormSection>\r\n    );\r\n};\r\n\r\nconst selector = formValueSelector('advanced-form');\r\n\r\nconst mapStateToProps = (state, ownProps) => ({\r\n    enabled: selector(state, `controls.custom.${ownProps.name}.enabled`),\r\n});\r\n\r\nexport default connect(mapStateToProps)(CustomControlSection);\r\n","import React from 'react';\r\nimport { FormSection } from 'redux-form';\r\nimport styled from 'styled-components';\r\n\r\nimport CustomControlSection from 'components/AdvancedSettings/CustomControlSection';\r\nimport { SettingsHelper } from 'components/Shared/SettingsGroup';\r\nimport { SCAFFOLDING, SETTINGS_INPUTS, INPUT_TOGGLES } from 'theme';\r\n\r\nconst StyledSettingsHelper = styled(SettingsHelper)`\r\n    margin: 0 -${SETTINGS_INPUTS.PADDING.X} 1px;\r\n    padding: ${SCAFFOLDING.GUTTER_FACTOR(0.5)} ${SETTINGS_INPUTS.PADDING.X} ${SCAFFOLDING.GUTTER_FACTOR(0.5)};\r\n    padding-left: ${`calc(${parseInt(SETTINGS_INPUTS.PADDING.X, 10) + 10}px + ${INPUT_TOGGLES.WIDTH})`};\r\n    background-color: ${SETTINGS_INPUTS.BG.SUB};\r\n\r\n    & + * {\r\n        margin-top: 1px;\r\n    }\r\n`;\r\n\r\nconst CustomControlsSection = () => {\r\n    return (\r\n        <FormSection name=\"custom\">\r\n            <StyledSettingsHelper>\r\n                Toggle individual controls and settings. More information about the different control positions can be\r\n                viewed{' '}\r\n                <a\r\n                    href=\"https://developers.google.com/maps/documentation/javascript/controls#ControlPositioning\"\r\n                    target=\"_blank\"\r\n                    rel=\"noopener noreferrer\"\r\n                >\r\n                    here\r\n                </a>\r\n                .\r\n            </StyledSettingsHelper>\r\n            <CustomControlSection name=\"zoom\" title=\"Zoom Control\" label=\"Show Control\" />\r\n            <CustomControlSection name=\"mapType\" title=\"Map Type Control\" label=\"Show Control\" />\r\n            <CustomControlSection name=\"streetView\" title=\"Street View Control\" label=\"Show Control\" />\r\n            <CustomControlSection\r\n                name=\"rotate\"\r\n                title=\"Rotate Control\"\r\n                label=\"Show Control\"\r\n                help=\"You will only see this control when you zoom into certain locations while in satellite mode (e.g. Santa Cruz, CA).\"\r\n            />\r\n            <CustomControlSection\r\n                name=\"scale\"\r\n                title=\"Scale Control\"\r\n                label=\"Show Control\"\r\n                help=\"This control appears in the bottom right hand side of the map next to the Terms of Use.\"\r\n            />\r\n            <CustomControlSection name=\"fullscreen\" title=\"Fullscreen Control\" label=\"Show Control\" />\r\n        </FormSection>\r\n    );\r\n};\r\n\r\nexport default CustomControlsSection;\r\n","import React from 'react';\r\nimport { connect } from 'react-redux';\r\nimport { FormSection, formValueSelector } from 'redux-form';\r\nimport styled from 'styled-components';\r\n\r\nimport { Radio } from 'components/Shared/Forms';\r\nimport Collapse from 'components/Shared/Collapse';\r\nimport { controlsType } from 'modules/advancedSettings';\r\nimport CustomControlsSection from 'components/AdvancedSettings/CustomControlsSection';\r\nimport { SettingsHelper } from 'components/Shared/SettingsGroup';\r\nimport { SETTINGS_INPUTS } from 'theme';\r\n\r\nconst StyledFormSection = styled(FormSection)`\r\n    margin-bottom: -${SETTINGS_INPUTS.PADDING.Y};\r\n`;\r\n\r\nconst StyledCollapse = styled(Collapse)`\r\n    margin-left: -${SETTINGS_INPUTS.PADDING.X};\r\n    margin-right: -${SETTINGS_INPUTS.PADDING.X};\r\n    padding-left: ${SETTINGS_INPUTS.PADDING.X};\r\n    padding-right: ${SETTINGS_INPUTS.PADDING.X};\r\n`;\r\n\r\nconst ControlsSection = ({ showCustom }) => {\r\n    return (\r\n        <StyledFormSection name=\"controls\">\r\n            <SettingsHelper>\r\n                For more information on the controls available and their settings, please refer to the{' '}\r\n                <a\r\n                    href=\"https://developers.google.com/maps/documentation/javascript/controls\"\r\n                    target=\"_blank\"\r\n                    rel=\"noopener noreferrer\"\r\n                >\r\n                    Google Maps APIs documentation\r\n                </a>\r\n                .\r\n            </SettingsHelper>\r\n            <Radio name=\"type\" label=\"Default Google Maps settings\" value={controlsType.DEFAULT} />\r\n            <Radio name=\"type\" label=\"Hide all controls\" value={controlsType.HIDE_ALL} />\r\n            <Radio name=\"type\" label=\"Custom\" value={controlsType.CUSTOM} />\r\n            <StyledCollapse isOpened={showCustom}>\r\n                <CustomControlsSection />\r\n            </StyledCollapse>\r\n        </StyledFormSection>\r\n    );\r\n};\r\n\r\nconst selector = formValueSelector('advanced-form');\r\n\r\nconst mapStateToProps = (state) => ({\r\n    showCustom: selector(state, 'controls.type') === controlsType.CUSTOM,\r\n});\r\n\r\nexport default connect(mapStateToProps)(ControlsSection);\r\n","import React from 'react';\r\nimport { FormSection } from 'redux-form';\r\nimport styled from 'styled-components';\r\n\r\nimport { Checkbox } from 'components/Shared/Forms';\r\nimport { SETTINGS_INPUTS } from 'theme';\r\n\r\nconst StyledFormSection = styled(FormSection)`\r\n    margin: -${SETTINGS_INPUTS.PADDING.Y} -${SETTINGS_INPUTS.PADDING.X};\r\n    padding-left: ${SETTINGS_INPUTS.PADDING.X};\r\n    padding-right: ${SETTINGS_INPUTS.PADDING.X};\r\n`;\r\n\r\nconst BehaviorSection = () => {\r\n    return (\r\n        <StyledFormSection name=\"behavior\">\r\n            <Checkbox name=\"panning\" label=\"Panning\" />\r\n            <Checkbox name=\"keyboardShortcuts\" label=\"Keyboard shortcuts\" />\r\n            <Checkbox name=\"doubleClickToZoom\" label=\"Double click to zoom\" />\r\n            <Checkbox name=\"scrollToZoom\" label=\"Scroll to zoom\" />\r\n            <Checkbox name=\"clickableIcons\" label=\"Clickable points of interest\" />\r\n        </StyledFormSection>\r\n    );\r\n};\r\n\r\nexport default BehaviorSection;\r\n","import React, { useMemo } from 'react';\r\nimport styled from 'styled-components';\r\nimport { Select } from 'components/Shared/Forms';\r\nimport { BREAKPOINTS, SCAFFOLDING } from 'theme';\r\nimport { useRecoilValue } from 'recoil';\r\nimport { languagesSelector } from 'modules/languages';\r\n\r\nconst StyledSelect = styled(Select)`\r\n    min-width: 15em;\r\n\r\n    @media (min-width: ${`${BREAKPOINTS.xxl}px`}) {\r\n        width: calc(50% - ${SCAFFOLDING.GUTTER_FACTOR(0.25)});\r\n    }\r\n`;\r\n\r\nexport const LanguagesSelect = ({ name = 'language' }) => {\r\n    const languages = useRecoilValue(languagesSelector);\r\n    const selectOptions = useMemo(() => languages.map(({ code, name }) => ({ label: name, value: code })), [languages]);\r\n    return <StyledSelect name={name} options={selectOptions} searchable />;\r\n};\r\n","import React from 'react';\r\nimport { ReactComponent as LoadingCircle } from 'assets/images/loading.svg';\r\nimport styles from './Loading.module.scss';\r\n\r\nexport const SmallLoading = ({ size = 20 }) => {\r\n    return (\r\n        <div className={styles.loading} style={{ height: size + 'px' }}>\r\n            <LoadingCircle className={styles.circle} stroke=\"var(--sm-brand-primary)\" width={size} height={size} />\r\n        </div>\r\n    );\r\n};\r\n","import React, { Suspense } from 'react';\r\nimport { connect } from 'react-redux';\r\nimport { reduxForm, change } from 'redux-form';\r\nimport styled from 'styled-components';\r\n\r\nimport If from 'components/Shared/If';\r\nimport SettingsGroup from 'components/Shared/SettingsGroup';\r\nimport { ContentSet, FlexRow } from 'components/Shared/Scaffolding';\r\nimport { TextButton } from 'components/Shared/Buttons';\r\nimport { Select, ButtonSet } from 'components/Shared/Forms';\r\nimport { saveAdvancedSettings, getAdvancedSettings, getLanguage, mapTypes } from 'modules/advancedSettings';\r\nimport { getMapTileLanguage, languageMismatch } from 'store';\r\nimport ControlsSection from 'components/AdvancedSettings/ControlsSection';\r\nimport BehaviorSection from 'components/AdvancedSettings/BehaviorSection';\r\nimport { BREAKPOINTS, SCAFFOLDING, TYPOGRAPHY } from 'theme';\r\nimport { LanguagesSelect } from './LanguagesSelect';\r\nimport { SmallLoading } from 'components/Loading/SmallLoading';\r\nimport { useRecoilValue } from 'recoil';\r\nimport { languageNameByCodeSelector } from 'modules/languages';\r\n\r\nconst StyledSelect = styled(Select)`\r\n    min-width: 15em;\r\n\r\n    @media (min-width: ${`${BREAKPOINTS.xxl}px`}) {\r\n        width: calc(50% - ${SCAFFOLDING.GUTTER_FACTOR(0.25)});\r\n    }\r\n`;\r\n\r\nconst StyledFlexRow = styled(FlexRow)`\r\n    margin-top: ${SCAFFOLDING.GUTTER_FACTOR(0.25)};\r\n\r\n    > * {\r\n        display: inline-block;\r\n    }\r\n`;\r\n\r\nconst HighlightText = styled.span`\r\n    flex: 0 0 auto;\r\n    color: ${TYPOGRAPHY.COLOR_DANGER};\r\n`;\r\n\r\nconst AdvancedForm = ({ handleSubmit, mapTileLanguage, language, languageMismatch, cancelPanel }) => {\r\n    const mapTypeOptions = Object.values(mapTypes).map((value) => ({\r\n        label: value.charAt(0).toUpperCase() + value.slice(1),\r\n        value,\r\n    }));\r\n    const mapTileLanguageName = useRecoilValue(languageNameByCodeSelector(mapTileLanguage));\r\n    const languageName = useRecoilValue(languageNameByCodeSelector(language));\r\n    return (\r\n        <form onSubmit={handleSubmit}>\r\n            <ContentSet spacing={SCAFFOLDING.GUTTER}>\r\n                <SettingsGroup name=\"Language\" description=\"Specify the language to use on your map\">\r\n                    <Suspense fallback={<SmallLoading />}>\r\n                        <LanguagesSelect name=\"language\" />\r\n                    </Suspense>\r\n                    <If statement={languageMismatch}>\r\n                        <StyledFlexRow spacing=\"4px\">\r\n                            <HighlightText>**</HighlightText>\r\n                            <em>\r\n                                The map is currently in <strong>{mapTileLanguageName}</strong>. Refresh this page to set\r\n                                the map to <strong>{languageName}</strong>. Your changes will not be lost.\r\n                            </em>\r\n                        </StyledFlexRow>\r\n                    </If>\r\n                </SettingsGroup>\r\n                <SettingsGroup name=\"Map Type\" description=\"Select what map type should be displayed by default\">\r\n                    <StyledSelect name=\"mapType\" options={mapTypeOptions} />\r\n                </SettingsGroup>\r\n                <SettingsGroup name=\"Controls\" description=\"Specify which controls should be displayed on your map\">\r\n                    <ControlsSection />\r\n                </SettingsGroup>\r\n                <SettingsGroup name=\"Behavior\" description=\"Specify advanced behavior settings for your map\">\r\n                    <BehaviorSection />\r\n                </SettingsGroup>\r\n                <ButtonSet>\r\n                    <TextButton primary type=\"submit\">\r\n                        Apply Changes\r\n                    </TextButton>\r\n                    <TextButton type=\"button\" onClick={cancelPanel}>\r\n                        Cancel\r\n                    </TextButton>\r\n                </ButtonSet>\r\n            </ContentSet>\r\n        </form>\r\n    );\r\n};\r\n\r\nconst mapStateToProps = (state) => ({\r\n    mapTileLanguage: getMapTileLanguage(),\r\n    language: getLanguage(state),\r\n    languageMismatch: languageMismatch(state),\r\n    initialValues: {\r\n        ...getAdvancedSettings(state),\r\n        language: getLanguage(state),\r\n    },\r\n});\r\n\r\nconst mapDispatchToProps = () => ({\r\n    onSubmit: (values, dispatch) => {\r\n        dispatch(saveAdvancedSettings(values));\r\n    },\r\n    onSubmitSuccess: (result, dispatch, props) => {\r\n        props.closePanel();\r\n    },\r\n});\r\n\r\nconst form = 'advanced-form';\r\n\r\nexport const setMapType = (mapType) => change(form, 'mapType', mapType);\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(reduxForm({ form })(AdvancedForm));\r\n","import React, { Suspense } from 'react';\r\n\r\nimport { ContentSet } from 'components/Shared/Scaffolding';\r\nimport Panel, { PanelTitle } from 'components/Shared/Panel';\r\nimport AdvancedForm from 'components/AdvancedSettings/AdvancedForm';\r\nimport { SCAFFOLDING } from 'theme';\r\nimport withCancel from 'components/Shared/PanelCancel';\r\nimport { SmallLoading } from 'components/Loading/SmallLoading';\r\n\r\nconst AdvancedPanel = ({ open, onClose, onCancel }) => (\r\n    <Panel open={open} onClose={onCancel}>\r\n        <ContentSet spacing={SCAFFOLDING.GUTTER} padding={SCAFFOLDING.GUTTER}>\r\n            <PanelTitle>Advanced Settings</PanelTitle>\r\n            <Suspense fallback={<SmallLoading size={40} />}>\r\n                <AdvancedForm closePanel={onClose} cancelPanel={onCancel} />\r\n            </Suspense>\r\n        </ContentSet>\r\n    </Panel>\r\n);\r\n\r\nexport default withCancel({ form: 'advanced-form' })(AdvancedPanel);\r\n","import React from 'react';\r\nimport styled from 'styled-components';\r\nimport { ifProp } from 'styled-tools';\r\n\r\nimport { TABS } from 'theme';\r\n\r\nconst StyledTab = styled.button`\r\n    display: inline-block;\r\n    position: relative;\r\n    padding: ${TABS.PADDING.Y} ${TABS.PADDING.X};\r\n    background-color: transparent;\r\n    border: 0;\r\n    color: ${ifProp('active', TABS.COLOR.ACTIVE, TABS.COLOR.BASE)};\r\n    font-size: ${TABS.FONT_SIZE};\r\n    text-transform: uppercase;\r\n\r\n    &:after {\r\n        content: '';\r\n        display: block;\r\n        position: absolute;\r\n        right: ${TABS.PADDING.X};\r\n        bottom: 0;\r\n        left: ${TABS.PADDING.X};\r\n        height: 4px;\r\n        background-color: ${ifProp('active', TABS.BORDER.ACTIVE, TABS.BORDER.BASE)};\r\n    }\r\n`;\r\n\r\nconst Tab = ({ children, ...props }) => {\r\n    return (\r\n        <StyledTab type=\"button\" {...props}>\r\n            {children}\r\n        </StyledTab>\r\n    );\r\n};\r\n\r\nexport default Tab;\r\n","import React from 'react';\r\nimport styled from 'styled-components';\r\nimport CSSTransitionGroup from 'react-transition-group/CSSTransitionGroup';\r\n\r\nimport { TRANSITION } from 'theme';\r\nimport { FirstChild } from 'utils/transitions';\r\n\r\nconst StyledTabContent = styled.div`\r\n    &.fade {\r\n        /* Active must come after its previous state */\r\n        &-enter {\r\n            opacity: 0;\r\n        }\r\n\r\n        &-enter-active {\r\n            opacity: 1;\r\n        }\r\n\r\n        &-leave {\r\n            position: absolute;\r\n            top: 0;\r\n            right: 0;\r\n            left: 0;\r\n            opacity: 1;\r\n        }\r\n\r\n        &-leave-active {\r\n            opacity: 0;\r\n        }\r\n\r\n        /* Need the transition on the active classes to animate with react-select */\r\n        &-enter-active,\r\n        &-leave-active {\r\n            transition: opacity ${TRANSITION.LENGTH_LONG} ${TRANSITION.BEZIER};\r\n        }\r\n    }\r\n`;\r\n\r\nconst TabContent = ({ isOpen, children, props }) => {\r\n    return (\r\n        <CSSTransitionGroup\r\n            component={FirstChild}\r\n            transitionName=\"fade\"\r\n            transitionEnterTimeout={parseInt(TRANSITION.LENGTH_LONG, 10)}\r\n            transitionLeaveTimeout={parseInt(TRANSITION.LENGTH_LONG, 10)}\r\n        >\r\n            {isOpen && <StyledTabContent {...props}>{children}</StyledTabContent>}\r\n        </CSSTransitionGroup>\r\n    );\r\n};\r\n\r\nexport default TabContent;\r\n","import React from 'react';\r\nimport styled from 'styled-components';\r\n\r\nimport { ContentSet } from 'components/Shared/Scaffolding';\r\nimport Tab from 'components/Shared/Tabs/Tab';\r\nimport TabContent from 'components/Shared/Tabs/TabContent';\r\nimport { SCAFFOLDING, TABS } from 'theme';\r\n\r\nconst StyledTabs = styled.div`\r\n    margin: -${TABS.PADDING.Y} -${TABS.PADDING.X};\r\n`;\r\n\r\nconst TabContentWrapper = styled.div`\r\n    position: relative;\r\n`;\r\n\r\nconst TabGroup = ({ tabs, selected = 0, onTabClick = () => {}, ...props }) => {\r\n    return (\r\n        <ContentSet spacing={SCAFFOLDING.GUTTER}>\r\n            <StyledTabs>\r\n                {tabs.map((tab, index) => {\r\n                    return (\r\n                        <Tab active={selected === index} key={index} onClick={() => onTabClick(tab, index)}>\r\n                            {tab}\r\n                        </Tab>\r\n                    );\r\n                })}\r\n            </StyledTabs>\r\n            <TabContentWrapper>\r\n                {props.children.map((Child, index) => {\r\n                    return (\r\n                        <TabContent isOpen={selected === index} key={index}>\r\n                            {Child}\r\n                        </TabContent>\r\n                    );\r\n                })}\r\n            </TabContentWrapper>\r\n        </ContentSet>\r\n    );\r\n};\r\n\r\nexport default TabGroup;\r\n","import { selector } from 'recoil';\r\nimport { httpGet } from 'modules/api';\r\n\r\nexport const filterOptionsSelector = selector({\r\n    key: 'FilterOptions',\r\n    get: async () => {\r\n        try {\r\n            return httpGet('/maps/filter-options');\r\n        } catch {\r\n            return { sortOptions: [], tagOptions: [], colorOptions: [] };\r\n        }\r\n    },\r\n});\r\n","import React, { useMemo } from 'react';\r\nimport styled from 'styled-components';\r\n\r\nimport { FlexRow } from 'components/Shared/Scaffolding';\r\nimport { Input, Select } from 'components/Shared/Forms';\r\nimport { TextButton } from 'components/Shared/Buttons';\r\nimport { Icon, GLYPHS } from 'components/Shared/Icon';\r\nimport { SCAFFOLDING, TYPOGRAPHY, SECTIONS } from 'theme';\r\nimport { useRecoilValue } from 'recoil';\r\nimport { filterOptionsSelector } from 'modules/filter-options';\r\n\r\nconst opts = (x) => x.map(({ name, value }) => ({ label: name, value }));\r\n\r\nconst StyledSearchOptions = styled.div`\r\n    margin-left: -${SCAFFOLDING.GUTTER};\r\n    margin-right: -${SCAFFOLDING.GUTTER};\r\n    padding: ${SCAFFOLDING.GUTTER_FACTOR(0.5)} ${SCAFFOLDING.GUTTER};\r\n    background-color: ${SECTIONS.SUB.BG};\r\n`;\r\n\r\nconst StyledInput = styled(Input)`\r\n    flex: 1 1 auto;\r\n\r\n    input {\r\n        border-top-right-radius: 0;\r\n        border-bottom-right-radius: 0;\r\n    }\r\n`;\r\n\r\nconst StyledButton = styled(TextButton)`\r\n    padding-top: 0;\r\n    padding-bottom: 0;\r\n    border-top-left-radius: 0;\r\n    border-bottom-left-radius: 0;\r\n    font-size: ${TYPOGRAPHY.FONT_SIZE.LARGE};\r\n`;\r\n\r\nconst StyledSelect = styled(Select)`\r\n    flex: 1 1 auto;\r\n    margin-top: ${SCAFFOLDING.GUTTER_FACTOR(0.25)};\r\n`;\r\n\r\nconst SearchOptions = ({ handleSearchClicked }) => {\r\n    const { sortOptions, tagOptions, colorOptions } = useRecoilValue(filterOptionsSelector);\r\n    const sorts = useMemo(() => opts(sortOptions), [sortOptions]);\r\n    const tags = useMemo(() => opts(tagOptions), [tagOptions]);\r\n    const colors = useMemo(() => opts(colorOptions), [colorOptions]);\r\n    return (\r\n        <StyledSearchOptions>\r\n            <FlexRow spacing={0}>\r\n                <StyledInput name=\"text\" type=\"text\" placeholder=\"Search...\" normalize={(value) => value || null} />\r\n                <StyledButton\r\n                    primary\r\n                    glyph={GLYPHS.SEARCH}\r\n                    onClick={(event) => {\r\n                        event.preventDefault();\r\n                        handleSearchClicked();\r\n                    }}\r\n                >\r\n                    <Icon glyph={GLYPHS.SEARCH} />\r\n                </StyledButton>\r\n            </FlexRow>\r\n            <FlexRow spacing={SCAFFOLDING.GUTTER_FACTOR(0.125)}>\r\n                <StyledSelect\r\n                    name=\"sort\"\r\n                    options={sorts}\r\n                    clearable\r\n                    placeholder=\"Sort\"\r\n                    width={SCAFFOLDING.COLUMN_WIDTH(4)}\r\n                />\r\n                <StyledSelect\r\n                    name=\"tag\"\r\n                    options={tags}\r\n                    clearable\r\n                    placeholder=\"Tag\"\r\n                    width={SCAFFOLDING.COLUMN_WIDTH(4)}\r\n                />\r\n                <StyledSelect\r\n                    name=\"color\"\r\n                    options={colors}\r\n                    clearable\r\n                    placeholder=\"Color\"\r\n                    width={SCAFFOLDING.COLUMN_WIDTH(4)}\r\n                />\r\n            </FlexRow>\r\n        </StyledSearchOptions>\r\n    );\r\n};\r\n\r\nexport default SearchOptions;\r\n","import React from 'react';\r\nimport styled, { css } from 'styled-components';\r\nimport { ifProp } from 'styled-tools';\r\nimport CSSTransitionGroup from 'react-transition-group/CSSTransitionGroup';\r\n\r\nimport { FlexRow } from 'components/Shared/Scaffolding';\r\nimport { CardWrapper } from 'components/Shared/Cards';\r\nimport { Icon, GLYPHS } from 'components/Shared/Icon';\r\nimport { SCAFFOLDING, SECTIONS, TRANSITION } from 'theme';\r\nimport { FirstChild } from 'utils/transitions';\r\n\r\nconst Style = styled(CardWrapper)`\r\n    overflow: hidden;\r\n\r\n    ${ifProp(\r\n        'isSelected',\r\n        css`\r\n            background-color: ${SECTIONS.DARK.BG};\r\n            color: ${SECTIONS.DARK.COLOR};\r\n        `\r\n    )}\r\n`;\r\n\r\nconst StyleImage = styled.span`\r\n    flex: 0 0 ${SCAFFOLDING.COLUMN_WIDTH(7)};\r\n    display: inline-block;\r\n    height: ${SCAFFOLDING.GUTTER_FACTOR(5)};\r\n    background-color: ${SECTIONS.SUB.BG};\r\n    background-position: center;\r\n    background-repeat: no-repeat;\r\n`;\r\n\r\nconst StyleDesc = styled.span`\r\n    flex: 1 1 auto;\r\n    display: inline-block;\r\n    position: relative;\r\n    padding: ${SCAFFOLDING.GUTTER_FACTOR(0.5)};\r\n    word-wrap: break-word;\r\n    word-break: break-word;\r\n`;\r\n\r\nconst StyleName = styled.span`\r\n    display: block;\r\n    font-size: 1.1em;\r\n    font-weight: 700;\r\n`;\r\n\r\nconst StyleBy = styled.span`\r\n    display: block;\r\n    font-style: italic;\r\n`;\r\n\r\nconst StyleCheck = styled(Icon)`\r\n    position: absolute;\r\n    left: ${SCAFFOLDING.GUTTER_FACTOR(0.5)};\r\n    bottom: ${SCAFFOLDING.GUTTER_FACTOR(0.5)};\r\n    color: #fff;\r\n    font-size: 3em;\r\n\r\n    &.checked-enter {\r\n        opacity: 0;\r\n    }\r\n\r\n    &.checked-enter-active {\r\n        opacity: 1;\r\n        transition: opacity ${TRANSITION.LENGTH_LONG} ${TRANSITION.BEZIER};\r\n    }\r\n`;\r\n\r\nconst SearchResultPreview = ({ style, isSelected, selectStyle }) => {\r\n    return (\r\n        <Style isSelected={isSelected} type=\"button\" onClick={() => selectStyle(style, isSelected)}>\r\n            <FlexRow spacing={0}>\r\n                <StyleImage style={{ backgroundImage: `url(${style.imageUrl})` }} />\r\n                <StyleDesc>\r\n                    <StyleName>{style.name}</StyleName>\r\n                    <StyleBy>by {style.createdBy}</StyleBy>\r\n                    <CSSTransitionGroup\r\n                        component={FirstChild}\r\n                        transitionName=\"checked\"\r\n                        transitionEnterTimeout={300}\r\n                        transitionLeaveTimeout={300}\r\n                    >\r\n                        {isSelected ? <StyleCheck glyph={GLYPHS.CHECK} /> : null}\r\n                    </CSSTransitionGroup>\r\n                </StyleDesc>\r\n            </FlexRow>\r\n        </Style>\r\n    );\r\n};\r\n\r\nexport default SearchResultPreview;\r\n","import React from 'react';\r\nimport styled from 'styled-components';\r\nimport ReactPaginate from 'react-paginate';\r\n\r\nimport { ContentSet } from 'components/Shared/Scaffolding';\r\nimport { Icon, GLYPHS } from 'components/Shared/Icon';\r\nimport SearchResultPreview from 'components/StyleSettings/SearchResultPreview';\r\nimport { SCAFFOLDING, TYPOGRAPHY, PAGINATION } from 'theme';\r\n\r\nconst PaginateContainer = styled.div`\r\n    font-size: 1.125em;\r\n\r\n    ul {\r\n        padding: 0;\r\n        text-align: center;\r\n    }\r\n\r\n    li {\r\n        display: inline-block;\r\n    }\r\n\r\n    a {\r\n        display: block;\r\n        padding: ${PAGINATION.PADDING.Y} ${PAGINATION.PADDING.X};\r\n        border-radius: 3px;\r\n        outline: none !important;\r\n        cursor: pointer;\r\n        line-height: 1;\r\n        text-decoration: none;\r\n    }\r\n\r\n    svg {\r\n        display: inline-block;\r\n        vertical-align: top;\r\n    }\r\n\r\n    .break {\r\n        padding: ${PAGINATION.PADDING.Y} ${PAGINATION.PADDING.X};\r\n        cursor: default;\r\n    }\r\n\r\n    .selected a {\r\n        color: ${PAGINATION.COLOR.SELECTED};\r\n        font-weight: 700;\r\n        cursor: default;\r\n    }\r\n\r\n    .disabled a {\r\n        opacity: 0.1;\r\n        color: ${PAGINATION.COLOR.DISABLED};\r\n        cursor: default;\r\n    }\r\n`;\r\n\r\nconst NoResults = styled.div`\r\n    color: ${TYPOGRAPHY.COLOR_REDUCED};\r\n    font-style: italic;\r\n    text-align: center;\r\n`;\r\n\r\nconst SearchResults = ({ selectedStyle, page, pageCount, styles, error, handlePageChange, handleStyleSelected }) => {\r\n    return (\r\n        <ContentSet spacing={SCAFFOLDING.GUTTER}>\r\n            {error && (\r\n                <NoResults>\r\n                    There was an error getting the map styles.\r\n                    <br /> Please try again.\r\n                </NoResults>\r\n            )}\r\n            {!error && styles && styles.length === 0 && <NoResults>No results found.</NoResults>}\r\n            {!error &&\r\n                styles &&\r\n                styles.length > 0 &&\r\n                styles.map((s) => (\r\n                    <SearchResultPreview\r\n                        key={s.id}\r\n                        style={s}\r\n                        isSelected={selectedStyle.id === s.id}\r\n                        selectStyle={handleStyleSelected}\r\n                    />\r\n                ))}\r\n            {pageCount > 0 && (\r\n                <PaginateContainer>\r\n                    <ReactPaginate\r\n                        initialPage={page}\r\n                        forcePage={page}\r\n                        pageCount={pageCount}\r\n                        pageRangeDisplayed={2}\r\n                        marginPagesDisplayed={1}\r\n                        onPageChange={handlePageChange}\r\n                        disableInitialCallback\r\n                        previousLabel={<Icon glyph={GLYPHS.CHEVRON_LEFT} />}\r\n                        nextLabel={<Icon glyph={GLYPHS.CHEVRON_RIGHT} />}\r\n                    />\r\n                </PaginateContainer>\r\n            )}\r\n        </ContentSet>\r\n    );\r\n};\r\n\r\nexport default SearchResults;\r\n","import React, { Suspense } from 'react';\r\nimport { connect } from 'react-redux';\r\nimport { FormSection } from 'redux-form';\r\nimport { debounce } from 'throttle-debounce';\r\nimport styled from 'styled-components';\r\n\r\nimport SearchOptions from 'components/StyleSettings/SearchOptions';\r\nimport SearchResults from 'components/StyleSettings/SearchResults';\r\nimport {\r\n    setPreviewStyleAction,\r\n    clearPreviewStyleAction,\r\n    searchAction,\r\n    searchQuery,\r\n} from 'modules/navigation/stylePanel';\r\nimport { getStyle } from 'modules/style';\r\nimport { ContentSet } from 'components/Shared/Scaffolding';\r\nimport { SCAFFOLDING, TYPOGRAPHY, SECTIONS } from 'theme';\r\nimport { LinkButton } from 'components/Shared/Buttons';\r\nimport MODAL from 'components/Shared/Modals';\r\nimport { showModal } from 'modules/modal';\r\nimport { currentUserAuthenticatedSelector } from 'modules/currentUser';\r\nimport { SmallLoading } from 'components/Loading/SmallLoading';\r\n\r\nconst NoResults = styled.div`\r\n    padding-top: ${SCAFFOLDING.GUTTER};\r\n    border-top: 1px solid ${SECTIONS.SUB.BG};\r\n    color: ${TYPOGRAPHY.COLOR_REDUCED};\r\n    font-style: italic;\r\n    text-align: center;\r\n`;\r\n\r\nclass SearchTab extends React.Component {\r\n    componentDidMount() {\r\n        const styles = this.props.tab.searchResult.styles;\r\n        if (styles === undefined && !this.props.showLoginMessage) {\r\n            this.props.search();\r\n        }\r\n    }\r\n\r\n    UNSAFE_componentWillReceiveProps(nextProps) {\r\n        // Compare the search queries, ignore the pagination\r\n        if (searchQuery(this.props.tab, 0) !== searchQuery(nextProps.tab, 0)) {\r\n            nextProps.search(0);\r\n        }\r\n    }\r\n\r\n    renderLoginMessage() {\r\n        const { onLoginClick, onRegisterClick } = this.props;\r\n        const button = (onClick, text) => (\r\n            <LinkButton type=\"button\" onClick={onClick}>\r\n                {text}\r\n            </LinkButton>\r\n        );\r\n        const login = button(onLoginClick, 'log in');\r\n        const register = button(onRegisterClick, 'register');\r\n        return (\r\n            <NoResults>\r\n                Please {login} or {register} to access your saved styles.\r\n            </NoResults>\r\n        );\r\n    }\r\n\r\n    render() {\r\n        const { tab, tabIndex, selectedStyle, showLoginMessage, search, handleStyleSelected, scrollToTop } = this.props;\r\n        return (\r\n            <FormSection name={`tabs.${tabIndex}`}>\r\n                <ContentSet spacing={SCAFFOLDING.GUTTER}>\r\n                    {!showLoginMessage && (\r\n                        <Suspense fallback={<SmallLoading />}>\r\n                            <SearchOptions\r\n                                handleSearchClicked={() => {\r\n                                    search();\r\n                                }}\r\n                            />\r\n                        </Suspense>\r\n                    )}\r\n                    {!showLoginMessage && (\r\n                        <SearchResults\r\n                            selectedStyle={selectedStyle}\r\n                            {...tab.searchResult}\r\n                            handlePageChange={(page) => {\r\n                                scrollToTop();\r\n                                search(page.selected);\r\n                            }}\r\n                            handleStyleSelected={handleStyleSelected}\r\n                        />\r\n                    )}\r\n                    {showLoginMessage && this.renderLoginMessage()}\r\n                </ContentSet>\r\n            </FormSection>\r\n        );\r\n    }\r\n}\r\n\r\nconst mapStateToProps = (state) => ({\r\n    selectedStyle: getStyle(state),\r\n    isAuthenticated: currentUserAuthenticatedSelector(state),\r\n});\r\n\r\nconst mapDispatchToProps = (dispatch) => ({\r\n    handleStyleSelected: debounce(100, (style, isSelected) => {\r\n        dispatch(isSelected ? clearPreviewStyleAction() : setPreviewStyleAction(style));\r\n    }),\r\n    search: (tabIndex, page) => {\r\n        dispatch(searchAction(tabIndex, page));\r\n    },\r\n    onLoginClick: () => {\r\n        dispatch(showModal(MODAL.LOGIN));\r\n    },\r\n    onRegisterClick: () => {\r\n        dispatch(showModal(MODAL.REGISTER));\r\n    },\r\n});\r\n\r\nconst mergeProps = (stateProps, dispatchProps, ownProps) =>\r\n    Object.assign({}, ownProps, stateProps, dispatchProps, {\r\n        search: (page) => dispatchProps.search(ownProps.tabIndex, page),\r\n        showLoginMessage: ownProps.tab.requiresAuthentication && !stateProps.isAuthenticated,\r\n    });\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps, mergeProps)(SearchTab);\r\n","import React from 'react';\r\nimport { connect } from 'react-redux';\r\nimport { reduxForm } from 'redux-form';\r\nimport { debounce } from 'throttle-debounce';\r\nimport styled from 'styled-components';\r\n\r\nimport { ContentSet } from 'components/Shared/Scaffolding';\r\nimport Panel, { PanelTitle } from 'components/Shared/Panel';\r\nimport { TextButton } from 'components/Shared/Buttons';\r\nimport TabGroup from 'components/Shared/Tabs/TabGroup';\r\nimport SearchTab from 'components/StyleSettings/SearchTab';\r\nimport {\r\n    getPreviewStyle,\r\n    setPreviewStyleAction,\r\n    clearPreviewStyleAction,\r\n    setTabAction,\r\n    saveFieldsAction,\r\n} from 'modules/navigation/stylePanel';\r\nimport { setStyleAction, getStyle } from 'modules/style';\r\nimport { SCAFFOLDING } from 'theme';\r\nimport MODAL from 'components/Shared/Modals';\r\nimport { showModal } from 'modules/modal';\r\n\r\nconst StyledForm = styled.form`\r\n    height: 100%;\r\n`;\r\n\r\nconst ScrollWrapper = styled.div`\r\n    display: flex;\r\n    flex-direction: column;\r\n    height: 100%;\r\n`;\r\n\r\nconst ScrollContent = styled(ContentSet)`\r\n    flex: 1 1 auto;\r\n    overflow: auto;\r\n`;\r\n\r\nconst ScrollFooter = styled.div`\r\n    flex: 0 0 auto;\r\n    padding: ${SCAFFOLDING.GUTTER_FACTOR(0.5)} ${SCAFFOLDING.GUTTER};\r\n    border-top: 1px solid ${SCAFFOLDING.BORDER_COLOR};\r\n`;\r\n\r\nclass PanelContent extends React.Component {\r\n    componentDidMount() {\r\n        this.props.handleOnMount();\r\n    }\r\n\r\n    render() {\r\n        const { tabs, handleSubmit, selectedTab, handleTabChange, scrollToTop } = this.props;\r\n        return (\r\n            <StyledForm onSubmit={handleSubmit}>\r\n                <ScrollWrapper>\r\n                    <ScrollContent\r\n                        spacing={SCAFFOLDING.GUTTER}\r\n                        padding={SCAFFOLDING.GUTTER}\r\n                        ref={(el) => {\r\n                            this.styleScrollContent = el;\r\n                        }}\r\n                    >\r\n                        <PanelTitle>Choose a Map Style</PanelTitle>\r\n                        <TabGroup\r\n                            tabs={tabs.map((tab) => tab.name)}\r\n                            selected={selectedTab}\r\n                            onTabClick={handleTabChange}\r\n                        >\r\n                            {tabs.map((tab, index) => (\r\n                                <SearchTab\r\n                                    key={index}\r\n                                    tab={tab}\r\n                                    tabIndex={index}\r\n                                    scrollToTop={() => scrollToTop(this.styleScrollContent)}\r\n                                />\r\n                            ))}\r\n                        </TabGroup>\r\n                    </ScrollContent>\r\n                    <ScrollFooter>\r\n                        <TextButton block primary type=\"submit\">\r\n                            Apply Style\r\n                        </TextButton>\r\n                    </ScrollFooter>\r\n                </ScrollWrapper>\r\n            </StyledForm>\r\n        );\r\n    }\r\n}\r\n\r\n// eslint-disable-next-line react/no-multi-comp\r\nclass StylePanel extends React.Component {\r\n    onClose = () => {\r\n        const { mapStyle, previewStyle, dispatch, onClose } = this.props;\r\n        if (!previewStyle || mapStyle.id !== previewStyle.id) {\r\n            dispatch(\r\n                showModal(MODAL.CONFIRM_PANEL_CLOSE, {\r\n                    dispatches: [clearPreviewStyleAction()],\r\n                })\r\n            );\r\n        } else {\r\n            dispatch(clearPreviewStyleAction());\r\n            onClose();\r\n        }\r\n    };\r\n\r\n    render() {\r\n        const { open, ...otherProps } = this.props;\r\n        return (\r\n            <Panel open={open} onClose={this.onClose}>\r\n                <PanelContent {...otherProps} />\r\n            </Panel>\r\n        );\r\n    }\r\n}\r\n\r\nconst mapStateToProps = (state) => ({\r\n    mapStyle: getStyle(state, true),\r\n    previewStyle: getPreviewStyle(state),\r\n    selectedTab: state.navigation.stylePanel.tab,\r\n    tabs: state.navigation.stylePanel.tabs,\r\n    initialValues: {\r\n        tabs: state.navigation.stylePanel.tabs.map((tab) => ({\r\n            ...tab.fields,\r\n        })),\r\n    },\r\n});\r\n\r\nconst mapDispatchToProps = (dispatch) => ({\r\n    onSubmit: (values, dispatch) => {\r\n        dispatch(saveFieldsAction(values.tabs));\r\n    },\r\n    onSubmitSuccess: (result, dispatch, props) => {\r\n        dispatch(setStyleAction(props.previewStyle));\r\n        dispatch(clearPreviewStyleAction());\r\n        props.onClose();\r\n    },\r\n    handleTabChange: (tab, index) => {\r\n        dispatch(setTabAction(index));\r\n    },\r\n    onChange: debounce(250, (values, dispatch) => {\r\n        dispatch(saveFieldsAction(values.tabs));\r\n    }),\r\n    handleOnMount: (style) => {\r\n        dispatch(setPreviewStyleAction(style));\r\n    },\r\n});\r\n\r\nconst mergeProps = (stateProps, dispatchProps, ownProps) =>\r\n    Object.assign({}, ownProps, stateProps, dispatchProps, {\r\n        handleOnMount: () => dispatchProps.handleOnMount(stateProps.mapStyle),\r\n    });\r\n\r\nStylePanel = reduxForm({\r\n    form: 'style-panel-form',\r\n})(StylePanel);\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps, mergeProps)(StylePanel);\r\n","import React from 'react';\r\nimport { connect } from 'react-redux';\r\nimport { reduxForm } from 'redux-form';\r\nimport styled from 'styled-components';\r\n\r\nimport { ContentSet } from 'components/Shared/Scaffolding';\r\nimport SettingsGroup, { SettingsHelper } from 'components/Shared/SettingsGroup';\r\nimport { Input, ButtonSet } from 'components/Shared/Forms';\r\nimport { TextButton } from 'components/Shared/Buttons';\r\nimport { saveDetails, getDetails } from 'modules/mapDetails';\r\nimport { SETTINGS_GROUP } from 'theme';\r\n\r\nconst StyledSettingsHelper = styled(SettingsHelper)`\r\n    margin-top: -${SETTINGS_GROUP.PADDING.Y};\r\n`;\r\n\r\nconst SaveForm = ({ handleSubmit, onCancel, submitting }) => {\r\n    return (\r\n        <form onSubmit={handleSubmit}>\r\n            <ContentSet spacing=\"40px\">\r\n                <SettingsGroup name=\"Map Name\" description=\"Enter a name for your map.\">\r\n                    <Input name=\"name\" type=\"text\" required width=\"100%\" />\r\n                </SettingsGroup>\r\n                <SettingsGroup name=\"Google Maps API Key\" description=\"Enter an API Key for your map.\">\r\n                    <StyledSettingsHelper highlight=\"info\">\r\n                        <strong>Note:</strong> In order to use Google Maps on your site you must sign up for an API Key\r\n                        with Google.{' '}\r\n                        <a\r\n                            href=\"https://developers.google.com/maps/documentation/javascript/get-api-key\"\r\n                            target=\"_blank\"\r\n                            rel=\"noopener noreferrer\"\r\n                        >\r\n                            Click here\r\n                        </a>{' '}\r\n                        to get an API key and paste it below when you have created one.\r\n                    </StyledSettingsHelper>\r\n                    <Input name=\"apiKey\" type=\"text\" width=\"100%\" />\r\n                </SettingsGroup>\r\n                <ButtonSet>\r\n                    <TextButton primary loading={submitting} type=\"submit\">\r\n                        Save\r\n                    </TextButton>\r\n                    <TextButton secondary type=\"button\" onClick={onCancel}>\r\n                        Cancel\r\n                    </TextButton>\r\n                </ButtonSet>\r\n            </ContentSet>\r\n        </form>\r\n    );\r\n};\r\n\r\nconst form = 'save';\r\n\r\nconst onSubmit = (values, dispatch, props) => {\r\n    return dispatch(saveDetails(values, props.id));\r\n};\r\n\r\nconst mapStateToProps = (state) => ({\r\n    initialValues: { ...getDetails(state) },\r\n});\r\n\r\nexport default connect(mapStateToProps)(reduxForm({ form, onSubmit })(SaveForm));\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport { ContentSet } from 'components/Shared/Scaffolding';\r\nimport Panel, { PanelTitle } from 'components/Shared/Panel';\r\nimport { SCAFFOLDING } from 'theme';\r\nimport SaveForm from 'components/Save/SaveForm';\r\nimport withCancel from 'components/Shared/PanelCancel';\r\nimport { useRecoilState } from 'recoil';\r\nimport { currentMapIdState } from 'modules/map';\r\n\r\nconst propTypes = {\r\n    open: PropTypes.bool.isRequired,\r\n    onClose: PropTypes.func.isRequired,\r\n};\r\n\r\nconst SavePanel = ({ open, onClose, onCancel }) => {\r\n    const [mapId] = useRecoilState(currentMapIdState);\r\n    return (\r\n        <Panel open={open} onClose={onCancel}>\r\n            <ContentSet spacing={SCAFFOLDING.GUTTER} padding={SCAFFOLDING.GUTTER}>\r\n                <PanelTitle>Save Map</PanelTitle>\r\n                <SaveForm id={mapId} onClose={onClose} onCancel={onCancel} />\r\n            </ContentSet>\r\n        </Panel>\r\n    );\r\n};\r\n\r\nSavePanel.propTypes = propTypes;\r\n\r\nexport default withCancel({ form: 'save' })(SavePanel);\r\n","export const getAbsoluteUrl = (relativeUrl) => {\r\n    if (!relativeUrl || relativeUrl.length === 0) {\r\n        return window.location.origin;\r\n    }\r\n    return window.location.origin + (relativeUrl[0] !== '/' ? '/' : '') + relativeUrl;\r\n};\r\n","import React from 'react';\r\nimport hljs from 'highlight.js/lib/core';\r\nimport xml from 'highlight.js/lib/languages/xml';\r\nimport 'highlight.js/styles/default.css';\r\n\r\nhljs.registerLanguage('html', xml);\r\nconst codeStyle = { backgroundColor: 'transparent' };\r\n\r\nexport const HtmlHighlight = ({ content }) => {\r\n    const html = React.useMemo(\r\n        () => ({ __html: content ? hljs.highlight(content, { language: 'html' }).value : null }),\r\n        [content]\r\n    );\r\n    return (\r\n        <pre>\r\n            <code className=\"hljs\" dangerouslySetInnerHTML={html} style={codeStyle} />\r\n        </pre>\r\n    );\r\n};\r\n","import React from 'react';\r\nimport { connect } from 'react-redux';\r\nimport CopyToClipboard from 'react-copy-to-clipboard';\r\nimport styled from 'styled-components';\r\n\r\nimport { ContentSet, HelperBlock } from 'components/Shared/Scaffolding';\r\nimport Panel, { PanelTitle } from 'components/Shared/Panel';\r\nimport { TextButton } from 'components/Shared/Buttons';\r\nimport notify from 'utils/notify';\r\nimport { SCAFFOLDING, SECTIONS } from 'theme';\r\nimport { currentMapIdState } from 'modules/map';\r\nimport { useRecoilState } from 'recoil';\r\nimport { getAbsoluteUrl } from 'utils/urls';\r\nimport { HtmlHighlight } from 'components/Export/HtmlHighlight';\r\n\r\nconst CodeBlock = styled.div`\r\n    margin-left: -${SCAFFOLDING.GUTTER};\r\n    margin-right: -${SCAFFOLDING.GUTTER};\r\n    padding: ${SCAFFOLDING.GUTTER_FACTOR(0.5)} ${SCAFFOLDING.GUTTER};\r\n    background-color: ${SECTIONS.SUB.BG};\r\n\r\n    pre {\r\n        padding: 0;\r\n    }\r\n`;\r\n\r\nconst StyledTextButton = styled(TextButton)`\r\n    width: 100%;\r\n    margin-top: ${SCAFFOLDING.GUTTER_FACTOR(0.5)};\r\n    margin-bottom: ${SCAFFOLDING.GUTTER_FACTOR(0.5)};\r\n    background-color: transparent;\r\n    font-size: 0.85em;\r\n\r\n    &:hover,\r\n    &:focus {\r\n        background-color: transparent;\r\n    }\r\n`;\r\n\r\nconst StyledHelperBlock = styled(HelperBlock)`\r\n    margin-left: -${SCAFFOLDING.GUTTER};\r\n    margin-right: -${SCAFFOLDING.GUTTER};\r\n`;\r\n\r\nconst ExportPanel = ({ width, height, open, onClose, onCopy }) => {\r\n    const [mapId] = useRecoilState(currentMapIdState);\r\n    const embedUrl = getAbsoluteUrl('/embed/' + mapId);\r\n    const previewUrl = getAbsoluteUrl('/build-a-map/preview/' + mapId);\r\n    const iframeText = `<iframe src=\"${embedUrl}\" width=\"${width}\" height=\"${height}\" style=\"border:none;\"></iframe>`;\r\n    return (\r\n        <Panel open={open} onClose={onClose}>\r\n            <ContentSet spacing={SCAFFOLDING.GUTTER} padding={SCAFFOLDING.GUTTER}>\r\n                <PanelTitle>View Code</PanelTitle>\r\n                <StyledHelperBlock highlight=\"info\">\r\n                    <strong>Make sure to save all of your changes before proceeding.</strong>\r\n                </StyledHelperBlock>\r\n                <div>\r\n                    <p>\r\n                        You can embed your map by copying the HTML below into your site.{' '}\r\n                        <a href={previewUrl} title=\"Embedded map preview\" target=\"_blank\" rel=\"noopener noreferrer\">\r\n                            Click here\r\n                        </a>{' '}\r\n                        to view a preview of your map embedded in a page. Make sure to save all changes to ensure the\r\n                        preview is up to date.\r\n                    </p>\r\n                    <p>\r\n                        The actual size of your map may vary depending on the HTML and CSS of your site. Make sure your\r\n                        site can handle the sizing of the map appropriately. If any changes are made to the size of the\r\n                        map, the embedded code on your site will need to be updated.\r\n                    </p>\r\n                </div>\r\n                <CodeBlock>\r\n                    <div>HTML:</div>\r\n                    <CopyToClipboard text={iframeText} onCopy={onCopy}>\r\n                        <StyledTextButton>Copy Code To Clipboard</StyledTextButton>\r\n                    </CopyToClipboard>\r\n                    <HtmlHighlight content={iframeText} />\r\n                </CodeBlock>\r\n            </ContentSet>\r\n        </Panel>\r\n    );\r\n};\r\n\r\nconst mapStateToProps = (state) => {\r\n    const size = state.map.size;\r\n    const di = (name) => `${size[name]}${size[`${name}Unit`]}`;\r\n    return {\r\n        width: di('width'),\r\n        height: di('height'),\r\n    };\r\n};\r\n\r\nconst mapDispatchToProps = () => ({\r\n    onCopy: (text, result) => {\r\n        if (result) {\r\n            notify.success('Copied to clipboard!');\r\n        }\r\n    },\r\n});\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(ExportPanel);\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport styled from 'styled-components';\r\n\r\nimport { ContentSet } from 'components/Shared/Scaffolding';\r\nimport Panel, { PanelTitle } from 'components/Shared/Panel';\r\nimport { SCAFFOLDING } from 'theme';\r\nimport { Icon, GLYPHS } from 'components/Shared/Icon';\r\nimport { routes } from 'modules/routes';\r\n\r\nconst propTypes = {\r\n    open: PropTypes.bool.isRequired,\r\n    onClose: PropTypes.func.isRequired,\r\n};\r\n\r\nconst StyledIcon = styled(Icon)`\r\n    font-size: 1.5em;\r\n    line-height: 1.7;\r\n`;\r\n\r\nconst HelpPanel = ({ open, onClose }) => (\r\n    <Panel open={open} onClose={onClose}>\r\n        <ContentSet padding={SCAFFOLDING.GUTTER}>\r\n            <PanelTitle>Help</PanelTitle>\r\n            <h2>Introduction</h2>\r\n            <p>\r\n                Welcome to our Map Builder! With this tool you can create a Google Map that looks great and fits the\r\n                style of your site with just a few clicks.\r\n            </p>\r\n            <h2>Creating a Map</h2>\r\n            <p>\r\n                There are 4 major sections of the map builder: style, size & location, markers (with popups), and\r\n                advanced settings. Please refer to each panel for additional help with each section. Customize your map\r\n                to your liking with the settings in the left panel and see a preview of your map on the right.\r\n            </p>\r\n            <h2>Saving</h2>\r\n            <p>\r\n                When you have the map the way you like it or would like to continue your work later, click the{' '}\r\n                <StyledIcon glyph={GLYPHS.SAVE} /> Save panel in the toolbar to save your map to your account. All of\r\n                your saved maps are accessible under{' '}\r\n                <a href={routes.myMaps.path} rel=\"noopener noreferrer\" target=\"_blank\">\r\n                    My Maps\r\n                </a>{' '}\r\n                if you would like to come back to it at any time.\r\n            </p>\r\n            <h2>View Code (Exporting)</h2>\r\n            <p>\r\n                Now that you are finished creating your perfect map, you need a way to get it onto your website. This is\r\n                done by including the <code>iframe</code> tag on your site that embeds your map with all of the settings\r\n                you have. See the <StyledIcon glyph={GLYPHS.CODE} /> View Code panel for more details.\r\n            </p>\r\n        </ContentSet>\r\n    </Panel>\r\n);\r\n\r\nHelpPanel.propTypes = propTypes;\r\n\r\nexport default HelpPanel;\r\n","import React from 'react';\r\nimport { connect } from 'react-redux';\r\nimport styled, { css } from 'styled-components';\r\nimport { ifProp } from 'styled-tools';\r\n\r\nimport { ContentSet, LabelBeta } from 'components/Shared/Scaffolding';\r\nimport StylePreview from 'components/StyleSettings/StylePreview';\r\nimport LocationPreview from 'components/LocationSettings/LocationPreview';\r\nimport LocationPanel from 'components/LocationSettings/LocationPanel';\r\nimport MarkerPreviewContainer from 'containers/MarkerPreviewContainer';\r\nimport MarkerPanel from 'components/MarkerSettings/MarkerPanel';\r\nimport InfoWindowPanel from 'components/InfoWindowSettings/InfoWindowPanel';\r\nimport AdvancedPreview from 'components/AdvancedSettings/AdvancedPreview';\r\nimport AdvancedPanel from 'components/AdvancedSettings/AdvancedPanel';\r\nimport StylePanel from 'components/StyleSettings/StylePanel';\r\nimport SavePanel from 'components/Save/SavePanel';\r\nimport ExportPanel from 'components/Export/ExportPanel';\r\nimport HelpPanel from 'components/Help/HelpPanel';\r\nimport Panel, { PanelTitle, TRANSITION_TYPE } from 'components/Shared/Panel';\r\nimport { PANELS, changePanel, closePanel, getActivePanel } from 'modules/navigation/activePanel';\r\nimport { clearPreviewLocation } from 'modules/navigation/preview';\r\nimport { BREAKPOINTS, SCAFFOLDING, TRANSITION } from 'theme';\r\n\r\nconst SideMenuWrapper = styled.div`\r\n    position: absolute;\r\n    top: 0;\r\n    bottom: 0;\r\n    left: 0;\r\n    width: ${SCAFFOLDING.COLUMN_WIDTH(5)};\r\n    min-height: 100%;\r\n    z-index: 2;\r\n    overflow: hidden;\r\n    background-color: ${SCAFFOLDING.BG};\r\n    box-shadow: ${SCAFFOLDING.BOX_SHADOW.BASE};\r\n    transition: left ${TRANSITION.LENGTH_LONG} ${TRANSITION.BEZIER};\r\n\r\n    @media (min-width: ${`${BREAKPOINTS.lg}px`}) {\r\n        width: ${SCAFFOLDING.COLUMN_WIDTH(4)};\r\n    }\r\n\r\n    @media (max-width: ${`${BREAKPOINTS.md - 1}px`}) {\r\n        display: none;\r\n    }\r\n\r\n    ${ifProp(\r\n        'fullscreen',\r\n        css`\r\n            left: -${SCAFFOLDING.COLUMN_WIDTH(4)} !important;\r\n        `\r\n    )}\r\n`;\r\n\r\nconst StyledPanelTitle = styled(PanelTitle)`\r\n    display: inline-block;\r\n    margin-right: 8px;\r\n    vertical-align: middle;\r\n`;\r\n\r\nconst NumberedContentSet = styled(ContentSet)`\r\n    counter-reset: preview-counter;\r\n`;\r\n\r\nconst NumberedSettingsGroup = styled.div`\r\n    position: relative;\r\n\r\n    .label-counter {\r\n        &:before {\r\n            content: counter(preview-counter);\r\n            counter-increment: preview-counter;\r\n            flex: 0 0 auto;\r\n            align-self: center;\r\n            display: inline-block;\r\n            width: ${SCAFFOLDING.GUTTER_FACTOR(0.7)};\r\n            height: ${SCAFFOLDING.GUTTER_FACTOR(0.7)};\r\n            margin-right: ${SCAFFOLDING.GUTTER_FACTOR(0.25)};\r\n            background-color: #aaa;\r\n            border-radius: 50%;\r\n            color: #fff;\r\n            font-size: 1.1em;\r\n            line-height: ${SCAFFOLDING.GUTTER_FACTOR(0.7)};\r\n            text-align: center;\r\n        }\r\n    }\r\n\r\n    &:not(:last-child) {\r\n        .label-counter:after {\r\n            content: '';\r\n            display: block;\r\n            position: absolute;\r\n            top: ${SCAFFOLDING.GUTTER_FACTOR(0.7)};\r\n            left: ${SCAFFOLDING.GUTTER_FACTOR(0.35)};\r\n            width: 2px;\r\n            height: calc(100% + ${SCAFFOLDING.GUTTER_FACTOR(0.8)});\r\n            margin-left: -1px;\r\n            background-color: #ddd;\r\n        }\r\n    }\r\n\r\n    .content-counter {\r\n        padding-left: ${SCAFFOLDING.GUTTER_FACTOR(2)};\r\n    }\r\n`;\r\n\r\nconst NumberedStylePreview = NumberedSettingsGroup.withComponent(StylePreview);\r\nconst NumberedLocationPreview = NumberedSettingsGroup.withComponent(LocationPreview);\r\nconst NumberedMarkerPreview = NumberedSettingsGroup.withComponent(MarkerPreviewContainer);\r\nconst NumberedAdvancedPreview = NumberedSettingsGroup.withComponent(AdvancedPreview);\r\n\r\nconst SideMenu = ({ activePanel, onPanelClose, onPanelOpen, fullscreen }) => {\r\n    return (\r\n        <SideMenuWrapper fullscreen={fullscreen}>\r\n            <Panel main open={activePanel === PANELS.MAIN} onClose={onPanelClose} transition={TRANSITION_TYPE.FADE}>\r\n                <NumberedContentSet spacing={SCAFFOLDING.GUTTER} padding={SCAFFOLDING.GUTTER}>\r\n                    <header>\r\n                        <StyledPanelTitle>Build a Map</StyledPanelTitle>\r\n                        <LabelBeta>Beta</LabelBeta>\r\n                    </header>\r\n                    <p>\r\n                        Create a map using the sections below. Once you are finished, you can copy the code and embed\r\n                        the map on your site.\r\n                    </p>\r\n                    <NumberedStylePreview\r\n                        onCardClick={() => onPanelOpen(PANELS.STYLE)}\r\n                        labelClassName=\"label-counter\"\r\n                        contentClassName=\"content-counter\"\r\n                    />\r\n                    <NumberedLocationPreview\r\n                        onCardClick={() => onPanelOpen(PANELS.LOCATION)}\r\n                        labelClassName=\"label-counter\"\r\n                        contentClassName=\"content-counter\"\r\n                    />\r\n                    <NumberedMarkerPreview labelClassName=\"label-counter\" contentClassName=\"content-counter\" />\r\n                    <NumberedAdvancedPreview\r\n                        onCardClick={() => onPanelOpen(PANELS.ADVANCED_SETTINGS)}\r\n                        labelClassName=\"label-counter\"\r\n                        contentClassName=\"content-counter\"\r\n                    />\r\n                </NumberedContentSet>\r\n            </Panel>\r\n            <StylePanel open={activePanel === PANELS.STYLE} onClose={onPanelClose} />\r\n            <LocationPanel open={activePanel === PANELS.LOCATION} onClose={onPanelClose} />\r\n            <MarkerPanel open={activePanel === PANELS.MARKER} onClose={onPanelClose} />\r\n            <InfoWindowPanel open={activePanel === PANELS.INFO_WINDOW} onClose={onPanelClose} />\r\n            <AdvancedPanel open={activePanel === PANELS.ADVANCED_SETTINGS} onClose={onPanelClose} />\r\n            <SavePanel open={activePanel === PANELS.SAVE} onClose={onPanelClose} />\r\n            <ExportPanel open={activePanel === PANELS.EXPORT} onClose={onPanelClose} />\r\n            <HelpPanel open={activePanel === PANELS.HELP} onClose={onPanelClose} />\r\n        </SideMenuWrapper>\r\n    );\r\n};\r\n\r\nconst mapStateToProps = (state) => ({\r\n    activePanel: getActivePanel(state),\r\n    fullscreen: state.navigation.fullscreen,\r\n});\r\n\r\nconst mapDispatchToProps = (dispatch) => ({\r\n    onPanelOpen: (panel) => {\r\n        if (panel === PANELS.LOCATION) {\r\n            dispatch(clearPreviewLocation());\r\n        }\r\n        dispatch(changePanel(panel));\r\n    },\r\n    onPanelClose: () => dispatch(closePanel()),\r\n});\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(SideMenu);\r\n","import React from 'react';\r\n\r\nimport SideToolbar from 'components/SideControls/SideToolbar';\r\nimport SideMenu from 'components/SideMenu/SideMenu';\r\n\r\nconst SettingsContainer = ({ panelOpen }) => (\r\n    <div>\r\n        <SideMenu />\r\n        <SideToolbar onPanelOpen={panelOpen} />\r\n    </div>\r\n);\r\n\r\nexport default SettingsContainer;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { ANCHOR } from 'react-google-maps/lib/constants';\r\nimport deepEqual from 'deep-equal';\r\n\r\nimport 'snazzy-info-window/dist/snazzy-info-window.min.css';\r\n\r\nconst open = (infoWindow) => {\r\n    setTimeout(() => {\r\n        if (!infoWindow._destroyed) {\r\n            infoWindow.open();\r\n        }\r\n    });\r\n};\r\n\r\nconst close = (infoWindow) => {\r\n    setTimeout(() => {\r\n        if (!infoWindow._destroyed) {\r\n            infoWindow.close();\r\n        }\r\n    });\r\n};\r\n\r\nlet Snazzy = null;\r\n\r\nclass SnazzyInfoWindow extends React.Component {\r\n    // State parameters to retrieve from the parent component\r\n    static contextTypes = {\r\n        [ANCHOR]: PropTypes.object,\r\n    };\r\n\r\n    // Recreate the info window when these properties change.\r\n    static immutableProperties = [\r\n        'maxHeight',\r\n        'maxWidth',\r\n        'placement',\r\n        'border',\r\n        'pointer',\r\n        'shadow',\r\n        'closeOnMapClick',\r\n        'openOnMarkerClick',\r\n        'closeWhenOthersOpen',\r\n    ];\r\n\r\n    constructor(props, context) {\r\n        super(props, context);\r\n        this.state = {\r\n            infoWindow: this.createInfoWindow(props, context),\r\n        };\r\n    }\r\n\r\n    // Snazzy Info Window has a dependency on the global google variable.\r\n    // Since we are using an async google maps loader we need to\r\n    // only load the Snazzy Info Window plugin when it is needed.\r\n    createInfoWindow = (props, context) => {\r\n        const that = this;\r\n        if (Snazzy === null) {\r\n            Snazzy = require('snazzy-info-window');\r\n        }\r\n        return new Snazzy({\r\n            marker: context[ANCHOR],\r\n            ...props.options,\r\n            callbacks: {\r\n                afterOpen() {\r\n                    // When the info window opens we need to update the preview location\r\n                    props.onLocationChange();\r\n                    // Always pan on open after the first time\r\n                    that.panOnOpen = true;\r\n                },\r\n                beforeOpen() {\r\n                    // Update the pan on open value\r\n                    this._opts.panOnOpen = that.panOnOpen;\r\n                },\r\n            },\r\n        });\r\n    };\r\n\r\n    // Deep equality check for properties which can be objects\r\n    shouldRecreate = (nextProps) => {\r\n        // Handle for empty options\r\n        const options = this.props.options || {};\r\n        const nextOptions = nextProps.options || {};\r\n        const immutableChanged = SnazzyInfoWindow.immutableProperties.some(\r\n            (p) => !deepEqual(options[p], nextOptions[p])\r\n        );\r\n        const missingKey = Object.keys(options).some((k) => options[k] !== undefined && nextOptions[k] === undefined);\r\n        return immutableChanged || missingKey;\r\n    };\r\n\r\n    resetOpenState = (infoWindow, props, mapReset) => {\r\n        const {\r\n            behavior: { openByDefault },\r\n            isEditMode,\r\n            isActive,\r\n        } = props;\r\n\r\n        if (isEditMode) {\r\n            // In edit mode open the active info window\r\n            this.panOnOpen = !mapReset;\r\n            if (isActive) {\r\n                open(infoWindow);\r\n            } else {\r\n                close(infoWindow);\r\n            }\r\n        } else {\r\n            // In normal mode perform open by default\r\n            this.panOnOpen = false;\r\n            if (openByDefault) {\r\n                open(infoWindow);\r\n            } else {\r\n                close(infoWindow);\r\n            }\r\n        }\r\n    };\r\n\r\n    componentDidMount() {\r\n        this.resetOpenState(this.state.infoWindow, this.props, false);\r\n    }\r\n\r\n    componentWillUnmount() {\r\n        this.state.infoWindow.destroy();\r\n    }\r\n\r\n    UNSAFE_componentWillReceiveProps(nextProps, nextContext) {\r\n        if (this.shouldRecreate(nextProps)) {\r\n            this.setState({\r\n                infoWindow: this.createInfoWindow(nextProps, nextContext),\r\n            });\r\n        }\r\n    }\r\n\r\n    UNSAFE_componentWillUpdate(nextProps, nextState) {\r\n        const nextInfo = nextState.infoWindow;\r\n        const oldInfo = this.state.infoWindow;\r\n        const oldProps = this.props;\r\n\r\n        if (oldInfo !== nextInfo) {\r\n            open(nextInfo);\r\n        }\r\n\r\n        const enterEditMode = !oldProps.isEditMode && nextProps.isEditMode;\r\n        const exitEditMode = oldProps.isEditMode && !nextProps.isEditMode;\r\n        const resetMap = !oldProps.isMapReset && nextProps.isMapReset;\r\n\r\n        if (enterEditMode || exitEditMode || resetMap) {\r\n            this.resetOpenState(nextInfo, nextProps, resetMap);\r\n        }\r\n    }\r\n\r\n    componentDidUpdate(prevProps, prevState) {\r\n        const i = this.state.infoWindow;\r\n        if (prevState.infoWindow === i) {\r\n            i._opts = {\r\n                ...i._opts,\r\n                ...this.props.options,\r\n            };\r\n            if (this.props.options) {\r\n                i.setContent(this.props.options.content);\r\n            }\r\n            i.draw();\r\n            i.resize();\r\n            i.reposition();\r\n        } else {\r\n            prevState.infoWindow.destroy();\r\n            prevState.infoWindow._destroyed = true;\r\n        }\r\n    }\r\n\r\n    render() {\r\n        return false;\r\n    }\r\n}\r\n\r\nexport default SnazzyInfoWindow;\r\n","import React from 'react';\r\nimport { withGoogleMap, GoogleMap, Marker } from 'react-google-maps';\r\nimport withScriptjs from 'react-google-maps/lib/async/withScriptjs';\r\n\r\nimport { getIconOptions, isIconOptimized } from 'components/MarkerSettings/IconOptions';\r\nimport { roundLatLng } from 'utils/maps';\r\nimport SnazzyInfoWindow from 'components/Shared/SnazzyInfoWindow';\r\nimport { PANELS } from 'modules/navigation/activePanel';\r\n\r\nconst handleMarkerDragEnd = (e, marker, callback) => {\r\n    callback(marker.id, roundLatLng(e.latLng));\r\n};\r\n\r\nconst SnazzyMap = withScriptjs(\r\n    withGoogleMap(\r\n        ({\r\n            center,\r\n            zoom,\r\n            onClick,\r\n            onPan,\r\n            onLoad,\r\n            onZoom,\r\n            options,\r\n            markers,\r\n            activeMarker,\r\n            activePanel,\r\n            onMarkerDragEnd,\r\n            onMapTypeChange,\r\n        }) => {\r\n            const isActive = (marker) => activeMarker && marker && activeMarker.id === marker.id;\r\n            const noop = () => {};\r\n            return (\r\n                <GoogleMap\r\n                    ref={onLoad || noop}\r\n                    zoom={zoom}\r\n                    center={center}\r\n                    onDragEnd={onPan || noop}\r\n                    onZoomChanged={onZoom || noop}\r\n                    onClick={onClick || noop}\r\n                    onMapTypeIdChanged={onMapTypeChange || noop}\r\n                    options={options}\r\n                >\r\n                    {markers &&\r\n                        markers.map((marker) => (\r\n                            <Marker\r\n                                draggable={isActive(marker) && activePanel === PANELS.MARKER}\r\n                                zIndex={isActive(marker) ? 99999999 : 0}\r\n                                opacity={!activeMarker || isActive(marker) ? 1 : 0.5}\r\n                                key={marker.id}\r\n                                position={marker.location}\r\n                                icon={getIconOptions(marker.icon)}\r\n                                options={{\r\n                                    optimized: isIconOptimized(marker.icon),\r\n                                }}\r\n                                onDragEnd={(e) => handleMarkerDragEnd(e, marker, onMarkerDragEnd)}\r\n                            >\r\n                                {marker.infoWindow.enabled && (\r\n                                    <SnazzyInfoWindow {...marker.infoWindow} onLocationChange={onPan || noop} />\r\n                                )}\r\n                            </Marker>\r\n                        ))}\r\n                </GoogleMap>\r\n            );\r\n        }\r\n    )\r\n);\r\n\r\nconst Map = (props) => {\r\n    return (\r\n        <SnazzyMap\r\n            {...props}\r\n            // TODO: Create a real loading indicator?\r\n            loadingElement={<div />}\r\n            containerElement={<div style={{ height: '100%' }} />}\r\n            mapElement={<div style={{ height: '100%' }} />}\r\n        />\r\n    );\r\n};\r\n\r\nexport default Map;\r\n","import React from 'react';\r\nimport styled, { css } from 'styled-components';\r\nimport { ifProp } from 'styled-tools';\r\nimport breakpoint from 'styled-components-breakpoint';\r\n\r\nimport { PullRight } from 'components/Shared/Scaffolding';\r\nimport { GLYPHS } from 'components/Shared/Icon';\r\nimport { MapToolbarControl, MapToolbarDropdown, MapToolbarSlider } from 'components/Map/MapToolbar';\r\nimport { SCAFFOLDING, TRANSITION, SIDECONTROLS } from 'theme';\r\n\r\nconst StyledMapToolbar = styled.div`\r\n    position: absolute;\r\n    top: 0;\r\n    left: 0;\r\n    right: 0;\r\n    height: 50px;\r\n    padding-left: ${SCAFFOLDING.GUTTER_FACTOR(0.25)};\r\n    padding-right: ${SCAFFOLDING.GUTTER_FACTOR(0.25)};\r\n    z-index: ${SCAFFOLDING.Z_INDEX.indexOf('MapToolbar')};\r\n    background-color: ${SCAFFOLDING.BG};\r\n    box-shadow: ${SCAFFOLDING.BOX_SHADOW.BASE};\r\n    visibility: hidden;\r\n    transform: translate(0, -100%);\r\n    transition: all ${TRANSITION.LENGTH_LONG} ${TRANSITION.BEZIER};\r\n\r\n    ${ifProp(\r\n        'active',\r\n        css`\r\n            visibility: visible;\r\n            transform: translate(0, 0);\r\n        `\r\n    )};\r\n\r\n    ${breakpoint('md')`\r\n        left: ${SIDECONTROLS.BUTTON.WIDTH};\r\n    `}\r\n\r\n    .dropdown {\r\n        display: inline-block;\r\n        vertical-align: middle;\r\n    }\r\n`;\r\n\r\nconst MapToolbar = ({\r\n    guides,\r\n    onToggleGuides,\r\n    previewZoom,\r\n    onChangePreviewZoom,\r\n    onSnapToCenter,\r\n    onFitToScreen,\r\n    ...props\r\n}) => {\r\n    return (\r\n        <StyledMapToolbar {...props}>\r\n            <PullRight>\r\n                <MapToolbarControl\r\n                    title=\"Restore the map preview to your settings\"\r\n                    glyph={GLYPHS.RESTORE_MAP}\r\n                    onClick={onSnapToCenter}\r\n                />\r\n                <MapToolbarControl\r\n                    title=\"Zoom preview out\"\r\n                    glyph={GLYPHS.ZOOM_OUT}\r\n                    data-zoom=\"-0.1\"\r\n                    onClick={() => onChangePreviewZoom(previewZoom - 0.1)}\r\n                />\r\n                <MapToolbarSlider previewZoom={previewZoom} onChange={onChangePreviewZoom} />\r\n                <MapToolbarControl\r\n                    title=\"Zoom preview in\"\r\n                    glyph={GLYPHS.ZOOM_IN}\r\n                    data-zoom=\"0.1\"\r\n                    onClick={() => onChangePreviewZoom(previewZoom + 0.1)}\r\n                />\r\n                <MapToolbarDropdown\r\n                    previewZoom={previewZoom}\r\n                    onFitToScreen={onFitToScreen}\r\n                    onChangePreviewZoom={onChangePreviewZoom}\r\n                />\r\n            </PullRight>\r\n        </StyledMapToolbar>\r\n    );\r\n};\r\n\r\nexport default MapToolbar;\r\n","import React from 'react';\r\nimport styled from 'styled-components';\r\nimport { IconButton } from 'components/Shared/Buttons';\r\nimport { MAPTOOLBAR } from 'theme';\r\n\r\nconst StyledMapToolbarControl = styled(IconButton)`\r\n    width: ${MAPTOOLBAR.BUTTON.WIDTH};\r\n    height: ${MAPTOOLBAR.BUTTON.HEIGHT};\r\n    color: #666;\r\n    font-size: 1.5em;\r\n    vertical-align: middle;\r\n`;\r\n\r\nconst MapToolbarControl = (props) => {\r\n    return <StyledMapToolbarControl {...props} />;\r\n};\r\n\r\nexport default MapToolbarControl;\r\n","import React from 'react';\r\nimport styled from 'styled-components';\r\nimport Dropdown from 'react-simple-dropdown';\r\n\r\nimport { Icon, GLYPHS } from 'components/Shared/Icon';\r\nimport { SCAFFOLDING, TRANSITION, SELECTS, MAPTOOLBAR } from 'theme';\r\n\r\nconst DropdownToggle = styled.button`\r\n    height: ${MAPTOOLBAR.BUTTON.HEIGHT};\r\n    padding-left: ${SELECTS.PADDING.X};\r\n    padding-right: ${SELECTS.PADDING.X};\r\n    background-color: transparent;\r\n    border: 0;\r\n    color: #666;\r\n    text-align: right;\r\n\r\n    svg {\r\n        width: 1.5em;\r\n        height: 1.5em;\r\n        vertical-align: middle;\r\n        transition: transform ${TRANSITION.LENGTH} ${TRANSITION.BEZIER};\r\n    }\r\n\r\n    .dropdown--active & svg {\r\n        transform: scale(1, -1);\r\n    }\r\n`;\r\n\r\nconst DropdownToggleLabel = styled.span`\r\n    display: inline-block;\r\n    width: 2.75em;\r\n    line-height: 1;\r\n    vertical-align: middle;\r\n`;\r\n\r\nconst DropdownContent = styled.div`\r\n    display: none;\r\n    position: absolute;\r\n    top: 100%;\r\n    right: 0;\r\n    min-width: 100%;\r\n    max-width: 30em;\r\n    margin-bottom: ${SCAFFOLDING.GUTTER_FACTOR(0.25)};\r\n    z-index: 1;\r\n    overflow: hidden;\r\n    background-color: ${SCAFFOLDING.BG};\r\n    box-shadow: ${SCAFFOLDING.BOX_SHADOW.HOVER};\r\n    border-radius: ${SCAFFOLDING.BORDER_RADIUS};\r\n\r\n    /* TODO: Add proper animation while making sure it does not take space while closed */\r\n\r\n    .dropdown--active & {\r\n        display: block;\r\n    }\r\n`;\r\n\r\nconst DropdownItem = styled.button`\r\n    display: block;\r\n    width: 100%;\r\n    padding: ${SELECTS.OPTION.PADDING.Y} ${SELECTS.OPTION.PADDING.X};\r\n    background-color: transparent;\r\n    border: 0;\r\n    text-align: left;\r\n    white-space: nowrap;\r\n\r\n    &:hover,\r\n    &:focus {\r\n        background-color: ${SELECTS.OPTION.HOVER_BG};\r\n    }\r\n`;\r\n\r\nclass MapToolbarDropdown extends React.Component {\r\n    handleToggleClick = () => {\r\n        const dropdown = this.zoomDropdown;\r\n        if (dropdown.isActive()) {\r\n            dropdown.hide();\r\n        } else {\r\n            dropdown.show();\r\n        }\r\n    };\r\n\r\n    render() {\r\n        const { previewZoom, onFitToScreen, onChangePreviewZoom, ...props } = this.props;\r\n        return (\r\n            <Dropdown\r\n                ref={(el) => {\r\n                    this.zoomDropdown = el;\r\n                }}\r\n                {...props}\r\n            >\r\n                <DropdownToggle type=\"button\" onClick={this.handleToggleClick} {...props}>\r\n                    <DropdownToggleLabel>{parseInt(Math.round(previewZoom * 100), 10)}%</DropdownToggleLabel>\r\n                    <Icon glyph={GLYPHS.CARET_DOWN} />\r\n                </DropdownToggle>\r\n                <DropdownContent>\r\n                    <DropdownItem type=\"button\" onClick={(e) => onFitToScreen(e)}>\r\n                        Fit to screen\r\n                    </DropdownItem>\r\n                    <DropdownItem type=\"button\" onClick={() => onChangePreviewZoom(1)}>\r\n                        100%\r\n                    </DropdownItem>\r\n                    <DropdownItem type=\"button\" onClick={() => onChangePreviewZoom(0.75)}>\r\n                        75%\r\n                    </DropdownItem>\r\n                    <DropdownItem type=\"button\" onClick={() => onChangePreviewZoom(0.5)}>\r\n                        50%\r\n                    </DropdownItem>\r\n                    <DropdownItem type=\"button\" onClick={() => onChangePreviewZoom(0.25)}>\r\n                        25%\r\n                    </DropdownItem>\r\n                </DropdownContent>\r\n            </Dropdown>\r\n        );\r\n    }\r\n}\r\n\r\nexport default MapToolbarDropdown;\r\n","import React from 'react';\r\nimport styled from 'styled-components';\r\n\r\nimport { SliderComponent, SliderHandle } from 'components/Shared/Forms/Slider';\r\n\r\nconst StyledSlider = styled(SliderComponent)`\r\n    display: inline-block;\r\n    vertical-align: middle;\r\n    width: 10em;\r\n\r\n    .rc-slider-track,\r\n    .rc-slider-handle {\r\n        background-color: #888;\r\n    }\r\n`;\r\n\r\nconst MapToolbarSlider = ({ previewZoom, onChange, ...props }) => {\r\n    return (\r\n        <StyledSlider\r\n            step={0.01}\r\n            min={0.1}\r\n            max={1.0}\r\n            value={previewZoom}\r\n            onChange={(value) => {\r\n                onChange(value);\r\n            }}\r\n            handle={SliderHandle}\r\n            {...props}\r\n        />\r\n    );\r\n};\r\n\r\nexport default MapToolbarSlider;\r\n","import React from 'react';\r\nimport styled from 'styled-components';\r\nimport { SCAFFOLDING, MAPTOOLBAR } from 'theme';\r\n\r\nconst StyledMapWrapperScroll = styled.div`\r\n    position: absolute;\r\n    top: ${MAPTOOLBAR.HEIGHT};\r\n    right: 0;\r\n    bottom: 0;\r\n    left: ${SCAFFOLDING.GUTTER};\r\n    overflow: scroll; /* Force a scrollbar because percentage dimensions get affected by the scrollbar */\r\n    -webkit-overflow-scrolling: touch;\r\n`;\r\n\r\n// eslint-disable-next-line react/prefer-stateless-function\r\nexport default class MapWrapperScroll extends React.Component {\r\n    render() {\r\n        const { children, ...props } = this.props;\r\n\r\n        return <StyledMapWrapperScroll {...props}>{children}</StyledMapWrapperScroll>;\r\n    }\r\n}\r\n","import React from 'react';\r\nimport styled, { css } from 'styled-components';\r\nimport { prop, ifProp } from 'styled-tools';\r\nimport { SCAFFOLDING } from 'theme';\r\n\r\nconst StyledMapWrapperGuidelines = styled.div`\r\n    box-sizing: content-box;\r\n    display: flex;\r\n    flex-direction: column;\r\n    position: relative;\r\n    width: ${prop('width')};\r\n    height: ${prop('height')};\r\n    min-width: calc(100% - ${SCAFFOLDING.GUTTER_FACTOR(2)});\r\n    min-height: calc(100% - ${SCAFFOLDING.GUTTER_FACTOR(2)});\r\n    padding: ${SCAFFOLDING.GUTTER};\r\n\r\n    ${ifProp(\r\n        'active',\r\n        css`\r\n            &:before,\r\n            &:after {\r\n                content: '';\r\n                position: absolute;\r\n                z-index: ${SCAFFOLDING.Z_INDEX.indexOf('MapGuidelines')};\r\n                background-color: #00ffff;\r\n                pointer-events: none;\r\n            }\r\n\r\n            &:before {\r\n                top: 0;\r\n                bottom: 0;\r\n                left: 50%;\r\n                width: 1px;\r\n            }\r\n\r\n            &:after {\r\n                top: 50%;\r\n                right: 0;\r\n                left: 0;\r\n                height: 1px;\r\n            }\r\n        `\r\n    )}\r\n`;\r\n\r\n// This component can't be a stateless function since it uses refs\r\n// eslint-disable-next-line react/prefer-stateless-function\r\nclass MapWrapperGuidelines extends React.Component {\r\n    render() {\r\n        const { active, width, height, children, ...props } = this.props;\r\n        return (\r\n            <StyledMapWrapperGuidelines active={active} width={width} height={height} {...props}>\r\n                {children}\r\n            </StyledMapWrapperGuidelines>\r\n        );\r\n    }\r\n}\r\n\r\nexport default MapWrapperGuidelines;\r\n","import React from 'react';\r\nimport styled from 'styled-components';\r\nimport { prop } from 'styled-tools';\r\nimport { SCAFFOLDING } from 'theme';\r\n\r\nconst StyledMapWrapperOuter = styled.div`\r\n    display: inline-block;\r\n    position: relative;\r\n    width: ${prop('width')};\r\n    height: ${prop('height')};\r\n    margin: auto;\r\n    overflow: hidden;\r\n    box-shadow: ${SCAFFOLDING.BOX_SHADOW.BASE};\r\n`;\r\n\r\nconst MapWrapperOuter = ({ width, height, children, ...props }) => {\r\n    return (\r\n        <StyledMapWrapperOuter width={width} height={height} {...props}>\r\n            {children}\r\n        </StyledMapWrapperOuter>\r\n    );\r\n};\r\n\r\nexport default MapWrapperOuter;\r\n","import React from 'react';\r\nimport styled from 'styled-components';\r\nimport { prop } from 'styled-tools';\r\n\r\nconst StyledMapWrapperInner = styled.div`\r\n    position: absolute;\r\n    top: 0;\r\n    right: 0;\r\n    bottom: 0;\r\n    left: 0;\r\n    width: ${prop('width')};\r\n    height: ${prop('height')};\r\n    transform: scale(${prop('previewZoom')});\r\n    transform-origin: 0 0;\r\n`;\r\n\r\nconst MapWrapperInner = ({ width, height, previewZoom, children, ...props }) => {\r\n    return (\r\n        <StyledMapWrapperInner width={width} height={height} previewZoom={previewZoom} {...props}>\r\n            {children}\r\n        </StyledMapWrapperInner>\r\n    );\r\n};\r\n\r\nexport default MapWrapperInner;\r\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport { connect } from 'react-redux';\r\nimport styled, { css } from 'styled-components';\r\nimport { ifProp } from 'styled-tools';\r\nimport { MAP as MAP_KEY } from 'react-google-maps/lib/constants';\r\n\r\nimport Map from 'components/Shared/Map';\r\nimport { MapToolbar } from 'components/Map/MapToolbar';\r\nimport MapWrapperScroll from 'components/Map/MapWrapperScroll';\r\nimport MapWrapperGuidelines from 'components/Map/MapWrapperGuidelines';\r\nimport MapWrapperOuter from 'components/Map/MapWrapperOuter';\r\nimport MapWrapperInner from 'components/Map/MapWrapperInner';\r\nimport { BREAKPOINTS, SCAFFOLDING, TRANSITION, SIDECONTROLS, MAPTOOLBAR } from 'theme';\r\nimport { PANELS, getActivePanel } from 'modules/navigation/activePanel';\r\nimport {\r\n    changePreviewZoom,\r\n    changePreviewLocation,\r\n    clearPreviewLocation,\r\n    getPreviewZoom,\r\n} from 'modules/navigation/preview';\r\nimport { setLocation } from 'components/LocationSettings/LocationForm';\r\nimport { getMapSize, MAP_DIMENSION_UNIT } from 'modules/size';\r\nimport { getActiveMarker } from 'modules/navigation/activeMarker';\r\nimport { roundLatLng } from 'utils/maps';\r\nimport { setActiveMarkerLocation } from 'components/MarkerSettings/MarkerForm';\r\nimport notify from 'utils/notify';\r\nimport { getMapTileLanguage } from 'store';\r\nimport { getGoogleMapsProps } from 'components/Map/MapWrapperHelper';\r\nimport { setMapType } from 'components/AdvancedSettings/AdvancedForm';\r\n\r\nconst StyledMapWrapper = styled.div`\r\n    position: absolute;\r\n    top: 0;\r\n    right: 0;\r\n    bottom: 0;\r\n    left: ${SCAFFOLDING.COLUMN_WIDTH(5)};\r\n    z-index: 0;\r\n    background-color: #eee;\r\n    transition: left ${TRANSITION.LENGTH_LONG} ${TRANSITION.BEZIER};\r\n\r\n    @media (min-width: ${`${BREAKPOINTS.lg}px`}) {\r\n        left: ${SCAFFOLDING.COLUMN_WIDTH(4)};\r\n    }\r\n\r\n    @media (max-width: ${`${BREAKPOINTS.md - 1}px`}) {\r\n        display: none;\r\n    }\r\n\r\n    ${ifProp(\r\n        'fullscreen',\r\n        css`\r\n            left: 0 !important;\r\n        `\r\n    )}\r\n`;\r\n\r\nclass MapWrapper extends React.Component {\r\n    handleMapLoad = (map) => {\r\n        this.map = map;\r\n    };\r\n\r\n    isLocationPanelActive() {\r\n        return this.props.activePanel === PANELS.LOCATION;\r\n    }\r\n\r\n    isMarkerPanelActive() {\r\n        return this.props.activePanel === PANELS.MARKER;\r\n    }\r\n\r\n    isAdvancedSettingsPanelActive() {\r\n        return this.props.activePanel === PANELS.ADVANCED_SETTINGS;\r\n    }\r\n\r\n    handleLocationChange = () => {\r\n        const currentLocation = this.getCurrentLocation();\r\n        this.props.onPreviewLocationChange(currentLocation);\r\n        if (this.isLocationPanelActive()) {\r\n            this.props.onLocationChange(currentLocation);\r\n        }\r\n    };\r\n\r\n    handleMarkerDragEnd = (markerId, location) => {\r\n        if (this.isMarkerPanelActive()) {\r\n            this.props.onActiveMarkerLocationChange(location);\r\n        }\r\n    };\r\n\r\n    handleMapTypeChange = () => {\r\n        if (this.isAdvancedSettingsPanelActive()) {\r\n            this.props.onMapTypeChange(this.map.getMapTypeId());\r\n        }\r\n    };\r\n\r\n    handleMapClick = (e) => {\r\n        if (!this.isMarkerPanelActive()) return;\r\n\r\n        const { activeMarker, onActiveMarkerLocationChange } = this.props;\r\n        if (!activeMarker || !activeMarker.location) {\r\n            onActiveMarkerLocationChange(roundLatLng(e.latLng));\r\n            notify.success('Marker location set. You can click and drag the marker to adjust the position.');\r\n        }\r\n    };\r\n\r\n    getCurrentLocation() {\r\n        const center = this.map.getCenter();\r\n        return {\r\n            zoom: this.map.getZoom(),\r\n            center: roundLatLng(center),\r\n        };\r\n    }\r\n\r\n    handleScrollUpdate = () => {\r\n        // Fixes Safari issue of the scroll position not resetting\r\n        const scrollEl = ReactDOM.findDOMNode(this.mapWrapperScroll); // eslint-disable-line react/no-find-dom-node\r\n        const childEl = ReactDOM.findDOMNode(this.mapWrapperGuidelines); // eslint-disable-line react/no-find-dom-node\r\n\r\n        if (scrollEl && childEl) {\r\n            if (scrollEl.offsetWidth >= childEl.offsetWidth) {\r\n                scrollEl.scrollLeft = 0;\r\n            }\r\n\r\n            if (scrollEl.offsetHeight >= childEl.offsetHeight) {\r\n                scrollEl.scrollTop = 0;\r\n            }\r\n        }\r\n    };\r\n\r\n    handleGuideDimen = (dimen, zoom, units) => {\r\n        const gutter = parseInt(SCAFFOLDING.GUTTER, 10);\r\n        let outerWidth = dimen * zoom;\r\n\r\n        if (units === MAP_DIMENSION_UNIT.PERCENT) {\r\n            const width = outerWidth;\r\n            const offset = (width / 100) * gutter * 2;\r\n            outerWidth = `calc(${width}${units} - ${offset}${MAP_DIMENSION_UNIT.PIXEL})`;\r\n        } else {\r\n            outerWidth += units;\r\n        }\r\n        return outerWidth;\r\n    };\r\n\r\n    handleOuterDimen = (dimen, zoom, units) => {\r\n        let innerDimen = dimen * zoom;\r\n        if (units === MAP_DIMENSION_UNIT.PERCENT && innerDimen > 100) {\r\n            innerDimen = 100;\r\n        }\r\n        return innerDimen + units;\r\n    };\r\n\r\n    handleInnerDimen = (zoom) => {\r\n        return (1 / zoom) * 100 + MAP_DIMENSION_UNIT.PERCENT;\r\n    };\r\n\r\n    handleOnChangePreviewZoom = (previewZoom) => {\r\n        if (previewZoom < 0.1) {\r\n            previewZoom = 0.1;\r\n        } else if (previewZoom > 1) {\r\n            previewZoom = 1;\r\n        }\r\n\r\n        previewZoom = Math.round(previewZoom * 100) / 100;\r\n        this.props.onChangePreviewZoom(previewZoom);\r\n    };\r\n\r\n    handleOnFitToScreen = () => {\r\n        // TODO: Find a better way to include the scrollbar\r\n        // TODO: Allow em and rem units\r\n        const wrapper = ReactDOM.findDOMNode(this.mapWrapper); // eslint-disable-line react/no-find-dom-node\r\n        const offset = parseInt(SCAFFOLDING.GUTTER_FACTOR(2), 10) + 20; // Extra 20 to the offset to include the scrollbar\r\n        let wrapperWidth = 0;\r\n        let wrapperHeight = 0;\r\n        let mapWidth = 100; // Assume 100% width initially\r\n        let mapHeight = 100; // Assume 100% height initially\r\n        let zoomWidth = 1;\r\n        let zoomHeight = 1;\r\n\r\n        if (wrapper) {\r\n            wrapperWidth = wrapper.offsetWidth;\r\n            wrapperHeight = wrapper.offsetHeight;\r\n        }\r\n\r\n        // Calculate the zoom value for the width\r\n        if (this.props.previewWidthUnit === MAP_DIMENSION_UNIT.PIXEL) {\r\n            mapWidth = wrapperWidth - offset - parseInt(SIDECONTROLS.BUTTON.WIDTH, 10);\r\n        }\r\n        if (this.props.previewWidth > mapWidth) {\r\n            zoomWidth = mapWidth / this.props.previewWidth;\r\n        }\r\n\r\n        // Calculate the zoom value for the height\r\n        if (this.props.previewHeightUnit === MAP_DIMENSION_UNIT.PIXEL) {\r\n            mapHeight = wrapperHeight - offset - parseInt(MAPTOOLBAR.HEIGHT, 10);\r\n        }\r\n        if (this.props.previewHeight > mapHeight) {\r\n            zoomHeight = mapHeight / this.props.previewHeight;\r\n        }\r\n\r\n        // Set the zoom to the smaller value of width or height\r\n        this.handleOnChangePreviewZoom(Math.min(zoomWidth, zoomHeight));\r\n    };\r\n\r\n    handleMapResize = () => {\r\n        if (this.map && this.map.context) {\r\n            const mapInstance = this.map.context[MAP_KEY];\r\n            if (mapInstance) {\r\n                window.google.maps.event.trigger(mapInstance, 'resize');\r\n                mapInstance.panTo(this.props.center);\r\n            }\r\n        }\r\n    };\r\n\r\n    UNSAFE_componentWillReceiveProps(nextProps) {\r\n        const propsChanged = (...props) => props.some((prop) => this.props[prop] !== nextProps[prop]);\r\n        const trigger = window.requestAnimationFrame || window.setTimeout;\r\n\r\n        if (propsChanged('previewWidth', 'previewWidthUnit', 'previewHeight', 'previewHeightUnit')) {\r\n            trigger(this.handleMapResize);\r\n        } else if (propsChanged('previewZoom')) {\r\n            trigger(this.handleScrollUpdate);\r\n        } else if (propsChanged('fullscreen')) {\r\n            // Fullscreen toggle has to wait until the side menu\r\n            // is completely collapsed before resizing\r\n            setTimeout(this.handleMapResize, TRANSITION.LENGTH_LONG_VALUE);\r\n        }\r\n    }\r\n\r\n    render() {\r\n        const {\r\n            googleMapURL,\r\n            center,\r\n            zoom,\r\n            options,\r\n            markers,\r\n            activeMarker,\r\n            previewWidth,\r\n            previewWidthUnit,\r\n            previewHeight,\r\n            previewHeightUnit,\r\n            previewZoom,\r\n            onSnapToCenter,\r\n            fullscreen,\r\n            activePanel,\r\n        } = this.props;\r\n\r\n        return (\r\n            <StyledMapWrapper\r\n                fullscreen={fullscreen}\r\n                ref={(el) => {\r\n                    this.mapWrapper = el;\r\n                }}\r\n            >\r\n                <MapWrapperScroll\r\n                    ref={(el) => {\r\n                        this.mapWrapperScroll = el;\r\n                    }}\r\n                >\r\n                    <MapWrapperGuidelines\r\n                        ref={(el) => {\r\n                            this.mapWrapperGuidelines = el;\r\n                        }}\r\n                        active={this.isLocationPanelActive()}\r\n                        width={this.handleGuideDimen(previewWidth, previewZoom, previewWidthUnit)}\r\n                        height={this.handleGuideDimen(previewHeight, previewZoom, previewHeightUnit)}\r\n                    >\r\n                        <MapWrapperOuter\r\n                            width={this.handleOuterDimen(previewWidth, previewZoom, previewWidthUnit)}\r\n                            height={this.handleOuterDimen(previewHeight, previewZoom, previewHeightUnit)}\r\n                        >\r\n                            <MapWrapperInner\r\n                                width={this.handleInnerDimen(previewZoom)}\r\n                                height={this.handleInnerDimen(previewZoom)}\r\n                                previewZoom={previewZoom}\r\n                            >\r\n                                <Map\r\n                                    googleMapURL={googleMapURL}\r\n                                    center={center}\r\n                                    zoom={zoom}\r\n                                    onLoad={this.handleMapLoad}\r\n                                    onClick={this.handleMapClick}\r\n                                    onPan={this.handleLocationChange}\r\n                                    onZoom={this.handleLocationChange}\r\n                                    options={options}\r\n                                    activeMarker={activeMarker}\r\n                                    activePanel={activePanel}\r\n                                    markers={markers}\r\n                                    onMarkerDragEnd={this.handleMarkerDragEnd}\r\n                                    onMapTypeChange={this.handleMapTypeChange}\r\n                                />\r\n                            </MapWrapperInner>\r\n                        </MapWrapperOuter>\r\n                    </MapWrapperGuidelines>\r\n                </MapWrapperScroll>\r\n                {/* Map Zoom */}\r\n                <MapToolbar\r\n                    active\r\n                    previewZoom={previewZoom}\r\n                    onChangePreviewZoom={this.handleOnChangePreviewZoom}\r\n                    onFitToScreen={this.handleOnFitToScreen}\r\n                    onSnapToCenter={onSnapToCenter}\r\n                />\r\n            </StyledMapWrapper>\r\n        );\r\n    }\r\n}\r\n\r\nconst mapStateToProps = (state) => {\r\n    const googleProps = getGoogleMapsProps(state, getMapTileLanguage());\r\n    const mapSize = getMapSize(state);\r\n    return {\r\n        ...googleProps,\r\n        activePanel: getActivePanel(state),\r\n        previewZoom: getPreviewZoom(state),\r\n        previewWidth: mapSize.width,\r\n        previewWidthUnit: mapSize.widthUnit,\r\n        previewHeight: mapSize.height,\r\n        previewHeightUnit: mapSize.heightUnit,\r\n        activeMarker: getActiveMarker(state),\r\n        fullscreen: state.navigation.fullscreen,\r\n    };\r\n};\r\n\r\nconst mapDispatchToProps = {\r\n    onChangePreviewZoom: changePreviewZoom,\r\n    onLocationChange: setLocation,\r\n    onPreviewLocationChange: changePreviewLocation,\r\n    onActiveMarkerLocationChange: setActiveMarkerLocation,\r\n    onSnapToCenter: clearPreviewLocation,\r\n    onMapTypeChange: setMapType,\r\n};\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(MapWrapper);\r\n","import React from 'react';\r\nimport styled from 'styled-components';\r\n\r\nimport { BREAKPOINTS, SCAFFOLDING } from 'theme';\r\n\r\nconst UnavailableWrapper = styled.div`\r\n    display: flex;\r\n    flex-direction: column;\r\n    justify-content: center;\r\n    position: absolute;\r\n    top: 0;\r\n    bottom: 0;\r\n    left: 0;\r\n    right: 0;\r\n    z-index: 10;\r\n    padding: ${SCAFFOLDING.GUTTER};\r\n    background-color: #f6f7f6;\r\n    color: #999;\r\n    font-style: italic;\r\n    text-align: center;\r\n\r\n    @media (min-width: ${`${BREAKPOINTS.md}px`}) {\r\n        display: none;\r\n    }\r\n`;\r\n\r\nexport default function Unavailable(props) {\r\n    return (\r\n        <UnavailableWrapper {...props}>\r\n            <div>The editor is currently unavailable at this size.</div>\r\n        </UnavailableWrapper>\r\n    );\r\n}\r\n","import React, { useEffect } from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nconst propTypes = {\r\n    client: PropTypes.string.isRequired,\r\n    slot: PropTypes.string.isRequired,\r\n    className: PropTypes.string,\r\n    style: PropTypes.object,\r\n    layout: PropTypes.string,\r\n    layoutKey: PropTypes.string,\r\n    format: PropTypes.string,\r\n    responsive: PropTypes.string,\r\n    pageLevelAds: PropTypes.bool,\r\n};\r\n\r\nconst AdElement = ({\r\n    className = '',\r\n    style = { display: 'block' },\r\n    client,\r\n    slot,\r\n    layout = '',\r\n    layoutKey = '',\r\n    format = 'auto',\r\n    responsive = 'false',\r\n    pageLevelAds = false,\r\n    ...rest\r\n}) => {\r\n    useEffect(() => {\r\n        const p = {};\r\n        if (pageLevelAds) {\r\n            p.google_ad_client = client;\r\n            p.enable_page_level_ads = true;\r\n        }\r\n\r\n        try {\r\n            if (typeof window === 'object') {\r\n                (window.adsbygoogle = window.adsbygoogle || []).push(p);\r\n            }\r\n        } catch {\r\n            // Pass\r\n        }\r\n        // eslint-disable-next-line react-hooks/exhaustive-deps\r\n    }, []);\r\n\r\n    return (\r\n        <ins\r\n            className={`adsbygoogle ${className}`}\r\n            style={style}\r\n            data-ad-client={client}\r\n            data-ad-slot={slot}\r\n            data-ad-layout={layout}\r\n            data-ad-layout-key={layoutKey}\r\n            data-ad-format={format}\r\n            data-full-width-responsive={responsive}\r\n            {...rest}\r\n        />\r\n    );\r\n};\r\n\r\nAdElement.propTypes = propTypes;\r\n\r\nexport { AdElement };\r\n","import React, { useCallback, useState } from 'react';\r\nimport { Icon, GLYPHS } from 'components/Shared/Icon';\r\nimport { AdElement } from './AdElement';\r\n\r\nexport const FixedLargeMobileBanner = ({ id, height, width }) => {\r\n    const enabled = process.env.NODE_ENV === 'production';\r\n    const [open, setOpen] = useState(true);\r\n    const close = useCallback(() => setOpen(false), [setOpen]);\r\n    return (\r\n        open && (\r\n            <div className=\"container-gas container-gas-mobile-banner\">\r\n                <button className=\"container-gas-close\" onClick={close}>\r\n                    <Icon glyph={GLYPHS.CLOSE} />\r\n                </button>\r\n                <div className=\"gas-label\">ADVERTISEMENT</div>\r\n                <div className=\"gas-mobile-banner\">\r\n                    {!enabled && (\r\n                        <img src={`https://via.placeholder.com/${width}x${height}?text=Test%20Ad`} alt=\"Test Ad\" />\r\n                    )}\r\n                    {enabled && (\r\n                        <div id={id} style={{ height: `${height}px`, width: `${width}px`, display: 'inline-block' }}>\r\n                            <AdElement\r\n                                client=\"ca-pub-5077429869863377\"\r\n                                slot=\"3712925246\"\r\n                                responsive=\"true\"\r\n                                format=\"horizontal\"\r\n                                pageLevelAds\r\n                            />\r\n                        </div>\r\n                    )}\r\n                </div>\r\n            </div>\r\n        )\r\n    );\r\n};\r\n","import { useEffect } from 'react';\r\nimport { useDispatch } from 'react-redux';\r\nimport { saveState } from 'modules/storage';\r\n\r\nconst saveThunk = () => {\r\n    return (dispatch, getState) => {\r\n        const state = getState();\r\n        saveState({ map: state.map });\r\n    };\r\n};\r\n\r\nexport const SaveMapStateOnUnload = () => {\r\n    const dispatch = useDispatch();\r\n    const save = () => dispatch(saveThunk());\r\n\r\n    useEffect(() => {\r\n        window.addEventListener('beforeunload', save);\r\n        return () => {\r\n            window.removeEventListener('beforeunload', save);\r\n        };\r\n    }, []); // eslint-disable-line\r\n\r\n    return null;\r\n};\r\n","import React, { Fragment, useEffect, useState } from 'react';\r\nimport SettingsContainer from 'containers/SettingsContainer';\r\nimport MapWrapper from 'components/Map/MapWrapper';\r\nimport Unavailable from 'components/Shared/Unavailable';\r\nimport { FixedLargeMobileBanner } from 'components/Shared/Ads/FixedLargeMobileBanner';\r\nimport { routes } from 'modules/routes';\r\nimport { useRoute } from 'wouter';\r\nimport { useRecoilState, useRecoilValue } from 'recoil';\r\nimport { currentMapIdState, currentMapSelector } from 'modules/map';\r\nimport { setCurrentMap } from 'modules/reset';\r\nimport { push } from 'utils/push';\r\nimport { SaveMapStateOnUnload } from 'components/Map/SaveMapStateOnUnload';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { clearState, loadState } from 'modules/storage';\r\nimport notify from 'utils/notify';\r\nimport { currentUserIsUpgradedUserSelector } from 'modules/currentUser';\r\n\r\nconst parseId = (id) => {\r\n    if (!id) {\r\n        return null;\r\n    }\r\n    const int = parseInt(id, 10);\r\n    return isNaN(int) ? null : int;\r\n};\r\n\r\nexport default function MapBuilder() {\r\n    const [match, params] = useRoute(routes.mapBuilderEdit.path);\r\n    const [currentMapId, setCurrentMapId] = useRecoilState(currentMapIdState); // eslint-disable-line no-unused-vars\r\n    const map = useRecoilValue(currentMapSelector);\r\n    const dispatch = useDispatch();\r\n\r\n    useEffect(() => {\r\n        setCurrentMapId(match ? parseId(params.id) : null);\r\n    }, [setCurrentMapId, match, params]);\r\n\r\n    const [loadedState, setLoadedState] = useState(false);\r\n    useEffect(() => {\r\n        const localState = loadState();\r\n        if (localState) {\r\n            clearState();\r\n            setLoadedState(true);\r\n            dispatch(setCurrentMap(localState.map));\r\n        } else {\r\n            if (!loadedState) {\r\n                dispatch(setCurrentMap(map));\r\n            }\r\n        }\r\n        if (!map && currentMapId) {\r\n            notify.error('Unable to access the requested map. Please contact support if the problem continues.');\r\n            push(routes.mapBuilder.path);\r\n        }\r\n    }, [dispatch, map, currentMapId, loadedState]);\r\n    const isUpgradedUser = useSelector(currentUserIsUpgradedUserSelector);\r\n\r\n    return (\r\n        <Fragment>\r\n            <SaveMapStateOnUnload />\r\n            <Unavailable />\r\n            <SettingsContainer />\r\n            <MapWrapper />\r\n            {!isUpgradedUser && <FixedLargeMobileBanner id=\"map-builder-ad\" width={320} height={100} />}\r\n        </Fragment>\r\n    );\r\n}\r\n","import { isInt } from 'utils/validation';\r\nimport { GLYPHS } from 'components/Shared/Icon';\r\n\r\nconst isGoogleDefined = () => typeof window.google !== 'undefined' && window.google !== null;\r\n\r\nexport const MARKER_TYPE = {\r\n    DEFAULT: 'default',\r\n    STYLED: 'styled',\r\n    CUSTOM: 'custom',\r\n};\r\n\r\nexport const STYLED_MARKER = [GLYPHS.MARKER1, GLYPHS.MARKER2, GLYPHS.MARKER3, GLYPHS.MARKER4, GLYPHS.MARKER5];\r\n\r\nexport const getIconOptions = (icon) => {\r\n    if (!icon || !icon.type) return undefined;\r\n    switch (icon.type) {\r\n        case MARKER_TYPE.STYLED:\r\n            return getStyledIconOptions(icon);\r\n\r\n        case MARKER_TYPE.CUSTOM:\r\n            return getCustomIconOptions(icon);\r\n\r\n        default:\r\n            return undefined;\r\n    }\r\n};\r\n\r\nexport const isIconOptimized = (icon) => {\r\n    if (icon && icon.type === MARKER_TYPE.CUSTOM && icon.image && icon.image.url && /\\.gif$/.test(icon.image.url)) {\r\n        return false;\r\n    }\r\n    return true;\r\n};\r\n\r\n//\r\n// Styled Markers\r\n//\r\n\r\nconst STYLED_MARKER_SIZE = 22;\r\n\r\nexport const getStyledIconOptions = (icon) => {\r\n    const { styledMarkerId, color, size } = icon;\r\n    const styledMarker = STYLED_MARKER[styledMarkerId];\r\n    if (!styledMarker) {\r\n        return undefined;\r\n    }\r\n\r\n    const path = MARKER_PATHS[styledMarker];\r\n    if (!path) {\r\n        return undefined;\r\n    }\r\n\r\n    // Use the options defined by Google Maps Symbols:\r\n    // https://developers.google.com/maps/documentation/javascript/symbols\r\n    return {\r\n        path: path,\r\n        scale: getScaleFromSize(size),\r\n        anchor: {\r\n            x: STYLED_MARKER_SIZE / 2,\r\n            y: STYLED_MARKER_SIZE,\r\n        },\r\n        fillOpacity: 1,\r\n        fillColor: color,\r\n        strokeOpacity: 0,\r\n    };\r\n};\r\n\r\n// Google doesn't take a width and height for this type of icon.\r\n// Determine how much to scale the icon by compared to the base image size.\r\nconst getScaleFromSize = (size) => {\r\n    if (!isInt(size)) {\r\n        size = STYLED_MARKER_SIZE;\r\n    }\r\n    return parseFloat((size / STYLED_MARKER_SIZE).toFixed(4));\r\n};\r\n\r\nconst MARKER_PATHS = {\r\n    [GLYPHS.MARKER1]:\r\n        'M11 2c-3.9 0-7 3.1-7 7 0 5.3 7 13 7 13 0 0 7-7.7 7-13 0-3.9-3.1-7-7-7Zm0 9.5c-1.4 0-2.5-1.1-2.5-2.5 0-1.4 1.1-2.5 2.5-2.5 1.4 0 2.5 1.1 2.5 2.5 0 1.4-1.1 2.5-2.5 2.5Z',\r\n    [GLYPHS.MARKER2]:\r\n        'M17.3 2l-12.7 0c-1 0-1.8 0.8-1.8 1.8l0 11.8c0 0.6 0.3 1.2 0.8 1.5l7.4 4.9 7.4-4.9c0.5-0.3 0.8-0.9 0.8-1.5l0-11.8c0-1-0.8-1.8-1.8-1.8l-0.1 0Z',\r\n    [GLYPHS.MARKER3]:\r\n        'M18 2c1.1 0 2 0.9 2 2l0 13c0 1.1-0.9 2-2 2l-4 0 -3 3 -3-3 -4 0c-1.1 0-2-0.9-2-2l0-13c0-1.1 0.9-2 2-2l14 0Zm-7 10.9l2.8 1.7 -0.7-3.2 2.5-2.1 -3.2-0.3 -1.3-3 -1.3 3 -3.2 0.3 2.5 2.1 -0.7 3.2 2.8-1.7Z',\r\n    [GLYPHS.MARKER4]:\r\n        'M10 13.9c-2.8-0.5-5-2.9-5-5.9 0-3.3 2.7-6 6-6 3.3 0 6 2.7 6 6 0 3-2.2 5.4-5 5.9l0 8.1 -2 0 0-8.1',\r\n    [GLYPHS.MARKER5]: 'M20 5.9l-10-4.9 0 21 2 0 0-12 8-4.1Z',\r\n};\r\n\r\n//\r\n// Custom Markers\r\n//\r\n\r\n// Use the options defined by Google Maps Icons\r\n// https://developers.google.com/maps/documentation/javascript/3.exp/reference#Icon\r\nconst getCustomIconOptions = (icon) => {\r\n    const { anchorX, anchorY, image } = icon;\r\n    let { width, height } = icon;\r\n\r\n    if (!image || !image.url || !isGoogleDefined()) {\r\n        return undefined;\r\n    }\r\n\r\n    width = isInt(width) ? width : 36;\r\n    height = isInt(height) ? height : 36;\r\n\r\n    const opts = { url: image.url };\r\n    if (isInt(width) && isInt(height)) {\r\n        opts.scaledSize = new window.google.maps.Size(width, height);\r\n        opts.size = new window.google.maps.Size(width, height);\r\n    }\r\n\r\n    if (isInt(anchorX) && isInt(anchorY)) {\r\n        opts.anchor = new window.google.maps.Point(anchorX, anchorY);\r\n    }\r\n\r\n    return opts;\r\n};\r\n","// Font sizes\r\nexport const DEFAULT_FONT_SIZE = 14;\r\n\r\nexport const FONT_SIZES = [8, 9, 10, 11, 12, 14, 18, 24, 30, 36, 48, 60, 72, 96];\r\n\r\n// A list of supported fonts\r\nexport const FONTS = [\r\n    {\r\n        name: 'Arial',\r\n        fontFamily: 'Arial, Helvetica, sans-serif',\r\n    },\r\n    {\r\n        name: 'Courier New',\r\n        fontFamily: \"'Courier New', Courier, monospace\",\r\n    },\r\n    {\r\n        name: 'Georgia',\r\n        fontFamily: 'Georgia, serif',\r\n    },\r\n    {\r\n        name: 'Merriweather',\r\n        fontFamily: \"'Merriweather', 'Times', serif\",\r\n    },\r\n    {\r\n        name: 'Open Sans',\r\n        fontFamily: \"'Open Sans', sans-serif\",\r\n    },\r\n    {\r\n        name: 'Roboto',\r\n        fontFamily: \"'Roboto', sans-serif\",\r\n    },\r\n    {\r\n        name: 'Times New Roman',\r\n        fontFamily: \"'Times New Roman', Times, serif\",\r\n    },\r\n    {\r\n        name: 'Verdana',\r\n        fontFamily: 'Verdana, Geneva, sans-serif',\r\n    },\r\n];\r\n\r\nexport const DEFAULT_FONT_INDEX = 0;\r\nexport const DEFAULT_FONT = FONTS[DEFAULT_FONT_INDEX];\r\n\r\nexport const RichTextEditorOptions = {\r\n    DefaultFontSize: `${DEFAULT_FONT_SIZE}px`,\r\n    DefaultFontFamily: DEFAULT_FONT.fontFamily,\r\n};\r\n","import deepExtend from 'deep-extend';\r\n\r\nexport const INFO_WINDOW_POSITION = {\r\n    TOP: {\r\n        label: 'Above the marker',\r\n        value: 'TOP',\r\n    },\r\n    LEFT: {\r\n        label: 'To the left of the marker',\r\n        value: 'LEFT',\r\n    },\r\n    BOTTOM: {\r\n        label: 'Below the marker',\r\n        value: 'BOTTOM',\r\n    },\r\n    RIGHT: {\r\n        label: 'To the right of the marker',\r\n        value: 'RIGHT',\r\n    },\r\n};\r\n\r\nexport const BASE_STYLE = {\r\n    background: '#fff',\r\n    fontColor: '#000',\r\n    container: {\r\n        padding: 30,\r\n        borderRadius: 3,\r\n        top: 0,\r\n        left: 0,\r\n    },\r\n    border: {\r\n        enabled: true,\r\n        width: 1,\r\n        color: '#bbb',\r\n    },\r\n    arrow: {\r\n        enabled: true,\r\n        length: 15,\r\n    },\r\n    shadow: {\r\n        enabled: true,\r\n        h: 0,\r\n        v: 1,\r\n        blur: 3,\r\n        spread: 0,\r\n        opacity: 0.3,\r\n        color: '#000000',\r\n    },\r\n};\r\n\r\nconst parseIndex = (styleIndex) => {\r\n    let i = parseInt(styleIndex, 10);\r\n    if (isNaN(i)) {\r\n        i = 0;\r\n    }\r\n    return i;\r\n};\r\n\r\nexport const mergeFormAndStyle = (formValues, styleIndex) => {\r\n    const i = parseIndex(styleIndex);\r\n    return deepExtend({}, BASE_STYLE, formValues, INFO_WINDOW_STYLES[i].values, { style: i });\r\n};\r\n\r\nexport const getDefaultValues = (styleIndex) => {\r\n    const i = parseIndex(styleIndex);\r\n    return deepExtend({}, BASE_STYLE, INFO_WINDOW_STYLES[i].values);\r\n};\r\n\r\nexport const INFO_WINDOW_STYLES = [\r\n    {\r\n        label: 'Default Light',\r\n        values: {},\r\n    },\r\n    {\r\n        label: 'Default Dark',\r\n        values: {\r\n            background: '#333',\r\n            fontColor: '#fff',\r\n            border: {\r\n                enabled: false,\r\n            },\r\n            shadow: {\r\n                opacity: 0.75,\r\n            },\r\n        },\r\n    },\r\n    {\r\n        label: 'Light flat',\r\n        values: {\r\n            background: '#fff',\r\n            fontColor: '#333',\r\n            container: {\r\n                borderRadius: 0,\r\n            },\r\n            border: {\r\n                enabled: false,\r\n            },\r\n            shadow: {\r\n                enabled: false,\r\n            },\r\n        },\r\n    },\r\n    {\r\n        label: 'Dark flat',\r\n        values: {\r\n            background: '#333',\r\n            fontColor: '#fff',\r\n            container: {\r\n                borderRadius: 0,\r\n            },\r\n            border: {\r\n                enabled: false,\r\n            },\r\n            shadow: {\r\n                enabled: false,\r\n            },\r\n        },\r\n    },\r\n    {\r\n        label: 'Light bold',\r\n        values: {\r\n            background: '#fff',\r\n            fontColor: '#333',\r\n            container: {\r\n                padding: 40,\r\n                borderRadius: 0,\r\n            },\r\n            border: {\r\n                width: 5,\r\n                color: '#333',\r\n            },\r\n            shadow: {\r\n                h: 10,\r\n                v: 10,\r\n                blur: 0,\r\n                spread: 0,\r\n                opacity: 0.5,\r\n            },\r\n            arrow: {\r\n                length: 20,\r\n            },\r\n        },\r\n    },\r\n    {\r\n        label: 'Dark bold',\r\n        values: {\r\n            background: '#333',\r\n            fontColor: '#fff',\r\n            container: {\r\n                padding: 40,\r\n                borderRadius: 0,\r\n            },\r\n            border: {\r\n                width: 5,\r\n                color: '#fff',\r\n            },\r\n            shadow: {\r\n                h: 10,\r\n                v: 10,\r\n                blur: 0,\r\n                spread: 0,\r\n                opacity: 0.75,\r\n            },\r\n            arrow: {\r\n                length: 20,\r\n            },\r\n        },\r\n    },\r\n];\r\n","import { controlsType, controlPositions, mapTypeStyles, mapTypes, getAdvancedSettings } from 'modules/advancedSettings';\r\nimport { getPreviewLocation } from 'modules/navigation/preview';\r\nimport { getMarkersWithForm } from 'modules/markers';\r\nimport snazzyInfoWindowOptions from 'modules/infoWindow';\r\nimport { getStyle } from 'modules/style';\r\nimport { MAX_ZOOM, MIN_ZOOM } from 'modules/location';\r\nimport { PANELS, getActivePanel } from 'modules/navigation/activePanel';\r\n\r\n// These properties are shared between the map builder and map printings\r\nexport const getGoogleMapsProps = (state, language) => {\r\n    const advancedSettings = getAdvancedSettings(state);\r\n    const controlProps = (name, forceEnabled) => {\r\n        const control = advancedSettings.controls.custom[name];\r\n        const type = advancedSettings.controls.type;\r\n\r\n        // Google maps will fallback to default when undefined\r\n        let enabled;\r\n        let position;\r\n        let style;\r\n        let mapTypeIds;\r\n\r\n        if (type === controlsType.CUSTOM) {\r\n            enabled = control.enabled;\r\n            if (control.position) {\r\n                position = controlPositions[control.position];\r\n            }\r\n            if (control.style) {\r\n                style = mapTypeStyles[control.style];\r\n            }\r\n            if (control.types) {\r\n                mapTypeIds = control.types.map((e) => mapTypes[e]);\r\n            }\r\n        } else if (type === controlsType.HIDE_ALL) {\r\n            enabled = false;\r\n        }\r\n\r\n        if (forceEnabled === true && enabled === false) {\r\n            enabled = true;\r\n        }\r\n\r\n        return {\r\n            [`${name}Control`]: enabled,\r\n            [`${name}ControlOptions`]: {\r\n                position,\r\n                style,\r\n                mapTypeIds,\r\n            },\r\n        };\r\n    };\r\n\r\n    const behavior = advancedSettings.behavior;\r\n    const preview = getPreviewLocation(state);\r\n    const activePanel = getActivePanel(state);\r\n    const forceEnableZoomPan =\r\n        activePanel === PANELS.LOCATION || activePanel === PANELS.MARKER || activePanel === PANELS.INFO_WINDOW;\r\n    const key = process.env.REACT_APP_GOOGLE_MAPS_API_KEY;\r\n\r\n    return {\r\n        googleMapURL: `https://maps.googleapis.com/maps/api/js?key=${key}&v=3.31&language=${language}&libraries=places,geometry`,\r\n        language,\r\n        center: preview.center,\r\n        zoom: preview.zoom,\r\n        markers: getMarkersWithForm(state).map((marker) => snazzyInfoWindowOptions(state, marker)),\r\n        options: {\r\n            ...controlProps('fullscreen'),\r\n            ...controlProps('mapType'),\r\n            ...controlProps('rotate'),\r\n            ...controlProps('scale'),\r\n            ...controlProps('streetView'),\r\n            ...controlProps('zoom', forceEnableZoomPan),\r\n            // Error when passing falsey value\r\n            clickableIcons: !!behavior.clickableIcons && activePanel !== PANELS.MARKER,\r\n            disableDoubleClickZoom: !behavior.doubleClickToZoom || forceEnableZoomPan,\r\n            draggable: !!behavior.panning || forceEnableZoomPan,\r\n            keyboardShortcuts: !!behavior.keyboardShortcuts,\r\n            scrollwheel: !!behavior.scrollToZoom || forceEnableZoomPan,\r\n            // TODO: Replace eval with something safer\r\n            styles: eval(getStyle(state).json), // eslint-disable-line no-eval\r\n            maxZoom: MAX_ZOOM,\r\n            minZoom: MIN_ZOOM,\r\n            mapTypeId: advancedSettings.mapType,\r\n        },\r\n    };\r\n};\r\n","import React from 'react';\r\nimport ReactDOMServer from 'react-dom/server';\r\nimport { getFormValues } from 'redux-form';\r\nimport { RichTextEditorOptions } from 'components/Shared/Forms/RichTextEditor/RichTextEditorConstants';\r\nimport { INFO_WINDOW_POSITION, getDefaultValues } from 'components/InfoWindowSettings/InfoWindowConstants';\r\nimport { getActiveMarker } from 'modules/navigation/activeMarker';\r\nimport { PANELS, getActivePanel } from 'modules/navigation/activePanel';\r\nimport { MARKER_TYPE, getStyledIconOptions } from 'components/MarkerSettings/IconOptions';\r\n\r\n// Calculate the pointer offset based on the placement\r\nconst getPointerPlacement = (icon, position) => {\r\n    let w = 22;\r\n    let h = 40;\r\n    let aX = 11;\r\n    let aY = 40;\r\n    let top = 0;\r\n    let left = 0;\r\n    let placement = 'top';\r\n    // First determine the size of the marker\r\n    switch (icon.type) {\r\n        case MARKER_TYPE.CUSTOM:\r\n            w = icon.width;\r\n            h = icon.height;\r\n            aX = icon.anchorX;\r\n            aY = icon.anchorY;\r\n            break;\r\n\r\n        case MARKER_TYPE.STYLED:\r\n            const opts = getStyledIconOptions(icon);\r\n            if (opts) {\r\n                w = icon.size;\r\n                h = icon.size;\r\n                aX = opts.anchor.x * opts.scale;\r\n                aY = opts.anchor.y * opts.scale;\r\n            }\r\n            break;\r\n\r\n        default:\r\n            break;\r\n    }\r\n\r\n    // Now calculate the placement\r\n    switch (position) {\r\n        case INFO_WINDOW_POSITION.TOP.value:\r\n            placement = 'top';\r\n            top = -aY;\r\n            left = w / 2 - aX;\r\n            break;\r\n\r\n        case INFO_WINDOW_POSITION.BOTTOM.value:\r\n            placement = 'bottom';\r\n            top = h - aY;\r\n            left = w / 2 - aX;\r\n            break;\r\n\r\n        case INFO_WINDOW_POSITION.LEFT.value:\r\n            placement = 'left';\r\n            top = h / 2 - aY;\r\n            left = -aX;\r\n            break;\r\n\r\n        case INFO_WINDOW_POSITION.RIGHT.value:\r\n            placement = 'right';\r\n            top = h / 2 - aY;\r\n            left = w - aX;\r\n            break;\r\n\r\n        default:\r\n            break;\r\n    }\r\n    return { placement, top, left };\r\n};\r\n\r\nconst snazzyInfoWindowOptions = (state, marker) => {\r\n    const activeMarker = getActiveMarker(state);\r\n    const isActiveMarker = activeMarker && activeMarker.id === marker.id;\r\n    let values = marker.infoWindow;\r\n    if (isActiveMarker) {\r\n        values = getFormValues('info-window')(state) || values;\r\n    }\r\n\r\n    if (!values || !values.enabled) {\r\n        return {\r\n            ...marker,\r\n            infoWindow: { enabled: false },\r\n        };\r\n    }\r\n\r\n    const { placement, top, left } = getPointerPlacement(marker.icon, values.position);\r\n    const arrow = values.arrow || {};\r\n    const shadow = values.shadow || {};\r\n    const border = values.border || {};\r\n    const container = values.container || {};\r\n    const defaults = getDefaultValues(values.style);\r\n\r\n    // The content could be initialized as a string instead of a delta\r\n    let content = values.content;\r\n    if (typeof content !== 'string') {\r\n        content = content.html;\r\n    }\r\n    const activePanel = getActivePanel(state);\r\n    const isEditMode = activePanel === PANELS.INFO_WINDOW || activePanel === PANELS.MARKER;\r\n    const isMapReset = !state.navigation.preview.location;\r\n    const ifSet = (value, defaultValue, format = (x) => x) => {\r\n        return value !== '' ? format(value) : format(defaultValue);\r\n    };\r\n    const pixelFormat = (value) => `${value}px`;\r\n\r\n    return {\r\n        ...marker,\r\n        infoWindow: {\r\n            enabled: values.enabled,\r\n            isActive: isActiveMarker,\r\n            isEditMode,\r\n            isMapReset,\r\n            behavior: values.behavior,\r\n            options: {\r\n                wrapperClass: 'ql-snow',\r\n                placement,\r\n                backgroundColor: values.background,\r\n                fontColor: values.fontColor,\r\n                content: ReactDOMServer.renderToStaticMarkup(\r\n                    <div\r\n                        className=\"ql-editor\"\r\n                        style={{\r\n                            fontFamily: RichTextEditorOptions.DefaultFontFamily,\r\n                            fontSize: RichTextEditorOptions.DefaultFontSize,\r\n                        }}\r\n                        // eslint-disable-next-line react/no-danger\r\n                        dangerouslySetInnerHTML={{\r\n                            __html: content,\r\n                        }}\r\n                    />\r\n                ),\r\n                maxWidth: ifSet(container.maxWidth),\r\n                maxHeight: ifSet(container.maxHeight),\r\n                padding: ifSet(container.padding, defaults.container.padding, pixelFormat),\r\n                borderRadius: ifSet(container.borderRadius, defaults.container.borderRadius, (x) => `${x}px ${x}px`),\r\n                offset: {\r\n                    top: ifSet(container.top, defaults.container.top, (x) => `${top + x}px`),\r\n                    left: ifSet(container.left, defaults.container.left, (x) => `${left + x}px`),\r\n                },\r\n                border: border.enabled\r\n                    ? {\r\n                          width: ifSet(border.width, defaults.border.width, pixelFormat),\r\n                          color: border.color,\r\n                      }\r\n                    : false,\r\n                pointer: arrow.enabled ? ifSet(arrow.length, defaults.arrow.length, pixelFormat) : false,\r\n                shadow:\r\n                    shadow.enabled && shadow.opacity !== 0\r\n                        ? {\r\n                              h: ifSet(shadow.h, defaults.shadow.h, pixelFormat),\r\n                              v: ifSet(shadow.v, defaults.shadow.v, pixelFormat),\r\n                              blur: ifSet(shadow.blur, defaults.shadow.blur, pixelFormat),\r\n                              spread: ifSet(shadow.spread, defaults.shadow.spread, pixelFormat),\r\n                              opacity: ifSet(shadow.opacity, defaults.shadow.opacity),\r\n                              color: shadow.color,\r\n                          }\r\n                        : false,\r\n                closeOnMapClick: !!values.behavior.closeOnMapClick,\r\n                openOnMarkerClick: !isEditMode || isActiveMarker,\r\n                closeWhenOthersOpen: !!values.behavior.closeWhenOthersOpen,\r\n            },\r\n        },\r\n    };\r\n};\r\n\r\nexport default snazzyInfoWindowOptions;\r\n","import { Quill } from 'react-quill';\r\n\r\nexport const COLORS = [\r\n    '#000000',\r\n    '#e60000',\r\n    '#ff9900',\r\n    '#ffff00',\r\n    '#008a00',\r\n    '#0066cc',\r\n    '#9933ff',\r\n    '#ffffff',\r\n    '#facccc',\r\n    '#ffebcc',\r\n    '#ffffcc',\r\n    '#cce8cc',\r\n    '#cce0f5',\r\n    '#ebd6ff',\r\n    '#bbbbbb',\r\n    '#f06666',\r\n    '#ffc266',\r\n    '#ffff66',\r\n    '#66b966',\r\n    '#66a3e0',\r\n    '#c285ff',\r\n    '#888888',\r\n    '#a10000',\r\n    '#b26b00',\r\n    '#b2b200',\r\n    '#006100',\r\n    '#0047b2',\r\n    '#6b24b2',\r\n    '#444444',\r\n    '#5c0000',\r\n    '#663d00',\r\n    '#666600',\r\n    '#003700',\r\n    '#002966',\r\n    '#3d1466',\r\n    '',\r\n];\r\n\r\nconst ColorPicker = Quill.import('ui/color-picker');\r\n\r\nexport default class SnazzyColorPicker extends ColorPicker {\r\n    buildItem(option) {\r\n        const item = super.buildItem(option);\r\n        if (!item.dataset.value) {\r\n            item.className = 'ql-color-reset';\r\n            item.innerHTML = 'Reset to Default';\r\n        } else {\r\n            item.title = item.dataset.value;\r\n        }\r\n        return item;\r\n    }\r\n}\r\n","import { Quill } from 'react-quill';\r\n\r\nimport { FONTS, DEFAULT_FONT_INDEX } from 'components/Shared/Forms/RichTextEditor/RichTextEditorConstants';\r\n\r\n// Defined in themes/base.js in quilljs\r\nexport const fillFontSelect = (select) => {\r\n    FONTS.forEach((font, i) => {\r\n        const option = document.createElement('option');\r\n        if (i === DEFAULT_FONT_INDEX) {\r\n            option.setAttribute('selected', 'selected');\r\n        }\r\n        option.setAttribute('value', `font-${i}`);\r\n        option.innerHTML = font.name;\r\n        option.style.fontFamily = font.fontFamily;\r\n        select.appendChild(option);\r\n    });\r\n};\r\n\r\n// Return the font for the given option value\r\nconst getFontIndex = (value) => {\r\n    let index = parseInt(value.replace(/^font-/, ''), 10);\r\n    if (isNaN(index)) {\r\n        index = DEFAULT_FONT_INDEX;\r\n    }\r\n    return index;\r\n};\r\n\r\nconst Picker = Quill.import('ui/picker');\r\n\r\nexport default class SnazzyFontPicker extends Picker {\r\n    buildItem(option) {\r\n        const item = super.buildItem(option);\r\n        if (item && option && option.style.fontFamily) {\r\n            item.style.fontFamily = option.style.fontFamily;\r\n        }\r\n        item.title = option.innerHTML;\r\n        return item;\r\n    }\r\n\r\n    buildOptions(select) {\r\n        super.buildOptions(select);\r\n        const items = this.container.querySelector('.ql-picker-options').children;\r\n        for (let i = 0; i < items.length; i++) {\r\n            const option = this.select.options[i];\r\n            if (option && option.selected) {\r\n                this.selectItem(items[i]);\r\n            }\r\n        }\r\n    }\r\n\r\n    selectItem(item, trigger) {\r\n        super.selectItem(item, trigger);\r\n        if (this.select.selectedIndex > -1) {\r\n            const option = this.select.options[this.select.selectedIndex];\r\n            if (option && option.style.fontFamily) {\r\n                this.label.style.fontFamily = option.style.fontFamily;\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\n// It appears that React-Quill override the default font class attributor\r\n// with a style attributor. This caused issues with fonts that had spaces\r\n// in their names.\r\n// The generated HTML for the info window will contain the data attribute\r\n// We might want to parse it out before generating the iframe.\r\nconst Parchment = Quill.import('parchment');\r\nclass FontStyleAttributor extends Parchment.Attributor.Style {\r\n    add(node, value) {\r\n        if (!this.canAdd(node, value)) return false;\r\n        const index = getFontIndex(value);\r\n        node.style.fontFamily = FONTS[index].fontFamily;\r\n        node.dataset.fontIndex = index;\r\n        return true;\r\n    }\r\n\r\n    value(node) {\r\n        const index = node.dataset.fontIndex || DEFAULT_FONT_INDEX;\r\n        return `font-${index}`;\r\n    }\r\n}\r\n\r\n// No need for a white list\r\nconst FontStyle = new FontStyleAttributor('font', 'font-family', {\r\n    scope: Parchment.Scope.INLINE,\r\n});\r\nQuill.register(FontStyle, true);\r\n","import { Quill } from 'react-quill';\r\n\r\nimport { FONT_SIZES, DEFAULT_FONT_SIZE } from 'components/Shared/Forms/RichTextEditor/RichTextEditorConstants';\r\n\r\n// Defined in themes/base.js in quilljs\r\nexport const fillFontSizeSelect = (select) => {\r\n    FONT_SIZES.forEach((size) => {\r\n        const option = document.createElement('option');\r\n        if (size === DEFAULT_FONT_SIZE) {\r\n            option.setAttribute('selected', 'selected');\r\n        }\r\n        option.setAttribute('value', `font-size-${size}`);\r\n        option.innerHTML = size;\r\n        option.style.fontSize = size;\r\n        select.appendChild(option);\r\n    });\r\n};\r\n\r\n// Return the font for the given option value\r\nconst getFontSize = (value) => {\r\n    let size = parseInt(value.replace(/^font-size-/, ''), 10);\r\n    if (isNaN(size)) {\r\n        size = DEFAULT_FONT_SIZE;\r\n    }\r\n    return size;\r\n};\r\n\r\nconst Picker = Quill.import('ui/picker');\r\n\r\nexport default class SnazzyFontSizePicker extends Picker {\r\n    buildItem(option) {\r\n        const item = super.buildItem(option);\r\n        if (item && option && option.style.fontSize) {\r\n            item.style.fontSize = option.style.fontSize;\r\n        }\r\n        item.title = option.innerHTML;\r\n        return item;\r\n    }\r\n\r\n    buildOptions(select) {\r\n        super.buildOptions(select);\r\n        const items = this.container.querySelector('.ql-size .ql-picker-options').children;\r\n        for (let i = 0; i < items.length; i++) {\r\n            const option = this.select.options[i];\r\n            if (option && option.selected) {\r\n                this.selectItem(items[i]);\r\n            }\r\n        }\r\n    }\r\n\r\n    selectItem(item, trigger) {\r\n        super.selectItem(item, trigger);\r\n        if (this.select.selectedIndex > -1) {\r\n            const option = this.select.options[this.select.selectedIndex];\r\n            if (option && option.style.fontSize) {\r\n                this.label.style.fontSize = option.style.fontSize;\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\n// It appears that React-Quill override the default font class attributor\r\n// with a style attributor. This caused issues with fonts that had spaces\r\n// in their names.\r\n// The generated HTML for the info window will contain the data attribute\r\n// We might want to parse it out before generating the iframe.\r\nconst Parchment = Quill.import('parchment');\r\nclass FontSizeAttributor extends Parchment.Attributor.Style {\r\n    add(node, value) {\r\n        if (!this.canAdd(node, value)) return false;\r\n        const size = getFontSize(value);\r\n        node.style.fontSize = size + 'px';\r\n        node.dataset.fontSize = size;\r\n        return true;\r\n    }\r\n\r\n    value(node) {\r\n        const size = node.dataset.fontSize || DEFAULT_FONT_SIZE;\r\n        return `font-size-${size}`;\r\n    }\r\n}\r\n\r\n// No need for a white list\r\nconst FontSizeStyle = new FontSizeAttributor('size', 'font-size', {\r\n    scope: Parchment.Scope.INLINE,\r\n});\r\nQuill.register(FontSizeStyle, true);\r\n","import { Quill } from 'react-quill';\r\n\r\nexport const FONT_HEADERS = ['1', '2', '3', '4', false];\r\n\r\nconst Picker = Quill.import('ui/picker');\r\n\r\nexport default class SnazzyFontHeaderPicker extends Picker {\r\n    buildItem(option) {\r\n        const item = super.buildItem(option);\r\n        if (option.value) {\r\n            item.title = `Heading ${option.value}`;\r\n        } else {\r\n            item.title = 'Normal';\r\n        }\r\n        return item;\r\n    }\r\n}\r\n","import { Quill } from 'react-quill';\r\n\r\nconst Clipboard = Quill.import('modules/clipboard');\r\n\r\nconst resetAttributes = ['background', 'size', 'font', 'color'];\r\n\r\nclass PlainClipboard extends Clipboard {\r\n    convert(html = null) {\r\n        // Remove all attributes from each delta\r\n        const delta = super.convert(html);\r\n        if (!html) {\r\n            delta.ops.forEach((op) => {\r\n                // When pasting the html value is empty\r\n                resetAttributes.forEach((attribute) => {\r\n                    if (op.attributes) {\r\n                        delete op.attributes[attribute];\r\n                    }\r\n                });\r\n            });\r\n        }\r\n        return delta;\r\n    }\r\n}\r\n\r\nQuill.register('modules/clipboard', PlainClipboard, true);\r\n","import { Quill } from 'react-quill';\r\n\r\nimport 'components/Shared/Forms/RichTextEditor/Quill/Style';\r\nimport ColorPicker, { COLORS } from 'components/Shared/Forms/RichTextEditor/Quill/ColorPicker';\r\nimport FontPicker, { fillFontSelect } from 'components/Shared/Forms/RichTextEditor/Quill/FontPicker';\r\nimport FontSizePicker, { fillFontSizeSelect } from 'components/Shared/Forms/RichTextEditor/Quill/FontSizePicker';\r\nimport FontHeaderPicker, { FONT_HEADERS } from 'components/Shared/Forms/RichTextEditor/Quill/FontHeaderPicker';\r\nimport 'components/Shared/Forms/RichTextEditor/Quill/PlainClipboard';\r\n\r\nconst SnowTheme = Quill.import('themes/snow');\r\n\r\nclass SnazzyQuillTheme extends SnowTheme {\r\n    buildPickers(selects, icons) {\r\n        // 1. Create a custom picker\r\n        const customPickers = selects\r\n            .map((select) => {\r\n                if (select.classList.contains('ql-color')) {\r\n                    fillSelect(select, COLORS, '');\r\n                    return new ColorPicker(select, icons.color);\r\n                } else if (select.classList.contains('ql-font')) {\r\n                    fillFontSelect(select);\r\n                    return new FontPicker(select);\r\n                } else if (select.classList.contains('ql-size')) {\r\n                    fillFontSizeSelect(select);\r\n                    return new FontSizePicker(select);\r\n                } else if (select.classList.contains('ql-header')) {\r\n                    fillSelect(select, FONT_HEADERS);\r\n                    return new FontHeaderPicker(select);\r\n                }\r\n                return null;\r\n            })\r\n            .filter((x) => x != null);\r\n\r\n        // 2. Create the default pickers, excluding the custom ones\r\n        super.buildPickers(\r\n            selects.filter((select) => !customPickers.some((custom) => custom.select === select)),\r\n            icons\r\n        );\r\n\r\n        // 3. Splice the custom pickers into the default pickers\r\n        customPickers.forEach((custom) => {\r\n            const index = selects.findIndex((select) => custom.select === select);\r\n            if (index !== -1) {\r\n                this.pickers.splice(index, 0, custom);\r\n            }\r\n        });\r\n    }\r\n}\r\n\r\n// Defined in themes/base.js in quilljs\r\nconst fillSelect = (select, values, defaultValue = false) => {\r\n    values.forEach((value) => {\r\n        const option = document.createElement('option');\r\n        if (value === defaultValue) {\r\n            option.setAttribute('selected', 'selected');\r\n        } else {\r\n            option.setAttribute('value', value);\r\n        }\r\n        select.appendChild(option);\r\n    });\r\n};\r\n\r\nQuill.register({\r\n    'themes/snazzy': SnazzyQuillTheme,\r\n});\r\n","import React from 'react';\r\nimport { Field } from 'redux-form';\r\nimport ReactQuill from 'react-quill';\r\nimport { debounce } from 'throttle-debounce';\r\nimport styled from 'styled-components';\r\n\r\nimport { InputCSS } from 'components/Shared/Forms';\r\nimport 'components/Shared/Forms/RichTextEditor/Quill/Theme';\r\nimport { RichTextEditorOptions } from 'components/Shared/Forms/RichTextEditor/RichTextEditorConstants';\r\nimport { SCAFFOLDING, TRANSITION, TYPOGRAPHY, BUTTON_PRIMARY, INPUTS, SELECTS } from 'theme';\r\n\r\nconst Group = ({ children }) => <span className=\"ql-formats\">{children}</span>;\r\n\r\nconst Item = ({ name, title, multiple, children, ...otherProps }) => {\r\n    const Component = multiple ? 'select' : 'button';\r\n    return (\r\n        <Component className={`ql-${name}`} title={title} {...otherProps}>\r\n            {children}\r\n        </Component>\r\n    );\r\n};\r\n\r\nconst CustomToolbar = ({ className }) => (\r\n    <div className={`custom-toolbar ${className}`}>\r\n        <Group>\r\n            <Item name=\"header\" title=\"Header\" multiple />\r\n            <Item name=\"font\" title=\"Font\" multiple defaultValue=\"font-0\" />\r\n            <Item name=\"size\" title=\"Size\" multiple defaultValue=\"font-size-14\" />\r\n        </Group>\r\n        <Group>\r\n            <Item name=\"bold\" title=\"Bold\" />\r\n            <Item name=\"italic\" title=\"Italic\" />\r\n            <Item name=\"underline\" title=\"Underline \" />\r\n        </Group>\r\n        <Group>\r\n            <Item name=\"color\" title=\"Font Color\" multiple />\r\n            <Item name=\"link\" title=\"Link\" />\r\n            <Item name=\"list\" title=\"Ordered List\" value=\"ordered\" />\r\n            <Item name=\"list\" title=\"Bullet List\" value=\"bullet\" />\r\n        </Group>\r\n        <Group>\r\n            <Item name=\"align\" title=\"Text Alignment\" multiple />\r\n        </Group>\r\n        <Group>\r\n            <Item name=\"clean\" title=\"Clear Formatting\" />\r\n        </Group>\r\n    </div>\r\n);\r\n\r\nconst StyledRichTextEditor = styled.div`\r\n    display: flex;\r\n    flex-direction: column;\r\n    background-color: ${SCAFFOLDING.BG};\r\n    border-radius: ${SCAFFOLDING.BORDER_RADIUS};\r\n    box-shadow: ${SCAFFOLDING.BOX_SHADOW.BASE};\r\n`;\r\n\r\nconst StyledCustomToolbar = styled(CustomToolbar)`\r\n    &.ql-toolbar.ql-snow {\r\n        flex: 0 0 auto;\r\n        padding: 0 ${INPUTS.PADDING.X} ${INPUTS.PADDING.X};\r\n        border: 0;\r\n        color: ${TYPOGRAPHY.COLOR};\r\n        font-family: inherit;\r\n\r\n        .ql-formats {\r\n            margin-right: 0;\r\n            line-height: 1;\r\n        }\r\n\r\n        .ql-picker,\r\n        button {\r\n            width: auto;\r\n            height: 30px;\r\n            margin-top: ${INPUTS.PADDING.X};\r\n            margin-left: -1px;\r\n            float: none;\r\n            vertical-align: middle;\r\n        }\r\n\r\n        .ql-picker {\r\n            color: inherit;\r\n            font-weight: 400;\r\n\r\n            &.ql-header {\r\n                width: 7em;\r\n            }\r\n\r\n            &.ql-font {\r\n                width: 7em;\r\n            }\r\n\r\n            &.ql-size {\r\n                width: 5em;\r\n            }\r\n        }\r\n\r\n        .ql-picker-label {\r\n            padding: 0 ${INPUTS.PADDING.X};\r\n            border-top-right-radius: ${SCAFFOLDING.BORDER_RADIUS};\r\n            border-top-left-radius: ${SCAFFOLDING.BORDER_RADIUS};\r\n            line-height: 26px;\r\n            transition: color ${TRANSITION.LENGTH} ${TRANSITION.BEZIER};\r\n\r\n            &.ql-active {\r\n                color: inherit;\r\n            }\r\n\r\n            &:hover {\r\n                color: ${TYPOGRAPHY.LINK_COLOR.BASE};\r\n            }\r\n\r\n            svg {\r\n                right: 9px;\r\n            }\r\n\r\n            &::before {\r\n                display: inline-block;\r\n                width: 100%;\r\n                padding-right: 24px;\r\n                overflow: hidden;\r\n                white-space: nowrap;\r\n                text-overflow: ellipsis;\r\n                vertical-align: middle;\r\n            }\r\n\r\n            &::after {\r\n                content: '';\r\n                position: absolute;\r\n                display: block;\r\n                right: ${INPUTS.PADDING.X};\r\n                bottom: -1px;\r\n                left: ${INPUTS.PADDING.X};\r\n                border-bottom: 1px solid;\r\n                opacity: 0.25;\r\n            }\r\n        }\r\n\r\n        .ql-picker-options {\r\n            max-height: 25vh;\r\n            padding: 0;\r\n            overflow: auto;\r\n            border-bottom-left-radius: ${SELECTS.BORDER_RADIUS};\r\n            border-bottom-right-radius: ${SELECTS.BORDER_RADIUS};\r\n            box-shadow: ${SELECTS.MENU.BOX_SHADOW};\r\n        }\r\n\r\n        .ql-picker-item {\r\n            padding: ${SELECTS.OPTION.PADDING.Y} ${SELECTS.OPTION.PADDING.X};\r\n            line-height: ${TYPOGRAPHY.LINE_HEIGHT};\r\n            transition: background-color ${TRANSITION.LENGTH} ${TRANSITION.BEZIER};\r\n\r\n            &:hover,\r\n            &:focus {\r\n                background-color: ${SELECTS.OPTION.HOVER_BG};\r\n                color: inherit;\r\n            }\r\n\r\n            &.ql-selected {\r\n                background-color: ${SELECTS.OPTION.ACTIVE_BG};\r\n                color: ${SELECTS.OPTION.ACTIVE_COLOR};\r\n            }\r\n        }\r\n\r\n        .ql-color-picker,\r\n        .ql-icon-picker {\r\n            width: auto;\r\n\r\n            .ql-picker-label::after {\r\n                display: none;\r\n            }\r\n\r\n            svg {\r\n                width: 1.2em;\r\n                height: 1.2em;\r\n                vertical-align: middle;\r\n            }\r\n        }\r\n\r\n        .ql-color-picker {\r\n            .ql-picker-options {\r\n                width: 12em;\r\n                padding: ${SELECTS.OPTION.PADDING.X};\r\n                white-space: normal;\r\n            }\r\n\r\n            .ql-picker-item {\r\n                display: inline-block;\r\n                width: calc(${`${100 / 7}%`} - 4px);\r\n                height: 0;\r\n                padding: 0 0 calc(${`${100 / 7}%`} - 4px);\r\n                float: none;\r\n                border: 0;\r\n                transition: all ${TRANSITION.LENGTH} ${TRANSITION.BEZIER};\r\n\r\n                &:hover {\r\n                    position: relative;\r\n                    box-shadow: ${SCAFFOLDING.BOX_SHADOW.HOVER};\r\n                    transform: scale(1.2);\r\n                }\r\n            }\r\n        }\r\n\r\n        .ql-color-reset {\r\n            display: block;\r\n            margin: ${SELECTS.OPTION.PADDING.X} -${SELECTS.OPTION.PADDING.X} -${SELECTS.OPTION.PADDING.X};\r\n            padding: ${SELECTS.OPTION.PADDING.X} ${INPUTS.PADDING.X};\r\n            clear: both;\r\n            border-top: 1px solid ${INPUTS.BORDER.BASE};\r\n            cursor: pointer;\r\n            font-size: 0.9em;\r\n            line-height: ${TYPOGRAPHY.LINE_HEIGHT};\r\n            text-align: center;\r\n        }\r\n\r\n        button {\r\n            margin-left: -1px;\r\n            padding: 0 ${INPUTS.PADDING.X};\r\n            border: 1px solid transparent;\r\n            color: inherit;\r\n            transition: color ${TRANSITION.LENGTH} ${TRANSITION.BEZIER};\r\n\r\n            &:hover {\r\n                color: ${TYPOGRAPHY.LINK_COLOR.BASE};\r\n            }\r\n\r\n            svg {\r\n                width: 1.2em;\r\n                height: 1.2em;\r\n            }\r\n\r\n            &.ql-active {\r\n                background-color: #eee;\r\n                color: inherit;\r\n            }\r\n        }\r\n\r\n        .ql-stroke {\r\n            stroke: currentColor !important;\r\n        }\r\n\r\n        .ql-fill {\r\n            fill: currentColor !important;\r\n        }\r\n    }\r\n`;\r\n\r\n// Always work in deltas rather than html\r\nclass CustomReactQuill extends ReactQuill {\r\n    setEditorContents = (editor, value) => {\r\n        const sel = editor.getSelection();\r\n        if (typeof value === 'string') {\r\n            editor.clipboard.dangerouslyPasteHTML(value || '');\r\n        } else if (value.delta) {\r\n            editor.setContents(value.delta);\r\n        }\r\n        if (sel) this.setEditorSelection(editor, sel);\r\n    };\r\n}\r\n\r\nconst StyledReactQuill = styled(CustomReactQuill)`\r\n    border-top: 1px solid ${INPUTS.BORDER.BASE};\r\n    border-bottom-left-radius: ${SCAFFOLDING.BORDER_RADIUS};\r\n    border-bottom-right-radius: ${SCAFFOLDING.BORDER_RADIUS};\r\n\r\n    .ql-container {\r\n        font-family: ${RichTextEditorOptions.DefaultFontFamily};\r\n        font-size: ${RichTextEditorOptions.DefaultFontSize};\r\n\r\n        &.ql-snow {\r\n            border: 0;\r\n        }\r\n    }\r\n\r\n    .ql-snow .ql-editor {\r\n        height: 40vh;\r\n        min-height: 20em;\r\n        padding: ${`${parseFloat(INPUTS.PADDING.X) * 2}em`};\r\n    }\r\n\r\n    .ql-snow .ql-tooltip {\r\n        padding: ${INPUTS.PADDING.X} ${`${parseFloat(INPUTS.PADDING.X) * 2}em`};\r\n        border: 0;\r\n        border-radius: ${SCAFFOLDING.BORDER_RADIUS};\r\n        box-shadow: ${SCAFFOLDING.BOX_SHADOW.HOVER};\r\n\r\n        &:before {\r\n            content: 'URL:';\r\n        }\r\n\r\n        &.ql-editing {\r\n            input[type='text'] {\r\n                ${InputCSS}\r\n                display: inline-block;\r\n                width: 15em;\r\n                border-top-right-radius: 0;\r\n                border-bottom-right-radius: 0;\r\n            }\r\n\r\n            a.ql-action {\r\n                display: inline-block;\r\n                margin-left: 0;\r\n                padding-left: ${BUTTON_PRIMARY.PADDING.X};\r\n                padding-right: ${BUTTON_PRIMARY.PADDING.X};\r\n                background-color: ${BUTTON_PRIMARY.BG.BASE};\r\n                border-top-right-radius: ${BUTTON_PRIMARY.BORDER_RADIUS};\r\n                border-bottom-right-radius: ${BUTTON_PRIMARY.BORDER_RADIUS};\r\n                box-shadow: ${BUTTON_PRIMARY.BOX_SHADOW.BASE};\r\n                color: ${BUTTON_PRIMARY.COLOR.BASE};\r\n                line-height: ${INPUTS.HEIGHT};\r\n                vertical-align: middle;\r\n                transition: ${BUTTON_PRIMARY.TRANSITION};\r\n\r\n                &:hover,\r\n                &:focus {\r\n                    background-color: ${BUTTON_PRIMARY.BG.HOVER};\r\n                    color: ${BUTTON_PRIMARY.COLOR.HOVER};\r\n                    box-shadow: ${BUTTON_PRIMARY.BOX_SHADOW.HOVER};\r\n                    text-decoration: none;\r\n                }\r\n\r\n                &:active {\r\n                    box-shadow: ${BUTTON_PRIMARY.BOX_SHADOW.ACTIVE};\r\n                }\r\n            }\r\n        }\r\n\r\n        a.ql-action::after,\r\n        a.ql-remove::before {\r\n            margin: 0;\r\n            padding: 0;\r\n            border: 0;\r\n        }\r\n\r\n        a {\r\n            flex: 0 0 auto;\r\n            color: ${TYPOGRAPHY.LINK_COLOR.BASE};\r\n            line-height: ${INPUTS.HEIGHT};\r\n            transition: color ${TRANSITION.LENGTH} ${TRANSITION.BEZIER};\r\n\r\n            &:hover,\r\n            &:focus {\r\n                color: ${TYPOGRAPHY.LINK_COLOR.HOVER};\r\n                text-decoration: underline;\r\n            }\r\n        }\r\n\r\n        a.ql-preview {\r\n            flex: 1 1 auto;\r\n            max-width: none;\r\n            font-style: italic;\r\n            text-decoration: underline;\r\n        }\r\n\r\n        a.ql-action {\r\n            margin-left: ${`${parseFloat(INPUTS.PADDING.X) * 2}em`};\r\n        }\r\n\r\n        a.ql-remove {\r\n            position: relative;\r\n            margin-left: ${`${parseFloat(INPUTS.PADDING.X) * 2}em`};\r\n\r\n            &::after {\r\n                content: '';\r\n                display: inline-block;\r\n                position: absolute;\r\n                top: 50%;\r\n                left: -${INPUTS.PADDING.X};\r\n                height: 1em;\r\n                margin-top: -0.5em;\r\n                border-left: 1px solid ${INPUTS.BORDER.BASE};\r\n                vertical-align: middle;\r\n                pointer-events: none;\r\n            }\r\n        }\r\n    }\r\n`;\r\n\r\nclass RichTextEditorWrapper extends React.Component {\r\n    constructor(props) {\r\n        super(props);\r\n        this.handleOnChange = debounce(250, (value, delta, source, editor) => {\r\n            // Trim out base64 images pasted into the text editor so they don't clog up the database.\r\n            var base64ImageRegex = /data:image\\/[a-zA-Z]+;base64,[^\"]*?/gi;\r\n\r\n            let trimmedValue = value;\r\n            try {\r\n                trimmedValue = trimmedValue.replace(base64ImageRegex, '');\r\n            } catch (err) {}\r\n\r\n            let trimmedDelta = editor.getContents();\r\n            try {\r\n                if (trimmedDelta && trimmedDelta.ops) {\r\n                    for (var i = 0; i < trimmedDelta.ops.length; i++) {\r\n                        var op = trimmedDelta.ops[i];\r\n                        if (op && op.insert && op.insert.image && base64ImageRegex.test(op.insert.image)) {\r\n                            trimmedDelta.ops.splice(i, 1);\r\n                        }\r\n                    }\r\n                }\r\n            } catch (err) {}\r\n\r\n            this.props.input.onChange({\r\n                html: trimmedValue === '<p><br></p>' ? null : trimmedValue,\r\n                delta: trimmedDelta,\r\n            });\r\n        }).bind(this);\r\n    }\r\n\r\n    render() {\r\n        const { fontColor, backgroundColor } = this.props;\r\n        return (\r\n            <StyledRichTextEditor>\r\n                <StyledCustomToolbar />\r\n                <StyledReactQuill\r\n                    theme=\"snazzy\"\r\n                    value={this.props.input.value}\r\n                    placeholder={this.props.placeholder}\r\n                    onChange={this.handleOnChange}\r\n                    modules={{\r\n                        toolbar: '.custom-toolbar',\r\n                    }}\r\n                    style={{\r\n                        color: fontColor,\r\n                        backgroundColor,\r\n                    }}\r\n                />\r\n            </StyledRichTextEditor>\r\n        );\r\n    }\r\n}\r\n\r\nconst QuillRichTextEditorField = (props) => <Field component={RichTextEditorWrapper} {...props} />;\r\n\r\nexport default QuillRichTextEditorField;\r\n"],"sourceRoot":""}