{"version":3,"sources":["webpack:///./node_modules/preact/dist/preact.module.js","webpack:///./app/javascript/common-prop-types/default-children-prop-types.js","webpack:///./app/javascript/Snackbar/index.js","webpack:///./app/javascript/utilities/dropdownUtils.js","webpack:///./app/javascript/utilities/viewport.js","webpack:///./app/javascript/utilities/debounceAction.js","webpack:///./app/javascript/shared/components/useKeyboardShortcuts.js","webpack:///./app/javascript/packs/validateFileInputs.js","webpack:///./app/javascript/utilities/getUserDataAndCsrfToken.js","webpack:///./app/javascript/Snackbar/SnackbarItem.jsx","webpack:///./node_modules/ahoy.js/dist/ahoy.esm.js","webpack:///./node_modules/moment/locale sync ^\\.\\/.*$","webpack:///./app/javascript/shared/components/focusTrap.jsx","webpack:///./app/javascript/utilities/showModal.jsx","webpack:///./app/javascript/crayons/Modal/Modal.jsx","webpack:///./app/javascript/article-form/actions.js","webpack:///./app/javascript/utilities/gist.js","webpack:///./app/javascript/common-prop-types/article-prop-types.js","webpack:///./app/javascript/Snackbar/Snackbar.jsx","webpack:///./app/javascript/utilities/billboardDropdown.jsx","webpack:///./app/javascript/utilities/ahoy/trackEvents.jsx","webpack:///./app/javascript/shared/components/defaultSelectionTemplate.jsx","webpack:///./app/javascript/crayons/MultiSelectAutocomplete/MultiSelectAutocomplete.jsx","webpack:///./app/javascript/crayons/Button/index.js","webpack:///./app/javascript/crayons/Buttons/Button.jsx","webpack:///./app/javascript/crayons/Links/Link.jsx","webpack:///./app/javascript/crayons/CTAs/CTA.jsx","webpack:///./app/javascript/crayons/ButtonGroup/ButtonGroup.jsx","webpack:///./app/javascript/crayons/Dropdown/Dropdown.jsx","webpack:///./app/javascript/crayons/formElements/FormField/FormField.jsx","webpack:///./app/javascript/crayons/formElements/RadioButton/RadioButton.jsx","webpack:///./app/javascript/crayons/formElements/ColorPicker/ColorPicker.jsx","webpack:///./app/javascript/crayons/formElements/Toggles/Toggle.jsx","webpack:///./app/javascript/crayons/formElements/DateRangePicker/dateRangeUtils.js","webpack:///./app/javascript/crayons/formElements/DateRangePicker/DateRangePicker.jsx","webpack:///./app/javascript/crayons/Icons/Icon.jsx","webpack:///./app/javascript/crayons/MobileDrawer/MobileDrawer.jsx","webpack:///./app/javascript/crayons/MarkdownToolbar/markdownSyntaxFormatters.jsx","webpack:///./app/javascript/crayons/MarkdownToolbar/MarkdownToolbar.jsx","webpack:///./app/javascript/crayons/Spinner/Spinner.jsx","webpack:///./app/javascript/crayons/Button/Button.jsx","webpack:///./app/javascript/crayons/AutocompleteTriggerTextArea/UserListItemContent.jsx","webpack:///./app/javascript/crayons/AutocompleteTriggerTextArea/AutocompleteTriggerTextArea.jsx","webpack:///./app/javascript/article-form/components/ClipboardButton.jsx","webpack:///./app/javascript/article-form/components/ImageUploader.jsx","webpack:///./app/javascript/utilities/calculateTextAreaHeight.js","webpack:///./app/javascript/utilities/textAreaUtils.js","webpack:///./app/javascript/utilities/codeFullscreenModeSwitcher.js","webpack:///./app/javascript/common-prop-types/user-prop-types.js","webpack:///./app/javascript/common-prop-types/selected-tags-prop-types.js","webpack:///./app/javascript/liquidTags/userSubscriptionLiquidTag.js","webpack:///./app/javascript/packs/articlePage.jsx","webpack:///./app/javascript/utilities/runtime.js","webpack:///./app/javascript/shared/components/useMediaQuery.js"],"names":["n","l","u","t","i","o","r","f","e","c","s","a","v","Array","isArray","h","p","parentNode","removeChild","y","arguments","length","children","call","defaultProps","d","type","props","key","ref","__k","__","__b","__e","__d","__c","__h","constructor","__v","vnode","_","current","k","b","this","context","g","indexOf","m","base","w","push","x","__r","debounceRendering","sort","shift","__P","z","__n","ownerSVGElement","L","P","C","D","H","I","T","j","A","N","nextSibling","S","$","O","some","insertBefore","setProperty","test","style","cssText","replace","toLowerCase","slice","Date","now","addEventListener","removeEventListener","removeAttribute","setAttribute","event","contextType","value","__E","prototype","render","q","sub","state","_sb","__s","getDerivedStateFromProps","componentWillMount","componentDidMount","componentWillReceiveProps","shouldComponentUpdate","forEach","componentWillUpdate","componentDidUpdate","getChildContext","getSnapshotBeforeUpdate","M","diffed","localName","nodeType","document","createTextNode","createElementNS","createElement","is","data","childNodes","dangerouslySetInnerHTML","attributes","name","__html","innerHTML","checked","unmount","componentWillUnmount","B","firstChild","E","F","G","Consumer","Provider","splice","getDerivedStateFromError","setState","componentDidCatch","forceUpdate","Promise","then","bind","resolve","setTimeout","defaultChildrenPropTypes","PropTypes","oneOfType","arrayOf","node","object","getDropdownRepositionListener","debounceAction","handleDropdownRepositions","_step","_iterator","_createForOfIteratorHelper","querySelectorAll","done","element","classList","remove","isDropdownCurrentlyOpen","display","opacity","isInViewport","add","removeProperty","err","INTERACTIVE_ELEMENTS_QUERY","openDropdown","_ref","_dropdownContent$quer","triggerElementId","dropdownContentId","dropdownContent","getElementById","querySelector","focus","closeDropdown","_ref2","_document$getElementB","onClose","initializeDropdown","_ref3","dropdownContentCloseButtonId","onOpen","triggerButton","_document$getElementB3","keyUpListener","_ref4","getAttribute","onCloseCleanupActions","contains","activeElement","clickOutsideListener","_ref5","target","matches","_document$getElementB2","_document$getElementB4","_ref$offsetTop","offsetTop","_ref$allowPartialVisi","allowPartialVisibility","boundingRect","getBoundingClientRect","clientHeight","window","innerHeight","documentElement","clientWidth","innerWidth","topIsInViewport","top","rightIsInViewport","right","bottomIsInViewport","bottom","leftIsInViewport","left","topIsOutOfViewport","bottomIsOutOfViewport","action","undefined","_ref$time","time","_ref$config","config","leading","configs","_objectSpread","debounce","isFormField","HTMLElement","nodeName","isContentEditable","callShortcut","keys","chain","shortcuts","shortcut","concat","join","code","_toConsumableArray","defaultOptions","timeout","useKeyboardShortcuts","eventTarget","options","_useState","useState","_useState2","_slicedToArray","storedShortcuts","_useState3","_useState4","keyChain","setKeyChain","_useState5","_useState6","mergedOptions","setMergedOptions","useEffect","newOptions","clearTimeout","Object","keyEvent","defaultPrevented","ctrlKeyEntry","ctrlKey","cmdKeyEntry","metaKey","altKeyEntry","altKey","shiftKeyEntry","shiftKey","Node","newChain","KeyboardShortcuts","propTypes","isRequired","shape","number","instanceOf","Element","Window","MAX_FILE_SIZE_MB","freeze","image","video","PERMITTED_FILE_TYPES","addErrorMessage","msg","addSnackbarItem","message","addCloseButton","validateFileSize","file","fileType","fileInput","maxFileSizeMb","dataset","fileSizeErrorHandler","fileSizeMb","size","toFixed","isValidFileSize","Number","errorMessage","handleFileSizeError","validateFileType","permittedFileTypes","JSON","parse","fileTypeErrorHandler","isValidFileType","includes","fileTypeBracketed","handleFileTypeError","validateFileNameLength","maxFileNameLength","fileNameLengthErrorHandler","isValidFileNameLength","handleFileNameLengthError","validateFileInput","isValidFileInput","files","from","split","validateFileInputs","validFileInputs","fileInputs","getWaitOnUserDataHandler","reject","_ref$safe","safe","_ref$waitTime","waitTime","totalTimeWaiting","waitingOnUserData","user","csrfToken","Error","content","body","currentUser","getUserDataAndCsrfTokenSafely","getUserDataAndCsrfToken","snackbarItemProps","actions","string","handler","func","lifespan","SnackbarItem","_ref$actions","className","role","map","text","Button","variant","inverted","onClick","displayName","Cookies","ttl","domain","expires","cookieDomain","date","setTime","getTime","toGMTString","cookie","escape","nameEQ","ca","charAt","substring","unescape","urlPrefix","visitsUrl","eventsUrl","page","platform","useBeacon","startOnReady","trackVisits","cookies","headers","visitParams","withCredentials","visitDuration","visitorDuration","ahoy","Ahoy","configure","hasOwnProperty","visitId","visitorId","track","callback","jQuery","Zepto","isReady","queue","canStringify","eventQueue","canTrackNow","trackNow","obj","navigator","setCookie","getCookie","destroyCookie","log","console","setReady","matchesSelector","selector","mozMatchesSelector","msMatchesSelector","oMatchesSelector","webkitMatchesSelector","apply","parentElement","onEvent","eventName","matchedElement","skip","getClosest","generateId","Math","random","toString","saveEventQueue","stringify","meta","CSRFProtection","xhr","token","setRequestHeader","sendRequest","url","success","ajax","contentType","dataType","beforeSend","xhrFields","XMLHttpRequest","header","open","onload","status","send","eventData","events","visit_token","visitor_token","trackEvent","ready","id","trackEventNow","param","events_json","sendBeacon","FormData","append","serialize","location","pathname","presence","str","eventProperties","cleanObject","tag","tagName","section","attribute","hasAttribute","createVisit","getVisitId","getVisitorId","landing_page","href","screen_width","screen","width","screen_height","height","js","referrer","getVisitToken","getVisitorToken","reset","debug","enabled","properties","trackView","additionalProperties","title","propName","trackClicks","textContent","innerText","trim","trackSubmits","trackChanges","start","readyState","webpackContext","req","webpackContextResolve","__webpack_require__","module","exports","FocusTrap","onDeactivate","_ref$clickOutsideDeac","clickOutsideDeactivates","_ref$document","focusTrap","useRef","deactivate","useCallback","useLayoutEffect","currentLocationHref","routeChangeObserver","MutationObserver","mutations","_focusTrap$current","disconnect","createFocusTrap","escapeDeactivates","activate","observe","childList","Fragment","preactImport","modalImports","WINDOW_MODAL_ID","getPreactImport","showWindowModal","_asyncToGenerator","_document$querySelect","modalContent","contentSelector","modalProps","_objectWithoutProperties","_excluded","_yield$getModalImport2","all","Modal","_yield$getModalImport3","currentModalContainer","appendChild","_extends","focusTrapSelector","_x","closeWindowModal","_yield$getPreactImpor","CloseIcon","viewBox","xmlns","_classNames","prompt","sheet","centered","noBackdrop","_ref$showHeader","showHeader","_ref$sheetAlign","sheetAlign","_ref$backdropDismissi","backdropDismissible","_ref$allowOverflow","allowOverflow","_ref$onClose","_ref$focusTrapSelecto","classes","classNames","_defineProperty","class","icon","backdrop","bool","oneOf","previewArticle","payload","successCb","failureCb","fetch","method","Accept","article_body","credentials","response","json","processPayload","previewShowing","helpShowing","previewResponse","helpHTML","imageManagementShowing","moreConfigShowing","errors","submitArticle","onSuccess","onError","article","current_state_path","generateUploadFormdata","formData","entries","generateMainImage","signal","error","links","processImageUpload","images","handleImageUploading","handleImageSuccess","handleImageFailure","postscribeImport","getPostScribe","_getPostScribe","postscribe","getGistTags","nodes","gistNodes","loadEmbeddedGists","gistTags","_step2","_iterator2","_loop","gistTag","gistWrapper","firstElementChild","outerHTML","beforeWrite","childElementCount","watchForGistTagInsertion","targetNode","observer","mutationsList","_step3","_iterator3","addedNodes","subtree","InstantClick","on","embedGists","_embedGists","articleSnippetResultPropTypes","body_text","articlePropTypes","path","cloudinary_video_url","video_duration_in_minutes","type_of","class_name","flare_tag","bg_color_hex","text_color_hex","tag_list","cached_tag_list_array","podcast","slug","image_url","user_id","username","organization","profile_image_90","highlight","public_reactions_count","reactions_count","comments_count","reading_time","snackbarItems","snackbarItem","Snackbar","_Component","_inherits","_super","_createSuper","_this","_classCallCheck","_len","args","_key","snacks","pollingId","paused","pauseLifespan","resumeLifespan","initializePolling","_this2","_event","stopPropagation","_this3","_this$props","pollingTime","setInterval","newSnacks","updateSnackbarItems","snack","lifespanTimeoutId","decreaseLifespan","prevState","filter","potentialSnackToFilterOut","updatedSnacks","_this4","currentSnack","_this5","index","_ref2$actions","Component","setupBillboardDropdown","sponsorshipDropdownButtons","sponsorshipDropdownButton","closest","overflowY","amendBillboardStyle","initialized","trackCommentClicks","elementId","_relevantNode$dataset","relevantNode","getTrackingNode","trackingName","trackCreateAccountClicks","_relevantNode$dataset2","version","source","trackingSource","trackingElement","Close","DefaultSelectionTemplate","_ref$enableValidation","enableValidation","_ref$valid","valid","_ref$buttonVariant","buttonVariant","_ref$className","onEdit","onDeselect","React","Icon","src","KEYS","ALLOWED_CHARS_REGEX","reducer","_action$payload$sugge","selectedItems","suggestions","activeDescendentIndex","editValue","inputPosition","ignoreBlur","showMaxSelectionsReached","MultiSelectAutocomplete","_inputRef$current5","labelText","_ref$showLabel","showLabel","fetchSuggestions","_ref$defaultValue","defaultValue","_ref$staticSuggestion","staticSuggestions","staticSuggestionsHeading","_ref$border","border","_ref$placeholder","placeholder","inputId","maxSelections","onSelectionsChanged","onFocus","_ref$allowUserDefined","allowUserDefinedSelections","SuggestionTemplate","_ref$SelectionTemplat","SelectionTemplate","_useReducer2","useReducer","dispatch","inputRef","inputSizerRef","selectedItemsRef","popoverRef","allowSelections","input","resizeInputToContentSize","cursorPosition","setSelectionRange","changeEvent","Event","dispatchEvent","popover","activeItem","offsetHeight","popoverOffsetHeight","scrollTop","isBelow","scrollTo","selectByText","textValue","_ref2$nextInputValue","nextInputValue","_ref2$keepSelecting","keepSelecting","matchingSuggestion","find","suggestion","selectItem","selectedItem","enterEditState","editItem","editItemIndex","deselectItem","exitEditState","_inputRef$current","_ref3$nextInputValue","_ref3$keepSelecting","handleInputChange","results","item","clearInput","editPreviousSelectionIfExists","nextEditIndex","_ref7","_ref7$nextInputValue","_ref7$keepSelecting","_ref6","_ref6$currentSelectio","currentSelections","insertIndex","newSelections","listItem","selection","deselectedItem","selectionNode","allSelectedItemElements","defaultPosition","position","order","selectionsPlaceholder","inputPlaceholder","_inputRef$current4","autocomplete","onChange","onKeyDown","_inputRef$current3","selectionStart","currentValue","preventDefault","onBlur","_inputRef$current2","suggestionDisplayName","onMouseDown","optionPropType","ButtonNew","_props$variant","rounded","destructive","_props$type","tooltip","onKeyUp","otherProps","suppressTooltip","setSuppressTooltip","focusable","elementType","Link","_props$href","block","CTA","ButtonGroup","Dropdown","triggerButtonId","_ref$onOpen","restOfProps","isInitialized","setIsInitialized","FormField","RadioButton","ColorPicker","buttonLabelText","inputProps","color","setColor","buttonId","popoverId","backgroundColor","HexColorInput","fullHexCode","hex","handleBlur","prefixed","HexColorPicker","Toggle","_objectDestructuringEmpty","MONTH_UNTIL_TODAY","QUARTER_UNTIL_TODAY","YEAR_UNTIL_TODAY","LAST_FULL_MONTH","LAST_FULL_QUARTER","LAST_FULL_YEAR","ALL_PRESET_RANGES","RANGE_LABELS","PERIODS","getPeriodUntilToday","today","period","clone","startOf","end","getLastFullPeriod","subtract","endOf","getDateRangeStartAndEndDates","dateRangeName","ChevronLeft","fill","ChevronRight","Calendar","PICKER_PHRASES","defaultPhrases","chooseAvailableStartDate","chooseAvailableEndDate","focusStartDate","invalidDateFormat","format","errorPrefix","dateTooLate","latestDate","dateTooEarly","earliestDate","MONTH_NAMES","toLocaleString","month","MonthYearPicker","earliestMoment","latestMoment","onMonthSelect","onYearSelect","selectedMonth","selectedYear","year","latestMonthIndex","availableMonths","yearsDiff","diff","years","PresetDateRangeOptions","_ref5$presetRanges","presetRanges","onPresetSelected","presetsWithinPermittedDates","_getDateRangeStartAnd","rangeStart","rangeEnd","isSameOrBefore","isSameOrAfter","rangeName","DateRangePicker","_ref8","startDateId","endDateId","defaultStartDate","defaultEndDate","_ref8$maxEndDate","maxEndDate","_ref8$minStartDate","minStartDate","onDatesChanged","_ref8$presetRanges","startDateAriaLabel","endDateAriaLabel","_ref8$todaysDate","todaysDate","_useState10","START_DATE","focusedInput","setFocusedInput","_useState12","moment","startMoment","setStartMoment","_useState14","endMoment","setEndMoment","dateFormat","getCurrentLocale","useCompactLayout","useMediaQuery","BREAKPOINTS","Medium","_useDateRangeValidati","startDateInput","setStartDateInput","endDateInput","setEndDateInput","startDateError","setStartDateError","_useState8","endDateError","setEndDateError","setError","inputType","valueMoment","isValid","isBefore","isAfter","handleStartBlur","handleEndBlur","useDateRangeValidation","ReactDateRangePicker","startDate","endDate","startDatePlaceholderText","endDatePlaceholderText","displayFormat","navPrev","tabindex","navNext","minDate","maxDate","initialVisibleMonth","relevantDate","isMonthSameAsLatestMonth","customInputIcon","showDefaultInputIcon","inputIconPosition","ICON_BEFORE_POSITION","orientation","VERTICAL_ORIENTATION","HORIZONTAL_ORIENTATION","showClearDates","customArrowIcon","phrases","onFocusChange","isOutsideRange","isBetween","isDateOutsideOfRange","onDatesChange","_ref9","toDate","small","renderMonthElement","renderCalendarInfo","_ref10","maxStartDate","InternalIcon","native","MobileDrawer","BoldIcon","ItalicIcon","LinkIcon","OrderedListIcon","UnorderedListIcon","HeadingIcon","QuoteIcon","CodeIcon","CodeBlockIcon","EmbedIcon","UnderlineIcon","StrikethroughIcon","DividerIcon","clipRule","fillRule","ORDERED_LIST_ITEM_REGEX","MARKDOWN_LINK_REGEX","URL_PLACEHOLDER_TEXT","getNewLinePrefixSuffixes","selectionEnd","numberOfNewLinesBeforeSelection","getNumberOfNewLinesPrecedingSelection","numberOfNewLinesFollowingSelection","getNumberOfNewLinesFollowingSelection","numberOfNewLinesNeededAtStart","newLinesPrefix","String","padStart","newLinesSuffix","undoOrAddFormattingForInlineSyntax","prefix","suffix","prefixLength","suffixLength","_getSelectionData","getSelectionData","selectedText","textBeforeSelection","textAfterSelection","editSelectionStart","editSelectionEnd","replaceSelectionWith","newCursorStart","newCursorEnd","undoOrAddFormattingForMultilineSyntax","linePrefix","blockPrefix","blockSuffix","_getSelectionData2","formattedText","lastNewLine","getLastIndexOfCharacter","selectionIndex","character","lineStart","splitByNewLine","line","every","unformattedText","_getNewLinePrefixSuff","newLinePrefixLength","cursorStartBaseline","cursorStartBlockPrefixOffset","cursorStartLinePrefixOffset","markdownSyntaxFormatters","bold","label","getKeyboardShortcut","modifier","getOSKeyboardModifierKeyString","command","tooltipHint","toUpperCase","getFormatting","italic","link","startingText","_getSelectionData3","basicFormattingForEmptySelection","indexOfLinkStructureEnd","getNextIndexOfCharacter","breakOnCharacters","urlText","handleLinkFormattingForEmptyTextSelection","startsWith","basicFormattingForLinkSelection","indexOfSyntaxOpen","textToReplaceMarkdown","handleLinkFormattingForUrlSelection","match","linkDescriptionEnd","linkText","handleUndoMarkdownLinkSelection","orderedList","_ref11","_getSelectionData4","_getNewLinePrefixSuff2","newLineSuffixLength","newText","indexOfFullStop","formattedList","textChunk","unorderedList","_ref12","heading","_ref13","currentLineSelectionStart","indexOfFirstLineCharacter","currentHeadingIndex","_getNewLinePrefixSuff3","adjustingHeading","cursorOffset","quote","_ref14","_ref15","codeBlock","_ref16","embed","_ref17","underline","_ref18","strikethrough","_ref19","divider","_ref20","OverflowIcon","UPLOADING_IMAGE_PLACEHOLDER","MAX_CORE_FORMATTERS_BY_SCREEN_SIZE","MarkdownToolbar","textAreaId","_ref2$additionalSecon","additionalSecondaryToolbarElements","textAreaRef","overflowMenuOpen","setOverflowMenuOpen","storedCursorPosition","setStoredCursorPosition","smallScreen","largeScreen","Large","ExtraLarge","overflowMenuRows","additionalSecondaryItems","SecondaryItem","cloneElement","handleToolbarButtonKeyPress","keyboardShortcuts","fromEntries","syntaxName","insertSyntax","clickOutsideHandler","escapePressHandler","getElementsByClassName","isSmallScreen","isLargeScreen","nextButton","sibling","nextElementSibling","getNextMatchingSibling","previousButton","previousElementSibling","getPreviousMatchingSibling","firstButton","allButtons","lastButton","textArea","_markdownSyntaxFormat2","contentEditable","preventScroll","execCommand","_unused","textAreaValue","getNewTextAreaValueWithEdits","handleImageUploadEnd","imageMarkdown","currentTextAreaValue","indexOfPlaceholder","newTextValue","differenceInLength","numberOfCoreFormatters","coreSyntaxFormatters","secondarySyntaxFormatters","secondaryFormatterButtons","controlName","_secondarySyntaxForma","_coreSyntaxFormatters","ImageUploader","editorVersion","onImageUploadStart","textWithPlaceholder","newCursorPosition","onImageUploadSuccess","onImageUploadError","buttonProps","_textAreaRef$current","Spinner","getAdditionalClassNames","disabled","additionalClassNames","buttonType","onMouseOver","onMouseOut","tabIndex","ComponentName","UserListItemContent","alt","isComboboxMode","dropdownPositionPoints","suppressPopover","emptyStateMessage","AutocompleteTriggerTextArea","forwardRef","forwardedRef","triggerCharacter","_ref2$autoResize","autoResize","searchInstructionsMessage","maxSuggestions","replaceElement","Small","wrapperRef","_useTextAreaAutoResiz","useTextAreaAutoResize","setTextArea","setAdditionalElements","scrollIntoView","originalTextArea","newTextArea","enhancedTextArea","defaultView","getComputedStyle","attributeKey","transition","refs","selectSuggestion","currentInput","indexOfSearchStart","getAutocompleteWordData","indexOfAutocompleteStart","currentSearchTerm","newTextAreaValue","comboboxProps","_getAutocompleteWordD","isSearching","isTriggered","searchTermStartPosition","searchTerm","_getCursorXY","getCursorXY","selectionPoint","cursorX","textAreaX","offsetLeft","createPortal","CopyIcon","ClipboardButton","imageLinks","onCopy","imageUrls","_ref$showCopyMessage","showCopyMessage","readOnly","imageLink","ImageIcon","CancelIcon","SpinnerOrCancel","imageUploaderReducer","uploadErrorMessage","uploadingImage","insertionImageUrls","initNativeImagePicker","_window$ForemMobile","ForemMobile","injectNativeMessage","NativeIosV1ImageUpload","V2EditorImageUpload","handleInsertionImageUpload","useNativeUpload","handleNativeMessage","abortRequestController","setAbortRequestController","actionTooltip","controller","AbortController","accept","abort","_buttonProps$onClick","click","V1EditorImageUpload","showCopiedImageText","setShowCopiedImageText","multiple","imageMarkdownInput","copyToClipboard","Honeybadger","notify","_ref4$editorVersion","_ref4$buttonProps","onUploadError","abortSignal","handleInsertImageUploadSuccess","detail","namespace","isNativeIOS","hiddenTextarea","SIZING_STYLE","calculateNodeStyling","boxSizing","getPropertyValue","paddingSize","parseFloat","borderSize","sizingStyle","_ref$relativeToElemen","relativeToElement","bodyRect","elementRect","inputY","inputX","scrollLeft","div","copyStyle","_i","_Object$values","values","property","inputValue","substr","span","spanX","spanY","valueBeforeKeystroke","_ref3$breakOnCharacte","currentCharacter","previousCharacter","_ref4$breakOnCharacte","nextCharacter","count","searchIndex","constrainToContentHeight","setConstrainToContentHeight","additionalElements","resizeTextArea","allElements","allContentHeights","uiTextNode","_calculateNodeStyling","baseHeight","scrollHeight","calculateTextAreaHeight","max","newHeight","resizeCallback","resizeObserver","ResizeObserver","isFullScreenModeCodeOn","screenScroll","fullScreenWindow","onPressEscape","fullScreenModeControl","listenToKeyboardForEscape","listen","onPopstate","listenToWindowForPopstate","toggleOverflowForDocument","overflow","addFullScreenModeControl","elements","currentTarget","cloneNode","codeBlockControls","removeFullScreenModeControl","scrollY","userPropTypes","profile_image_url","summary","selectedTagsPropTypes","tags","onKeyPress","toggleSubscribeActionUI","tagContainer","_ref$showSubscribeAct","showSubscribeAction","_ref$appleAuth","appleAuth","signedInUI","appleAuthUI","toggleSignedOutUI","showSignedOutUI","signedOutUI","updateProfileImagesUI","signedIn","profileImagesContainer","initSignedOutState","initSignedInState","showConfirmSubscribeModal","confirmSubscribe","_step4","_iterator4","toggleSignedInInstructionsUI","clearNotices","toggleSubmitButtonsState","articleId","subscriber","userData","user_subscription","source_type","source_id","subscriber_email","email","getCsrfToken","sendFetch","res","submitSubscription","allSubscriptionLiquidTags","showSubscribedNotices","updateNotices","submit","notice","isVisible","_step5","_iterator5","instructions","fetchSubscriptionStatus","params","URLSearchParams","ok","statusText","authorUsername","populateSubscriberProfileImage","profileImageSrc","profileImage","_initializeUserSubscriptionLiquidTagContent","allUserSubLiquidTags","userStatus","_step7","isSubscriberAuthedWithApple","apple_auth","_iterator7","isSubscribed","is_subscribed","_step8","_iterator8","_step6","_iterator6","animatedImages","initializePausableAnimatedImages","fullscreenActionElements","snackZone","multiReactionDrawerTrigger","shareDropdownButton","isNativeAndroid","AndroidBridge","shareText","hidden","postUrlValue","_document$body$datase","_document$body$datase2","root","isLoggedIn","_yield$import","getCommentSubscriptionStatus","setCommentSubscriptionStatus","CommentSubscription","subscriptionType","subscriptionRequestHandler","positionType","onSubscribe","onUnsubscribe","initializeUserSubscriptionLiquidTagContent","hash","FocusEvent","focusOnComments","currentContext","currentMedium","currentOS","userAgent","nativeCheck","webkit","messageHandlers","namespaceCheck","clipboard","writeText","hasOSSpecificModifier","KeyboardEvent","language","query","mediaQuery","matchMedia","setMatch","addListener","removeListener"],"mappings":"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","file":"js/articlePage-652e3cd58709d736767d.chunk.js","sourcesContent":["var n,l,u,t,i,o,r,f,e,c={},s=[],a=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,v=Array.isArray;function h(n,l){for(var u in l)n[u]=l[u];return n}function p(n){var l=n.parentNode;l&&l.removeChild(n)}function y(l,u,t){var i,o,r,f={};for(r in u)\"key\"==r?i=u[r]:\"ref\"==r?o=u[r]:f[r]=u[r];if(arguments.length>2&&(f.children=arguments.length>3?n.call(arguments,2):t),\"function\"==typeof l&&null!=l.defaultProps)for(r in l.defaultProps)void 0===f[r]&&(f[r]=l.defaultProps[r]);return d(l,f,i,o,null)}function d(n,t,i,o,r){var f={type:n,props:t,key:i,ref:o,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,__h:null,constructor:void 0,__v:null==r?++u:r};return null==r&&null!=l.vnode&&l.vnode(f),f}function _(){return{current:null}}function k(n){return n.children}function b(n,l){this.props=n,this.context=l}function g(n,l){if(null==l)return n.__?g(n.__,n.__.__k.indexOf(n)+1):null;for(var u;ll&&i.sort(f));x.__r=0}function P(n,l,u,t,i,o,r,f,e,a,h){var p,y,_,b,m,w,x,P,C,D=0,H=t&&t.__k||s,I=H.length,T=I,j=l.length;for(u.__k=[],p=0;p0?d(b.type,b.props,b.key,b.ref?b.ref:null,b.__v):b)?(b.__=u,b.__b=u.__b+1,-1===(P=A(b,H,x=p+D,T))?_=c:(_=H[P]||c,H[P]=void 0,T--),z(n,b,_,i,o,r,f,e,a,h),m=b.__e,(y=b.ref)&&_.ref!=y&&(_.ref&&N(_.ref,null,b),h.push(y,b.__c||m,b)),null!=m&&(null==w&&(w=m),(C=_===c||null===_.__v)?-1==P&&D--:P!==x&&(P===x+1?D++:P>x?T>j-x?D+=P-x:D--:D=P(null!=e?1:0))for(;r>=0||f=0){if((e=l[r])&&i==e.key&&o===e.type)return r;r--}if(f2&&(e.children=arguments.length>3?n.call(arguments,2):t),d(l.type,e,i||l.key,o||l.ref,null)}function G(n,l){var u={__c:l=\"__cC\"+e++,__:n,Consumer:function(n,l){return n.children(l)},Provider:function(n){var u,t;return this.getChildContext||(u=[],(t={})[l]=this,this.getChildContext=function(){return t},this.shouldComponentUpdate=function(n){this.props.value!==n.value&&u.some(function(n){n.__e=!0,w(n)})},this.sub=function(n){u.push(n);var l=n.componentWillUnmount;n.componentWillUnmount=function(){u.splice(u.indexOf(n),1),l&&l.call(n)}}),n.children}};return u.Provider.__=u.Consumer.contextType=u}n=s.slice,l={__e:function(n,l,u,t){for(var i,o,r;l=l.__;)if((i=l.__c)&&!i.__)try{if((o=i.constructor)&&null!=o.getDerivedStateFromError&&(i.setState(o.getDerivedStateFromError(n)),r=i.__d),null!=i.componentDidCatch&&(i.componentDidCatch(n,t||{}),r=i.__d),r)return i.__E=i}catch(l){n=l}throw n}},u=0,t=function(n){return null!=n&&void 0===n.constructor},b.prototype.setState=function(n,l){var u;u=null!=this.__s&&this.__s!==this.state?this.__s:this.__s=h({},this.state),\"function\"==typeof n&&(n=n(h({},u),this.props)),n&&h(u,n),null!=n&&this.__v&&(l&&this._sb.push(l),w(this))},b.prototype.forceUpdate=function(n){this.__v&&(this.__e=!0,n&&this.__h.push(n),w(this))},b.prototype.render=k,i=[],r=\"function\"==typeof Promise?Promise.prototype.then.bind(Promise.resolve()):setTimeout,f=function(n,l){return n.__v.__b-l.__v.__b},x.__r=0,e=0;export{b as Component,k as Fragment,F as cloneElement,G as createContext,y as createElement,_ as createRef,y as h,E as hydrate,t as isValidElement,l as options,B as render,C as toChildArray};\n//# sourceMappingURL=preact.module.js.map\n","import PropTypes from 'prop-types';\n\n// Use this whenever you need the standard children prop.\nexport const defaultChildrenPropTypes = PropTypes.oneOfType([\n PropTypes.arrayOf(PropTypes.node),\n PropTypes.node,\n PropTypes.object,\n PropTypes.arrayOf(PropTypes.object),\n]);\n","export * from './Snackbar';\nexport * from './SnackbarItem';\n","import { isInViewport } from '@utilities/viewport';\nimport { debounceAction } from '@utilities/debounceAction';\n\n/**\n * Helper function designed to be used on scroll to detect when dropdowns should switch from dropping downwards/upwards.\n * The action is debounced since scroll events are usually fired several at a time.\n *\n * @returns {Function} a debounced function that handles the repositioning of dropdowns\n * @example\n *\n * document.addEventListener('scroll', getDropdownRepositionListener());\n */\nexport const getDropdownRepositionListener = () =>\n debounceAction(handleDropdownRepositions);\n\n/**\n * Checks for all dropdowns on the page which have the attribute 'data-repositioning-dropdown', signalling\n * they should dynamically change between dropping downwards or upwards, depending on viewport position.\n *\n * Any dropdowns not fully in view when dropping down will be switched to dropping upwards.\n */\nconst handleDropdownRepositions = () => {\n // Select all of the dropdowns which should reposition\n const allRepositioningDropdowns = document.querySelectorAll(\n '[data-repositioning-dropdown]',\n );\n\n for (const element of allRepositioningDropdowns) {\n // Default to dropping downwards\n element.classList.remove('reverse');\n\n const isDropdownCurrentlyOpen = element.style.display === 'block';\n\n if (!isDropdownCurrentlyOpen) {\n // We can't determine position on an element with display:none, so we \"show\" the dropdown with 0 opacity very temporarily\n element.style.opacity = 0;\n element.style.display = 'block';\n }\n\n if (!isInViewport({ element })) {\n // If the element isn't fully visible when dropping down, reverse the direction\n element.classList.add('reverse');\n }\n\n if (!isDropdownCurrentlyOpen) {\n // Revert the temporary changes to determine position\n element.style.removeProperty('display');\n element.style.removeProperty('opacity');\n }\n }\n};\n\n/**\n * Helper query string to identify interactive/focusable HTML elements\n */\nexport const INTERACTIVE_ELEMENTS_QUERY =\n 'button, [href], input:not([type=\"hidden\"]), select, textarea, [tabindex=\"0\"]';\n\n/**\n * Open the given dropdown, updating aria attributes, and focusing the first interactive element\n *\n * @param {Object} args\n * @param {string} args.triggerElementId The id of the button which activates the dropdown\n * @param {string} args.dropdownContent The id of the dropdown content element\n */\nexport const openDropdown = ({ triggerElementId, dropdownContentId }) => {\n const dropdownContent = document.getElementById(dropdownContentId);\n const triggerElement = document.getElementById(triggerElementId);\n\n triggerElement.setAttribute('aria-expanded', 'true');\n\n // Style set inline to prevent specificity issues\n dropdownContent.style.display = 'block';\n\n // Send focus to the first suitable element\n dropdownContent.querySelector(INTERACTIVE_ELEMENTS_QUERY)?.focus();\n};\n\n/**\n * Close the given dropdown, updating aria attributes\n *\n * @param {Object} args\n * @param {string} args.triggerElementId The id of the button which activates the dropdown\n * @param {string} args.dropdownContent The id of the dropdown content element\n * @param {Function} args.onClose Optional function for any side-effects which should occur on dropdown close\n */\nexport const closeDropdown = ({\n triggerElementId,\n dropdownContentId,\n onClose,\n}) => {\n const dropdownContent = document.getElementById(dropdownContentId);\n\n if (!dropdownContent) {\n // Component may have unmounted\n return;\n }\n\n document\n .getElementById(triggerElementId)\n ?.setAttribute('aria-expanded', 'false');\n\n // Remove the inline style added when we opened the dropdown\n dropdownContent.style.removeProperty('display');\n\n onClose?.();\n};\n\n/**\n * A helper function to initialize dropdown behaviors. This function attaches open/close click and keyup listeners,\n * and makes sure relevant aria properties and keyboard focus are updated.\n *\n * @param {Object} args\n * @param {string} args.triggerButtonElementId The ID of the button which triggers the dropdown open/close behavior\n * @param {string} args.dropdownContentId The ID of the dropdown content which should open/close on trigger button press\n * @param {string} args.dropdownContentCloseButtonId Optional ID of any button within the dropdown content which should close the dropdown\n * @param {Function} args.onClose An optional callback for when the dropdown is closed. This can be passed to execute any side-effects required when the dropdown closes.\n * @param {Function} args.onOpen An optional callback for when the dropdown is opened. This can be passed to execute any side-effects required when the dropdown opens.\n *\n * @returns {{closeDropdown: Function}} Object with callback to close the initialized dropdown\n */\nexport const initializeDropdown = ({\n triggerElementId,\n dropdownContentId,\n dropdownContentCloseButtonId,\n onClose,\n onOpen,\n}) => {\n const triggerButton = document.getElementById(triggerElementId);\n const dropdownContent = document.getElementById(dropdownContentId);\n\n if (!triggerButton || !dropdownContent) {\n // The required props haven't been provided, do nothing\n return;\n }\n\n // Ensure default values have been applied\n triggerButton.setAttribute('aria-expanded', 'false');\n triggerButton.setAttribute('aria-controls', dropdownContentId);\n triggerButton.setAttribute('aria-haspopup', 'true');\n\n const keyUpListener = ({ key }) => {\n if (key === 'Escape') {\n // Close the dropdown and return focus to the trigger button to prevent focus being lost\n const isCurrentlyOpen =\n triggerButton.getAttribute('aria-expanded') === 'true';\n if (isCurrentlyOpen) {\n closeDropdown({\n triggerElementId,\n dropdownContentId,\n onClose: onCloseCleanupActions,\n });\n triggerButton.focus();\n }\n } else if (key === 'Tab') {\n // Close the dropdown if the user has tabbed away from it\n const isInsideDropdown = dropdownContent?.contains(\n document.activeElement,\n );\n if (!isInsideDropdown) {\n closeDropdown({\n triggerElementId,\n dropdownContentId,\n onClose: onCloseCleanupActions,\n });\n }\n }\n };\n\n // Close the dropdown if user has clicked outside\n const clickOutsideListener = ({ target }) => {\n // Get fresh handle every time, resulting in more streamlined functionality for cypress\n const triggerButton = document.getElementById(triggerElementId);\n if (\n triggerButton &&\n target !== triggerButton &&\n !dropdownContent.contains(target) &&\n !triggerButton.contains(target)\n ) {\n closeDropdown({\n triggerElementId,\n dropdownContentId,\n onClose: onCloseCleanupActions,\n });\n\n // If the user did not click on another interactive item, return focus to the trigger\n if (!target.matches(INTERACTIVE_ELEMENTS_QUERY)) {\n triggerButton.focus();\n }\n }\n };\n\n // Any necessary side effects required on dropdown close\n const onCloseCleanupActions = () => {\n onClose?.();\n document.removeEventListener('keyup', keyUpListener);\n document.removeEventListener('click', clickOutsideListener);\n };\n\n // Add the main trigger button toggle functionality\n triggerButton.addEventListener('click', () => {\n if (\n document\n .getElementById(triggerElementId)\n ?.getAttribute('aria-expanded') === 'true'\n ) {\n closeDropdown({\n triggerElementId,\n dropdownContentId,\n onClose: onCloseCleanupActions,\n });\n } else {\n openDropdown({\n triggerElementId,\n dropdownContentId,\n });\n onOpen?.();\n\n document.addEventListener('keyup', keyUpListener);\n document.addEventListener('click', clickOutsideListener);\n }\n });\n\n if (dropdownContentCloseButtonId) {\n // The dropdown content has a 'close' button inside that we also need to handle\n document\n .getElementById(dropdownContentCloseButtonId)\n ?.addEventListener('click', () => {\n closeDropdown({\n triggerElementId,\n dropdownContentId,\n onClose: onCloseCleanupActions,\n });\n\n document.getElementById(triggerElementId)?.focus();\n });\n }\n\n return {\n closeDropdown: () => {\n closeDropdown({\n triggerElementId,\n dropdownContentId,\n onClose: onCloseCleanupActions,\n });\n },\n };\n};\n","/**\n * Checks if an element is visible in the viewport\n *\n * @example\n * const element = document.getElementById('element');\n * isInViewport({element, allowPartialVisibility = true}); // true or false\n *\n * @param {HTMLElement} element - The HTML element to check\n * @param {number} [offsetTop=0] - Part of the screen to ignore counting from the top\n * @param {boolean} [allowPartialVisibility=false] - A boolean to flip the check between partial or completely visible in the viewport\n * @returns {boolean} isInViewport - true if the element is visible in the viewport\n */\nexport function isInViewport({\n element,\n offsetTop = 0,\n allowPartialVisibility = false,\n}) {\n const boundingRect = element.getBoundingClientRect();\n const clientHeight =\n window.innerHeight || document.documentElement.clientHeight;\n const clientWidth = window.innerWidth || document.documentElement.clientWidth;\n const topIsInViewport =\n boundingRect.top <= clientHeight && boundingRect.top >= offsetTop;\n const rightIsInViewport =\n boundingRect.right >= 0 && boundingRect.right <= clientWidth;\n const bottomIsInViewport =\n boundingRect.bottom >= offsetTop && boundingRect.bottom <= clientHeight;\n const leftIsInViewport =\n boundingRect.left <= clientWidth && boundingRect.left >= 0;\n const topIsOutOfViewport = boundingRect.top <= offsetTop;\n const bottomIsOutOfViewport = boundingRect.bottom >= clientHeight;\n const elementSpansEntireViewport =\n topIsOutOfViewport && bottomIsOutOfViewport;\n\n if (allowPartialVisibility) {\n return (\n (topIsInViewport || bottomIsInViewport || elementSpansEntireViewport) &&\n (leftIsInViewport || rightIsInViewport)\n );\n }\n return (\n topIsInViewport &&\n bottomIsInViewport &&\n leftIsInViewport &&\n rightIsInViewport\n );\n}\n","import debounce from 'lodash.debounce';\n\n/**\n * A util function to wrap any action with lodash's `debounce` (https://lodash.com/docs/#debounce).\n * To use this util, wrap it in the util like so: debounceAction(onSearchBoxType.bind(this));\n *\n * By default, this util uses a default time of 300ms, and includes a default config of `{ leading: false }`.\n * These values can be overridden: debounceAction(this.onSearchBoxType.bind(this), { time: 100, config: { leading: true }});\n *\n *\n * @param {Function} action - The function that should be wrapped with `debounce`.\n * @param {Number} [time=300] - The number of milliseconds to wait.\n * @param {Object} [config={ leading: false }] - Any configuration for the debounce function.\n *\n * @returns {Function} A function wrapped in `debounce`.\n */\nexport function debounceAction(\n action,\n { time = 300, config = { leading: false } } = {},\n) {\n const configs = { ...config };\n return debounce(action, time, configs);\n}\n","import { useState, useEffect } from 'preact/hooks';\nimport PropTypes from 'prop-types';\n\n/**\n * Checker that return true if element is a form element\n *\n * @param {node} element to be checked\n *\n * @returns {boolean} isFormField\n */\nfunction isFormField(element) {\n if (element instanceof HTMLElement === false) return false;\n\n const name = element.nodeName.toLowerCase();\n const type = (element.getAttribute('type') || '').toLowerCase();\n return (\n name === 'select' ||\n name === 'textarea' ||\n (name === 'input' &&\n type !== 'submit' &&\n type !== 'reset' &&\n type !== 'checkbox' &&\n type !== 'radio') ||\n element.isContentEditable\n );\n}\n\n/**\n * Function to handle converting key presses to callback functions\n *\n * @param {KeyboardEvent} e Keyboard event\n * @param {String} keys special keys formatted in a string\n * @param {Array} chain array of past keys\n * @param {Object} shortcuts object containing callback functions\n *\n * @returns {Array} New chain\n */\nconst callShortcut = (e, keys, chain, shortcuts) => {\n const shortcut =\n chain && chain.length > 0\n ? shortcuts[`${chain.join('~')}~${e.code}`]\n : shortcuts[`${keys}${e.code}`] ||\n shortcuts[`${keys}${e.key.toLowerCase()}`];\n\n // if a valid shortcut is found call it and reset the chain\n if (shortcut) {\n shortcut(e);\n return [];\n }\n\n // if we have keys don't add to the chain\n if (keys || e.key === 'Shift') {\n return [];\n }\n\n return [...chain, e.code];\n};\n\n// Default options to be used if null\nconst defaultOptions = {\n timeout: 0, // The default is zero as we want no delays between keystrokes by default.\n};\n\n/**\n * hook that can be added to a component to listen\n * for keyboard presses\n *\n * @example\n * const shortcuts = {\n * 'ctrl+alt+KeyG': (e) => {\n * e.preventDefault();\n * alert('Control Alt G has been pressed');\n * },\n * 'KeyG~KeyH': (e) => {\n * e.preventDefault();\n * alert('G has been pressed quickly followed by H');\n * },\n * '?': (e) => {\n * setIsHelpVisible(true);\n * }\n * }\n *\n * useKeyboardShortcuts(shortcuts, someElementOrWindowObject, {timeout: 1500});\n *\n * @param {object} shortcuts List of keyboard shortcuts/event\n * @param {EventTarget} [eventTarget=window] An event target.\n * @param {object} [options = {}] An object for extra options\n *\n */\nexport function useKeyboardShortcuts(\n shortcuts,\n eventTarget = window,\n options = {},\n) {\n const [storedShortcuts] = useState(shortcuts);\n const [keyChain, setKeyChain] = useState([]);\n const [mergedOptions, setMergedOptions] = useState({\n ...defaultOptions,\n ...options,\n });\n\n // update mergedOptions if options prop changes\n useEffect(() => {\n const newOptions = {};\n if (typeof options.timeout === 'number')\n newOptions.timeout = options.timeout;\n setMergedOptions({ ...defaultOptions, ...newOptions });\n }, [options.timeout]);\n\n // clear key chain after timeout is reached\n useEffect(() => {\n if (keyChain.length <= 0) return;\n\n const timeout = window.setTimeout(() => {\n clearTimeout(timeout);\n setKeyChain([]);\n }, mergedOptions.timeout);\n\n return () => clearTimeout(timeout);\n }, [keyChain.length, mergedOptions.timeout]);\n\n // set up event listeners\n useEffect(() => {\n if (!storedShortcuts || Object.keys(storedShortcuts).length === 0) return;\n\n const keyEvent = (e) => {\n if (e.defaultPrevented) return;\n\n const ctrlKeyEntry = e.ctrlKey ? 'ctrl+' : '';\n const cmdKeyEntry = e.metaKey ? 'cmd+' : '';\n const altKeyEntry = e.altKey ? 'alt+' : '';\n const shiftKeyEntry = e.shiftKey ? 'shift+' : '';\n\n // We build the special keys string in an opinionated order to ensure consistency\n const keys = `${ctrlKeyEntry}${cmdKeyEntry}${altKeyEntry}${shiftKeyEntry}`;\n\n // If no special keys, except shift, are pressed and focus is inside a field return\n if (e.target instanceof Node && isFormField(e.target) && !keys) return;\n\n const newChain = callShortcut(e, keys, keyChain, storedShortcuts);\n\n // update keychain with latest chain\n setKeyChain(newChain);\n };\n\n eventTarget?.addEventListener('keydown', keyEvent);\n\n return () => eventTarget?.removeEventListener('keydown', keyEvent);\n }, [keyChain, storedShortcuts, eventTarget]);\n}\n\n/**\n * A component that can be added to a component to listen\n * for keyboard presses using the useKeyboardShortcuts hook\n *\n * @example\n * const shortcuts = {\n * 'ctrl+alt+KeyG': (e) => {\n * e.preventDefault();\n * alert('Control Alt G has been pressed')\n * }\n * }\n *\n * \n * \n *\n * @param {object} shortcuts List of keyboard shortcuts/event\n * @param {EventTarget} [eventTarget=window] An event target.\n * @param {object} [options = {}] An object for extra options\n *\n */\nexport function KeyboardShortcuts({ shortcuts, eventTarget, options }) {\n useKeyboardShortcuts(shortcuts, eventTarget, options);\n\n return null;\n}\n\nKeyboardShortcuts.propTypes = {\n shortcuts: PropTypes.object.isRequired,\n options: PropTypes.shape({\n timeout: PropTypes.number,\n }),\n eventTarget: PropTypes.oneOfType([\n PropTypes.instanceOf(Element),\n PropTypes.instanceOf(Window),\n ]),\n};\n\nKeyboardShortcuts.defaultProps = {\n shortcuts: {},\n options: {},\n eventTarget: window,\n};\n","import { addSnackbarItem } from '../Snackbar';\n\n/**\n * @file Manages logic to validate file uploads client-side. In general, the\n * validations work by looping over input form fields with a type of file and\n * checking the size and format of the files upload by the user.\n */\n\n/**\n * An object containing the top level MIME type as the key and the max file\n * size in MB for the value. To use a different value than these defaults,\n * simply add a data-max-file-mb attribute to the input form field with the\n * max file size in MB. If that attribute is found, it takes priority over these\n * defaults.\n *\n * @constant {Object.}\n */\nconst MAX_FILE_SIZE_MB = Object.freeze({\n image: 25,\n video: 50,\n});\n\n/**\n * Permitted file types using the top level MIME type (i.e. image for\n * image/png). To specify permitted file types, simply add a\n * data-permitted-file-types attribute to the input form field as an Array of\n * strings specifying the top level MIME types that are permitted.\n *\n * @constant {string[]}\n */\nconst PERMITTED_FILE_TYPES = ['image'];\n\n/**\n * The maximum length of the file name to prevent errors on the backend when a\n * file name is too long.\n *\n * @constant {number}\n */\nconst MAX_FILE_NAME_LENGTH = 250;\n\n/**\n * Adds error messages in the form of a div with red text.\n *\n * @param {string} msg - The error message to be displayed to the user\n *\n * @returns {HTMLElement} The error element that was added to the DOM\n */\nfunction addErrorMessage(msg) {\n if (top.addSnackbarItem) {\n // The Comment editor's context (MarkdownToolbar component) doesn't have\n // access to the Snackbar element in the DOM, so it needs to use `top`\n top.addSnackbarItem({\n message: msg,\n addCloseButton: true,\n });\n } else {\n // The Post editor (Toolbar component) doesn't have access to\n // `top.addSnackbarItem` so we need to check to ensure if it's undefined\n addSnackbarItem({\n message: msg,\n addCloseButton: true,\n });\n }\n}\n\n/**\n * Handles errors for files that are too large.\n *\n * @param {object} fileSizeErrorHandler - A custom function to be ran after the default error handling\n * @param {number} fileSizeMb - The size of the file in MB\n * @param {?number} maxFileSizeMb - The max file size limit in MB\n */\nfunction handleFileSizeError(fileSizeErrorHandler, fileSizeMb, maxFileSizeMb) {\n if (fileSizeErrorHandler) {\n fileSizeErrorHandler();\n } else {\n let errorMessage = `File size too large (${fileSizeMb} MB).`;\n\n // If a user uploads a file type that we haven't defined a max size limit for then maxFileSizeMb\n // could be NaN\n if (maxFileSizeMb >= 0) {\n errorMessage += ` The limit is ${maxFileSizeMb} MB.`;\n }\n\n addErrorMessage(errorMessage);\n }\n}\n\n/**\n * Handles errors for files that are not a valid format.\n *\n * @param {object} fileSizeErrorHandler - A custom function to be ran after the default error handling\n * @param {string} fileType - The top level file type (i.e. image for image/png)\n * @param {string[]} permittedFileTypes - The top level file types (i.e. image for image/png) that are permitted\n */\nfunction handleFileTypeError(\n fileTypeErrorHandler,\n fileType,\n permittedFileTypes,\n) {\n if (fileTypeErrorHandler) {\n fileTypeErrorHandler();\n } else {\n const fileTypeBracketed =\n fileType && fileType.length !== 0 ? ` (${fileType})` : '';\n const errorMessage = `Invalid file format${fileTypeBracketed}. Only ${permittedFileTypes.join(\n ', ',\n )} files are permitted.`;\n addErrorMessage(errorMessage);\n }\n}\n\n/**\n * Handles errors for files with names that are too long.\n *\n * @param {object} fileNameLengthErrorHandler - A custom function to be ran after the default error handling\n * @param {number} maxFileNameLength - The max number of characters permitted for a file name\n */\nfunction handleFileNameLengthError(\n fileNameLengthErrorHandler,\n maxFileNameLength,\n) {\n if (fileNameLengthErrorHandler) {\n fileNameLengthErrorHandler();\n } else {\n const errorMessage = `File name is too long. It can't be longer than ${maxFileNameLength} characters.`;\n addErrorMessage(errorMessage);\n }\n}\n\n/**\n * Validates the file size and handles the error if it's invalid.\n *\n * @external File\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/File File}\n *\n * @param {File} file - The file attached by the user\n * @param {string} fileType - The top level file type (i.e. image for image/png)\n * @param {HTMLElement} fileInput - An input form field with type of file\n *\n * @returns {Boolean} Returns false if the file is too big. Otherwise, returns true.\n */\nfunction validateFileSize(file, fileType, fileInput) {\n let { maxFileSizeMb } = fileInput.dataset;\n\n const { fileSizeErrorHandler } = fileInput.dataset;\n\n const fileSizeMb = (file.size / (1024 * 1024)).toFixed(2);\n maxFileSizeMb = Number(maxFileSizeMb || MAX_FILE_SIZE_MB[fileType]);\n\n const isValidFileSize = fileSizeMb <= maxFileSizeMb;\n\n if (!isValidFileSize) {\n handleFileSizeError(fileSizeErrorHandler, fileSizeMb, maxFileSizeMb);\n }\n\n return isValidFileSize;\n}\n\n/**\n * Validates the file type and handles the error if it's invalid.\n *\n * @external File\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/File File}\n *\n * @param {File} file - The file attached by the user\n * @param {string} fileType - The top level file type (i.e. image for image/png)\n * @param {HTMLElement} fileInput - An input form field with type of file\n *\n * @returns {Boolean} Returns false if the files is an invalid format. Otherwise, returns true.\n */\nfunction validateFileType(file, fileType, fileInput) {\n let { permittedFileTypes } = fileInput.dataset;\n\n if (permittedFileTypes) {\n permittedFileTypes = JSON.parse(permittedFileTypes);\n }\n\n permittedFileTypes = permittedFileTypes || PERMITTED_FILE_TYPES;\n\n const { fileTypeErrorHandler } = fileInput.dataset;\n\n const isValidFileType = permittedFileTypes.includes(fileType);\n\n if (!isValidFileType) {\n handleFileTypeError(fileTypeErrorHandler, fileType, permittedFileTypes);\n }\n\n return isValidFileType;\n}\n\n/**\n * Validates the length of the file name and handles the error if it's invalid.\n *\n * @external File\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/File File}\n *\n * @param {File} file - The file attached by the user\n * @param {HTMLElement} fileInput - An input form field with type of file\n *\n * @returns {Boolean} Returns false if the file name is too long. Otherwise, returns true.\n */\nfunction validateFileNameLength(file, fileInput) {\n let { maxFileNameLength } = fileInput.dataset;\n\n maxFileNameLength = Number(maxFileNameLength || MAX_FILE_NAME_LENGTH);\n\n const { fileNameLengthErrorHandler } = fileInput.dataset;\n\n const isValidFileNameLength = file.name.length <= maxFileNameLength;\n\n if (!isValidFileNameLength) {\n handleFileNameLengthError(fileNameLengthErrorHandler, maxFileNameLength);\n }\n\n return isValidFileNameLength;\n}\n\n/**\n * This is the core function to handle validations of uploaded files. It loops\n * through all the uploaded files for the given fileInput and checks the file\n * size, file format, and file name length. If a file fails a validation, the\n * error is handled.\n *\n * @param {HTMLElement} fileInput - An input form field with type of file\n *\n * @returns {Boolean} Returns false if any files failed validations. Otherwise, returns true.\n */\nfunction validateFileInput(fileInput) {\n let isValidFileInput = true;\n\n const files = Array.from(fileInput.files);\n\n for (let i = 0; i < files.length; i += 1) {\n const file = files[i];\n const fileType = file.type.split('/')[0];\n\n const isValidFileSize = validateFileSize(file, fileType, fileInput);\n\n if (!isValidFileSize) {\n isValidFileInput = false;\n break;\n }\n\n const isValidFileType = validateFileType(file, fileType, fileInput);\n\n if (!isValidFileType) {\n isValidFileInput = false;\n break;\n }\n\n const isValidFileNameLength = validateFileNameLength(file, fileInput);\n\n if (!isValidFileNameLength) {\n isValidFileInput = false;\n break;\n }\n }\n\n return isValidFileInput;\n}\n\n/**\n * This function is designed to be exported in areas where we are doing more\n * custom implementations of file uploading using Preact. It can then be used\n * in Preact event handlers. It loops through all file input fields on the DOM\n * and validates any attached files.\n *\n * @returns {Boolean} Returns false if any files failed validations. Otherwise, returns true.\n */\nexport function validateFileInputs() {\n let validFileInputs = true;\n const fileInputs = document.querySelectorAll('input[type=\"file\"]');\n\n for (let i = 0; i < fileInputs.length; i += 1) {\n const fileInput = fileInputs[i];\n const validFileInput = validateFileInput(fileInput);\n\n if (!validFileInput) {\n validFileInputs = false;\n break;\n }\n }\n\n return validFileInputs;\n}\n\n// This is written so that it works automagically by just including this pack\n// in a view.\nconst fileInputs = document.querySelectorAll('input[type=\"file\"]');\n\nfileInputs.forEach((fileInput) => {\n fileInput.addEventListener('change', () => {\n validateFileInput(fileInput);\n });\n});\n","export function getCsrfToken() {\n const element = document.querySelector(`meta[name='csrf-token']`);\n\n return element !== null ? element.content : undefined;\n}\n\nconst getWaitOnUserDataHandler = ({\n resolve,\n reject,\n safe = false,\n waitTime = 20,\n}) => {\n let totalTimeWaiting = 0;\n\n return function waitingOnUserData() {\n if (totalTimeWaiting === 3000) {\n if (!safe) {\n reject(new Error(\"Couldn't find user data on page.\"));\n return;\n } \n resolve({ user, csrfToken });\n return;\n \n }\n\n const csrfToken = getCsrfToken(document);\n const { user } = document.body.dataset;\n\n if (user && csrfToken !== undefined) {\n const currentUser = JSON.parse(user);\n\n resolve({ currentUser, csrfToken });\n return;\n }\n\n totalTimeWaiting += waitTime;\n setTimeout(waitingOnUserData, waitTime);\n };\n};\n\nexport function getUserDataAndCsrfTokenSafely() {\n return new Promise((resolve, reject) => {\n const safe = true;\n getWaitOnUserDataHandler({ resolve, reject, safe })();\n });\n}\n\nexport function getUserDataAndCsrfToken() {\n return new Promise((resolve, reject) => {\n getWaitOnUserDataHandler({ resolve, reject })();\n });\n}\n","import { h } from 'preact';\nimport PropTypes from 'prop-types';\nimport { defaultChildrenPropTypes } from '../common-prop-types';\nimport { Button } from '@crayons';\n\nexport const snackbarItemProps = {\n children: defaultChildrenPropTypes.isRequired,\n actions: PropTypes.arrayOf(\n PropTypes.shape({\n message: PropTypes.string.isRequired,\n handler: PropTypes.func.isRequired,\n lifespan: PropTypes.number.isRequired,\n }),\n ),\n};\n\nexport const SnackbarItem = ({ message, actions = [] }) => (\n
\n
\n {message}\n
\n
\n {actions.map(({ text, handler }) => (\n \n ))}\n
\n
\n);\n\nSnackbarItem.displayName = 'SnackbarItem';\n\nSnackbarItem.propTypes = snackbarItemProps.isRequired;\n","/*!\n * Ahoy.js v0.4.3\n * Simple, powerful JavaScript analytics\n * https://github.com/ankane/ahoy.js\n * MIT License\n */\n\n// https://www.quirksmode.org/js/cookies.html\n\nvar Cookies = {\n set: function (name, value, ttl, domain) {\n var expires = \"\";\n var cookieDomain = \"\";\n if (ttl) {\n var date = new Date();\n date.setTime(date.getTime() + (ttl * 60 * 1000));\n expires = \"; expires=\" + date.toGMTString();\n }\n if (domain) {\n cookieDomain = \"; domain=\" + domain;\n }\n document.cookie = name + \"=\" + escape(value) + expires + cookieDomain + \"; path=/; samesite=lax\";\n },\n get: function (name) {\n var i, c;\n var nameEQ = name + \"=\";\n var ca = document.cookie.split(';');\n for (i = 0; i < ca.length; i++) {\n c = ca[i];\n while (c.charAt(0) === ' ') {\n c = c.substring(1, c.length);\n }\n if (c.indexOf(nameEQ) === 0) {\n return unescape(c.substring(nameEQ.length, c.length));\n }\n }\n return null;\n }\n};\n\nvar config = {\n urlPrefix: \"\",\n visitsUrl: \"/ahoy/visits\",\n eventsUrl: \"/ahoy/events\",\n page: null,\n platform: \"Web\",\n useBeacon: true,\n startOnReady: true,\n trackVisits: true,\n cookies: true,\n cookieDomain: null,\n headers: {},\n visitParams: {},\n withCredentials: false,\n visitDuration: 4 * 60, // default 4 hours\n visitorDuration: 2 * 365 * 24 * 60 // default 2 years\n};\n\nvar ahoy = window.ahoy || window.Ahoy || {};\n\nahoy.configure = function (options) {\n for (var key in options) {\n if (Object.prototype.hasOwnProperty.call(options, key)) {\n config[key] = options[key];\n }\n }\n};\n\n// legacy\nahoy.configure(ahoy);\n\nvar $ = window.jQuery || window.Zepto || window.$;\nvar visitId, visitorId, track;\nvar isReady = false;\nvar queue = [];\nvar canStringify = typeof(JSON) !== \"undefined\" && typeof(JSON.stringify) !== \"undefined\";\nvar eventQueue = [];\n\nfunction visitsUrl() {\n return config.urlPrefix + config.visitsUrl;\n}\n\nfunction eventsUrl() {\n return config.urlPrefix + config.eventsUrl;\n}\n\nfunction isEmpty(obj) {\n return Object.keys(obj).length === 0;\n}\n\nfunction canTrackNow() {\n return (config.useBeacon || config.trackNow) && isEmpty(config.headers) && canStringify && typeof(window.navigator.sendBeacon) !== \"undefined\" && !config.withCredentials;\n}\n\nfunction serialize(object) {\n var data = new FormData();\n for (var key in object) {\n if (Object.prototype.hasOwnProperty.call(object, key)) {\n data.append(key, object[key]);\n }\n }\n return data;\n}\n\n// cookies\n\nfunction setCookie(name, value, ttl) {\n Cookies.set(name, value, ttl, config.cookieDomain || config.domain);\n}\n\nfunction getCookie(name) {\n return Cookies.get(name);\n}\n\nfunction destroyCookie(name) {\n Cookies.set(name, \"\", -1);\n}\n\nfunction log(message) {\n if (getCookie(\"ahoy_debug\")) {\n window.console.log(message);\n }\n}\n\nfunction setReady() {\n var callback;\n while ((callback = queue.shift())) {\n callback();\n }\n isReady = true;\n}\n\nahoy.ready = function (callback) {\n if (isReady) {\n callback();\n } else {\n queue.push(callback);\n }\n};\n\nfunction matchesSelector(element, selector) {\n var matches = element.matches ||\n element.matchesSelector ||\n element.mozMatchesSelector ||\n element.msMatchesSelector ||\n element.oMatchesSelector ||\n element.webkitMatchesSelector;\n\n if (matches) {\n if (matches.apply(element, [selector])) {\n return element;\n } else if (element.parentElement) {\n return matchesSelector(element.parentElement, selector);\n }\n return null;\n } else {\n log(\"Unable to match\");\n return null;\n }\n}\n\nfunction onEvent(eventName, selector, callback) {\n document.addEventListener(eventName, function (e) {\n var matchedElement = matchesSelector(e.target, selector);\n if (matchedElement) {\n var skip = getClosest(matchedElement, \"data-ahoy-skip\");\n if (skip !== null && skip !== \"false\") { return; }\n\n callback.call(matchedElement, e);\n }\n });\n}\n\n// http://beeker.io/jquery-document-ready-equivalent-vanilla-javascript\nfunction documentReady(callback) {\n if (document.readyState === \"interactive\" || document.readyState === \"complete\") {\n setTimeout(callback, 0);\n } else {\n document.addEventListener(\"DOMContentLoaded\", callback);\n }\n}\n\n// https://stackoverflow.com/a/2117523/1177228\nfunction generateId() {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n var r = Math.random() * 16 | 0;\n var v = c === 'x' ? r : (r & 0x3 | 0x8);\n return v.toString(16);\n });\n}\n\nfunction saveEventQueue() {\n if (config.cookies && canStringify) {\n setCookie(\"ahoy_events\", JSON.stringify(eventQueue), 1);\n }\n}\n\n// from rails-ujs\n\nfunction csrfToken() {\n var meta = document.querySelector(\"meta[name=csrf-token]\");\n return meta && meta.content;\n}\n\nfunction csrfParam() {\n var meta = document.querySelector(\"meta[name=csrf-param]\");\n return meta && meta.content;\n}\n\nfunction CSRFProtection(xhr) {\n var token = csrfToken();\n if (token) { xhr.setRequestHeader(\"X-CSRF-Token\", token); }\n}\n\nfunction sendRequest(url, data, success) {\n if (canStringify) {\n if ($ && $.ajax) {\n $.ajax({\n type: \"POST\",\n url: url,\n data: JSON.stringify(data),\n contentType: \"application/json; charset=utf-8\",\n dataType: \"json\",\n beforeSend: CSRFProtection,\n success: success,\n headers: config.headers,\n xhrFields: {\n withCredentials: config.withCredentials\n }\n });\n } else {\n var xhr = new XMLHttpRequest();\n xhr.open(\"POST\", url, true);\n xhr.withCredentials = config.withCredentials;\n xhr.setRequestHeader(\"Content-Type\", \"application/json\");\n for (var header in config.headers) {\n if (Object.prototype.hasOwnProperty.call(config.headers, header)) {\n xhr.setRequestHeader(header, config.headers[header]);\n }\n }\n xhr.onload = function () {\n if (xhr.status === 200) {\n success();\n }\n };\n CSRFProtection(xhr);\n xhr.send(JSON.stringify(data));\n }\n }\n}\n\nfunction eventData(event) {\n var data = {\n events: [event]\n };\n if (config.cookies) {\n data.visit_token = event.visit_token;\n data.visitor_token = event.visitor_token;\n }\n delete event.visit_token;\n delete event.visitor_token;\n return data;\n}\n\nfunction trackEvent(event) {\n ahoy.ready(function () {\n sendRequest(eventsUrl(), eventData(event), function () {\n // remove from queue\n for (var i = 0; i < eventQueue.length; i++) {\n if (eventQueue[i].id === event.id) {\n eventQueue.splice(i, 1);\n break;\n }\n }\n saveEventQueue();\n });\n });\n}\n\nfunction trackEventNow(event) {\n ahoy.ready(function () {\n var data = eventData(event);\n var param = csrfParam();\n var token = csrfToken();\n if (param && token) { data[param] = token; }\n // stringify so we keep the type\n data.events_json = JSON.stringify(data.events);\n delete data.events;\n window.navigator.sendBeacon(eventsUrl(), serialize(data));\n });\n}\n\nfunction page() {\n return config.page || window.location.pathname;\n}\n\nfunction presence(str) {\n return (str && str.length > 0) ? str : null;\n}\n\nfunction cleanObject(obj) {\n for (var key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n if (obj[key] === null) {\n delete obj[key];\n }\n }\n }\n return obj;\n}\n\nfunction eventProperties() {\n return cleanObject({\n tag: this.tagName.toLowerCase(),\n id: presence(this.id),\n \"class\": presence(this.className),\n page: page(),\n section: getClosest(this, \"data-section\")\n });\n}\n\nfunction getClosest(element, attribute) {\n for (; element && element !== document; element = element.parentNode) {\n if (element.hasAttribute(attribute)) {\n return element.getAttribute(attribute);\n }\n }\n\n return null;\n}\n\nfunction createVisit() {\n isReady = false;\n\n visitId = ahoy.getVisitId();\n visitorId = ahoy.getVisitorId();\n track = getCookie(\"ahoy_track\");\n\n if (config.cookies === false || config.trackVisits === false) {\n log(\"Visit tracking disabled\");\n setReady();\n } else if (visitId && visitorId && !track) {\n // TODO keep visit alive?\n log(\"Active visit\");\n setReady();\n } else {\n if (!visitId) {\n visitId = generateId();\n setCookie(\"ahoy_visit\", visitId, config.visitDuration);\n }\n\n // make sure cookies are enabled\n if (getCookie(\"ahoy_visit\")) {\n log(\"Visit started\");\n\n if (!visitorId) {\n visitorId = generateId();\n setCookie(\"ahoy_visitor\", visitorId, config.visitorDuration);\n }\n\n var data = {\n visit_token: visitId,\n visitor_token: visitorId,\n platform: config.platform,\n landing_page: window.location.href,\n screen_width: window.screen.width,\n screen_height: window.screen.height,\n js: true\n };\n\n // referrer\n if (document.referrer.length > 0) {\n data.referrer = document.referrer;\n }\n\n for (var key in config.visitParams) {\n if (Object.prototype.hasOwnProperty.call(config.visitParams, key)) {\n data[key] = config.visitParams[key];\n }\n }\n\n log(data);\n\n sendRequest(visitsUrl(), data, function () {\n // wait until successful to destroy\n destroyCookie(\"ahoy_track\");\n setReady();\n });\n } else {\n log(\"Cookies disabled\");\n setReady();\n }\n }\n}\n\nahoy.getVisitId = ahoy.getVisitToken = function () {\n return getCookie(\"ahoy_visit\");\n};\n\nahoy.getVisitorId = ahoy.getVisitorToken = function () {\n return getCookie(\"ahoy_visitor\");\n};\n\nahoy.reset = function () {\n destroyCookie(\"ahoy_visit\");\n destroyCookie(\"ahoy_visitor\");\n destroyCookie(\"ahoy_events\");\n destroyCookie(\"ahoy_track\");\n return true;\n};\n\nahoy.debug = function (enabled) {\n if (enabled === false) {\n destroyCookie(\"ahoy_debug\");\n } else {\n setCookie(\"ahoy_debug\", \"t\", 365 * 24 * 60); // 1 year\n }\n return true;\n};\n\nahoy.track = function (name, properties) {\n // generate unique id\n var event = {\n name: name,\n properties: properties || {},\n time: (new Date()).getTime() / 1000.0,\n id: generateId(),\n js: true\n };\n\n ahoy.ready(function () {\n if (config.cookies && !ahoy.getVisitId()) {\n createVisit();\n }\n\n ahoy.ready(function () {\n log(event);\n\n event.visit_token = ahoy.getVisitId();\n event.visitor_token = ahoy.getVisitorId();\n\n if (canTrackNow()) {\n trackEventNow(event);\n } else {\n eventQueue.push(event);\n saveEventQueue();\n\n // wait in case navigating to reduce duplicate events\n setTimeout(function () {\n trackEvent(event);\n }, 1000);\n }\n });\n });\n\n return true;\n};\n\nahoy.trackView = function (additionalProperties) {\n var properties = {\n url: window.location.href,\n title: document.title,\n page: page()\n };\n\n if (additionalProperties) {\n for (var propName in additionalProperties) {\n if (Object.prototype.hasOwnProperty.call(additionalProperties, propName)) {\n properties[propName] = additionalProperties[propName];\n }\n }\n }\n ahoy.track(\"$view\", properties);\n};\n\nahoy.trackClicks = function (selector) {\n if (selector === undefined) {\n throw new Error(\"Missing selector\");\n }\n onEvent(\"click\", selector, function (e) {\n var properties = eventProperties.call(this, e);\n properties.text = properties.tag === \"input\" ? this.value : (this.textContent || this.innerText || this.innerHTML).replace(/[\\s\\r\\n]+/g, \" \").trim();\n properties.href = this.href;\n ahoy.track(\"$click\", properties);\n });\n};\n\nahoy.trackSubmits = function (selector) {\n if (selector === undefined) {\n throw new Error(\"Missing selector\");\n }\n onEvent(\"submit\", selector, function (e) {\n var properties = eventProperties.call(this, e);\n ahoy.track(\"$submit\", properties);\n });\n};\n\nahoy.trackChanges = function (selector) {\n log(\"trackChanges is deprecated and will be removed in 0.5.0\");\n if (selector === undefined) {\n throw new Error(\"Missing selector\");\n }\n onEvent(\"change\", selector, function (e) {\n var properties = eventProperties.call(this, e);\n ahoy.track(\"$change\", properties);\n });\n};\n\n// push events from queue\ntry {\n eventQueue = JSON.parse(getCookie(\"ahoy_events\") || \"[]\");\n} catch (e) {\n // do nothing\n}\n\nfor (var i = 0; i < eventQueue.length; i++) {\n trackEvent(eventQueue[i]);\n}\n\nahoy.start = function () {\n createVisit();\n\n ahoy.start = function () {};\n};\n\ndocumentReady(function () {\n if (config.startOnReady) {\n ahoy.start();\n }\n});\n\nexport { ahoy as default };\n","var map = {\n\t\"./af\": 40,\n\t\"./af.js\": 40,\n\t\"./ar\": 41,\n\t\"./ar-dz\": 42,\n\t\"./ar-dz.js\": 42,\n\t\"./ar-kw\": 43,\n\t\"./ar-kw.js\": 43,\n\t\"./ar-ly\": 44,\n\t\"./ar-ly.js\": 44,\n\t\"./ar-ma\": 45,\n\t\"./ar-ma.js\": 45,\n\t\"./ar-sa\": 46,\n\t\"./ar-sa.js\": 46,\n\t\"./ar-tn\": 47,\n\t\"./ar-tn.js\": 47,\n\t\"./ar.js\": 41,\n\t\"./az\": 48,\n\t\"./az.js\": 48,\n\t\"./be\": 49,\n\t\"./be.js\": 49,\n\t\"./bg\": 50,\n\t\"./bg.js\": 50,\n\t\"./bm\": 51,\n\t\"./bm.js\": 51,\n\t\"./bn\": 52,\n\t\"./bn-bd\": 53,\n\t\"./bn-bd.js\": 53,\n\t\"./bn.js\": 52,\n\t\"./bo\": 54,\n\t\"./bo.js\": 54,\n\t\"./br\": 55,\n\t\"./br.js\": 55,\n\t\"./bs\": 56,\n\t\"./bs.js\": 56,\n\t\"./ca\": 57,\n\t\"./ca.js\": 57,\n\t\"./cs\": 58,\n\t\"./cs.js\": 58,\n\t\"./cv\": 59,\n\t\"./cv.js\": 59,\n\t\"./cy\": 60,\n\t\"./cy.js\": 60,\n\t\"./da\": 61,\n\t\"./da.js\": 61,\n\t\"./de\": 62,\n\t\"./de-at\": 63,\n\t\"./de-at.js\": 63,\n\t\"./de-ch\": 64,\n\t\"./de-ch.js\": 64,\n\t\"./de.js\": 62,\n\t\"./dv\": 65,\n\t\"./dv.js\": 65,\n\t\"./el\": 66,\n\t\"./el.js\": 66,\n\t\"./en-au\": 67,\n\t\"./en-au.js\": 67,\n\t\"./en-ca\": 68,\n\t\"./en-ca.js\": 68,\n\t\"./en-gb\": 69,\n\t\"./en-gb.js\": 69,\n\t\"./en-ie\": 70,\n\t\"./en-ie.js\": 70,\n\t\"./en-il\": 71,\n\t\"./en-il.js\": 71,\n\t\"./en-in\": 72,\n\t\"./en-in.js\": 72,\n\t\"./en-nz\": 73,\n\t\"./en-nz.js\": 73,\n\t\"./en-sg\": 74,\n\t\"./en-sg.js\": 74,\n\t\"./eo\": 75,\n\t\"./eo.js\": 75,\n\t\"./es\": 76,\n\t\"./es-do\": 77,\n\t\"./es-do.js\": 77,\n\t\"./es-mx\": 78,\n\t\"./es-mx.js\": 78,\n\t\"./es-us\": 79,\n\t\"./es-us.js\": 79,\n\t\"./es.js\": 76,\n\t\"./et\": 80,\n\t\"./et.js\": 80,\n\t\"./eu\": 81,\n\t\"./eu.js\": 81,\n\t\"./fa\": 82,\n\t\"./fa.js\": 82,\n\t\"./fi\": 83,\n\t\"./fi.js\": 83,\n\t\"./fil\": 84,\n\t\"./fil.js\": 84,\n\t\"./fo\": 85,\n\t\"./fo.js\": 85,\n\t\"./fr\": 86,\n\t\"./fr-ca\": 87,\n\t\"./fr-ca.js\": 87,\n\t\"./fr-ch\": 88,\n\t\"./fr-ch.js\": 88,\n\t\"./fr.js\": 86,\n\t\"./fy\": 89,\n\t\"./fy.js\": 89,\n\t\"./ga\": 90,\n\t\"./ga.js\": 90,\n\t\"./gd\": 91,\n\t\"./gd.js\": 91,\n\t\"./gl\": 92,\n\t\"./gl.js\": 92,\n\t\"./gom-deva\": 93,\n\t\"./gom-deva.js\": 93,\n\t\"./gom-latn\": 94,\n\t\"./gom-latn.js\": 94,\n\t\"./gu\": 95,\n\t\"./gu.js\": 95,\n\t\"./he\": 96,\n\t\"./he.js\": 96,\n\t\"./hi\": 97,\n\t\"./hi.js\": 97,\n\t\"./hr\": 98,\n\t\"./hr.js\": 98,\n\t\"./hu\": 99,\n\t\"./hu.js\": 99,\n\t\"./hy-am\": 100,\n\t\"./hy-am.js\": 100,\n\t\"./id\": 101,\n\t\"./id.js\": 101,\n\t\"./is\": 102,\n\t\"./is.js\": 102,\n\t\"./it\": 103,\n\t\"./it-ch\": 104,\n\t\"./it-ch.js\": 104,\n\t\"./it.js\": 103,\n\t\"./ja\": 105,\n\t\"./ja.js\": 105,\n\t\"./jv\": 106,\n\t\"./jv.js\": 106,\n\t\"./ka\": 107,\n\t\"./ka.js\": 107,\n\t\"./kk\": 108,\n\t\"./kk.js\": 108,\n\t\"./km\": 109,\n\t\"./km.js\": 109,\n\t\"./kn\": 110,\n\t\"./kn.js\": 110,\n\t\"./ko\": 111,\n\t\"./ko.js\": 111,\n\t\"./ku\": 112,\n\t\"./ku.js\": 112,\n\t\"./ky\": 113,\n\t\"./ky.js\": 113,\n\t\"./lb\": 114,\n\t\"./lb.js\": 114,\n\t\"./lo\": 115,\n\t\"./lo.js\": 115,\n\t\"./lt\": 116,\n\t\"./lt.js\": 116,\n\t\"./lv\": 117,\n\t\"./lv.js\": 117,\n\t\"./me\": 118,\n\t\"./me.js\": 118,\n\t\"./mi\": 119,\n\t\"./mi.js\": 119,\n\t\"./mk\": 120,\n\t\"./mk.js\": 120,\n\t\"./ml\": 121,\n\t\"./ml.js\": 121,\n\t\"./mn\": 122,\n\t\"./mn.js\": 122,\n\t\"./mr\": 123,\n\t\"./mr.js\": 123,\n\t\"./ms\": 124,\n\t\"./ms-my\": 125,\n\t\"./ms-my.js\": 125,\n\t\"./ms.js\": 124,\n\t\"./mt\": 126,\n\t\"./mt.js\": 126,\n\t\"./my\": 127,\n\t\"./my.js\": 127,\n\t\"./nb\": 128,\n\t\"./nb.js\": 128,\n\t\"./ne\": 129,\n\t\"./ne.js\": 129,\n\t\"./nl\": 130,\n\t\"./nl-be\": 131,\n\t\"./nl-be.js\": 131,\n\t\"./nl.js\": 130,\n\t\"./nn\": 132,\n\t\"./nn.js\": 132,\n\t\"./oc-lnc\": 133,\n\t\"./oc-lnc.js\": 133,\n\t\"./pa-in\": 134,\n\t\"./pa-in.js\": 134,\n\t\"./pl\": 135,\n\t\"./pl.js\": 135,\n\t\"./pt\": 136,\n\t\"./pt-br\": 137,\n\t\"./pt-br.js\": 137,\n\t\"./pt.js\": 136,\n\t\"./ro\": 138,\n\t\"./ro.js\": 138,\n\t\"./ru\": 139,\n\t\"./ru.js\": 139,\n\t\"./sd\": 140,\n\t\"./sd.js\": 140,\n\t\"./se\": 141,\n\t\"./se.js\": 141,\n\t\"./si\": 142,\n\t\"./si.js\": 142,\n\t\"./sk\": 143,\n\t\"./sk.js\": 143,\n\t\"./sl\": 144,\n\t\"./sl.js\": 144,\n\t\"./sq\": 145,\n\t\"./sq.js\": 145,\n\t\"./sr\": 146,\n\t\"./sr-cyrl\": 147,\n\t\"./sr-cyrl.js\": 147,\n\t\"./sr.js\": 146,\n\t\"./ss\": 148,\n\t\"./ss.js\": 148,\n\t\"./sv\": 149,\n\t\"./sv.js\": 149,\n\t\"./sw\": 150,\n\t\"./sw.js\": 150,\n\t\"./ta\": 151,\n\t\"./ta.js\": 151,\n\t\"./te\": 152,\n\t\"./te.js\": 152,\n\t\"./tet\": 153,\n\t\"./tet.js\": 153,\n\t\"./tg\": 154,\n\t\"./tg.js\": 154,\n\t\"./th\": 155,\n\t\"./th.js\": 155,\n\t\"./tk\": 156,\n\t\"./tk.js\": 156,\n\t\"./tl-ph\": 157,\n\t\"./tl-ph.js\": 157,\n\t\"./tlh\": 158,\n\t\"./tlh.js\": 158,\n\t\"./tr\": 159,\n\t\"./tr.js\": 159,\n\t\"./tzl\": 160,\n\t\"./tzl.js\": 160,\n\t\"./tzm\": 161,\n\t\"./tzm-latn\": 162,\n\t\"./tzm-latn.js\": 162,\n\t\"./tzm.js\": 161,\n\t\"./ug-cn\": 163,\n\t\"./ug-cn.js\": 163,\n\t\"./uk\": 164,\n\t\"./uk.js\": 164,\n\t\"./ur\": 165,\n\t\"./ur.js\": 165,\n\t\"./uz\": 166,\n\t\"./uz-latn\": 167,\n\t\"./uz-latn.js\": 167,\n\t\"./uz.js\": 166,\n\t\"./vi\": 168,\n\t\"./vi.js\": 168,\n\t\"./x-pseudo\": 169,\n\t\"./x-pseudo.js\": 169,\n\t\"./yo\": 170,\n\t\"./yo.js\": 170,\n\t\"./zh-cn\": 171,\n\t\"./zh-cn.js\": 171,\n\t\"./zh-hk\": 172,\n\t\"./zh-hk.js\": 172,\n\t\"./zh-mo\": 173,\n\t\"./zh-mo.js\": 173,\n\t\"./zh-tw\": 174,\n\t\"./zh-tw.js\": 174\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 204;","import PropTypes from 'prop-types';\nimport { h, Fragment } from 'preact';\nimport { useLayoutEffect, useRef, useCallback } from 'preact/hooks';\nimport { createFocusTrap } from 'focus-trap';\nimport { defaultChildrenPropTypes } from '../../common-prop-types';\nimport { KeyboardShortcuts } from './useKeyboardShortcuts';\n\n/**\n * Wrapper component to create a focus trap within the HTML element found by the given selector\n *\n * @example\n * import { FocusTrap } from \"shared/components/FocusTrap\";\n *\n * const ExampleComponent = ({ onClose }) => (\n * \n *
\n * \n *
\n *
\n * )\n *\n * @param {string} selector The CSS selector for the element where focus is to be trapped\n * @param {Array} children Child element(s) passed via composition\n * @param {Function} onDeactivate Callback function to be called when the focus trap is deactivated by navigation or Escape press\n * @param {boolean} clickOutsideDeactivates If true, the focus trap will deactivate when a user clicks outside of the trap area\n */\nexport const FocusTrap = ({\n selector,\n children,\n onDeactivate,\n clickOutsideDeactivates = false,\n document = window.document,\n}) => {\n const focusTrap = useRef(null);\n const deactivate = useCallback(() => onDeactivate(), [onDeactivate]);\n\n useLayoutEffect(() => {\n const currentLocationHref = document.location.href;\n const routeChangeObserver = new MutationObserver((mutations) => {\n const hasRouteChanged = mutations.some(\n () => currentLocationHref !== document.location.href,\n );\n\n // Ensure trap deactivates if user navigates from the page\n if (hasRouteChanged) {\n focusTrap.current?.deactivate();\n routeChangeObserver.disconnect();\n }\n });\n\n focusTrap.current = createFocusTrap(selector, {\n escapeDeactivates: false,\n clickOutsideDeactivates,\n onDeactivate: deactivate,\n document,\n });\n\n focusTrap.current.activate();\n routeChangeObserver.observe(document.querySelector('body'), {\n childList: true,\n });\n\n return () => {\n focusTrap.current.deactivate();\n routeChangeObserver.disconnect();\n };\n }, [clickOutsideDeactivates, selector, deactivate, document]);\n\n const shortcuts = {\n escape: onDeactivate,\n };\n\n return (\n \n {children}\n \n \n );\n};\n\nFocusTrap.defaultProps = {\n selector: '.crayons-modal',\n onDeactivate: () => {},\n};\n\nFocusTrap.propTypes = {\n selector: PropTypes.string,\n children: defaultChildrenPropTypes.isRequired,\n onDeactivate: PropTypes.func,\n};\n","// Unique ID applied to modals created using the showWindowModal function\nexport const WINDOW_MODAL_ID = 'window-modal';\n\n// We only import these modules if a user actually triggers a modal. Here we cache them so they are only imported once.\nlet preactImport;\nlet modalImports;\n\nconst getPreactImport = () => {\n if (!preactImport) {\n preactImport = import('preact');\n }\n return preactImport;\n};\n\nconst getModalImports = () => {\n if (!modalImports) {\n modalImports = [import('@crayons/Modal'), getPreactImport()];\n }\n return Promise.all(modalImports);\n};\n\n/**\n * This helper function presents content inside a Preact modal.\n *\n * The modal content may be passed either as:\n * - the actual HTML (using modalContent prop), which will be dropped straight into the modal\n * - a CSS selector (using contentSelector prop), which will be used to locate the HTML content on the current page before dropping it into the modal\n *\n * Only one modal will be presented at any given time. All additional props will be passed directly to the Modal component.\n *\n * @param {Object} args\n * @param {HTMLElement} args.modalContent The HTML to display inside of the modal\n * @param {string} args.contentSelector The CSS query to locate the HTML to be presented in the modal, as an alternative to passing the actual HTML (e.g. '#my-modal-content')\n * @param {Function} args.onOpen A callback function to run when the modal opens. This can be useful, for example, to attach any event listeners to items inside the modal.\n * @param {Object} args.document Allows us to specify which \"document\" is relevant; e.g. use within iframes.\n */\nexport const showWindowModal = async ({\n modalContent,\n contentSelector,\n onOpen,\n document = window.document,\n ...modalProps\n}) => {\n const [{ Modal }, { render, h }] = await getModalImports();\n\n // Guard against two modals being opened at once\n let currentModalContainer = document.getElementById(WINDOW_MODAL_ID);\n if (currentModalContainer) {\n render(null, currentModalContainer);\n } else {\n currentModalContainer = document.createElement('div');\n currentModalContainer.setAttribute('id', WINDOW_MODAL_ID);\n document.body.appendChild(currentModalContainer);\n }\n\n render(\n {\n render(null, currentModalContainer);\n }}\n focusTrapSelector={`#${WINDOW_MODAL_ID}`}\n document={document}\n {...modalProps}\n >\n \n ,\n currentModalContainer,\n );\n\n onOpen?.();\n};\n\n/**\n * This helper function closes any currently open window modal. This can be useful, for example, if your modal contains a \"cancel\" button.\n */\nexport const closeWindowModal = async (document = window.document) => {\n const currentModalContainer = document.getElementById(WINDOW_MODAL_ID);\n if (currentModalContainer) {\n const { render } = await getPreactImport();\n render(null, currentModalContainer);\n }\n};\n","import { h } from 'preact';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames/bind';\nimport { FocusTrap } from '../../shared/components/focusTrap';\nimport { defaultChildrenPropTypes } from '../../common-prop-types';\nimport { ButtonNew as Button } from '@crayons';\nimport CloseIcon from '@images/x.svg';\n\nexport const Modal = ({\n children,\n size,\n className,\n title,\n prompt,\n sheet,\n centered,\n noBackdrop,\n showHeader = true,\n sheetAlign = 'center',\n backdropDismissible = false,\n allowOverflow = false,\n onClose = () => {},\n focusTrapSelector = '.crayons-modal__box',\n document = window.document,\n}) => {\n const classes = classNames('crayons-modal', {\n [`crayons-modal--${size}`]: size && size !== 'medium',\n [`crayons-modal--${sheetAlign}`]: sheet && sheetAlign !== 'center',\n 'crayons-modal--sheet': sheet,\n 'crayons-modal--prompt': prompt,\n 'crayons-modal--centered': centered && prompt,\n 'crayons-modal--bg-dismissible': !noBackdrop && backdropDismissible,\n 'crayons-modal--overflow-visible': allowOverflow,\n [className]: className,\n });\n\n return (\n \n
\n \n {showHeader && (\n
\n

{title}

\n \n
\n )}\n
{children}
\n
\n {!noBackdrop && (\n \n )}\n \n \n );\n};\n\nModal.displayName = 'Modal';\n\nModal.propTypes = {\n children: defaultChildrenPropTypes.isRequired,\n className: PropTypes.string,\n title: PropTypes.string.isRequired,\n backdrop: PropTypes.bool,\n backdropDismissible: PropTypes.bool,\n prompt: PropTypes.bool,\n centered: PropTypes.bool,\n onClose: PropTypes.func,\n size: PropTypes.oneOf(['small', 'medium', 'large']),\n focusTrapSelector: PropTypes.string,\n sheet: PropTypes.bool,\n sheetAlign: PropTypes.oneOf(['center', 'left', 'right']),\n showHeader: PropTypes.bool,\n};\n","import { validateFileInputs } from '../packs/validateFileInputs';\n\nexport function previewArticle(payload, successCb, failureCb) {\n fetch('/articles/preview', {\n method: 'POST',\n headers: {\n Accept: 'application/json',\n 'X-CSRF-Token': window.csrfToken,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n article_body: payload,\n }),\n credentials: 'same-origin',\n })\n .then(async (response) => {\n const payload = await response.json();\n\n if (response.status !== 200) {\n throw payload;\n }\n\n return payload;\n })\n .then(successCb)\n .catch(failureCb);\n}\n\nexport function getArticle() {}\n\nfunction processPayload(payload) {\n const {\n /* eslint-disable no-unused-vars */\n previewShowing,\n helpShowing,\n previewResponse,\n helpHTML,\n imageManagementShowing,\n moreConfigShowing,\n errors,\n /* eslint-enable no-unused-vars */\n ...neededPayload\n } = payload;\n return neededPayload;\n}\n\nexport function submitArticle({ payload, onSuccess, onError }) {\n const method = payload.id ? 'PUT' : 'POST';\n const url = payload.id ? `/articles/${payload.id}` : '/articles';\n fetch(url, {\n method,\n headers: {\n Accept: 'application/json',\n 'X-CSRF-Token': window.csrfToken,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n article: processPayload(payload),\n }),\n credentials: 'same-origin',\n })\n .then((response) => response.json())\n .then((response) => {\n if (response.current_state_path) {\n onSuccess();\n window.location.replace(response.current_state_path);\n } else {\n onError(response);\n }\n })\n .catch(onError);\n}\n\nfunction generateUploadFormdata(payload) {\n const token = window.csrfToken;\n const formData = new FormData();\n formData.append('authenticity_token', token);\n\n Object.entries(payload.image).forEach(([_, value]) =>\n formData.append('image[]', value),\n );\n\n return formData;\n}\n\nexport function generateMainImage({ payload, successCb, failureCb, signal }) {\n fetch('/image_uploads', {\n method: 'POST',\n headers: {\n 'X-CSRF-Token': window.csrfToken,\n },\n body: generateUploadFormdata(payload),\n credentials: 'same-origin',\n signal,\n })\n .then((response) => response.json())\n .then((json) => {\n if (json.error) {\n throw new Error(json.error);\n }\n const { links } = json;\n const { image } = payload;\n return successCb({ links, image });\n })\n .catch((message) => failureCb(message));\n}\n\n/**\n * Processes images for upload.\n *\n * @param {FileList} images Images to be uploaded.\n * @param {Function} handleImageSuccess The handler that runs when the image is uploaded successfully.\n * @param {Function} handleImageFailure The handler that runs when the image upload fails.\n */\nexport function processImageUpload(\n images,\n handleImageUploading,\n handleImageSuccess,\n handleImageFailure,\n) {\n // Currently only one image is supported for upload.\n if (images.length > 0 && validateFileInputs()) {\n const payload = { image: images };\n\n handleImageUploading();\n generateMainImage({\n payload,\n successCb: handleImageSuccess,\n failureCb: handleImageFailure,\n });\n }\n}\n","let postscribeImport;\n\nasync function getPostScribe() {\n if (postscribeImport) {\n // Grab the cached import so we're not always fetching it from the network.\n return postscribeImport;\n }\n\n const { default: postscribe } = await import('postscribe');\n postscribeImport = postscribe;\n\n return postscribeImport;\n}\n\nfunction getGistTags(nodes) {\n const gistNodes = [];\n\n for (const node of nodes) {\n if (node.nodeType === 1) {\n if (node.classList.contains('ltag_gist-liquid-tag')) {\n gistNodes.push(node);\n }\n\n gistNodes.push(...node.querySelectorAll('.ltag_gist-liquid-tag'));\n }\n }\n\n return gistNodes;\n}\n\nfunction loadEmbeddedGists(postscribe, gistTags) {\n for (const gistTag of gistTags) {\n const gistWrapper = gistTag.firstElementChild;\n postscribe(gistTag, gistWrapper.outerHTML, {\n beforeWrite(text) {\n return gistTag.childElementCount > 3 ? '' : text;\n },\n });\n gistWrapper.remove();\n }\n}\n\nfunction watchForGistTagInsertion(targetNode, postscribe) {\n const config = { attributes: false, childList: true, subtree: true };\n\n const callback = function (mutationsList) {\n for (const { type, addedNodes } of mutationsList) {\n if (type === 'childList' && addedNodes.length > 0) {\n loadEmbeddedGists(postscribe, getGistTags(addedNodes));\n }\n }\n };\n\n const observer = new MutationObserver(callback);\n observer.observe(targetNode, config);\n\n InstantClick.on('change', () => {\n observer.disconnect();\n });\n\n window.addEventListener('beforeunload', () => {\n observer.disconnect();\n });\n}\n\nexport async function embedGists(targetNode) {\n const postscribe = await getPostScribe();\n\n // Load gist tags that were rendered server-side\n loadEmbeddedGists(\n postscribe,\n document.querySelectorAll('.ltag_gist-liquid-tag'),\n );\n\n watchForGistTagInsertion(targetNode, postscribe);\n}\n","import PropTypes from 'prop-types';\n\nexport const articleSnippetResultPropTypes = PropTypes.shape({\n body_text: PropTypes.arrayOf(PropTypes.string),\n});\n\nexport const articlePropTypes = PropTypes.shape({\n id: PropTypes.number.isRequired,\n title: PropTypes.string.isRequired,\n path: PropTypes.string.isRequired,\n cloudinary_video_url: PropTypes.string,\n video_duration_in_minutes: PropTypes.string,\n type_of: PropTypes.oneOf(['podcast_episodes']),\n class_name: PropTypes.oneOf(['PodcastEpisode', 'User', 'Article']),\n flare_tag: PropTypes.shape({\n name: PropTypes.string.isRequired,\n bg_color_hex: PropTypes.string,\n text_color_hex: PropTypes.string,\n }),\n tag_list: PropTypes.arrayOf(PropTypes.string),\n cached_tag_list_array: PropTypes.arrayOf(PropTypes.string),\n podcast: PropTypes.shape({\n slug: PropTypes.string.isRequired,\n title: PropTypes.string.isRequired,\n image_url: PropTypes.string.isRequired,\n }),\n user_id: PropTypes.number.isRequired,\n user: PropTypes.shape({\n username: PropTypes.string.isRequired,\n name: PropTypes.string.isRequired,\n }),\n organization: PropTypes.shape({\n name: PropTypes.string.isRequired,\n profile_image_90: PropTypes.string.isRequired,\n slug: PropTypes.string.isRequired,\n }),\n highlight: articleSnippetResultPropTypes,\n public_reactions_count: PropTypes.number,\n reactions_count: PropTypes.number,\n comments_count: PropTypes.number,\n reading_time: PropTypes.number,\n});\n","import { h, Component } from 'preact';\nimport PropTypes from 'prop-types';\nimport { SnackbarItem } from './SnackbarItem';\n\nlet snackbarItems = [];\n\nexport function addSnackbarItem(snackbarItem) {\n if (!Array.isArray(snackbarItem.actions)) {\n snackbarItem.actions = []; // eslint-disable-line no-param-reassign\n }\n\n snackbarItems.push(snackbarItem);\n}\n\nexport class Snackbar extends Component {\n state = {\n snacks: [],\n };\n\n pollingId;\n\n paused = false;\n\n pauseLifespan;\n\n resumeLifespan;\n\n componentDidMount() {\n this.initializePolling();\n }\n\n componentDidUpdate() {\n if (!this.pauseLifespan) {\n this.pauseLifespan = (_event) => {\n this.paused = true;\n };\n\n this.resumeLifespan = (event) => {\n event.stopPropagation();\n this.paused = false;\n };\n\n this.element.addEventListener('mouseover', this.pauseLifespan);\n this.element.addEventListener('mouseout', this.resumeLifespan, true);\n }\n }\n\n componentWillUnmount() {\n if (this.element) {\n this.element.removeEventListener('mouseover', this.pauseLifespan);\n this.element.addEventListener('mouseout', this.resumeLifespan);\n }\n }\n\n initializePolling() {\n const { pollingTime, lifespan } = this.props;\n\n this.pollingId = setInterval(() => {\n if (snackbarItems.length > 0) {\n // Need to add the lifespan to snackbar items because each second that goes by, we\n // decrease the lifespan until it is no more.\n const newSnacks = snackbarItems.map((snackbarItem) => ({\n ...snackbarItem,\n lifespan,\n }));\n\n snackbarItems = [];\n\n this.updateSnackbarItems(newSnacks);\n\n // Start the lifespan countdowns for each new snackbar item.\n newSnacks.forEach((snack) => {\n // eslint-disable-next-line no-param-reassign\n snack.lifespanTimeoutId = setTimeout(() => {\n this.decreaseLifespan(snack);\n }, 1000);\n\n if (snack.addCloseButton) {\n // Adds an optional close button if addDefaultACtion is true.\n snack.actions.push({\n text: 'Dismiss',\n handler: () => {\n this.setState((prevState) => {\n return {\n prevState,\n snacks: prevState.snacks.filter(\n (potentialSnackToFilterOut) =>\n potentialSnackToFilterOut !== snack,\n ),\n };\n });\n },\n });\n }\n });\n }\n }, pollingTime);\n }\n\n updateSnackbarItems(newSnacks) {\n this.setState((prevState) => {\n let updatedSnacks = [...prevState.snacks, ...newSnacks];\n\n if (updatedSnacks.length > 3) {\n const snacksToBeDiscarded = updatedSnacks.slice(\n 0,\n updatedSnacks.length - 3,\n );\n\n snacksToBeDiscarded.forEach(({ lifespanTimeoutId }) => {\n clearTimeout(lifespanTimeoutId);\n });\n\n updatedSnacks = updatedSnacks.slice(updatedSnacks.length - 3);\n }\n\n return { ...prevState, snacks: updatedSnacks };\n });\n }\n\n decreaseLifespan(snack) {\n /* eslint-disable no-param-reassign */\n if (!this.paused && snack.lifespan === 0) {\n clearTimeout(snack.lifespanTimeoutId);\n\n this.setState((prevState) => {\n const snacks = prevState.snacks.filter(\n (currentSnack) => currentSnack !== snack,\n );\n\n return {\n ...prevState,\n snacks,\n };\n });\n\n return;\n }\n\n if (!this.paused) {\n snack.lifespan -= 1;\n }\n\n snack.lifespanTimeoutId = setTimeout(() => {\n this.decreaseLifespan(snack);\n }, 1000);\n /* eslint-enable no-param-reassign */\n }\n\n render() {\n const { snacks } = this.state;\n\n return (\n 0 ? 'crayons-snackbar' : 'hidden'}\n ref={(element) => {\n this.element = element;\n }}\n >\n {snacks.map(({ message, actions = [] }, index) => (\n \n ))}\n \n );\n }\n}\n\nSnackbar.defaultProps = {\n lifespan: 5,\n pollingTime: 300,\n};\n\nSnackbar.displayName = 'Snackbar';\n\nSnackbar.propTypes = {\n lifespan: PropTypes.number,\n pollingTime: PropTypes.number,\n};\n","import { initializeDropdown } from './dropdownUtils';\n\nexport function setupBillboardDropdown() {\n const sponsorshipDropdownButtons = document.querySelectorAll(\n 'button[id^=sponsorship-dropdown-trigger-]',\n );\n if (sponsorshipDropdownButtons.length) {\n sponsorshipDropdownButtons.forEach((sponsorshipDropdownButton) => {\n amendBillboardStyle(sponsorshipDropdownButton);\n\n const dropdownContentId =\n sponsorshipDropdownButton.getAttribute('aria-controls');\n if (\n sponsorshipDropdownButton &&\n sponsorshipDropdownButton.dataset.initialized !== 'true'\n ) {\n initializeDropdown({\n triggerElementId: sponsorshipDropdownButton.id,\n dropdownContentId,\n });\n\n sponsorshipDropdownButton.dataset.initialized = 'true';\n }\n });\n }\n}\n\n/**\n * If the billboard container height is less than 220px, then we revert the overflow-y property\n given by the billboard class so that the dropdown does not scroll within the container\n */\nfunction amendBillboardStyle(sponsorshipDropdownButton) {\n if (sponsorshipDropdownButton.closest('.js-billboard').clientHeight < 220) {\n sponsorshipDropdownButton.closest('.js-billboard').style.overflowY =\n 'revert';\n }\n}\n","import ahoy from 'ahoy.js';\n\n// * Create an ahoy event that will track a click on the\n// * passed in element.\n// *\n// * @param {string} elementId A unique identifier to identify the element that is being tracked\n// */\nexport function trackCommentClicks(elementId) {\n document\n .getElementById(elementId)\n ?.addEventListener('click', ({ target }) => {\n const relevantNode = getTrackingNode(target, '[data-tracking-name]');\n\n if (relevantNode) {\n ahoy.track('Comment section click', {\n page: location.href,\n element: relevantNode.dataset?.trackingName,\n });\n }\n });\n}\n\n// * Create an ahoy event that will track a click on the\n// * passed in element.\n// *\n// * @param {string} elementId A unique identifier to identify the element that is being tracked\n// */\nexport function trackCreateAccountClicks(elementId) {\n document\n .getElementById(elementId)\n ?.addEventListener('click', ({ target }) => {\n const relevantNode = getTrackingNode(target, '[data-tracking-id]');\n if (relevantNode) {\n ahoy.track('Clicked on Create Account', {\n version: 0.1,\n page: location.href,\n source: relevantNode.dataset?.trackingSource,\n });\n }\n });\n}\n\nfunction getTrackingNode(target, trackingElement) {\n // We check for any parent container with a trackingElement attribute, as otherwise\n // SVGs inside buttons can cause events to be missed\n const relevantNode = target.closest(trackingElement);\n return relevantNode;\n}\n","import { h } from 'preact';\nimport PropTypes from 'prop-types';\nimport { Icon, ButtonNew as Button } from '@crayons';\nimport { Close } from '@images/x.svg';\n\n/**\n * Responsible for the layout of a selected item in the crayons autocomplete and multi input components\n *\n * @param {string} name The selected item name\n * @param {string} buttonVariant Optional button variant\n * @param {string} className Optional classname for selected item\n * @param {Function} onEdit Callback for edit click on the name of the selected item\n * @param {Function} onDeselect Callback for deselect click on the close icon\n */\nexport const DefaultSelectionTemplate = ({\n name,\n enableValidation = false,\n valid = true,\n buttonVariant = 'default',\n className = 'c-autocomplete--multi__selected',\n onEdit,\n onDeselect,\n}) => {\n const conditionalAttributes = () => {\n if (enableValidation) {\n return { 'aria-describedby': `invalid-item-${name}` };\n }\n return {};\n };\n\n return (\n <>\n {enableValidation && (\n \n {!valid ? 'Invalid entry' : ''}\n \n )}\n
\n \n {name}\n \n \n \n \n
\n \n );\n};\n\nDefaultSelectionTemplate.propTypes = {\n name: PropTypes.string.isRequired,\n buttonVariant: PropTypes.string,\n className: PropTypes.string,\n onEdit: PropTypes.func.isRequired,\n onDeselect: PropTypes.func.isRequired,\n};\n","/* eslint-disable jsx-a11y/interactive-supports-focus, jsx-a11y/role-has-required-aria-props */\n// Disabled due to the linter being out of date for combobox role: https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/issues/789\nimport { h, Fragment } from 'preact';\nimport PropTypes from 'prop-types';\nimport { useEffect, useRef, useReducer } from 'preact/hooks';\nimport { DefaultSelectionTemplate } from '../../shared/components/defaultSelectionTemplate';\n\nconst KEYS = {\n UP: 'ArrowUp',\n DOWN: 'ArrowDown',\n ENTER: 'Enter',\n ESCAPE: 'Escape',\n DELETE: 'Backspace',\n COMMA: ',',\n SPACE: ' ',\n};\n\nconst ALLOWED_CHARS_REGEX = /([a-zA-Z0-9])/;\nconst PLACEHOLDER_SELECTIONS_MADE = 'Add another...';\n\nconst reducer = (state, action) => {\n switch (action.type) {\n case 'setSelectedItems':\n return {\n ...state,\n selectedItems: action.payload.selectedItems,\n suggestions: action.payload.suggestions ?? state.suggestions,\n activeDescendentIndex: null,\n };\n case 'setSuggestions':\n return {\n ...state,\n suggestions: action.payload,\n activeDescendentIndex: null,\n };\n case 'updateEditState':\n return {\n ...state,\n editValue: action.payload.editValue,\n inputPosition: action.payload.inputPosition,\n };\n case 'setActiveDescendentIndex':\n return { ...state, activeDescendentIndex: action.payload };\n case 'setIgnoreBlur':\n return { ...state, ignoreBlur: action.payload };\n case 'setShowMaxSelectionsReached':\n return { ...state, showMaxSelectionsReached: action.payload };\n default:\n return state;\n }\n};\n\n/**\n * Component allowing users to search and select multiple values\n *\n * @param {Object} props\n * @param {string} props.labelText The text for the input's label\n * @param {boolean} props.showLabel Whether the label text should be visible or hidden (for assistive tech users only)\n * @param {Function} props.fetchSuggestions Callback function which accepts the search term string and returns an array of suggestions\n * @param {Array} props.defaultValue Array of items which should be selected by default\n * @param {Array} props.staticSuggestions Array of items which should be suggested if no search term has been entered yet\n * @param {string} props.staticSuggestionsHeading Optional heading to display when static suggestions are rendered\n * @param {boolean} props.border Whether to show a bordered input\n * @param {string} props.placeholder Input placeholder text\n * @param {string} props.inputId ID to be applied to the input element\n * @param {number} props.maxSelections Optional maximum number of allowed selections\n * @param {Function} props.onSelectionsChanged Callback for when selections are added or removed\n * @param {Function} props.onFocus Callback for when the component receives focus\n * @param {boolean} props.allowUserDefinedSelections Whether a user can create new selections other than the defined suggestions\n * @param {Function} props.SuggestionTemplate Optional Preact component to render suggestion items\n * @param {Function} props.SelectionTemplate Optional Preact component to render selected items\n */\nexport const MultiSelectAutocomplete = ({\n labelText,\n showLabel = true,\n fetchSuggestions,\n defaultValue = [],\n staticSuggestions = [],\n staticSuggestionsHeading,\n border = true,\n placeholder = 'Add...',\n inputId,\n maxSelections,\n onSelectionsChanged,\n onFocus,\n allowUserDefinedSelections = false,\n SuggestionTemplate,\n SelectionTemplate = DefaultSelectionTemplate,\n}) => {\n const [state, dispatch] = useReducer(reducer, {\n suggestions: [],\n selectedItems: defaultValue,\n inputPosition: null,\n editValue: null,\n activeDescendentIndex: null,\n ignoreBlur: false,\n showMaxSelectionsReached: false,\n });\n\n const {\n selectedItems,\n suggestions,\n inputPosition,\n editValue,\n activeDescendentIndex,\n ignoreBlur,\n showMaxSelectionsReached,\n } = state;\n\n const inputRef = useRef(null);\n const inputSizerRef = useRef(null);\n const selectedItemsRef = useRef(null);\n const popoverRef = useRef(null);\n\n const allowSelections =\n !maxSelections || selectedItems.length < maxSelections;\n\n useEffect(() => {\n if (defaultValue.length > 0) {\n dispatch({\n type: 'setSelectedItems',\n payload: {\n selectedItems: defaultValue,\n },\n });\n }\n }, [defaultValue]);\n\n const handleInputBlur = () => {\n dispatch({ type: 'setShowMaxSelectionsReached', payload: false });\n\n const {\n current: { value: currentValue },\n } = inputRef;\n\n // The input will blur when user selects an option from the dropdown via mouse click. The ignoreBlur boolean lets us know we can ignore this event.\n if (!ignoreBlur && allowSelections && currentValue !== '') {\n selectByText({ textValue: currentValue, keepSelecting: false });\n return;\n }\n if (!ignoreBlur) {\n // Clear the suggestions if a genuine blur event\n dispatch({ type: 'setSuggestions', payload: [] });\n }\n exitEditState({ keepSelecting: false });\n dispatch({ type: 'setIgnoreBlur', payload: false });\n };\n\n useEffect(() => {\n // editValue defaults to null when component is first rendered.\n // This ensures we do not autofocus the input before the user has started interacting with the component.\n if (editValue === null) {\n return;\n }\n\n const { current: input } = inputRef;\n if (input && inputPosition !== null) {\n // Entering 'edit' mode\n resizeInputToContentSize();\n\n input.value = editValue;\n const { length: cursorPosition } = editValue;\n\n input.focus();\n input.setSelectionRange(cursorPosition, cursorPosition);\n\n // Trigger the input event to make sure suggestion UI updates correctly\n const changeEvent = new Event('input');\n input.dispatchEvent(changeEvent);\n }\n }, [inputPosition, editValue]);\n\n useEffect(() => {\n if (activeDescendentIndex !== null) {\n const { current: popover } = popoverRef;\n const activeItem = popover?.querySelector('[aria-selected=\"true\"]');\n if (!popover || !activeItem) {\n return;\n }\n\n // Make sure that the active item is scrolled into view, if need be\n const { offsetHeight, offsetTop } = activeItem;\n const { offsetHeight: popoverOffsetHeight, scrollTop } = popover;\n\n const isAbove = offsetTop < scrollTop;\n const isBelow =\n offsetTop + offsetHeight > scrollTop + popoverOffsetHeight;\n\n if (isAbove) {\n popover.scrollTo(0, offsetTop);\n } else if (isBelow) {\n popover.scrollTo(0, offsetTop - popoverOffsetHeight + offsetHeight);\n }\n }\n }, [activeDescendentIndex]);\n\n const selectByText = ({\n textValue,\n nextInputValue = '',\n keepSelecting = true,\n }) => {\n const matchingSuggestion = suggestions.find(\n (suggestion) => suggestion.name === textValue,\n );\n\n if (matchingSuggestion) {\n selectItem({\n selectedItem: matchingSuggestion,\n nextInputValue,\n keepSelecting,\n });\n return;\n }\n\n // If we allow user's own input as a selection, fallback to that\n if (allowUserDefinedSelections) {\n selectItem({\n selectedItem: { name: textValue },\n nextInputValue,\n keepSelecting,\n });\n return;\n }\n\n // If we couldn't select any valid input, and search is terminated, clear the input\n if (!keepSelecting) {\n inputRef.current.value = '';\n dispatch('setSuggestions', { payload: [] });\n }\n };\n\n const enterEditState = (editItem, editItemIndex) => {\n inputSizerRef.current.innerText = editItem.name;\n deselectItem(editItem);\n\n dispatch({\n type: 'updateEditState',\n payload: {\n editValue: editItem.name,\n inputPosition: editItemIndex,\n },\n });\n };\n\n const exitEditState = ({ nextInputValue = '', keepSelecting = true }) => {\n // Reset 'edit mode' input resizing\n inputRef.current?.style?.removeProperty('width');\n inputSizerRef.current.innerText = nextInputValue;\n\n dispatch({\n type: 'updateEditState',\n payload: {\n editValue: nextInputValue,\n inputPosition: nextInputValue === '' ? null : inputPosition + 1,\n },\n });\n\n // Blurring away while clearing the input\n if (!keepSelecting && nextInputValue === '') {\n inputRef.current.value = '';\n }\n };\n\n const resizeInputToContentSize = () => {\n const { current: input } = inputRef;\n\n if (input) {\n input.style.width = `${inputSizerRef.current.clientWidth}px`;\n }\n };\n\n const handleAutocompleteStart = () => {\n // Only show static suggestions when not in edit mode\n if (inputPosition !== null) {\n return;\n }\n\n // If we've already reached max selections, show the message rather than static suggestions\n if (!allowSelections) {\n dispatch({ type: 'setShowMaxSelectionsReached', payload: true });\n return;\n }\n\n // If we have static suggestions, and no search term, show the static suggestions\n if (staticSuggestions.length > 0 && inputRef.current?.value === '') {\n dispatch({\n type: 'setSuggestions',\n payload: staticSuggestions.filter(\n (item) =>\n !selectedItems.some(\n (selectedItem) => selectedItem.name === item.name,\n ),\n ),\n });\n }\n };\n\n const handleInputChange = async ({ target: { value } }) => {\n // When the input appears inline in \"edit\" mode, we need to dynamically calculate the width to ensure it occupies the right space\n // (an input cannot resize based on its text content). We use a hidden to track the size.\n inputSizerRef.current.innerText = value;\n\n if (inputPosition !== null) {\n resizeInputToContentSize();\n }\n\n // If max selections have already been reached, no need to fetch further suggestions\n if (!allowSelections) {\n return;\n }\n\n if (value === '') {\n dispatch({\n type: 'setSuggestions',\n payload: staticSuggestions.filter(\n (item) =>\n !selectedItems.some(\n (selectedItem) => selectedItem.name === item.name,\n ),\n ),\n });\n return;\n }\n\n const results = await fetchSuggestions(value);\n\n // It could be that while waiting on the network fetch, the user has already made a selection or otherwise cleared the input\n if (inputRef.current.value === '') {\n return;\n }\n\n // If no results, and user-generated selections are allowed, display current search term as an option\n if (allowUserDefinedSelections && results.length === 0 && value !== '') {\n results.push({ name: value });\n }\n\n dispatch({\n type: 'setSuggestions',\n payload: results.filter(\n (item) =>\n !selectedItems.some(\n (selectedItem) => selectedItem.name === item.name,\n ),\n ),\n });\n };\n\n const clearInput = () => {\n inputRef.current.value = '';\n dispatch({ type: 'setSuggestions', payload: [] });\n };\n\n const handleKeyDown = (e) => {\n const { selectionStart, value: currentValue } = inputRef.current;\n\n switch (e.key) {\n case KEYS.DOWN:\n e.preventDefault();\n\n if (\n activeDescendentIndex !== null &&\n activeDescendentIndex < suggestions.length - 1\n ) {\n dispatch({\n type: 'setActiveDescendentIndex',\n payload: activeDescendentIndex + 1,\n });\n } else {\n dispatch({ type: 'setActiveDescendentIndex', payload: 0 });\n }\n break;\n case KEYS.UP:\n e.preventDefault();\n\n dispatch({\n type: 'setActiveDescendentIndex',\n payload:\n activeDescendentIndex >= 1\n ? activeDescendentIndex - 1\n : suggestions.length - 1,\n });\n\n break;\n case KEYS.ENTER:\n e.preventDefault();\n if (activeDescendentIndex !== null) {\n selectItem({ selectedItem: suggestions[activeDescendentIndex] });\n }\n break;\n case KEYS.ESCAPE:\n e.preventDefault();\n // Clear the input and suggestions\n clearInput();\n break;\n case KEYS.COMMA:\n case KEYS.SPACE:\n e.preventDefault();\n // Accept whatever is in the input before the comma or space.\n // If any text remains after the comma or space, the edit will continue separately\n if (currentValue !== '' && allowSelections) {\n selectByText({\n textValue: currentValue.slice(0, selectionStart),\n nextInputValue: currentValue.slice(selectionStart),\n });\n }\n break;\n case KEYS.DELETE:\n if (currentValue === '') {\n e.preventDefault();\n editPreviousSelectionIfExists();\n }\n break;\n default:\n if (!ALLOWED_CHARS_REGEX.test(e.key)) {\n e.preventDefault();\n }\n }\n };\n\n // If there is a previous selection, then pop it into edit mode\n const editPreviousSelectionIfExists = () => {\n if (selectedItems.length > 0 && inputPosition !== 0) {\n const nextEditIndex =\n inputPosition !== null ? inputPosition - 1 : selectedItems.length - 1;\n\n const item = selectedItems[nextEditIndex];\n deselectItem(item);\n enterEditState(item, nextEditIndex);\n }\n };\n\n const getEmptyInputSuggestions = ({ currentSelections = selectedItems }) => {\n if (staticSuggestions.length > 0) {\n return staticSuggestions.filter(\n (suggestion) =>\n !currentSelections.some(\n (selection) => selection.name === suggestion.name,\n ),\n );\n }\n\n return [];\n };\n\n const selectItem = ({\n selectedItem,\n nextInputValue = '',\n keepSelecting = true,\n }) => {\n // If a user has manually typed an item already selected, reset\n if (selectedItems.some((item) => item.name === selectedItem.name)) {\n clearInput();\n return;\n }\n\n // If an item was edited, we want to keep it in the same position in the list\n const insertIndex =\n inputPosition !== null ? inputPosition : selectedItems.length;\n const newSelections = [\n ...selectedItems.slice(0, insertIndex),\n selectedItem,\n ...selectedItems.slice(insertIndex),\n ];\n\n // We update the hidden selected items list, so additions are announced to screen reader users\n const listItem = document.createElement('li');\n listItem.innerText = selectedItem.name;\n selectedItemsRef.current.appendChild(listItem);\n\n exitEditState({ nextInputValue, keepSelecting });\n\n dispatch({\n type: 'setSelectedItems',\n payload: {\n selectedItems: newSelections,\n suggestions: keepSelecting\n ? getEmptyInputSuggestions({\n currentSelections: newSelections,\n })\n : [],\n },\n });\n\n onSelectionsChanged?.(newSelections);\n\n // Clear the text input\n const { current: input } = inputRef;\n input.value = nextInputValue;\n\n if (keepSelecting) {\n dispatch({\n type: 'setShowMaxSelectionsReached',\n payload: maxSelections && newSelections.length >= maxSelections,\n });\n\n // setTimeout is used with no delay here to make sure this focus event is executed in the next event cycle.\n // selectItem() happens on mousedown rather than click, because mousedown is handled before the blur event, and we\n // want to ignore some blur events (i.e. when input blurs because user has clicked a dropdown option).\n // By using setTimeout, we make sure that the normal blur event is handled before we try to refocus the input.\n setTimeout(() => {\n input.focus();\n });\n }\n };\n\n const deselectItem = (deselectedItem) => {\n const newSelections = selectedItems.filter(\n (item) => item.name !== deselectedItem.name,\n );\n dispatch({\n type: 'setSelectedItems',\n payload: {\n selectedItems: newSelections,\n suggestions,\n },\n });\n\n dispatch({\n type: 'setShowMaxSelectionsReached',\n payload: maxSelections && newSelections.length >= maxSelections,\n });\n\n onSelectionsChanged?.(newSelections);\n\n // We also update the hidden selected items list, so removals are announced to screen reader users\n selectedItemsRef.current.querySelectorAll('li').forEach((selectionNode) => {\n if (selectionNode.innerText === deselectedItem.name) {\n selectionNode.remove();\n }\n });\n };\n\n const allSelectedItemElements = selectedItems.map((item, index) => {\n // When we are in \"edit mode\" we visually display the input between the other selections\n const defaultPosition = index + 1;\n const appearsBeforeInput = inputPosition === null || index < inputPosition;\n const position = appearsBeforeInput ? defaultPosition : defaultPosition + 1;\n\n const { name: displayName } = item;\n return (\n \n enterEditState(item, index)}\n onDeselect={() => deselectItem(item)}\n />\n \n );\n });\n\n const selectionsPlaceholder =\n selectedItems.length > 0 ? PLACEHOLDER_SELECTIONS_MADE : placeholder;\n\n const inputPlaceholder = allowSelections ? selectionsPlaceholder : null;\n\n return (\n \n \n \n {labelText}\n \n \n {maxSelections ? `Maximum ${maxSelections} selections` : ''}\n \n\n {/* A visually hidden list provides confirmation messages to screen reader users as an item is selected or removed */}\n
\n

Selected items:

\n \n
\n\n
\n {/* disabled as the inner input forms the tab stop (this click handler ensures _any_ click on the wrapper focuses the input which may be less wide) */}\n {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events */}\n 0}\n aria-owns=\"listbox1\"\n className={`c-autocomplete--multi__wrapper${\n border ? '-border crayons-textfield' : ' border-none p-0'\n } flex items-center cursor-text`}\n onClick={(event) => {\n // Stopping propagation here so that clicks on the 'x' close button\n // don't appear to be \"outside\" of any container (eg, dropdown)\n event.stopPropagation();\n inputRef.current?.focus();\n }}\n >\n
    \n {allSelectedItemElements}\n\n \n {\n onFocus?.(e);\n handleAutocompleteStart();\n }}\n placeholder={inputPosition === null ? inputPlaceholder : null}\n />\n \n
\n
\n {showMaxSelectionsReached ? (\n
\n Only {maxSelections} selections allowed\n
\n ) : null}\n {suggestions.length > 0 && allowSelections ? (\n
\n {inputRef.current?.value === '' ? staticSuggestionsHeading : null}\n \n {suggestions.map((suggestion, index) => {\n const { name: suggestionDisplayName } = suggestion;\n return (\n {\n selectItem({ selectedItem: suggestion });\n dispatch({ type: 'setIgnoreBlur', payload: true });\n }}\n >\n {SuggestionTemplate ? (\n \n ) : (\n suggestionDisplayName\n )}\n \n );\n })}\n \n
\n ) : null}\n \n
\n );\n};\n\nconst optionPropType = PropTypes.shape({ name: PropTypes.string });\n\nMultiSelectAutocomplete.propTypes = {\n labelText: PropTypes.string.isRequired,\n showLabel: PropTypes.bool,\n fetchSuggestions: PropTypes.func.isRequired,\n defaultValue: PropTypes.arrayOf(optionPropType),\n staticSuggestions: PropTypes.arrayOf(optionPropType),\n staticSuggestionsHeading: PropTypes.oneOfType([\n PropTypes.element,\n PropTypes.string,\n ]),\n border: PropTypes.bool,\n placeholder: PropTypes.string,\n inputId: PropTypes.string,\n maxSelections: PropTypes.number,\n onSelectionsChanged: PropTypes.func,\n onFocus: PropTypes.func,\n SuggestionTemplate: PropTypes.func,\n SelectionTemplate: PropTypes.func,\n};\n","export * from './Button';\n","import { h } from 'preact';\nimport PropTypes from 'prop-types';\nimport { useState } from 'preact/hooks';\nimport classNames from 'classnames/bind';\nimport { defaultChildrenPropTypes } from '../../common-prop-types/default-children-prop-types';\nimport { Icon } from '@crayons';\n\nexport const ButtonNew = (props) => {\n const {\n children,\n variant = 'default',\n icon,\n rounded,\n destructive,\n type = 'button',\n className,\n tooltip,\n onKeyUp,\n ...otherProps\n } = props;\n\n const [suppressTooltip, setSuppressTooltip] = useState(false);\n\n const handleKeyUp = (event) => {\n onKeyUp?.(event);\n if (!tooltip) {\n return;\n }\n setSuppressTooltip(event.key === 'Escape');\n };\n\n const classes = classNames('c-btn', {\n [`c-btn--${variant}`]: variant && variant !== 'default',\n 'c-btn--destructive': destructive && variant !== 'secondary',\n 'c-btn--icon-left': icon && children,\n 'c-btn--icon-alone': icon && !children,\n 'crayons-tooltip__activator': tooltip,\n 'radius-full': rounded,\n [className]: className,\n });\n\n return (\n \n {icon && (\n \n )}\n {children}\n {tooltip ? (\n \n {tooltip}\n
\n ) : null}\n \n );\n};\n\nButtonNew.displayName = 'ButtonNew';\n\nButtonNew.propTypes = {\n children: defaultChildrenPropTypes,\n variant: PropTypes.oneOf(['default', 'primary', 'secondary']),\n rounded: PropTypes.bool,\n destructive: PropTypes.bool,\n type: PropTypes.oneOf(['button', 'submit']),\n className: PropTypes.string,\n tooltip: PropTypes.oneOfType([PropTypes.string, PropTypes.node]),\n onKeyUp: PropTypes.func,\n icon: PropTypes.elementType,\n};\n","import { h } from 'preact';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames/bind';\nimport { defaultChildrenPropTypes } from '../../common-prop-types/default-children-prop-types';\nimport { Icon } from '@crayons';\n\nexport const Link = (props) => {\n const {\n children,\n href = '#',\n variant = 'default',\n block,\n icon,\n rounded,\n className,\n ...otherProps\n } = props;\n\n const classes = classNames('c-link', {\n [`c-link--${variant}`]: variant && variant !== 'default',\n 'c-link--icon-left': icon && children,\n 'c-link--icon-alone': icon && !children,\n 'c-link--block': block,\n 'radius-full': rounded,\n [className]: className,\n });\n\n return (\n \n {icon && (\n \n )}\n {children}\n \n );\n};\n\nLink.displayName = 'Link';\n\nLink.propTypes = {\n variant: PropTypes.oneOf(['default', 'branded']),\n block: PropTypes.bool,\n rounded: PropTypes.bool,\n href: PropTypes.string.isRequired,\n className: PropTypes.string,\n children: defaultChildrenPropTypes,\n icon: PropTypes.elementType,\n};\n","import { h } from 'preact';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames/bind';\nimport { defaultChildrenPropTypes } from '../../common-prop-types/default-children-prop-types';\nimport { Icon } from '@crayons';\n\nexport const CTA = (props) => {\n const {\n children,\n href = '#',\n variant = 'default',\n icon,\n className,\n ...otherProps\n } = props;\n\n const classes = classNames('c-cta', {\n [`c-cta--${variant}`]: variant && variant !== 'default',\n 'c-cta--icon-left': icon && children,\n [className]: className,\n });\n\n return (\n \n {icon && (\n \n )}\n {children}\n \n );\n};\n\nCTA.displayName = 'CTA';\n\nCTA.propTypes = {\n variant: PropTypes.oneOf(['default', 'branded']),\n rounded: PropTypes.bool,\n href: PropTypes.string.isRequired,\n className: PropTypes.string,\n children: defaultChildrenPropTypes.isRequired,\n icon: PropTypes.elementType,\n};\n","import { h } from 'preact';\nimport PropTypes from 'prop-types';\nimport { defaultChildrenPropTypes } from '../../common-prop-types/default-children-prop-types';\n\n/**\n * Used to group related buttons together\n *\n * @param {string} labelText Used to form the aria-label providing to assistive technologies to describe the control\n * @param {HTMLElement[]} children The buttons rendered inside the group\n */\nexport const ButtonGroup = ({ children, labelText }) => (\n
\n {children}\n
\n);\n\nButtonGroup.displayName = 'ButtonGroup';\n\nButtonGroup.propTypes = {\n children: defaultChildrenPropTypes,\n labelText: PropTypes.string.isRequired,\n};\n","import { h } from 'preact';\nimport { useLayoutEffect, useState } from 'preact/hooks';\nimport PropTypes from 'prop-types';\nimport { defaultChildrenPropTypes } from '../../common-prop-types/default-children-prop-types';\nimport { initializeDropdown } from '@utilities/dropdownUtils';\n\n/**\n * A component to render a dropdown with the provided children.\n * This component handles the attachment of all open/close click events and listeners.\n *\n * @param {Object} props\n * @param {Array} props.children Children to be rendered inside the dropdown, passed via composition\n * @param {String} props.className Optional string of classnames to be applied to the dropdown (e.g for positioning)\n * @param {String} props.triggerButtonId The ID of the button element which should open and close the dropdown\n * @param {String} props.dropdownContentId The ID to be applied to the dropdown itself\n * @param {String} props.dropdownContentCloseButtonId An optional ID for any button inside the dropdown content itself which should close it\n * @param {Function} props.onOpen Optional callback for any side-effects needed when the dropdown opens\n * @param {Function} props.onClose Optional callback for any side-effects needed when the dropdown closes\n *\n * @example\n *
\n * \n * \n * {dropdownInnerContent}\n * \n *
\n */\nexport const Dropdown = ({\n children,\n className,\n triggerButtonId,\n dropdownContentId,\n dropdownContentCloseButtonId,\n onOpen = () => {},\n onClose = () => {},\n ...restOfProps\n}) => {\n const [isInitialized, setIsInitialized] = useState(false);\n useLayoutEffect(() => {\n if (!isInitialized) {\n initializeDropdown({\n triggerElementId: triggerButtonId,\n dropdownContentId,\n dropdownContentCloseButtonId,\n onOpen,\n onClose,\n });\n\n setIsInitialized(true);\n }\n }, [\n dropdownContentId,\n triggerButtonId,\n dropdownContentCloseButtonId,\n isInitialized,\n onOpen,\n onClose,\n ]);\n\n return (\n 0 ? ` ${className}` : ''\n }`}\n {...restOfProps}\n >\n {children}\n \n );\n};\n\nDropdown.defaultProps = {\n className: undefined,\n};\n\nDropdown.displayName = 'Dropdown';\n\nDropdown.propTypes = {\n children: defaultChildrenPropTypes.isRequired,\n className: PropTypes.string,\n triggerButtonId: PropTypes.string.isRequired,\n dropdownContentId: PropTypes.string.isRequired,\n dropdownContentCloseButtonId: PropTypes.string,\n onOpen: PropTypes.func,\n onClose: PropTypes.func,\n};\n","import { h } from 'preact';\nimport PropTypes from 'prop-types';\nimport { defaultChildrenPropTypes } from '../../../common-prop-types';\n\n// Only radio and checkboxes require an additional CSS class (variant class). Other form elements do not.\n\nexport const FormField = ({ children, variant }) => {\n return (\n 0 ? ` crayons-field--${variant}` : ''\n }`}\n >\n {children}\n \n );\n};\n\nFormField.displayName = 'FormField';\n\nFormField.defaultProps = {\n variant: undefined,\n};\n\nFormField.propTypes = {\n children: defaultChildrenPropTypes.isRequired,\n variant: PropTypes.oneOf(['radio', 'checkbox']),\n};\n","import { h } from 'preact';\nimport PropTypes from 'prop-types';\n\nexport const RadioButton = (props) => {\n const { id, value, name, className, checked, onClick, ...otherProps } = props;\n\n return (\n 0 ? ` ${className}` : ''\n }`}\n checked={checked}\n onClick={onClick}\n type=\"radio\"\n {...otherProps}\n />\n );\n};\n\nRadioButton.displayName = 'RadioButton';\n\nRadioButton.defaultProps = {\n id: undefined,\n className: undefined,\n checked: false,\n name: undefined,\n};\n\nRadioButton.propTypes = {\n id: PropTypes.string,\n value: PropTypes.string.isRequired,\n className: PropTypes.string,\n checked: PropTypes.bool,\n name: PropTypes.string,\n onClick: PropTypes.func.isRequired,\n};\n","import { h, Fragment } from 'preact';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { useState, useLayoutEffect } from 'preact/hooks';\nimport { HexColorPicker, HexColorInput } from 'react-colorful';\nimport { initializeDropdown } from '@utilities/dropdownUtils';\nimport { ButtonNew as Button } from '@crayons';\n\nconst convertThreeCharHexToSix = (hex) => {\n const r = hex.charAt(1);\n const g = hex.charAt(2);\n const b = hex.charAt(3);\n\n return `#${r}${r}${g}${g}${b}${b}`;\n};\n\nexport const ColorPicker = ({\n id,\n buttonLabelText,\n defaultValue,\n inputProps,\n onChange,\n onBlur,\n}) => {\n // Ternary has been used here to guard against an empty string being passed as default value\n const [color, setColor] = useState(defaultValue ? defaultValue : '#000');\n\n const buttonId = `color-popover-btn-${id}`;\n const popoverId = `color-popover-${id}`;\n\n useLayoutEffect(() => {\n initializeDropdown({\n triggerElementId: buttonId,\n dropdownContentId: popoverId,\n });\n }, [buttonId, popoverId]);\n\n // Hex codes may validly be represented by three characters, where r, g, b are all repeated,\n // e.g. #0D6 === #00DD66. To make sure that all color codes can be handled consistently through our app,\n // we convert any shorthand hex codes to their full 6 char representation.\n const handleBlur = () => {\n // Color always includes a leading '#', hence a length of 4\n if (color.length === 4) {\n const fullHexCode = convertThreeCharHexToSix(color);\n setColor(fullHexCode);\n onChange?.(fullHexCode);\n }\n };\n\n return (\n \n
\n \n {\n onChange?.(color);\n setColor(color);\n }}\n onBlur={(e) => {\n onBlur?.(e);\n handleBlur();\n }}\n prefixed\n />\n \n {\n onChange?.(color);\n setColor(color);\n }}\n />\n
\n \n
\n );\n};\n\nColorPicker.propTypes = {\n id: PropTypes.string.isRequired,\n buttonLabelText: PropTypes.string.isRequired,\n defaultValue: PropTypes.string,\n inputProps: PropTypes.object,\n};\n","import { h } from 'preact';\n\nexport const Toggle = ({ ...otherProps }) => {\n return ;\n};\n\nToggle.displayName = 'Toggle';\n","export const MONTH_UNTIL_TODAY = 'MONTH_UNTIL_TODAY';\nexport const QUARTER_UNTIL_TODAY = 'QUARTER_UNTIL_TODAY';\nexport const YEAR_UNTIL_TODAY = 'YEAR_UNTIL_TODAY';\nexport const LAST_FULL_MONTH = 'LAST_FULL_MONTH';\nexport const LAST_FULL_QUARTER = 'LAST_FULL_QUARTER';\nexport const LAST_FULL_YEAR = 'LAST_FULL_YEAR';\n\nexport const ALL_PRESET_RANGES = [\n MONTH_UNTIL_TODAY,\n LAST_FULL_MONTH,\n QUARTER_UNTIL_TODAY,\n LAST_FULL_QUARTER,\n YEAR_UNTIL_TODAY,\n LAST_FULL_YEAR,\n];\n\nexport const RANGE_LABELS = {\n MONTH_UNTIL_TODAY: 'This month',\n QUARTER_UNTIL_TODAY: 'This quarter',\n YEAR_UNTIL_TODAY: 'This year',\n LAST_FULL_MONTH: 'Last month',\n LAST_FULL_QUARTER: 'Last quarter',\n LAST_FULL_YEAR: 'Last year',\n};\n\nconst PERIODS = {\n DAY: 'day',\n MONTH: 'month',\n QUARTER: 'quarter',\n YEAR: 'year',\n};\n\nconst getPeriodUntilToday = (today, period) => ({\n start: today.clone().startOf(period),\n end: today.clone(),\n});\n\nconst getLastFullPeriod = (today, period) => ({\n start: today.clone().subtract(1, period).startOf(period),\n end: today.clone().subtract(1, period).endOf(period),\n});\n\nexport const getDateRangeStartAndEndDates = ({ today, dateRangeName }) => {\n switch (dateRangeName) {\n case MONTH_UNTIL_TODAY:\n return getPeriodUntilToday(today, PERIODS.MONTH);\n case LAST_FULL_MONTH:\n return getLastFullPeriod(today, PERIODS.MONTH);\n case QUARTER_UNTIL_TODAY:\n return getPeriodUntilToday(today, PERIODS.QUARTER);\n case LAST_FULL_QUARTER:\n return getLastFullPeriod(today, PERIODS.QUARTER);\n case YEAR_UNTIL_TODAY:\n return getPeriodUntilToday(today, PERIODS.YEAR);\n case LAST_FULL_YEAR:\n return getLastFullPeriod(today, PERIODS.YEAR);\n }\n};\n","import { h } from 'preact';\nimport PropTypes from 'prop-types';\nimport { useState, useLayoutEffect, useEffect } from 'preact/hooks';\nimport 'react-dates/initialize';\nimport moment from 'moment';\nimport { DateRangePicker as ReactDateRangePicker } from 'react-dates';\nimport defaultPhrases from 'react-dates/lib/defaultPhrases';\nimport {\n START_DATE,\n ICON_BEFORE_POSITION,\n VERTICAL_ORIENTATION,\n HORIZONTAL_ORIENTATION,\n} from 'react-dates/constants';\nimport { getDateRangeStartAndEndDates, RANGE_LABELS } from './dateRangeUtils';\nimport { Icon, ButtonNew as Button } from '@crayons';\nimport ChevronLeft from '@images/chevron-left.svg';\nimport ChevronRight from '@images/chevron-right.svg';\nimport Calendar from '@images/calendar.svg';\nimport { getCurrentLocale } from '@utilities/runtime';\nimport { useMediaQuery, BREAKPOINTS } from '@components/useMediaQuery';\n\nconst PICKER_PHRASES = {\n ...defaultPhrases,\n chooseAvailableStartDate: ({ date }) => `Choose ${date} as start date`,\n chooseAvailableEndDate: ({ date }) => `Choose ${date} as end date`,\n focusStartDate: 'Interact with the calendar and add your start date',\n invalidDateFormat: (format, errorPrefix) =>\n `${errorPrefix} must be in the format ${format}`,\n dateTooLate: (latestDate, errorPrefix) =>\n `${errorPrefix} must be on or before ${latestDate}`,\n dateTooEarly: (earliestDate, errorPrefix) =>\n `${errorPrefix} must be on or after ${earliestDate}`,\n};\n\nconst MONTH_NAMES = [...Array(12).keys()].map((key) =>\n new Date(0, key).toLocaleString('en', { month: 'long' }),\n);\n\nconst isDateOutsideOfRange = ({ date, minDate, maxDate }) =>\n !date.isBetween(minDate, maxDate);\n\n/**\n * Renders select elements allowing a user to jump to a given month/year\n * @param {Object} earliestMoment Moment object representing the earliest permitted date\n * @param {Object} latestMoment Moment object representing the latest permitted date\n * @param {Function} onMonthSelect Callback passed by react-dates library\n * @param {Function} onYearSelect Callback passed by react-dates library\n * @param {Object} month Moment object passed by react-dates library, representing the currently visible calendar\n */\nconst MonthYearPicker = ({\n earliestMoment,\n latestMoment,\n onMonthSelect,\n onYearSelect,\n month,\n}) => {\n const selectedMonth = month.month();\n const selectedYear = month.year();\n\n const latestYear = latestMoment.year();\n\n // Make sure we only display the available months for the currently selected year\n const latestMonthIndex =\n latestYear === selectedYear ? latestMoment.month() : 11;\n const availableMonths = MONTH_NAMES.slice(0, latestMonthIndex + 1);\n\n const yearsDiff = latestMoment.diff(earliestMoment, 'years');\n\n const years = [...Array(yearsDiff).keys()].map(\n (key) => latestMoment.year() - key,\n );\n years.push(earliestMoment.year());\n\n return (\n
\n onMonthSelect(month, e.target.value)}\n value={selectedMonth}\n >\n {availableMonths.map((month, index) => (\n \n ))}\n \n onYearSelect(month, e.target.value)}\n value={selectedYear}\n >\n {years.map((year) => (\n \n ))}\n \n
\n );\n};\n\n/**\n * Renders preset date ranges as 'quick select' buttons, if the range falls within the permitted dates.\n * Possible preset ranges are defined in ./dateRangeUtils.js\n *\n * @param {[string]} presetRanges The preset range names requested\n * @param {Object} earliestMoment Moment object representing earliest permitted date\n * @param {Object} latestMoment Moment object representing latest permitted date\n * @param {Function} onPresetSelected Callback which will receive start and end dates of selected preset\n * @param {Object} today Moment object representing today's date\n */\nconst PresetDateRangeOptions = ({\n presetRanges = [],\n earliestMoment,\n latestMoment,\n onPresetSelected,\n today,\n}) => {\n // Filter out any requested ranges which extend beyond the valid time period\n const presetsWithinPermittedDates = presetRanges.filter((dateRangeName) => {\n const { start: rangeStart, end: rangeEnd } = getDateRangeStartAndEndDates({\n today,\n dateRangeName,\n });\n\n return (\n rangeStart.isSameOrBefore(rangeEnd) &&\n rangeStart.isSameOrAfter(earliestMoment) &&\n rangeEnd.isSameOrBefore(latestMoment)\n );\n });\n\n if (presetsWithinPermittedDates.length === 0) {\n return null;\n }\n\n return (\n
    \n {presetsWithinPermittedDates.map((rangeName) => (\n
  • \n {\n onPresetSelected(\n getDateRangeStartAndEndDates({\n today,\n dateRangeName: rangeName,\n }),\n );\n }}\n >\n {RANGE_LABELS[rangeName]}\n \n
  • \n ))}\n
\n );\n};\n\n/**\n * Hook that will attach listeners to date range inputs and return the correct error message for each.\n * @param {Object} props\n * @param {Object} props.earliesMoment Moment object reflecting the earliest date that may be selected\n * @param {Object} props.latestMoment Moment object reflecting the latest date that may be selected\n * @param {string} props.dateFormat The expected date format, e.g. \"MM/DD/YYYY\"\n */\nconst useDateRangeValidation = ({\n earliestMoment,\n latestMoment,\n dateFormat,\n}) => {\n const [startDateInput, setStartDateInput] = useState(null);\n const [endDateInput, setEndDateInput] = useState(null);\n const [startDateError, setStartDateError] = useState('');\n const [endDateError, setEndDateError] = useState('');\n\n useEffect(() => {\n const setError = (error, inputType) =>\n inputType === 'start'\n ? setStartDateError(error ?? '')\n : setEndDateError(error ?? '');\n\n const handleBlur = ({ target: { value } }, inputType) => {\n if (value === '') {\n setError('', inputType);\n return;\n }\n\n const errorPrefix = `${inputType === 'start' ? 'Start' : 'End'} date`;\n\n const valueMoment = moment(value, dateFormat);\n if (!valueMoment.isValid()) {\n setError(\n PICKER_PHRASES.invalidDateFormat(dateFormat, errorPrefix),\n inputType,\n );\n return;\n }\n\n if (valueMoment.isBefore(earliestMoment)) {\n setError(\n PICKER_PHRASES.dateTooEarly(\n earliestMoment.format(dateFormat),\n errorPrefix,\n ),\n inputType,\n );\n return;\n }\n\n if (valueMoment.isAfter(latestMoment)) {\n setError(\n PICKER_PHRASES.dateTooLate(\n latestMoment.format(dateFormat),\n errorPrefix,\n ),\n inputType,\n );\n return;\n }\n\n // Date is valid\n setError('', inputType);\n };\n\n const handleStartBlur = (e) => handleBlur(e, 'start');\n const handleEndBlur = (e) => handleBlur(e, 'end');\n\n startDateInput?.addEventListener('blur', handleStartBlur);\n endDateInput?.addEventListener('blur', handleEndBlur);\n\n return () => {\n startDateInput?.removeEventListener('blur', handleStartBlur);\n endDateInput?.removeEventListener('blur', handleEndBlur);\n };\n }, [startDateInput, endDateInput, dateFormat, earliestMoment, latestMoment]);\n\n return { setStartDateInput, setEndDateInput, startDateError, endDateError };\n};\n\n/**\n * Used to facilitate picking a date range. This component is a wrapper around the one provided from react-dates.\n *\n * @param {Object} props\n * @param {string} props.startDateId A unique ID for the start date input\n * @param {string} props.endDateId A unique ID for the end date input\n * @param {Date} props.defaultStartDate The optional initial value for the start date\n * @param {Date} props.defaultEndDate The optional initial value for the end date\n * @param {Date} props.maxEndDate The latest date that may be selected\n * @param {Date} props.minStartDate The oldest date that may be selected\n * @param {Function} props.onDatesChanged Callback function for when dates are selected. Receives an object with startDate and endDate values.\n * @param {[string]} props.presetRanges Quick-select preset date ranges to offer in the calendar. These will only be shown if they fall within the min and max dates.\n * @param {string} props.startDateAriaLabel Custom aria-label for start date input\n * @param {string} props.endDateAriaLabel Custom aria-label for end date input\n * @param {Date} props.todaysDate Optional param to pass in today's Date, primarily for testing purposes\n */\nexport const DateRangePicker = ({\n startDateId,\n endDateId,\n defaultStartDate,\n defaultEndDate,\n maxEndDate = new Date(),\n minStartDate = new Date(),\n onDatesChanged,\n presetRanges = [],\n startDateAriaLabel,\n endDateAriaLabel,\n todaysDate = new Date(),\n}) => {\n const [focusedInput, setFocusedInput] = useState(START_DATE);\n const [startMoment, setStartMoment] = useState(\n defaultStartDate ? moment(defaultStartDate) : null,\n );\n\n const [endMoment, setEndMoment] = useState(\n defaultEndDate ? moment(defaultEndDate) : null,\n );\n\n const dateFormat =\n getCurrentLocale().toLowerCase() === 'en-us' ? 'MM/DD/YYYY' : 'DD/MM/YYYY';\n\n const useCompactLayout = useMediaQuery(\n `(max-width: ${BREAKPOINTS.Medium - 1}px)`,\n );\n\n const earliestMoment = moment(minStartDate).startOf('day');\n const latestMoment = moment(maxEndDate).endOf('day');\n\n const isMonthSameAsLatestMonth = (relevantDate) =>\n relevantDate.year() === latestMoment.year() &&\n relevantDate.month() === latestMoment.month();\n\n const today = moment(todaysDate);\n\n const { setStartDateInput, setEndDateInput, startDateError, endDateError } =\n useDateRangeValidation({ earliestMoment, latestMoment, dateFormat });\n\n useLayoutEffect(() => {\n const startDateInput = document.getElementById(startDateId);\n startDateInput.setAttribute('aria-describedby', 'start-date-error');\n setStartDateInput(startDateInput);\n\n const endDateInput = document.getElementById(endDateId);\n endDateInput.setAttribute('aria-describedby', 'end-date-error');\n setEndDateInput(endDateInput);\n }, [startDateId, endDateId, setStartDateInput, setEndDateInput]);\n\n return (\n // We wrap in a span to assist with scoping CSS selectors & overriding styles from react-dates\n \n }\n navNext={}\n minDate={earliestMoment}\n maxDate={latestMoment}\n initialVisibleMonth={() => {\n const relevantDate = startMoment ? startMoment : today;\n\n return isMonthSameAsLatestMonth(relevantDate)\n ? relevantDate.clone().subtract(1, 'month')\n : relevantDate;\n }}\n customInputIcon={}\n showDefaultInputIcon={!(startMoment || endMoment)}\n inputIconPosition={ICON_BEFORE_POSITION}\n orientation={\n useCompactLayout ? VERTICAL_ORIENTATION : HORIZONTAL_ORIENTATION\n }\n showClearDates={startMoment || endMoment}\n customArrowIcon=\"-\"\n phrases={PICKER_PHRASES}\n onFocusChange={(focusedInput) => setFocusedInput(focusedInput)}\n isOutsideRange={(date) =>\n isDateOutsideOfRange({\n date,\n minDate: earliestMoment,\n maxDate: latestMoment,\n })\n }\n onDatesChange={({ startDate, endDate }) => {\n setStartMoment(startDate);\n setEndMoment(endDate);\n onDatesChanged?.({\n startDate: startDate?.toDate(),\n endDate: endDate?.toDate(),\n });\n }}\n small={useCompactLayout}\n renderMonthElement={(props) => (\n \n )}\n renderCalendarInfo={() => (\n {\n setStartMoment(start);\n setEndMoment(end);\n // Force the calendar to close, same as if user clicks an end date manually\n setFocusedInput(false);\n }}\n />\n )}\n />\n {/* This hidden input provides information that may be needed by implementing forms to properly parse dates */}\n \n \n
{startDateError}
\n
{endDateError}
\n \n \n );\n};\n\nDateRangePicker.propTypes = {\n startDateId: PropTypes.string.isRequired,\n endDateId: PropTypes.string.isRequired,\n defaultStartDate: PropTypes.instanceOf(Date),\n defaultEndDate: PropTypes.instanceOf(Date),\n maxStartDate: PropTypes.instanceOf(Date),\n maxEndDate: PropTypes.instanceOf(Date),\n onDatesChanged: PropTypes.func,\n presetRanges: PropTypes.arrayOf(PropTypes.string),\n};\n","import { h } from 'preact';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames/bind';\n\nexport const Icon = ({\n src: InternalIcon,\n native,\n className,\n ...otherProps\n}) => {\n return (\n \n );\n};\n\nIcon.displayName = 'Icon';\n\nIcon.propTypes = {\n native: PropTypes.bool,\n className: PropTypes.string,\n src: PropTypes.elementType.isRequired,\n};\n","import { h } from 'preact';\nimport PropTypes from 'prop-types';\nimport { defaultChildrenPropTypes } from '../../common-prop-types';\nimport { FocusTrap } from '../../shared/components/focusTrap';\n\n/**\n * A component that creates a full-width modal that slides in from the bottom of viewport.\n *\n *\n * @param {object} props\n * @param {Array} props.children\n * @param {string} props.title The title to be applied to the dialog, surfaced to screen reader users\n * @param {Function} props.onClose Action to complete when user opts to close the drawer\n *\n * @example\n * const [isDrawerOpen, setIsDrawerOpen] = useState(false);\n * return (\n *
\n * \n * {isDrawerOpen && (\n * setIsDrawerOpen(false)}\n * >\n *

Lorem ipsum

\n * \n * \n * )}\n *
\n * );\n */\nexport const MobileDrawer = ({ children, title, onClose = () => {} }) => {\n return (\n
\n
\n \n \n {children}\n
\n \n
\n );\n};\n\nMobileDrawer.propTypes = {\n children: defaultChildrenPropTypes.isRequired,\n title: PropTypes.string.isRequired,\n onClose: PropTypes.func,\n};\n","import { h } from 'preact';\nimport {\n getLastIndexOfCharacter,\n getNextIndexOfCharacter,\n getNumberOfNewLinesFollowingSelection,\n getNumberOfNewLinesPrecedingSelection,\n getSelectionData,\n} from '../../utilities/textAreaUtils';\nimport { getOSKeyboardModifierKeyString } from '@utilities/runtime';\nimport BoldIcon from '@images/bold.svg';\nimport ItalicIcon from '@images/italic.svg';\nimport LinkIcon from '@images/link.svg';\nimport OrderedListIcon from '@images/list-ordered.svg';\nimport UnorderedListIcon from '@images/list-unordered.svg';\nimport HeadingIcon from '@images/heading.svg';\nimport QuoteIcon from '@images/quote.svg';\nimport CodeIcon from '@images/code.svg';\nimport CodeBlockIcon from '@images/codeblock.svg';\nimport EmbedIcon from '@images/lightning.svg';\nimport UnderlineIcon from '@images/underline.svg';\nimport StrikethroughIcon from '@images/strikethrough.svg';\nimport DividerIcon from '@images/divider.svg';\nimport { Icon } from '@crayons';\n\nconst ORDERED_LIST_ITEM_REGEX = /^\\d+\\.\\s+.*/;\nconst MARKDOWN_LINK_REGEX =\n /^\\[([\\w\\s\\d]*)\\]\\((url|(https?:\\/\\/[\\w\\d./?=#]+))\\)$/;\nconst URL_PLACEHOLDER_TEXT = 'url';\n\nconst NUMBER_OF_NEW_LINES_BEFORE_BLOCK_SYNTAX = 2;\nconst NUMBER_OF_NEW_LINES_BEFORE_AFTER_SYNTAX = 1;\n\nconst getNewLinePrefixSuffixes = ({ selectionStart, selectionEnd, value }) => {\n const numberOfNewLinesBeforeSelection = getNumberOfNewLinesPrecedingSelection(\n { selectionStart, value },\n );\n const numberOfNewLinesFollowingSelection =\n getNumberOfNewLinesFollowingSelection({ selectionEnd, value });\n\n // We only add new lines if we're not at the beginning of the text area\n const numberOfNewLinesNeededAtStart =\n selectionStart === 0\n ? 0\n : NUMBER_OF_NEW_LINES_BEFORE_BLOCK_SYNTAX -\n numberOfNewLinesBeforeSelection;\n\n const newLinesPrefix = String.prototype.padStart(\n numberOfNewLinesNeededAtStart,\n '\\n',\n );\n\n const newLinesSuffix =\n numberOfNewLinesFollowingSelection >=\n NUMBER_OF_NEW_LINES_BEFORE_AFTER_SYNTAX\n ? ''\n : '\\n';\n\n return { newLinesPrefix, newLinesSuffix };\n};\n\nconst handleLinkFormattingForEmptyTextSelection = ({\n textBeforeSelection,\n textAfterSelection,\n value,\n selectionStart,\n selectionEnd,\n}) => {\n const basicFormattingForEmptySelection = {\n editSelectionStart: selectionStart,\n editSelectionEnd: selectionEnd,\n replaceSelectionWith: `[](${URL_PLACEHOLDER_TEXT})`,\n newCursorStart: selectionStart + 3,\n newCursorEnd: selectionEnd + 6,\n };\n\n // Directly after inserting a link with a URL highlighted, cursor is inside the link description '[]'\n // Check if we are inside empty link description remove the link syntax if so\n const directlySurroundedByLinkStructure =\n textBeforeSelection.slice(-1) === '[' &&\n textAfterSelection.slice(0, 2) === '](';\n\n if (!directlySurroundedByLinkStructure)\n return basicFormattingForEmptySelection;\n\n // Search for the closing bracket of markdown link\n const indexOfLinkStructureEnd = getNextIndexOfCharacter({\n content: value,\n selectionIndex: selectionStart,\n character: ')',\n breakOnCharacters: [' ', '\\n'],\n });\n\n if (indexOfLinkStructureEnd === -1) return basicFormattingForEmptySelection;\n\n // Remove the markdown link structure, preserving the link text if it isn't the \"url\" placeholder\n const urlText = value.slice(selectionEnd + 2, indexOfLinkStructureEnd);\n\n return {\n editSelectionStart: selectionStart - 1,\n editSelectionEnd: indexOfLinkStructureEnd + 1,\n replaceSelectionWith: urlText === URL_PLACEHOLDER_TEXT ? '' : urlText,\n newCursorStart: selectionStart - 1,\n newCursorEnd: selectionEnd - 1,\n };\n};\n\nconst handleLinkFormattingForUrlSelection = ({\n textBeforeSelection,\n textAfterSelection,\n value,\n selectionStart,\n selectionEnd,\n selectedText,\n}) => {\n const basicFormattingForLinkSelection = {\n editSelectionStart: selectionStart,\n editSelectionEnd: selectionEnd,\n replaceSelectionWith: `[](${selectedText})`,\n newCursorStart: selectionStart + 1,\n newCursorEnd: selectionStart + 1,\n };\n\n // Check if the text selection is likely inside a currently formatted markdown link\n const directlySurroundedByLinkStructure =\n textBeforeSelection.slice(-2) === '](' &&\n textAfterSelection.slice(0, 1) === ')';\n\n if (!directlySurroundedByLinkStructure)\n return basicFormattingForLinkSelection;\n\n // Get the index of where the current link opens so we can get the text inside the square brackets\n const indexOfSyntaxOpen = getLastIndexOfCharacter({\n content: value,\n selectionIndex: selectionStart,\n character: '[',\n });\n\n // If link syntax is incomplete, format the selection as a link\n if (indexOfSyntaxOpen === -1) return basicFormattingForLinkSelection;\n\n // Replace the markdown with the link text in square brackets, if available\n let textToReplaceMarkdown = textBeforeSelection.slice(\n indexOfSyntaxOpen + 1,\n -2,\n );\n\n // If not available, take the URL as long as it's not the placeholder 'url' text\n if (textToReplaceMarkdown === '') {\n textToReplaceMarkdown =\n selectedText === URL_PLACEHOLDER_TEXT ? '' : selectedText;\n }\n\n return {\n editSelectionStart: indexOfSyntaxOpen,\n editSelectionEnd: selectionEnd + 1,\n replaceSelectionWith: textToReplaceMarkdown,\n newCursorStart: indexOfSyntaxOpen,\n newCursorEnd: indexOfSyntaxOpen + textToReplaceMarkdown.length,\n };\n};\n\nconst handleUndoMarkdownLinkSelection = ({\n selectedText,\n selectionStart,\n selectionEnd,\n}) => {\n const linkDescriptionEnd = getNextIndexOfCharacter({\n content: selectedText,\n selectionIndex: 0,\n character: ']',\n });\n\n let textToReplaceMarkdown = selectedText.slice(1, linkDescriptionEnd);\n\n // Keep the URL instead if no link description exists\n if (textToReplaceMarkdown === '') {\n const linkText = selectedText.slice(linkDescriptionEnd + 2, -1);\n textToReplaceMarkdown = linkText === URL_PLACEHOLDER_TEXT ? '' : linkText;\n }\n\n return {\n editSelectionStart: selectionStart,\n editSelectionEnd: selectionEnd,\n replaceSelectionWith: textToReplaceMarkdown,\n newCursorStart: selectionStart,\n newCursorEnd: selectionStart + textToReplaceMarkdown.length,\n };\n};\n\nconst isStringStartAUrl = (string) => {\n const startingText = string.substring(0, 8);\n return startingText === 'https://' || startingText.startsWith('http://');\n};\n\nconst undoOrAddFormattingForInlineSyntax = ({\n value,\n selectionStart,\n selectionEnd,\n prefix,\n suffix,\n}) => {\n const { length: prefixLength } = prefix;\n const { length: suffixLength } = suffix;\n const { selectedText, textBeforeSelection, textAfterSelection } =\n getSelectionData({ selectionStart, selectionEnd, value });\n\n // Check if selected text has prefix/suffix\n const selectedTextAlreadyFormatted =\n selectedText.slice(0, prefixLength) === prefix &&\n selectedText.slice(-1 * suffixLength) === suffix;\n\n if (selectedTextAlreadyFormatted) {\n return {\n editSelectionStart: selectionStart,\n editSelectionEnd: selectionEnd,\n replaceSelectionWith: selectedText.slice(prefixLength, -1 * suffixLength),\n newCursorStart: selectionStart,\n newCursorEnd: selectionEnd - (prefixLength + suffixLength),\n };\n }\n\n // Check if immediate surrounding content has prefix/suffix\n const surroundingTextHasFormatting =\n textBeforeSelection.substring(textBeforeSelection.length - prefixLength) ===\n prefix && textAfterSelection.substring(0, suffixLength) === suffix;\n\n if (surroundingTextHasFormatting) {\n return {\n editSelectionStart: selectionStart - prefixLength,\n editSelectionEnd: selectionEnd + suffixLength,\n replaceSelectionWith: selectedText,\n newCursorStart: selectionStart - prefixLength,\n newCursorEnd: selectionEnd - prefixLength,\n };\n }\n\n // No formatting to undo - format the selected text\n return {\n editSelectionStart: selectionStart,\n editSelectionEnd: selectionEnd,\n replaceSelectionWith: `${prefix}${selectedText}${suffix}`,\n newCursorStart: selectionStart + prefixLength,\n newCursorEnd: selectionEnd + prefixLength,\n };\n};\n\nconst undoOrAddFormattingForMultilineSyntax = ({\n selectionStart,\n selectionEnd,\n value,\n linePrefix,\n blockPrefix,\n blockSuffix,\n}) => {\n const { selectedText, textBeforeSelection, textAfterSelection } =\n getSelectionData({ selectionStart, selectionEnd, value });\n\n let formattedText = selectedText;\n\n if (linePrefix) {\n const { length: prefixLength } = linePrefix;\n\n // If no selection, check if we're in a freshly inserted syntax\n if (selectedText === '') {\n const lastNewLine =\n textBeforeSelection === ''\n ? -1\n : getLastIndexOfCharacter({\n content: value,\n selectionIndex: selectionStart - 1,\n character: '\\n',\n });\n\n const lineStart = lastNewLine === -1 ? 0 : lastNewLine + 1;\n\n if (\n textBeforeSelection.slice(lineStart, lineStart + prefixLength) ===\n linePrefix\n ) {\n // Remove the list formatting\n\n return {\n editSelectionStart: lineStart,\n editSelectionEnd: lineStart + prefixLength,\n replaceSelectionWith: '',\n newCursorStart: selectionStart - prefixLength,\n newCursorEnd: selectionEnd - prefixLength,\n };\n }\n }\n\n // Split by new lines and check each line has formatting\n const splitByNewLine = selectedText\n .split('\\n')\n .filter((line) => line !== '');\n\n const isAlreadyFormatted =\n splitByNewLine.length > 0 &&\n splitByNewLine.every(\n (line) => line.slice(0, prefixLength) === linePrefix,\n );\n\n if (isAlreadyFormatted) {\n // Remove the formatting\n const unformattedText = splitByNewLine\n .map((line) => line.slice(prefixLength))\n .join('\\n');\n\n return {\n editSelectionStart: selectionStart,\n editSelectionEnd: selectionEnd,\n replaceSelectionWith: unformattedText,\n newCursorStart: selectionStart,\n newCursorEnd:\n selectionEnd + (unformattedText.length - selectedText.length),\n };\n }\n\n // Otherwise add the prefix to each line to create the new formatted text\n formattedText =\n selectedText === ''\n ? linePrefix\n : splitByNewLine.map((line) => `${linePrefix}${line}`).join('\\n');\n } else {\n // Uses only block prefix and suffix\n const { length: prefixLength } = blockPrefix;\n const { length: suffixLength } = blockSuffix;\n\n // does the selection start and end with the prefix/suffix\n const selectionIsFormatted =\n selectedText.slice(0, prefixLength) === blockPrefix &&\n selectedText.slice(-1 * suffixLength) === blockSuffix;\n\n if (selectionIsFormatted) {\n return {\n editSelectionStart: selectionStart,\n editSelectionEnd: selectionEnd,\n replaceSelectionWith: selectedText.slice(\n prefixLength,\n -1 * suffixLength,\n ),\n newCursorStart: selectionStart,\n newCursorEnd: selectionEnd - prefixLength - suffixLength,\n };\n }\n\n // or does the prefix/suffix plus new line chars immediately precede and follow the selection\n const surroundingTextIsFormatted =\n textBeforeSelection.slice(-1 * prefixLength) === blockPrefix &&\n textAfterSelection.slice(0, suffixLength) === blockSuffix;\n\n if (surroundingTextIsFormatted) {\n return {\n editSelectionStart: selectionStart - prefixLength,\n editSelectionEnd: selectionEnd + suffixLength,\n replaceSelectionWith: selectedText,\n newCursorStart: selectionStart - prefixLength,\n newCursorEnd: selectionEnd - prefixLength,\n };\n }\n }\n\n // Add the formatting\n\n const { newLinesPrefix, newLinesSuffix } = getNewLinePrefixSuffixes({\n selectionStart,\n selectionEnd,\n value,\n });\n const { length: newLinePrefixLength } = newLinesPrefix;\n\n const cursorStartBaseline = selectionStart + newLinePrefixLength;\n const cursorStartBlockPrefixOffset = blockPrefix ? blockPrefix.length : 0;\n const cursorStartLinePrefixOffset =\n selectedText === '' && linePrefix ? linePrefix.length : 0;\n\n return {\n editSelectionStart: selectionStart,\n editSelectionEnd: selectionEnd,\n replaceSelectionWith: `${newLinesPrefix}${\n blockPrefix ? blockPrefix : ''\n }${formattedText}${blockSuffix ? blockSuffix : ''}${newLinesSuffix}`,\n newCursorStart:\n cursorStartBaseline +\n cursorStartBlockPrefixOffset +\n cursorStartLinePrefixOffset,\n newCursorEnd:\n selectionEnd +\n formattedText.length -\n selectedText.length +\n newLinePrefixLength +\n (blockPrefix?.length || 0),\n };\n};\n\nexport const getNewTextAreaValueWithEdits = ({\n textAreaValue,\n editSelectionStart,\n editSelectionEnd,\n replaceSelectionWith,\n}) =>\n `${textAreaValue.substring(\n 0,\n editSelectionStart,\n )}${replaceSelectionWith}${textAreaValue.substring(editSelectionEnd)}`;\n\nexport const markdownSyntaxFormatters = {\n bold: {\n icon: () => ,\n label: 'Bold',\n getKeyboardShortcut: () => {\n const modifier = getOSKeyboardModifierKeyString();\n return {\n command: `${modifier}+b`,\n tooltipHint: `${modifier.toUpperCase()} + B`,\n };\n },\n getFormatting: ({ selectionStart, selectionEnd, value }) => {\n return undoOrAddFormattingForInlineSyntax({\n selectionStart,\n selectionEnd,\n value,\n prefix: '**',\n suffix: '**',\n });\n },\n },\n italic: {\n icon: () => ,\n label: 'Italic',\n getKeyboardShortcut: () => {\n const modifier = getOSKeyboardModifierKeyString();\n return {\n command: `${modifier}+i`,\n tooltipHint: `${modifier.toUpperCase()} + I`,\n };\n },\n getFormatting: ({ selectionStart, selectionEnd, value }) => {\n return undoOrAddFormattingForInlineSyntax({\n selectionStart,\n selectionEnd,\n value,\n prefix: '_',\n suffix: '_',\n });\n },\n },\n link: {\n icon: () => ,\n label: 'Link',\n getKeyboardShortcut: () => {\n const modifier = getOSKeyboardModifierKeyString();\n return {\n command: `${modifier}+k`,\n tooltipHint: `${modifier.toUpperCase()} + K`,\n };\n },\n getFormatting: ({ selectionStart, selectionEnd, value }) => {\n const { selectedText, textBeforeSelection, textAfterSelection } =\n getSelectionData({ selectionStart, selectionEnd, value });\n\n if (selectedText === '') {\n return handleLinkFormattingForEmptyTextSelection({\n textBeforeSelection,\n textAfterSelection,\n value,\n selectionStart,\n selectionEnd,\n });\n }\n\n if (\n isStringStartAUrl(selectedText) ||\n selectedText === URL_PLACEHOLDER_TEXT\n ) {\n return handleLinkFormattingForUrlSelection({\n textBeforeSelection,\n textAfterSelection,\n value,\n selectionStart,\n selectedText,\n selectionEnd,\n });\n }\n\n // If the whole selectedText matches markdown link formatting, undo it\n if (selectedText.match(MARKDOWN_LINK_REGEX)) {\n return handleUndoMarkdownLinkSelection({\n selectedText,\n selectionStart,\n selectionEnd,\n textBeforeSelection,\n textAfterSelection,\n });\n }\n\n // Finally, handle the case where link syntax is inserted for a selection other than a URL\n return {\n editSelectionStart: selectionStart,\n editSelectionEnd: selectionEnd,\n replaceSelectionWith: `[${selectedText}](${URL_PLACEHOLDER_TEXT})`,\n newCursorStart: selectionStart + selectedText.length + 3,\n newCursorEnd: selectionEnd + 6,\n };\n },\n },\n orderedList: {\n icon: () => ,\n label: 'Ordered list',\n getFormatting: ({ selectionStart, selectionEnd, value }) => {\n const { selectedText, textBeforeSelection } = getSelectionData({\n selectionStart,\n selectionEnd,\n value,\n });\n\n const { newLinesPrefix, newLinesSuffix } = getNewLinePrefixSuffixes({\n selectionStart,\n selectionEnd,\n value,\n });\n const { length: newLinePrefixLength } = newLinesPrefix;\n const { length: newLineSuffixLength } = newLinesSuffix;\n\n if (selectedText === '') {\n // Check start of line for whether we're in an empty ordered list\n const lastNewLine =\n textBeforeSelection === ''\n ? -1\n : getLastIndexOfCharacter({\n content: value,\n selectionIndex: selectionStart - 1,\n character: '\\n',\n });\n\n const lineStart = lastNewLine === -1 ? 0 : lastNewLine + 1;\n\n if (textBeforeSelection.slice(lineStart, lineStart + 3) === '1. ') {\n // Remove the list formatting\n return {\n editSelectionStart: lineStart,\n editSelectionEnd: lineStart + 3,\n replaceSelectionWith: '',\n newCursorStart: selectionStart - 3,\n newCursorEnd: selectionEnd - 3,\n };\n }\n }\n\n if (selectedText === '') {\n // Otherwise insert an empty list for an empty selection\n return {\n editSelectionStart: selectionStart,\n editSelectionEnd: selectionEnd,\n replaceSelectionWith: `${newLinesPrefix}1. ${newLinesSuffix}`,\n newCursorStart: selectionStart + 3 + newLinePrefixLength,\n newCursorEnd: selectionEnd + 3 + newLinePrefixLength,\n };\n }\n\n const splitByNewLine = selectedText.split('\\n');\n\n const isAlreadyAnOrderedList = splitByNewLine.every(\n (line) => line.match(ORDERED_LIST_ITEM_REGEX) || line === '',\n );\n\n if (isAlreadyAnOrderedList) {\n // Undo formatting\n const newText = splitByNewLine\n .filter((line) => line !== '')\n .map((line) => {\n const indexOfFullStop = line.indexOf('.');\n return line.substring(indexOfFullStop + 2);\n })\n .join('\\n');\n\n return {\n editSelectionStart: selectionStart,\n editSelectionEnd: selectionEnd,\n replaceSelectionWith: newText,\n newCursorStart: selectionStart + selectedText.indexOf('.') - 1,\n newCursorEnd: selectionEnd + newText.length - selectedText.length,\n };\n }\n // Otherwise convert to an ordered list\n const formattedList = `${newLinesPrefix}${splitByNewLine\n .map((textChunk, index) => `${index + 1}. ${textChunk}`)\n .join('\\n')}${newLinesSuffix}`;\n\n const cursorOffsetStart =\n selectedText.length === 0 ? 4 : newLinePrefixLength;\n\n return {\n editSelectionStart: selectionStart,\n editSelectionEnd: selectionEnd,\n replaceSelectionWith: formattedList,\n newCursorStart: selectionStart + cursorOffsetStart,\n newCursorEnd:\n selectionStart + formattedList.length - newLineSuffixLength,\n };\n },\n },\n unorderedList: {\n icon: () => ,\n label: 'Unordered list',\n getFormatting: ({ selectionStart, selectionEnd, value }) => {\n return undoOrAddFormattingForMultilineSyntax({\n selectionStart,\n selectionEnd,\n value,\n linePrefix: '- ',\n });\n },\n },\n heading: {\n icon: () => ,\n label: 'Heading',\n getFormatting: ({ selectionStart, selectionEnd, value }) => {\n let currentLineSelectionStart = selectionStart;\n\n // The 'heading' formatter changes insertion based on the existing heading level of the current line\n // So we find the start of the current line and check for '#' characters\n if (selectionStart > 0) {\n const lastNewLine = getLastIndexOfCharacter({\n content: value,\n selectionIndex: selectionStart - 1,\n character: '\\n',\n });\n\n const indexOfFirstLineCharacter =\n lastNewLine === -1 ? 0 : lastNewLine + 1;\n\n if (value.charAt(indexOfFirstLineCharacter) === '#') {\n currentLineSelectionStart = indexOfFirstLineCharacter;\n }\n }\n\n const { selectedText } = getSelectionData({\n selectionStart: currentLineSelectionStart,\n selectionEnd,\n value,\n });\n\n let currentHeadingIndex = 0;\n while (selectedText.charAt(currentHeadingIndex) === '#') {\n currentHeadingIndex++;\n }\n\n // After h4, revert to no heading at all\n if (currentHeadingIndex >= 4) {\n return {\n editSelectionStart: currentLineSelectionStart,\n editSelectionEnd: selectionEnd,\n replaceSelectionWith: selectedText.substring(5),\n newCursorStart: selectionStart - 5,\n newCursorEnd: selectionEnd - 5,\n };\n }\n\n const { newLinesPrefix, newLinesSuffix } = getNewLinePrefixSuffixes({\n selectionStart,\n selectionEnd,\n value,\n });\n const { length: newLinePrefixLength } = newLinesPrefix;\n\n const adjustingHeading = currentHeadingIndex > 0;\n const cursorOffset = adjustingHeading ? 1 : 3 + newLinePrefixLength;\n\n return {\n editSelectionStart: adjustingHeading\n ? currentLineSelectionStart\n : selectionStart,\n editSelectionEnd: selectionEnd,\n replaceSelectionWith: adjustingHeading\n ? `#${selectedText}`\n : `${newLinesPrefix}## ${selectedText}${newLinesSuffix}`,\n newCursorStart: selectionStart + cursorOffset,\n newCursorEnd: selectionEnd + cursorOffset,\n };\n },\n },\n quote: {\n icon: () => ,\n label: 'Quote',\n getFormatting: ({ selectionStart, selectionEnd, value }) =>\n undoOrAddFormattingForMultilineSyntax({\n selectionStart,\n selectionEnd,\n value,\n linePrefix: '> ',\n }),\n },\n code: {\n icon: () => ,\n label: 'Code',\n getFormatting: ({ selectionStart, selectionEnd, value }) =>\n undoOrAddFormattingForInlineSyntax({\n selectionStart,\n selectionEnd,\n value,\n prefix: '`',\n suffix: '`',\n }),\n },\n codeBlock: {\n icon: () => ,\n label: 'Code block',\n getFormatting: ({ selectionStart, selectionEnd, value }) =>\n undoOrAddFormattingForMultilineSyntax({\n selectionStart,\n selectionEnd,\n value,\n blockPrefix: '```\\n',\n blockSuffix: '\\n```',\n }),\n },\n embed: {\n icon: () => ,\n label: 'Embed',\n getKeyboardShortcut: () => {\n const modifier = getOSKeyboardModifierKeyString();\n return {\n command: `${modifier}+shift+k`,\n tooltipHint: `${modifier.toUpperCase()} + SHIFT + K`,\n };\n },\n getFormatting: ({ selectionStart, selectionEnd, value }) =>\n undoOrAddFormattingForInlineSyntax({\n value,\n selectionStart,\n selectionEnd,\n prefix: '{% embed ',\n suffix: ' %}',\n }),\n },\n underline: {\n icon: () => ,\n label: 'Underline',\n getKeyboardShortcut: () => {\n const modifier = getOSKeyboardModifierKeyString();\n return {\n command: `${modifier}+u`,\n tooltipHint: `${modifier.toUpperCase()} + U`,\n };\n },\n getFormatting: ({ selectionStart, selectionEnd, value }) =>\n undoOrAddFormattingForInlineSyntax({\n selectionStart,\n selectionEnd,\n value,\n prefix: '',\n suffix: '',\n }),\n },\n strikethrough: {\n icon: () => ,\n label: 'Strikethrough',\n getKeyboardShortcut: () => {\n const modifier = getOSKeyboardModifierKeyString();\n return {\n command: `${modifier}+shift+x`,\n tooltipHint: `${modifier.toUpperCase()} + SHIFT + X`,\n };\n },\n getFormatting: ({ selectionStart, selectionEnd, value }) =>\n undoOrAddFormattingForInlineSyntax({\n selectionStart,\n selectionEnd,\n value,\n prefix: '~~',\n suffix: '~~',\n }),\n },\n divider: {\n icon: () => ,\n label: 'Line divider',\n getFormatting: ({ selectionStart, selectionEnd, value }) =>\n undoOrAddFormattingForMultilineSyntax({\n selectionStart,\n selectionEnd,\n value,\n blockPrefix: '---\\n',\n blockSuffix: '',\n }),\n },\n};\n","import { h, cloneElement } from 'preact';\nimport { useState, useLayoutEffect, useRef } from 'preact/hooks';\nimport { ImageUploader } from '../../article-form/components/ImageUploader';\nimport {\n markdownSyntaxFormatters,\n getNewTextAreaValueWithEdits,\n} from './markdownSyntaxFormatters';\nimport OverflowIcon from '@images/overflow-vertical.svg';\nimport { ButtonNew as Button } from '@crayons';\nimport { useKeyboardShortcuts } from '@components/useKeyboardShortcuts';\nimport { BREAKPOINTS, useMediaQuery } from '@components/useMediaQuery';\nimport { getSelectionData } from '@utilities/textAreaUtils';\n\n// Placeholder text displayed while an image is uploading\nconst UPLOADING_IMAGE_PLACEHOLDER = '![Uploading image](...)';\n\nconst MAX_CORE_FORMATTERS_BY_SCREEN_SIZE = {\n small: 5,\n large: 7,\n extraLarge: 10,\n};\n\nconst getNumberOfIconsToDisplayInToolbar = ({\n isSmallScreen,\n isLargeScreen,\n}) => {\n if (isSmallScreen) {\n return MAX_CORE_FORMATTERS_BY_SCREEN_SIZE.small;\n }\n if (isLargeScreen) {\n return MAX_CORE_FORMATTERS_BY_SCREEN_SIZE.large;\n }\n return MAX_CORE_FORMATTERS_BY_SCREEN_SIZE.extraLarge;\n};\n\n/**\n * Returns the next sibling in the DOM which matches the given CSS selector.\n * This makes sure that only toolbar buttons are cycled through on Arrow key press,\n * and not e.g. the hidden file input from ImageUploader\n *\n * @param {HTMLElement} element The current HTML element\n * @param {string} selector The CSS selector to match\n * @returns\n */\nconst getNextMatchingSibling = (element, selector) => {\n let sibling = element.nextElementSibling;\n\n while (sibling) {\n if (sibling.matches(selector)) return sibling;\n sibling = sibling.nextElementSibling;\n }\n};\n\n/**\n * Returns the previous sibling in the DOM which matches the given CSS selector.\n * This makes sure that only toolbar buttons are cycled through on Arrow key press,\n * and not e.g. the hidden file input from ImageUploader\n *\n * @param {HTMLElement} element The current HTML element\n * @param {string} selector The CSS selector to match\n * @returns\n */\nconst getPreviousMatchingSibling = (element, selector) => {\n let sibling = element.previousElementSibling;\n\n while (sibling) {\n if (sibling.matches(selector)) return sibling;\n sibling = sibling.previousElementSibling;\n }\n};\n\n/**\n * UI component providing markdown shortcuts, to be inserted into the textarea with the given ID\n *\n * @param {object} props\n * @param {string} props.textAreaId The ID of the textarea the markdown formatting should be added to\n */\nexport const MarkdownToolbar = ({\n textAreaId,\n additionalSecondaryToolbarElements = [],\n}) => {\n const textAreaRef = useRef(null);\n\n const [overflowMenuOpen, setOverflowMenuOpen] = useState(false);\n const [storedCursorPosition, setStoredCursorPosition] = useState({});\n const smallScreen = useMediaQuery(`(max-width: ${BREAKPOINTS.Medium - 1}px)`);\n const largeScreen = useMediaQuery(\n `(min-width: ${BREAKPOINTS.Large}px) and (max-width: ${\n BREAKPOINTS.ExtraLarge - 1\n }px)`,\n );\n\n const overflowMenuRows = smallScreen ? 2 : 1;\n\n // Enhance any additional toolbar elements with the appropriate roles & listeners\n const additionalSecondaryItems = additionalSecondaryToolbarElements.map(\n (SecondaryItem) =>\n cloneElement(SecondaryItem, {\n role: 'menuitem',\n className: 'overflow-menu-btn',\n tabindex: '-1',\n onKeyUp: (e) => handleToolbarButtonKeyPress(e, 'overflow-menu-btn'),\n }),\n );\n\n const keyboardShortcuts = Object.fromEntries(\n Object.keys(markdownSyntaxFormatters)\n .filter(\n (syntaxName) =>\n !!markdownSyntaxFormatters[syntaxName].getKeyboardShortcut,\n )\n .map((syntaxName) => {\n const { command } =\n markdownSyntaxFormatters[syntaxName].getKeyboardShortcut();\n return [\n command,\n (e) => {\n e.preventDefault();\n insertSyntax(syntaxName);\n },\n ];\n }),\n );\n\n useKeyboardShortcuts(keyboardShortcuts, textAreaRef.current);\n\n useLayoutEffect(() => {\n textAreaRef.current = document.getElementById(textAreaId);\n }, [textAreaId]);\n\n useLayoutEffect(() => {\n // If a user resizes their screen, make sure roving tabindex continues to operate\n const focusableToolbarButton = document.querySelector(\n '.toolbar-btn[tabindex=\"0\"]',\n );\n if (!focusableToolbarButton) {\n document.querySelector('.toolbar-btn').setAttribute('tabindex', '0');\n }\n }, [smallScreen, largeScreen]);\n\n useLayoutEffect(() => {\n const clickOutsideHandler = ({ target }) => {\n if (target.id !== 'overflow-menu-button') {\n setOverflowMenuOpen(false);\n }\n };\n\n const escapePressHandler = ({ key }) => {\n if (key === 'Escape') {\n setOverflowMenuOpen(false);\n document.getElementById('overflow-menu-button').focus();\n }\n if (key === 'Tab') {\n setOverflowMenuOpen(false);\n }\n };\n\n if (overflowMenuOpen) {\n document\n .getElementById('overflow-menu')\n .getElementsByClassName('overflow-menu-btn')[0]\n .focus();\n\n document.addEventListener('keyup', escapePressHandler);\n document.addEventListener('click', clickOutsideHandler);\n } else {\n document.removeEventListener('keyup', escapePressHandler);\n document.removeEventListener('click', clickOutsideHandler);\n }\n\n return () => {\n document.removeEventListener('keyup', escapePressHandler);\n document.removeEventListener('click', clickOutsideHandler);\n };\n }, [overflowMenuOpen]);\n\n // Handles keyboard 'roving tabindex' pattern for toolbar\n const handleToolbarButtonKeyPress = (event, className) => {\n const { key, target } = event;\n\n const nextButton = getNextMatchingSibling(target, `.${className}`);\n const previousButton = getPreviousMatchingSibling(target, `.${className}`);\n\n switch (key) {\n case 'ArrowRight':\n event.preventDefault();\n target.setAttribute('tabindex', '-1');\n if (nextButton) {\n nextButton.setAttribute('tabindex', 0);\n nextButton.focus();\n } else {\n const firstButton = document.querySelector(`.${className}`);\n firstButton.setAttribute('tabindex', '0');\n firstButton.focus();\n }\n break;\n case 'ArrowLeft':\n event.preventDefault();\n target.setAttribute('tabindex', '-1');\n if (previousButton) {\n previousButton.setAttribute('tabindex', 0);\n previousButton.focus();\n } else {\n const allButtons = document.getElementsByClassName(className);\n const lastButton = allButtons[allButtons.length - 1];\n lastButton.setAttribute('tabindex', '0');\n lastButton.focus();\n }\n break;\n case 'ArrowDown':\n if (target.id === 'overflow-menu-button') {\n event.preventDefault();\n setOverflowMenuOpen(true);\n }\n break;\n }\n };\n\n const insertSyntax = (syntaxName) => {\n setOverflowMenuOpen(false);\n\n const { current: textArea } = textAreaRef;\n const {\n newCursorStart,\n newCursorEnd,\n editSelectionStart,\n editSelectionEnd,\n replaceSelectionWith,\n } = markdownSyntaxFormatters[syntaxName].getFormatting(textArea);\n\n // We try to update the textArea with document.execCommand, which requires the contentEditable attribute to be true.\n // The value is later toggled back to 'false'\n textArea.contentEditable = 'true';\n textArea.focus({ preventScroll: true });\n textArea.setSelectionRange(editSelectionStart, editSelectionEnd);\n\n try {\n // We first try to use execCommand which allows the change to be correctly added to the undo queue.\n // document.execCommand is deprecated, but the API which will eventually replace it is still incoming (https://w3c.github.io/input-events/)\n if (replaceSelectionWith === '') {\n document.execCommand('delete', false);\n } else {\n document.execCommand('insertText', false, replaceSelectionWith);\n }\n } catch {\n // In the event of any error using execCommand, we make sure the text area updates (but undo queue will not)\n textArea.value = getNewTextAreaValueWithEdits({\n textAreaValue: textArea.value,\n editSelectionStart,\n editSelectionEnd,\n replaceSelectionWith,\n });\n }\n\n textArea.contentEditable = 'false';\n textArea.dispatchEvent(new Event('input'));\n textArea.setSelectionRange(newCursorStart, newCursorEnd);\n };\n\n const handleImageUploadStarted = () => {\n const { current: textArea } = textAreaRef;\n const { textBeforeSelection, textAfterSelection } =\n getSelectionData(textArea);\n\n const { selectionEnd } = storedCursorPosition;\n\n const textWithPlaceholder = `${textBeforeSelection}\\n${UPLOADING_IMAGE_PLACEHOLDER}${textAfterSelection}`;\n textArea.value = textWithPlaceholder;\n // Make sure Editor text area updates via linkstate\n textArea.dispatchEvent(new Event('input'));\n\n textArea.focus({ preventScroll: true });\n\n // Set cursor to the end of the placeholder\n const newCursorPosition =\n selectionEnd + UPLOADING_IMAGE_PLACEHOLDER.length + 1;\n\n textArea.setSelectionRange(newCursorPosition, newCursorPosition);\n };\n\n const handleImageUploadEnd = (imageMarkdown = '') => {\n const { current: textArea } = textAreaRef;\n\n const {\n selectionStart,\n selectionEnd,\n value: currentTextAreaValue,\n } = textArea;\n\n const indexOfPlaceholder = currentTextAreaValue.indexOf(\n UPLOADING_IMAGE_PLACEHOLDER,\n );\n\n // User has deleted placeholder, nothing to do\n if (indexOfPlaceholder === -1) return;\n\n const newTextValue = textArea.value.replace(\n UPLOADING_IMAGE_PLACEHOLDER,\n imageMarkdown,\n );\n\n textArea.value = newTextValue;\n // Make sure Editor text area updates via linkstate\n textArea.dispatchEvent(new Event('input'));\n\n // The change to image markdown length does not affect cursor position\n if (indexOfPlaceholder > selectionStart) {\n textArea.setSelectionRange(selectionStart, selectionEnd);\n return;\n }\n\n const differenceInLength =\n imageMarkdown.length - UPLOADING_IMAGE_PLACEHOLDER.length;\n\n textArea.setSelectionRange(\n selectionStart + differenceInLength,\n selectionEnd + differenceInLength,\n );\n };\n\n const numberOfCoreFormatters = getNumberOfIconsToDisplayInToolbar({\n isSmallScreen: smallScreen,\n isLargeScreen: largeScreen,\n });\n\n const coreSyntaxFormatters = Object.fromEntries(\n Object.entries(markdownSyntaxFormatters).slice(0, numberOfCoreFormatters),\n );\n const secondarySyntaxFormatters = Object.fromEntries(\n Object.entries(markdownSyntaxFormatters).slice(numberOfCoreFormatters),\n );\n\n const secondaryFormatterButtons = Object.keys(secondarySyntaxFormatters).map(\n (controlName, index) => {\n const { icon, label, getKeyboardShortcut } =\n secondarySyntaxFormatters[controlName];\n\n return (\n insertSyntax(controlName)}\n onKeyUp={(e) => handleToolbarButtonKeyPress(e, 'overflow-menu-btn')}\n aria-label={label}\n tooltip={\n smallScreen ? null : (\n \n {label}\n {getKeyboardShortcut ? (\n \n {` ${getKeyboardShortcut().tooltipHint}`}\n \n ) : null}\n \n )\n }\n />\n );\n },\n );\n\n return (\n \n {Object.keys(coreSyntaxFormatters).map((controlName, index) => {\n const { icon, label, getKeyboardShortcut } =\n coreSyntaxFormatters[controlName];\n return (\n insertSyntax(controlName)}\n onKeyUp={(e) => handleToolbarButtonKeyPress(e, 'toolbar-btn')}\n aria-label={label}\n tooltip={\n smallScreen ? null : (\n \n {label}\n {getKeyboardShortcut ? (\n \n {` ${getKeyboardShortcut().tooltipHint}`}\n \n ) : null}\n \n )\n }\n />\n );\n })}\n\n handleToolbarButtonKeyPress(e, 'toolbar-btn'),\n onClick: () => {\n const {\n current: { selectionStart, selectionEnd },\n } = textAreaRef;\n setStoredCursorPosition({ selectionStart, selectionEnd });\n },\n tooltip: smallScreen ? null : (\n Upload image\n ),\n key: 'image-btn',\n className: 'toolbar-btn formatter-btn mr-1',\n tabindex: '-1',\n }}\n />\n\n setOverflowMenuOpen(!overflowMenuOpen)}\n onKeyUp={(e) => handleToolbarButtonKeyPress(e, 'toolbar-btn')}\n aria-expanded={overflowMenuOpen ? 'true' : 'false'}\n aria-haspopup=\"true\"\n icon={OverflowIcon}\n className=\"toolbar-btn ml-auto\"\n tabindex=\"-1\"\n aria-label=\"More options\"\n />\n\n {overflowMenuOpen && (\n \n {secondaryFormatterButtons}\n {additionalSecondaryItems}\n \n )}\n \n );\n};\n","import { h } from 'preact';\n\nexport const Spinner = () => (\n \n \n \n);\n","import { h } from 'preact';\nimport { useState } from 'preact/hooks';\nimport PropTypes from 'prop-types';\nimport { defaultChildrenPropTypes } from '../../common-prop-types';\n\nfunction getAdditionalClassNames({\n variant,\n className,\n contentType,\n size,\n inverted,\n disabled,\n tooltip,\n}) {\n let additionalClassNames = '';\n\n if (variant && variant.length > 0 && variant !== 'primary') {\n additionalClassNames += ` crayons-btn--${variant}`;\n }\n\n if (size && size.length > 0 && size !== 'default') {\n additionalClassNames += ` crayons-btn--${size}`;\n }\n\n if (contentType && contentType.length > 0 && contentType !== 'text') {\n additionalClassNames += ` crayons-btn--${contentType}`;\n }\n\n if (disabled) {\n additionalClassNames += ' crayons-btn--disabled';\n }\n\n if (inverted) {\n additionalClassNames += ' crayons-btn--inverted';\n }\n\n if (className && className.length > 0) {\n additionalClassNames += ` ${className}`;\n }\n\n if (tooltip) {\n additionalClassNames += ` crayons-tooltip__activator`;\n }\n\n return additionalClassNames;\n}\n\nexport const Button = (props) => {\n const {\n children,\n variant = 'primary',\n tagName,\n inverted,\n contentType,\n size,\n className,\n icon,\n url,\n buttonType,\n disabled,\n onClick,\n onMouseOver,\n onMouseOut,\n onFocus,\n onBlur,\n onKeyUp,\n tabIndex,\n title,\n tooltip,\n ...restOfProps\n } = props;\n\n const [suppressTooltip, setSuppressTooltip] = useState(false);\n\n const handleKeyUp = (event) => {\n onKeyUp?.(event);\n if (!tooltip) {\n return;\n }\n setSuppressTooltip(event.key === 'Escape');\n };\n\n const ComponentName = tagName;\n const Icon = icon;\n const otherProps =\n tagName === 'button'\n ? { type: buttonType, disabled }\n : { href: disabled ? undefined : url };\n\n return (\n \n {contentType !== 'text' && contentType !== 'icon-right' && Icon && (\n \n )}\n {(contentType === 'text' ||\n contentType === 'icon-left' ||\n contentType === 'icon-right') &&\n children}\n {contentType !== 'text' && contentType === 'icon-right' && Icon && (\n \n )}\n {tooltip ? (\n \n {tooltip}\n \n ) : null}\n \n );\n};\n\nButton.displayName = 'Button';\n\nButton.defaultProps = {\n className: undefined,\n icon: undefined,\n url: undefined,\n buttonType: 'button',\n disabled: false,\n inverted: false,\n onClick: undefined,\n onMouseOver: undefined,\n onMouseOut: undefined,\n onFocus: undefined,\n onBlur: undefined,\n tabIndex: undefined,\n title: undefined,\n tagName: 'button',\n size: 'default',\n contentType: 'text',\n variant: 'primary',\n};\n\nButton.propTypes = {\n children: defaultChildrenPropTypes,\n variant: PropTypes.oneOf([\n 'primary',\n 'secondary',\n 'outlined',\n 'danger',\n 'ghost',\n 'ghost-brand',\n 'ghost-success',\n 'ghost-warning',\n 'ghost-danger',\n ]),\n contentType: PropTypes.oneOf([\n 'text',\n 'icon-left',\n 'icon-right',\n 'icon',\n 'icon-rounded',\n ]).isRequired,\n inverted: PropTypes.bool,\n tagName: PropTypes.oneOf(['a', 'button']).isRequired,\n className: PropTypes.string,\n icon: PropTypes.oneOfType([PropTypes.node, PropTypes.func]),\n url: PropTypes.string,\n buttonType: PropTypes.string,\n disabled: PropTypes.bool,\n size: PropTypes.oneOf(['default', 's', 'l', 'xl']).isRequired,\n onClick: PropTypes.func,\n onMouseOver: PropTypes.func,\n onMouseOut: PropTypes.func,\n onFocus: PropTypes.func,\n onBlur: PropTypes.func,\n tabIndex: PropTypes.number,\n title: PropTypes.string,\n tooltip: PropTypes.node,\n};\n","import { h } from 'preact';\nimport PropTypes from 'prop-types';\n\n/**\n * Component used to display user details in the Autocomplete dropdown\n *\n * @param {object} props\n * @param {string} props.name The user's name\n * @param {string} props.profile_image_90 The src of the user's profile image\n * @param {string} props.username The user's username\n */\nexport const UserListItemContent = ({ name, profile_image_90, username }) => (\n
\n \n \"\"\n \n\n
\n

{name}

\n

{`@${username}`}

\n
\n
\n);\n\nUserListItemContent.propTypes = {\n name: PropTypes.string.isRequired,\n username: PropTypes.string.isRequired,\n profile_image_90: PropTypes.string.isRequired,\n};\n","import { h } from 'preact';\nimport { useRef, useLayoutEffect, useReducer, useEffect } from 'preact/hooks';\nimport { forwardRef, createPortal } from 'preact/compat';\nimport { UserListItemContent } from './UserListItemContent';\nimport { useMediaQuery, BREAKPOINTS } from '@components/useMediaQuery';\nimport { isInViewport } from '@utilities/viewport';\n\nimport {\n useTextAreaAutoResize,\n getAutocompleteWordData,\n getCursorXY,\n} from '@utilities/textAreaUtils';\n\n// Used to ensure dropdown appears just below search text\nconst DROPDOWN_VERTICAL_OFFSET = '1.5rem';\nconst EMPTY_STATE_MESSAGE = 'No results found';\nconst MINIMUM_SEARCH_CHARS = 2;\n\nconst KEYS = {\n UP: 'ArrowUp',\n DOWN: 'ArrowDown',\n ENTER: 'Enter',\n ESCAPE: 'Escape',\n};\n\n/**\n * Helper function to copy all styles and attributes from the original textarea to the new autocomplete one\n *\n * @param {object} options\n * @param {element} options.originalTextArea The textarea DOM element that should be replaced/removed\n * @param {element} options.newTextArea The textarea DOM element containing the autocomplete functionality. It will receive all attributes and styles of the original node.\n */\nconst replaceTextArea = ({ originalTextArea, newTextArea }) => {\n const { attributes } = originalTextArea;\n const { cssText } = document.defaultView.getComputedStyle(\n originalTextArea,\n '',\n );\n\n // Make sure all attributes are copied over\n Object.keys(attributes).forEach((attributeKey) => {\n newTextArea.setAttribute(\n attributes[attributeKey].name,\n attributes[attributeKey].value,\n );\n });\n\n // Make sure all styles are copied over\n newTextArea.style.cssText = cssText;\n // Make sure no transition replays when the new textarea is mounted\n newTextArea.style.transition = 'none';\n // Copy any initial value\n newTextArea.value = originalTextArea.value;\n\n // We need to manually remove the original element, as Preact's diffing algorithm won't replace it in render\n originalTextArea.remove();\n};\n\n/**\n * Helper function to merge any additional ref passed to the textArea with the ref used internally by this component.\n *\n * @param {Array} refs Array of all references\n */\nconst mergeInputRefs = (refs) => (value) => {\n refs.forEach((ref) => {\n if (ref) {\n ref.current = value;\n }\n });\n};\n\nconst reducer = (state, action) => {\n switch (action.type) {\n case 'setIsComboboxMode':\n return { ...state, isComboboxMode: action.payload };\n case 'setSuggestions':\n return { ...state, suggestions: action.payload };\n case 'setDropdownPositionPoints':\n return { ...state, dropdownPositionPoints: action.payload };\n case 'setActiveDescendentIndex':\n return { ...state, activeDescendentIndex: action.payload };\n case 'setSuppressPopover':\n return { ...state, suppressPopover: action.payload };\n case 'setEmptyStateMessage':\n return { ...state, emptyStateMessage: action.payload };\n case 'setIgnoreBlur':\n return { ...state, ignoreBlur: action.payload };\n case 'exitComboboxMode':\n return {\n ...state,\n suggestions: [],\n activeDescendentIndex: null,\n isComboboxMode: false,\n };\n\n default:\n return state;\n }\n};\n\n/**\n * Renders a textarea with enhanced autocomplete functionality.\n * Autocomplete searching will start when user types the given trigger character, with suggestions fetched via fetchSuggestions callback.\n * Can optionally replace an existing textarea, passed as the replaceElement prop.\n */\nexport const AutocompleteTriggerTextArea = forwardRef(\n (\n {\n id,\n triggerCharacter,\n autoResize = false,\n onChange,\n onBlur,\n fetchSuggestions,\n searchInstructionsMessage,\n maxSuggestions,\n replaceElement,\n ...inputProps\n },\n forwardedRef,\n ) => {\n const [state, dispatch] = useReducer(reducer, {\n isComboboxMode: false,\n suggestions: [],\n dropdownPositionPoints: {\n x: 0,\n y: 0,\n },\n activeDescendentIndex: null,\n suppressPopover: false,\n emptyStateMessage: searchInstructionsMessage,\n ignoreBlur: false,\n });\n\n const {\n isComboboxMode,\n suggestions,\n dropdownPositionPoints,\n activeDescendentIndex,\n suppressPopover,\n emptyStateMessage,\n ignoreBlur,\n } = state;\n\n const isSmallScreen = useMediaQuery(`(max-width: ${BREAKPOINTS.Small}px)`);\n\n const inputRef = useRef(null);\n const popoverRef = useRef(null);\n const wrapperRef = useRef(null);\n\n const { setTextArea, setAdditionalElements } = useTextAreaAutoResize();\n\n useEffect(() => {\n if (activeDescendentIndex !== null) {\n const { current: popover } = popoverRef;\n const activeItem = popover?.querySelector('[aria-selected=\"true\"]');\n if (!popover || !activeItem) {\n return;\n }\n\n if (!isInViewport({ element: activeItem })) {\n activeItem.scrollIntoView(false);\n }\n }\n }, [activeDescendentIndex]);\n\n useLayoutEffect(() => {\n if (autoResize && inputRef.current) {\n setTextArea(inputRef.current);\n setAdditionalElements([wrapperRef.current]);\n }\n }, [autoResize, setTextArea, setAdditionalElements]);\n\n useLayoutEffect(() => {\n const { current: enhancedTextArea } = inputRef;\n\n if (enhancedTextArea && replaceElement) {\n replaceTextArea({\n originalTextArea: replaceElement,\n newTextArea: enhancedTextArea,\n });\n enhancedTextArea.focus({ preventScroll: true });\n }\n }, [replaceElement]);\n\n const handleInputChange = () => {\n const { current: currentInput } = inputRef;\n\n const {\n isTriggered: isSearching,\n indexOfAutocompleteStart: indexOfSearchStart,\n } = getAutocompleteWordData({\n textArea: currentInput,\n triggerCharacter,\n });\n\n dispatch({ type: 'setIsComboboxMode', payload: isSearching });\n\n if (!isSearching) {\n dispatch({ type: 'setSuggestions', payload: [] });\n return;\n }\n\n // Fetch suggestions\n const { selectionStart, value: currentValue } = currentInput;\n\n // Search term begins after the triggerCharacter\n const searchTermStartPosition = indexOfSearchStart + 1;\n\n const searchTerm = currentValue.substring(\n searchTermStartPosition,\n selectionStart,\n );\n\n if (searchTerm.length >= MINIMUM_SEARCH_CHARS) {\n fetchSuggestions(searchTerm).then((suggestions) => {\n if (maxSuggestions && suggestions.length > maxSuggestions) {\n dispatch({\n type: 'setSuggestions',\n payload: suggestions.slice(0, maxSuggestions),\n });\n return;\n }\n dispatch({ type: 'setSuggestions', payload: suggestions });\n });\n\n dispatch({\n type: 'setEmptyStateMessage',\n payload: EMPTY_STATE_MESSAGE,\n });\n } else {\n dispatch({\n type: 'setEmptyStateMessage',\n payload: searchInstructionsMessage,\n });\n }\n\n // Ensure dropdown is properly positioned\n const { x: cursorX, y } = getCursorXY({\n input: currentInput,\n selectionPoint: indexOfSearchStart,\n });\n const textAreaX = currentInput.offsetLeft;\n\n // On small screens always show dropdown at start of textarea\n const dropdownX = isSmallScreen ? textAreaX : cursorX;\n\n dispatch({\n type: 'setDropdownPositionPoints',\n payload: { x: dropdownX, y },\n });\n };\n\n const handleKeyDown = (e) => {\n // If we are not in combobox mode, ignore\n if (!isComboboxMode) {\n return;\n }\n\n switch (e.key) {\n case KEYS.DOWN:\n e.preventDefault();\n\n if (\n activeDescendentIndex !== null &&\n activeDescendentIndex < suggestions.length - 1\n ) {\n dispatch({\n type: 'setActiveDescendentIndex',\n payload: activeDescendentIndex + 1,\n });\n } else {\n dispatch({ type: 'setActiveDescendentIndex', payload: 0 });\n }\n break;\n case KEYS.UP:\n e.preventDefault();\n dispatch({\n type: 'setActiveDescendentIndex',\n payload:\n activeDescendentIndex >= 1\n ? activeDescendentIndex - 1\n : suggestions.length - 1,\n });\n\n break;\n case KEYS.ENTER:\n e.preventDefault();\n if (activeDescendentIndex !== null) {\n selectSuggestion(suggestions[activeDescendentIndex]);\n }\n break;\n case KEYS.ESCAPE:\n e.preventDefault();\n // Temporarily close the popover until next keypress\n dispatch({ type: 'setSuppressPopover', payload: true });\n\n return;\n }\n dispatch({ type: 'setSuppressPopover', payload: false });\n };\n\n // If a user clicks away from an in-progress search, we can assume they no longer wish to keep searching\n const handleTextAreaClicked = () => dispatch({ type: 'exitComboboxMode' });\n\n // The textarea blurs when an option is clicked from the dropdown suggestions, in which case we don't want to\n // trigger the behaviour for the user having left the textarea completely, hence the `ignoreBlur` boolean.\n const handleBlur = () => {\n if (!ignoreBlur) {\n dispatch({ type: 'exitComboboxMode' });\n return;\n }\n dispatch({ type: 'setIgnoreBlur', payload: false });\n };\n\n const selectSuggestion = (suggestion) => {\n const { current: currentInput } = inputRef;\n const { indexOfAutocompleteStart: indexOfSearchStart } =\n getAutocompleteWordData({\n textArea: currentInput,\n triggerCharacter,\n });\n\n const currentSearchTerm = currentInput.value.substring(\n indexOfSearchStart,\n currentInput.selectionStart,\n );\n\n // We try to update the textArea with document.execCommand (so that the change is added to undo queue),\n // which requires the contentEditable attribute to be true. The value is later toggled back to 'false'.\n currentInput.contentEditable = 'true';\n // Input blurs when user clicks an option with the mouse\n currentInput.focus();\n currentInput.setSelectionRange(\n indexOfSearchStart,\n indexOfSearchStart + currentSearchTerm.length,\n );\n\n try {\n document.execCommand(\n 'insertText',\n false,\n `${triggerCharacter}${suggestion.value} `,\n );\n } catch {\n // In the event of any error using execCommand, we make sure the text area updates (but undo queue will not)\n const { value: currentValue } = currentInput;\n const newTextAreaValue = `${currentValue.substring(\n 0,\n indexOfSearchStart,\n )}${triggerCharacter}${suggestion.value}${currentValue.substring(\n indexOfSearchStart + currentSearchTerm.length,\n )} `;\n currentInput.value = newTextAreaValue;\n }\n\n currentInput.contentEditable = 'false';\n\n // Clear suggestions\n dispatch({ type: 'exitComboboxMode' });\n };\n\n const comboboxProps = isComboboxMode\n ? {\n role: 'combobox',\n 'aria-haspopup': 'listbox',\n 'aria-expanded': isComboboxMode,\n 'aria-owns': `${id}-listbox`,\n 'aria-activedescendant': `${id}-suggestion-${activeDescendentIndex}`,\n }\n : {};\n\n return (\n \n {/* We use an assertive live region to alert screen reader users typing will now result in a search */}\n \n {isComboboxMode ? searchInstructionsMessage : ''}\n \n\n {\n onChange?.(e);\n handleInputChange(e);\n }}\n onBlur={(e) => {\n onBlur?.(e);\n handleBlur();\n }}\n onKeyDown={handleKeyDown}\n onClick={handleTextAreaClicked}\n />\n {isComboboxMode && !suppressPopover\n ? createPortal(\n \n {suggestions && suggestions.length > 0 ? (\n
    \n {suggestions.map((suggestion, index) => (\n // Disabled as the key handler is attached to the textarea\n // eslint-disable-next-line jsx-a11y/click-events-have-key-events\n selectSuggestion(suggestion)}\n onMouseDown={() =>\n dispatch({ type: 'setIgnoreBlur', payload: true })\n }\n >\n \n \n ))}\n
\n ) : (\n \n {emptyStateMessage}\n \n )}\n ,\n document.querySelector('body'),\n )\n : null}\n \n );\n },\n);\n","import { h } from 'preact';\nimport PropTypes from 'prop-types';\nimport { ButtonNew as Button } from '@crayons';\nimport CopyIcon from '@images/copy.svg';\n\nfunction linksToMarkdownForm(imageLinks) {\n return imageLinks\n .map((imageLink) => `![Image description](${imageLink})`)\n .join('\\n');\n}\n\nexport const ClipboardButton = ({\n onCopy,\n imageUrls,\n showCopyMessage = false,\n}) => (\n
\n \n \n {showCopyMessage ? 'Copied!' : 'Copy...'}\n \n
\n);\n\nClipboardButton.displayName = 'ClipboardButton';\n\nClipboardButton.propTypes = {\n onCopy: PropTypes.func.isRequired,\n imageUrls: PropTypes.arrayOf(PropTypes.string).isRequired,\n showCopyMessage: PropTypes.bool.isRequired,\n};\n","import { Fragment, h } from 'preact';\nimport { useReducer, useEffect, useState } from 'preact/hooks';\nimport { generateMainImage } from '../actions';\nimport { validateFileInputs } from '../../packs/validateFileInputs';\nimport { addSnackbarItem } from '../../Snackbar';\nimport { ClipboardButton } from './ClipboardButton';\nimport { copyToClipboard, isNativeIOS } from '@utilities/runtime';\nimport { ButtonNew as Button, Spinner, Icon } from '@crayons';\nimport ImageIcon from '@images/image.svg';\nimport CancelIcon from '@images/x.svg';\n\nconst SpinnerOrCancel = () => (\n \n \n \n \n);\n\nfunction imageUploaderReducer(state, action) {\n const { type, payload } = action;\n\n switch (type) {\n case 'uploading_image':\n return {\n ...state,\n uploadErrorMessage: null,\n uploadingImage: true,\n insertionImageUrls: [],\n };\n\n case 'upload_error':\n return {\n ...state,\n insertionImageUrls: [],\n uploadErrorMessage: payload.errorMessage,\n uploadingImage: false,\n };\n\n case 'upload_image_success':\n return {\n ...state,\n insertionImageUrls: payload.insertionImageUrls,\n uploadingImage: false,\n uploadErrorMessage: null,\n };\n\n default:\n return state;\n }\n}\n\nfunction initNativeImagePicker(e) {\n e.preventDefault();\n window.ForemMobile?.injectNativeMessage('imageUpload', {\n action: 'imageUpload',\n });\n}\n\nconst NativeIosV1ImageUpload = ({ uploadingImage }) => (\n \n {!uploadingImage && (\n \n Upload image\n \n )}\n \n);\n\n/**\n * The V2 editor uses a toolbar button press to trigger a visually hidden file input.\n *\n * @param {object} props\n * @param {object} props.buttonProps Any props to be added to the trigger button\n * @param {function} props.handleInsertionImageUpload Callback to handle image upload\n * @param {boolean} props.uploadingImage Is an image currently being uploaded\n * @param {boolean} props.useNativeUpload Should iOS native upload functionality be used\n * @param {function} props.handleNativeMessage Callback for iOS native upload message handling\n * @param {string} props.uploadErrorMessage Error message to be displayed\n *\n */\nconst V2EditorImageUpload = ({\n buttonProps,\n handleInsertionImageUpload,\n uploadingImage,\n useNativeUpload,\n handleNativeMessage,\n uploadErrorMessage,\n}) => {\n useEffect(() => {\n if (uploadErrorMessage) {\n addSnackbarItem({\n message: uploadErrorMessage,\n addCloseButton: true,\n });\n }\n }, [uploadErrorMessage]);\n\n const [abortRequestController, setAbortRequestController] = useState(null);\n\n const startNewRequest = (e) => {\n const controller = new AbortController();\n setAbortRequestController(controller);\n handleInsertionImageUpload(e, controller.signal);\n };\n\n const cancelRequest = () => {\n abortRequestController.abort();\n setAbortRequestController(null);\n };\n\n const { tooltip: actionTooltip } = buttonProps;\n\n return (\n \n {useNativeUpload ? (\n \n ) : (\n \n )}\n {uploadingImage ? (\n \n ) : (\n {\n buttonProps.onClick?.(e);\n useNativeUpload\n ? initNativeImagePicker(e)\n : document.getElementById('image-upload-field').click();\n }}\n aria-label=\"Upload image\"\n tooltip={actionTooltip}\n />\n )}\n \n );\n};\n\n/**\n * The V1 Editor uses a more detailed image upload UI, displaying errors and markdown text inline\n *\n * @param {object} props\n * @param {boolean} props.uploadingImage Is an image currently being uploaded\n * @param {boolean} props.useNativeUpload Should iOS native upload functionality be used\n * @param {function} props.handleNativeMessage Callback for iOS native upload message handling\n * @param {function} props.handleInsertionImageUpload Callback to handle image upload\n * @param {string[]} props.insertionImageUrls URLs of successfully uploaded images\n * @param {string} props.uploadErrorMessage Error message to be displayed\n *\n * @returns\n */\nconst V1EditorImageUpload = ({\n uploadingImage,\n useNativeUpload,\n handleNativeMessage,\n handleInsertionImageUpload,\n insertionImageUrls,\n uploadErrorMessage,\n}) => {\n const [showCopiedImageText, setShowCopiedImageText] = useState(false);\n\n useEffect(() => {\n if (uploadingImage) {\n setShowCopiedImageText(false);\n }\n }, [uploadingImage]);\n\n const copyText = () => {\n const imageMarkdownInput = document.getElementById(\n 'image-markdown-copy-link-input',\n );\n\n copyToClipboard(imageMarkdownInput.value)\n .then(() => {\n setShowCopiedImageText(true);\n })\n .catch((error) => {\n addSnackbarItem({\n message: error,\n addCloseButton: true,\n });\n Honeybadger.notify(error);\n });\n };\n return (\n
\n {uploadingImage && (\n \n Uploading...\n \n )}\n\n {useNativeUpload ? (\n \n ) : uploadingImage ? null : (\n \n \n \n )}\n\n {insertionImageUrls.length > 0 && (\n \n )}\n\n {uploadErrorMessage ? (\n {uploadErrorMessage}\n ) : null}\n
\n );\n};\n\n/**\n * Image Uploader feature for editor forms\n *\n * @param {object} props\n * @param {string} props.editorVersion The current editor version being used\n * @param {object} props.buttonProps Any additional props to be added to upload image button (v2 editor only)\n * @param {function} props.onImageUploadStart Callback for when image upload begins\n * @param {function} props.onImageUploadSuccess Callback for when image upload succeeds\n * @param {function} props.onImageUploadError Callback for when image upload fails\n *\n */\nexport const ImageUploader = ({\n editorVersion = 'v2',\n buttonProps = {},\n onImageUploadStart,\n onImageUploadSuccess,\n onImageUploadError,\n}) => {\n useEffect(() => {\n // Native Bridge messages come through ForemMobile events\n document.addEventListener('ForemMobile', handleNativeMessage);\n\n // Cleanup afterwards\n return () =>\n document.removeEventListener('ForemMobile', handleNativeMessage);\n });\n\n const [state, dispatch] = useReducer(imageUploaderReducer, {\n insertionImageUrls: [],\n uploadErrorMessage: null,\n uploadingImage: false,\n });\n\n const { uploadingImage, uploadErrorMessage, insertionImageUrls } = state;\n\n function onUploadError(error) {\n onImageUploadError?.();\n dispatch({\n type: 'upload_error',\n payload: { errorMessage: error.message },\n });\n }\n\n function handleInsertionImageUpload(e, abortSignal) {\n const { files } = e.target;\n\n if (files.length > 0 && validateFileInputs()) {\n const payload = { image: files };\n dispatch({\n type: 'uploading_image',\n });\n\n onImageUploadStart?.();\n generateMainImage({\n payload,\n successCb: handleInsertImageUploadSuccess,\n failureCb: onUploadError,\n signal: abortSignal,\n });\n }\n }\n\n function handleInsertImageUploadSuccess(response) {\n dispatch({\n type: 'upload_image_success',\n payload: { insertionImageUrls: response.links },\n });\n\n onImageUploadSuccess?.(`![Image description](${response.links})`);\n\n document.getElementById('upload-success-info').innerText =\n 'image upload complete';\n }\n\n function handleNativeMessage(e) {\n const message = JSON.parse(e.detail);\n if (message.namespace !== 'imageUpload') {\n return;\n }\n\n switch (message.action) {\n case 'uploading':\n onImageUploadStart?.();\n dispatch({\n type: 'uploading_image',\n });\n break;\n case 'error':\n onImageUploadError?.();\n dispatch({\n type: 'upload_error',\n payload: { errorMessage: message.error },\n });\n break;\n case 'success':\n onImageUploadSuccess?.(`![Image description](${message.link})`);\n dispatch({\n type: 'upload_image_success',\n payload: { insertionImageUrls: [message.link] },\n });\n break;\n }\n }\n\n // When the component is rendered in an environment that supports a native\n // image picker for image upload we want to add the aria-label attr and the\n // onClick event to the UI button. This event will kick off the native UX.\n // The props are unwrapped (using spread operator) in the button below\n const useNativeUpload = isNativeIOS('imageUpload');\n\n return (\n \n \n\n {editorVersion === 'v2' ? (\n \n ) : (\n \n )}\n \n );\n};\n\nImageUploader.displayName = 'ImageUploader';\n","// These styles are applied to the hidden element we use to measure the height.\n// !important styles are used to ensure no matter what style properties are attached to the given textarea, the hidden textarea will never become visible or cause layout jumps\nconst HIDDEN_TEXTAREA_STYLE = `\nmin-height:0 !important;\nmax-height:none !important;\nheight:0 !important;\nvisibility:hidden !important;\noverflow:hidden !important;\nposition:absolute !important;\nz-index:-1000 !important;\ntop:0 !important;\nright:0 !important\n`;\n\nconst SIZING_STYLE = [\n 'letter-spacing',\n 'line-height',\n 'padding-top',\n 'padding-bottom',\n 'font-family',\n 'font-weight',\n 'font-size',\n 'text-rendering',\n 'text-transform',\n 'width',\n 'text-indent',\n 'padding-left',\n 'padding-right',\n 'border-width',\n 'box-sizing',\n];\n\nlet hiddenTextarea;\n\n/**\n * Helper function to get the height of the textarea based on the current text content\n *\n * @param {HTMLElement} uiTextNode The textarea to measure height of\n *\n * @returns {{height: number}} Object with the calculated height\n */\nexport const calculateTextAreaHeight = (uiTextNode) => {\n if (!hiddenTextarea) {\n hiddenTextarea = document.createElement('textarea');\n document.body.appendChild(hiddenTextarea);\n }\n\n // Copy all CSS properties that have an impact on the height of the content in\n // the textbox\n const {\n paddingSize,\n borderSize,\n boxSizing,\n sizingStyle,\n } = calculateNodeStyling(uiTextNode);\n\n // Need to have the overflow attribute to hide the scrollbar otherwise\n // text-lines will not calculated properly as the shadow will technically be\n // narrower for content\n hiddenTextarea.setAttribute(\n 'style',\n `${sizingStyle};${HIDDEN_TEXTAREA_STYLE}`,\n );\n hiddenTextarea.value = uiTextNode.value || uiTextNode.placeholder || 'x';\n\n const baseHeight = hiddenTextarea.scrollHeight;\n\n if (boxSizing === 'border-box') {\n // border-box: add border, since height = content + padding + border\n return { height: baseHeight + borderSize };\n } else if (boxSizing === 'content-box') {\n // remove padding, since height = content\n return { height: baseHeight - paddingSize };\n }\n\n return { height: baseHeight };\n};\n\nconst calculateNodeStyling = (node) => {\n const style = window.getComputedStyle(node);\n\n const boxSizing =\n style.getPropertyValue('box-sizing') ||\n style.getPropertyValue('-moz-box-sizing') ||\n style.getPropertyValue('-webkit-box-sizing');\n\n const paddingSize =\n parseFloat(style.getPropertyValue('padding-bottom')) +\n parseFloat(style.getPropertyValue('padding-top'));\n\n const borderSize =\n parseFloat(style.getPropertyValue('border-bottom-width')) +\n parseFloat(style.getPropertyValue('border-top-width'));\n\n const sizingStyle = SIZING_STYLE.map(\n (name) => `${name}:${style.getPropertyValue(name)}`,\n ).join(';');\n\n return {\n sizingStyle,\n paddingSize,\n borderSize,\n boxSizing,\n };\n};\n","import { useEffect, useState } from 'preact/hooks';\nimport { calculateTextAreaHeight } from '@utilities/calculateTextAreaHeight';\nimport { debounceAction } from '@utilities/debounceAction';\n\n/**\n * A helper function to get the X/Y coordinates of the current cursor position within an element.\n * For a full explanation see the post by Jhey Tompkins: https://medium.com/@jh3y/how-to-where-s-the-caret-getting-the-xy-position-of-the-caret-a24ba372990a\n *\n * @param {args}\n * @param {args.element} input The DOM element the cursor is to be found within\n * @param {args.number} selectionPoint The current cursor position (e.g. either selectionStart or selectionEnd)\n * @param {args.element} relativeToElement The DOM element the position to be calculated relative to. Defaults to the document body\n *\n * @returns {object} An object with x and y properties (e.g. {x: 10, y: 0})\n *\n * @example\n * const coordinates = getCursorXY(elementRef.current, elementRef.current.selectionStart)\n */\nexport const getCursorXY = ({\n input,\n selectionPoint,\n relativeToElement = document.body,\n}) => {\n const bodyRect = relativeToElement.getBoundingClientRect();\n const elementRect = input.getBoundingClientRect();\n\n const inputY = elementRect.top - bodyRect.top - input.scrollTop;\n const inputX = elementRect.left - bodyRect.left - input.scrollLeft;\n\n // create a dummy element with the computed style of the input\n const div = document.createElement('div');\n const copyStyle = getComputedStyle(input);\n\n for (const property of Object.values(copyStyle)) {\n div.style.setProperty(property, copyStyle.getPropertyValue(property));\n }\n\n // set the div to the correct position\n div.style['position'] = 'absolute';\n div.style['top'] = `${inputY}px`;\n div.style['left'] = `${inputX}px`;\n div.style['opacity'] = 0;\n\n // replace whitespace with '.' when filling the dummy element if it's a single line \n const swap = '.';\n const inputValue =\n input.tagName === 'INPUT' ? input.value.replace(/ /g, swap) : input.value;\n\n // set the div content to that of the textarea up until selection point\n div.textContent = inputValue.substr(0, selectionPoint);\n\n if (input.tagName === 'TEXTAREA') div.style.height = 'auto';\n // if a single line input then the div needs to be single line and not break out like a text area\n if (input.tagName === 'INPUT') div.style.width = 'auto';\n\n // marker element to obtain caret position\n const span = document.createElement('span');\n // give the span the textContent of remaining content so that the recreated dummy element is as close as possible\n span.textContent = inputValue.substr(selectionPoint) || '.';\n\n // append the span marker to the div and the dummy element to the body\n div.appendChild(span);\n relativeToElement.appendChild(div);\n\n // get the marker position, this is the caret position top and left relative to the input\n const { offsetLeft: spanX, offsetTop: spanY } = span;\n\n // remove dummy element\n relativeToElement.removeChild(div);\n\n // return object with the x and y of the caret. account for input positioning so that you don't need to wrap the input\n return {\n x: inputX + spanX,\n y: inputY + spanY,\n };\n};\n\n// TODO: Remove once MentionAutocompleteTextArea removed\nexport const getMentionWordData = () => {};\n\n/**\n * A helper function that searches back to the beginning of the currently typed word (indicated by cursor position) and verifies whether it begins with an '@' symbol for user mention\n *\n * @param {element} textArea The text area or input to inspect the current word of\n * @returns {{isTriggered: boolean, indexOfAutocompleteStart: number}} Object with the word's autocomplete data\n *\n * @example\n * const { isTriggered, indexOfAutocompleteStart } = getAutocompleteWordData({textArea, triggerCharacter: '@'});\n * if (isTriggered) {\n * // Do something\n * }\n */\nexport const getAutocompleteWordData = ({ textArea, triggerCharacter }) => {\n const { selectionStart, value: valueBeforeKeystroke } = textArea;\n\n if (selectionStart === 0 || valueBeforeKeystroke === '') {\n return {\n isTriggered: false,\n indexOfAutocompleteStart: -1,\n };\n }\n\n const indexOfAutocompleteStart = getLastIndexOfCharacter({\n content: valueBeforeKeystroke,\n selectionIndex: selectionStart,\n character: triggerCharacter,\n breakOnCharacters: [' ', '', '\\n'],\n });\n\n return {\n isTriggered: indexOfAutocompleteStart !== -1,\n indexOfAutocompleteStart,\n };\n};\n\n/**\n * Searches backwards through text content for the last occurrence of the given character\n *\n * @param {Object} params\n * @param {string} content The chunk of text to search within\n * @param {number} selectionIndex The starting point to search from\n * @param {string} character The character to search for\n * @param {string[]} breakOnCharacters Any characters which should result in an immediate halt to the search\n * @returns {number} Index of the last occurrence of the character, or -1 if it isn't found\n */\nexport const getLastIndexOfCharacter = ({\n content,\n selectionIndex,\n character,\n breakOnCharacters = [],\n}) => {\n const currentCharacter = content.charAt(selectionIndex);\n const previousCharacter = content.charAt(selectionIndex - 1);\n\n if (currentCharacter === character) {\n return selectionIndex;\n }\n\n if (selectionIndex !== 0 && !breakOnCharacters.includes(previousCharacter)) {\n return getLastIndexOfCharacter({\n content,\n selectionIndex: selectionIndex - 1,\n character,\n breakOnCharacters,\n });\n }\n\n return -1;\n};\n\n/**\n * Searches forwards through text content for the next occurrence of the given character\n *\n * @param {Object} params\n * @param {string} content The chunk of text to search within\n * @param {number} selectionIndex The starting point to search from\n * @param {string} character The character to search for\n * @param {string[]} breakOnCharacters Any characters which should result in an immediate halt to the search\n * @returns {number} Index of the next occurrence of the character, or -1 if it isn't found\n */\nexport const getNextIndexOfCharacter = ({\n content,\n selectionIndex,\n character,\n breakOnCharacters = [],\n}) => {\n const currentCharacter = content.charAt(selectionIndex);\n const nextCharacter = content.charAt(selectionIndex + 1);\n\n if (currentCharacter === character) {\n return selectionIndex;\n }\n\n if (\n selectionIndex <= content.length &&\n !breakOnCharacters.includes(nextCharacter)\n ) {\n return getNextIndexOfCharacter({\n content,\n selectionIndex: selectionIndex + 1,\n character,\n breakOnCharacters,\n });\n }\n\n return -1;\n};\n\n/**\n * Counts how many new lines come immediately before the user's current selection start\n * @param {object} args\n * @param {number} args.selectionStart The index of user's current selection start\n * @param {string} args.value The value of the textarea\n *\n * @returns {number} Number of new lines directly before selection start\n */\nexport const getNumberOfNewLinesPrecedingSelection = ({\n selectionStart,\n value,\n}) => {\n if (selectionStart === 0) {\n return 0;\n }\n\n let count = 0;\n let searchIndex = selectionStart - 1;\n\n while (searchIndex >= 0 && value.charAt(searchIndex) === '\\n') {\n count++;\n searchIndex--;\n }\n\n return count;\n};\n\n/**\n * Counts how many new lines come immediately after the user's current selection end\n *\n * @param {object} args\n * @param {number} args.selectionEnd The index of user's current selection end\n * @param {string} args.value The value of the textarea\n *\n * @returns {number} the count of new line characters immediately following selection\n */\nexport const getNumberOfNewLinesFollowingSelection = ({\n selectionEnd,\n value,\n}) => {\n if (selectionEnd === value.length) {\n return 0;\n }\n\n let count = 0;\n let searchIndex = selectionEnd;\n\n while (searchIndex < value.length && value.charAt(searchIndex) === '\\n') {\n count++;\n searchIndex++;\n }\n\n return count;\n};\n\n/**\n * Retrieve data about the user's current text selection\n *\n * @param {Object} params\n * @param {number} selectionStart The start point of user's selection\n * @param {number} selectionEnd The end point of user's selection\n * @param {string} value The current value of the textarea\n * @returns {Object} object containing the text chunks before and after insertion, and the currently selected text\n */\nexport const getSelectionData = ({ selectionStart, selectionEnd, value }) => ({\n textBeforeSelection: value.substring(0, selectionStart),\n textAfterSelection: value.substring(selectionEnd, value.length),\n selectedText: value.substring(selectionStart, selectionEnd),\n});\n\n/**\n * This hook can be used to keep the height of a textarea in step with the current content height, avoiding a scrolling textarea.\n * An optional array of additional elements can be set. If provided, all elements will be set to the greatest content height.\n * Optionally, it can be specified to also constrain the max-height to the content height. Otherwise the max-height will continue to be managed only by the textarea's CSS\n *\n * @example\n *\n * const { setTextArea } = useTextAreaAutoResize();\n * setTextArea(myTextAreaRef.current);\n * setAdditionalElements([myOtherElement.current]);\n */\nexport const useTextAreaAutoResize = () => {\n const [textArea, setTextArea] = useState(null);\n const [constrainToContentHeight, setConstrainToContentHeight] =\n useState(false);\n const [additionalElements, setAdditionalElements] = useState([]);\n\n useEffect(() => {\n if (!textArea) {\n return;\n }\n\n const resizeTextArea = () => {\n const allElements = [textArea, ...additionalElements];\n\n const allContentHeights = allElements.map(\n (element) => calculateTextAreaHeight(element).height,\n );\n\n const height = Math.max(...allContentHeights);\n const newHeight = `${height}px`;\n\n allElements.forEach((element) => {\n element.style['min-height'] = newHeight;\n if (constrainToContentHeight) {\n // Don't allow the textarea to grow to a size larger than the content\n element.style['max-height'] = newHeight;\n }\n });\n };\n\n // Resize on first attach\n resizeTextArea();\n\n // Resize on window size changes\n const resizeCallback = debounceAction(() => resizeTextArea(), 300);\n const resizeObserver = new ResizeObserver(resizeCallback);\n resizeObserver.observe(textArea);\n\n // Resize on subsequent value changes\n textArea.addEventListener('input', resizeTextArea);\n\n return () => {\n resizeObserver.disconnect();\n textArea.removeEventListener('input', resizeTextArea);\n };\n }, [textArea, additionalElements, constrainToContentHeight]);\n\n return { setTextArea, setAdditionalElements, setConstrainToContentHeight };\n};\n","let isFullScreenModeCodeOn = false;\nlet screenScroll = 0;\nconst fullScreenWindow =\n document.getElementsByClassName('js-fullscreen-code')[0];\nconst { body } = document;\n\nexport function getFullScreenModeStatus() {\n return isFullScreenModeCodeOn;\n}\n\nfunction setAfterFullScreenScrollPosition() {\n window.scrollTo(0, screenScroll);\n}\n\nfunction getBeforeFullScreenScrollPosition() {\n screenScroll = window.scrollY;\n}\n\nexport function onPressEscape(event) {\n if (event.key == 'Escape') {\n fullScreenModeControl(event);\n }\n}\n\nfunction listenToKeyboardForEscape(listen) {\n if (listen) {\n document.body.addEventListener('keyup', onPressEscape);\n } else {\n document.body.removeEventListener('keyup', onPressEscape);\n }\n}\n\nexport function onPopstate() {\n fullScreenModeControl();\n}\n\nfunction listenToWindowForPopstate(listen) {\n if (listen) {\n window.addEventListener('popstate', onPopstate);\n } else {\n window.removeEventListener('popstate', onPopstate);\n }\n}\n\nfunction toggleOverflowForDocument(overflow) {\n if (overflow) {\n body.style.overflow = 'hidden';\n } else {\n body.style.overflow = '';\n }\n}\n\nexport function addFullScreenModeControl(elements) {\n if (elements) {\n for (const element of elements) {\n element.addEventListener('click', fullScreenModeControl);\n }\n }\n}\n\nfunction removeFullScreenModeControl(elements) {\n if (elements) {\n for (const element of elements) {\n element.removeEventListener('click', fullScreenModeControl);\n }\n }\n}\n\nfunction fullScreenModeControl(event) {\n const codeBlock = event?.currentTarget.closest('.js-code-highlight')\n ? event.currentTarget.closest('.js-code-highlight').cloneNode(true)\n : null;\n const codeBlockControls = codeBlock\n ? codeBlock.getElementsByClassName('js-fullscreen-code-action')\n : null;\n\n if (isFullScreenModeCodeOn) {\n toggleOverflowForDocument(false);\n setAfterFullScreenScrollPosition();\n listenToKeyboardForEscape(false);\n listenToWindowForPopstate(false);\n removeFullScreenModeControl(codeBlockControls);\n\n fullScreenWindow.classList.remove('is-open');\n fullScreenWindow.removeChild(fullScreenWindow.childNodes[0]);\n\n isFullScreenModeCodeOn = false;\n } else {\n toggleOverflowForDocument(true);\n getBeforeFullScreenScrollPosition();\n listenToKeyboardForEscape(true);\n listenToWindowForPopstate(true);\n\n codeBlock.classList.add('is-fullscreen');\n fullScreenWindow.appendChild(codeBlock);\n fullScreenWindow.classList.add('is-open');\n\n addFullScreenModeControl(codeBlockControls);\n\n isFullScreenModeCodeOn = true;\n }\n}\n","import PropTypes from 'prop-types';\n\nexport const userPropTypes = PropTypes.shape({\n id: PropTypes.string.isRequired,\n name: PropTypes.string.isRequired,\n profile_image_url: PropTypes.string.isRequired,\n summary: PropTypes.string.isRequired,\n});\n","import PropTypes from 'prop-types';\n\nexport const selectedTagsPropTypes = PropTypes.shape({\n tags: PropTypes.arrayOf(PropTypes.string).isRequired,\n onClick: PropTypes.func.isRequired,\n onKeyPress: PropTypes.func.isRequired,\n});\n","import { getUserDataAndCsrfToken } from '@utilities/getUserDataAndCsrfToken';\nimport {\n closeWindowModal,\n showWindowModal,\n WINDOW_MODAL_ID,\n} from '@utilities/showModal';\n/* global userData */\n\nfunction toggleSubscribeActionUI({\n tagContainer,\n showSubscribeAction = false,\n appleAuth = false,\n}) {\n const signedInUI = tagContainer.getElementsByClassName(\n 'ltag__user-subscription-tag__signed-in',\n )[0];\n\n const appleAuthUI = tagContainer.getElementsByClassName(\n 'ltag__user-subscription-tag__apple-auth',\n )[0];\n\n if (!showSubscribeAction) {\n appleAuthUI.classList.add('hidden');\n signedInUI.classList.add('hidden');\n return;\n }\n\n // In this case we don't have an email we can use, and need the user to update their settings first\n if (appleAuth) {\n signedInUI.classList.add('hidden');\n appleAuthUI.classList.remove('hidden');\n return;\n }\n\n signedInUI.classList.remove('hidden');\n}\n\nfunction toggleSignedOutUI(tagContainer, showSignedOutUI = false) {\n const signedOutUI = tagContainer.getElementsByClassName(\n 'ltag__user-subscription-tag__signed-out',\n )[0];\n if (showSignedOutUI) {\n signedOutUI.classList.remove('hidden');\n } else {\n signedOutUI.classList.add('hidden');\n }\n}\n\nfunction updateProfileImagesUI(tagContainer, signedIn = false) {\n const profileImagesContainer = tagContainer.getElementsByClassName(\n 'ltag__user-subscription-tag__profile-images',\n )[0];\n\n if (signedIn) {\n profileImagesContainer.classList.add('signed-in');\n profileImagesContainer.classList.remove('signed-out');\n\n tagContainer\n .getElementsByClassName(\n 'ltag__user-subscription-tag__subscriber-profile-image',\n )[0]\n .classList.remove('hidden');\n } else {\n profileImagesContainer.classList.remove('signed-in');\n profileImagesContainer.classList.add('signed-out');\n\n tagContainer\n .getElementsByClassName(\n 'ltag__user-subscription-tag__subscriber-profile-image',\n )[0]\n .classList.add('hidden');\n }\n}\n\nfunction initSignedOutState(tagContainer) {\n toggleSubscribeActionUI({ tagContainer, showSubscribeAction: false });\n toggleSignedOutUI(tagContainer, true);\n updateProfileImagesUI(tagContainer, false);\n}\n\nfunction initSignedInState(tagContainer, appleAuth = false) {\n toggleSubscribeActionUI({\n tagContainer,\n showSubscribeAction: true,\n appleAuth,\n });\n toggleSignedOutUI(tagContainer, false);\n updateProfileImagesUI(tagContainer, true);\n\n tagContainer\n .querySelector('.ltag__user-subscription-tag__signed-in .crayons-btn')\n .addEventListener('click', () => {\n showConfirmSubscribeModal();\n });\n}\n\nfunction showConfirmSubscribeModal() {\n showWindowModal({\n title: 'Confirm subscribe',\n size: 'small',\n modalContent: document.querySelector(\n '.user-subscription-confirmation-modal .crayons-modal__box__body',\n ).innerHTML,\n onOpen: () => {\n // Attach listeners for cancel button and subscribe button\n document\n .querySelector(\n `#${WINDOW_MODAL_ID} .ltag__user-subscription-tag____cancel-btn`,\n )\n .addEventListener('click', () => {\n closeWindowModal();\n });\n\n document\n .querySelector(\n `#${WINDOW_MODAL_ID} .ltag__user-subscription-tag__confirmation-btn`,\n )\n .addEventListener('click', confirmSubscribe);\n },\n });\n}\n\nfunction confirmSubscribe() {\n closeWindowModal();\n clearNotices();\n\n submitSubscription().then((response) => {\n if (response.success) {\n const allSubscriptionLiquidTags = document.getElementsByClassName(\n 'ltag__user-subscription-tag',\n );\n\n showSubscribedNotices();\n\n for (const tagContainer of allSubscriptionLiquidTags) {\n // We no longer want to show the submit button since user is now subscribed\n toggleSubscribeActionUI({ tagContainer, showSubscribeAction: false });\n }\n } else {\n updateNotices({ variant: 'danger', content: response.error });\n // Allow user to retry\n toggleSubmitButtonsState({ disabled: false, textContent: 'Subscribe' });\n }\n });\n}\n\nfunction toggleSubmitButtonsState({ disabled, textContent }) {\n // Since all user sub tags on the same article page perform the same action, all submit buttons are kept in sync\n const allUserSubLiquidTagSubmits = document.querySelectorAll(\n '.ltag__user-subscription-tag__signed-in .crayons-btn',\n );\n\n for (const submit of allUserSubLiquidTagSubmits) {\n submit.disabled = disabled;\n submit.textContent = textContent;\n }\n}\n\nfunction updateNotices({ variant, content }) {\n const allNotices = document.getElementsByClassName(\n 'ltag__user-subscription-tag__response-message',\n );\n\n for (const notice of allNotices) {\n notice.classList.remove('hidden');\n notice.classList.add(`crayons-notice--${variant}`);\n notice.textContent = content;\n }\n\n // When a notice is shown, we hide the generic signed-in instructions\n toggleSignedInInstructionsUI(false);\n}\n\nfunction clearNotices() {\n // Since all user sub tags on the same article page perform the same action, all notices are kept in sync\n const allNotices = document.getElementsByClassName(\n 'ltag__user-subscription-tag__response-message',\n );\n\n for (const notice of allNotices) {\n notice.classList.add('hidden');\n }\n\n // Re-show the signed in instructions\n toggleSignedInInstructionsUI(true);\n}\n\nfunction toggleSignedInInstructionsUI(isVisible) {\n const signedInInstructions = document.querySelectorAll(\n '.ltag__user-subscription-tag__signed-in .ltag__user-subscription-tag__logged-in-text',\n );\n\n for (const instructions of signedInInstructions) {\n if (isVisible) {\n instructions.classList.remove('hidden');\n } else {\n instructions.classList.add('hidden');\n }\n }\n}\n\nfunction submitSubscription() {\n toggleSubmitButtonsState({ disabled: true, textContent: 'Submitting' });\n\n const articleId =\n document.getElementById('article-body')?.dataset?.articleId ?? null;\n\n const subscriber = userData();\n const body = JSON.stringify({\n user_subscription: {\n source_type: 'Article',\n source_id: articleId,\n subscriber_email: subscriber.email,\n },\n });\n\n return getCsrfToken()\n .then(sendFetch('user_subscriptions', body))\n .then((res) => res.json());\n}\n\nfunction fetchSubscriptionStatus() {\n const { articleId } = document.getElementById('article-body').dataset;\n\n const params = new URLSearchParams({\n source_type: 'Article',\n source_id: articleId,\n }).toString();\n\n const headers = {\n Accept: 'application/json',\n 'X-CSRF-Token': window.csrfToken,\n 'Content-Type': 'application/json',\n };\n\n return fetch(`/user_subscriptions/subscribed?${params}`, {\n method: 'GET',\n headers,\n credentials: 'same-origin',\n }).then((response) => {\n if (response.ok) {\n return response.json();\n }\n console.error(\n `Base data error: ${response.status} - ${response.statusText}`,\n );\n });\n}\n\nfunction showSubscribedNotices() {\n const { authorUsername } = document.getElementsByClassName(\n 'ltag__user-subscription-tag',\n )[0].dataset;\n\n updateNotices({\n variant: 'success',\n content: `You are now subscribed and may receive emails from ${authorUsername}`,\n });\n}\n\nfunction populateSubscriberProfileImage({\n profile_image_90: profileImageSrc,\n username,\n}) {\n document\n .querySelectorAll('.ltag__user-subscription-tag__subscriber-profile-image')\n .forEach((profileImage) => {\n profileImage.src = profileImageSrc;\n profileImage.alt = username;\n });\n}\n\n/**\n * Initializes the functionality of any user_subscription liquid tags in an article.\n *\n * An article may have more than one user_subscription liquid tag, but all instances complete the same action,\n * and are therefore kept in-step throughout any user interaction or update (i.e. the UI and behavior of all user_subscription\n * liquid tags in an article will always be the same).\n */\nexport async function initializeUserSubscriptionLiquidTagContent() {\n const allUserSubLiquidTags = document.getElementsByClassName(\n 'ltag__user-subscription-tag__container',\n );\n\n const { userStatus } = document.querySelector('body').dataset;\n if (userStatus === 'logged-out') {\n for (const liquidTag of allUserSubLiquidTags) {\n initSignedOutState(liquidTag);\n }\n return;\n }\n\n const { currentUser: user } = await getUserDataAndCsrfToken();\n const { apple_auth: isSubscriberAuthedWithApple } = user;\n\n // Setup the initial signed-in state without waiting on subscription status fetch\n for (const liquidTag of allUserSubLiquidTags) {\n initSignedInState(liquidTag, isSubscriberAuthedWithApple);\n }\n\n // Check if we need to refresh UI due to existing subscription\n populateSubscriberProfileImage(user);\n fetchSubscriptionStatus().then(({ is_subscribed: isSubscribed }) => {\n if (isSubscribed) {\n showSubscribedNotices();\n }\n for (const liquidTag of allUserSubLiquidTags) {\n toggleSubscribeActionUI({\n tagContainer: liquidTag,\n showSubscribeAction: !isSubscribed,\n appleAuth: isSubscriberAuthedWithApple,\n });\n }\n });\n}\n","import { h, render } from 'preact';\nimport { Snackbar, addSnackbarItem } from '../Snackbar';\nimport { addFullScreenModeControl } from '../utilities/codeFullscreenModeSwitcher';\nimport { initializeDropdown } from '../utilities/dropdownUtils';\nimport { setupBillboardDropdown } from '../utilities/billboardDropdown';\nimport { embedGists } from '../utilities/gist';\nimport { initializeUserSubscriptionLiquidTagContent } from '../liquidTags/userSubscriptionLiquidTag';\nimport { trackCommentClicks } from '@utilities/ahoy/trackEvents';\nimport { isNativeAndroid, copyToClipboard } from '@utilities/runtime';\n\nconst animatedImages = document.querySelectorAll('[data-animated=\"true\"]');\nif (animatedImages.length > 0) {\n import('@utilities/animatedImageUtils').then(\n ({ initializePausableAnimatedImages }) => {\n initializePausableAnimatedImages(animatedImages);\n },\n );\n}\n\nconst fullscreenActionElements = document.getElementsByClassName(\n 'js-fullscreen-code-action',\n);\n\nif (fullscreenActionElements) {\n addFullScreenModeControl(fullscreenActionElements);\n}\n\n// The Snackbar for the article page\nconst snackZone = document.getElementById('snack-zone');\nif (snackZone) {\n render(, snackZone);\n}\n\n// eslint-disable-next-line no-restricted-globals\ntop.addSnackbarItem = addSnackbarItem;\n\nconst multiReactionDrawerTrigger = document.getElementById(\n 'reaction-drawer-trigger',\n);\n\nif (\n multiReactionDrawerTrigger &&\n multiReactionDrawerTrigger.dataset.initialized !== 'true'\n) {\n initializeDropdown({\n triggerElementId: 'reaction-drawer-trigger',\n dropdownContentId: 'reaction-drawer',\n });\n}\n\n// Dropdown accessibility\nfunction hideCopyLinkAnnouncerIfVisible() {\n document.getElementById('article-copy-link-announcer').hidden = true;\n}\n\n// Initialize the share options\nconst shareDropdownButton = document.getElementById('article-show-more-button');\n\nif (shareDropdownButton.dataset.initialized !== 'true') {\n if (isNativeAndroid('shareText')) {\n // Android native apps have enhanced sharing capabilities for Articles and don't use our standard dropdown\n shareDropdownButton.addEventListener('click', () =>\n AndroidBridge.shareText(location.href),\n );\n } else {\n const { closeDropdown } = initializeDropdown({\n triggerElementId: 'article-show-more-button',\n dropdownContentId: 'article-show-more-dropdown',\n onClose: hideCopyLinkAnnouncerIfVisible,\n });\n\n // We want to close the dropdown on link select (since they open in a new tab)\n document\n .querySelectorAll('#article-show-more-dropdown [href]')\n .forEach((link) => {\n link.addEventListener('click', (event) => {\n closeDropdown(event);\n });\n });\n }\n\n shareDropdownButton.dataset.initialized = 'true';\n}\n\n// Initialize the copy to clipboard functionality\nfunction showAnnouncer() {\n document.getElementById('article-copy-link-announcer').hidden = false;\n}\n\nfunction focusOnComments() {\n if (location.hash === '#comments') {\n //handle focus event on text area\n const element = document.getElementById('text-area');\n const event = new FocusEvent('focus');\n element.dispatchEvent(event);\n }\n}\n\nfunction copyArticleLink() {\n const postUrlValue = document\n .getElementById('copy-post-url-button')\n .getAttribute('data-postUrl');\n copyToClipboard(postUrlValue).then(() => {\n showAnnouncer();\n });\n}\ndocument\n .getElementById('copy-post-url-button')\n ?.addEventListener('click', copyArticleLink);\n\n// Comment Subscription\ngetCsrfToken().then(async () => {\n const { user = null, userStatus } = document.body.dataset;\n const root = document.getElementById('comment-subscription');\n const isLoggedIn = userStatus === 'logged-in';\n\n if (!root) {\n return;\n }\n try {\n const {\n getCommentSubscriptionStatus,\n setCommentSubscriptionStatus,\n CommentSubscription,\n } = await import('../CommentSubscription');\n\n const { articleId } = document.getElementById('article-body').dataset;\n\n let subscriptionType = 'not_subscribed';\n\n if (isLoggedIn && user !== null) {\n ({ config: subscriptionType } = await getCommentSubscriptionStatus(\n articleId,\n ));\n }\n\n const subscriptionRequestHandler = async (type) => {\n const message = await setCommentSubscriptionStatus(articleId, type);\n\n addSnackbarItem({ message, addCloseButton: true });\n };\n\n render(\n ,\n root,\n );\n } catch (e) {\n root.innerHTML =\n '

Unable to load Comment Subscription component.
Try refreshing the page.

';\n }\n});\n\nconst targetNode = document.querySelector('#comments');\ntargetNode && embedGists(targetNode);\n\nsetupBillboardDropdown();\ninitializeUserSubscriptionLiquidTagContent();\nfocusOnComments();\n// Temporary Ahoy Stats for comment section clicks on controls\ntrackCommentClicks('comments');\n","/**\n * This function returns a string combining the current Medium and OS\n * that represents the current Context where the app is running.\n *\n * @returns {String} \"Medium-OS\", for example \"Browser-Android\"\n */\nexport const currentContext = () => `${currentMedium()}-${currentOS()}`;\n\n/**\n * This function returns a string that represents the current Medium where\n * the app is currently running. The currently supported mediums are Browser,\n * and ForemWebView.\n *\n * @returns {String} One of the supported Mediums\n */\nexport const currentMedium = () =>\n /ForemWebView/i.test(navigator.userAgent) ? 'ForemWebView' : 'Browser';\n\n/**\n * This function returns a string that represents the current OS where the app\n * is currently running. The currently supported Operating Systems are\n * Windows, Linux, macOS, Android and iOS.\n *\n * @returns {String} One of the supported Operating Systems or 'Unsupported'\n */\nexport const currentOS = () => {\n const macosPlatforms = ['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K'];\n const windowsPlatforms = ['Win32', 'Win64', 'Windows', 'WinCE'];\n const iosPlatforms = ['iPhone', 'iPad', 'iPod'];\n\n if (macosPlatforms.includes(window.navigator.platform)) {\n return 'macOS';\n } else if (iosPlatforms.includes(window.navigator.platform)) {\n return 'iOS';\n } else if (windowsPlatforms.includes(window.navigator.platform)) {\n return 'Windows';\n } else if (/Android/i.test(window.navigator.userAgent)) {\n return 'Android';\n } else if (/Linux/i.test(window.navigator.platform)) {\n return 'Linux';\n }\n\n return 'Unsupported';\n};\n\n/**\n * Checks the device for iOS (webkit) native feature support\n *\n * @function isNativeIOS\n * @param {string} namespace Specifies support for a specific feature\n * (i.e. video, podcast, etc)\n * @returns {boolean} true if current environment support native features\n */\nexport const isNativeIOS = (namespace = null) => {\n const nativeCheck =\n /DEV-Native-ios|ForemWebView/i.test(navigator.userAgent) &&\n window &&\n window.webkit &&\n window.webkit.messageHandlers;\n\n let namespaceCheck = true;\n if (nativeCheck && namespace) {\n namespaceCheck = window.webkit.messageHandlers[namespace] != undefined;\n }\n\n return nativeCheck && namespaceCheck;\n};\n\n/**\n * Checks the device for Android native feature support\n *\n * @function isNativeAndroid\n * @param {string} namespace Specifies support for a specific feature\n * (i.e. videoMessage, podcastMessage, etc)\n * @returns {boolean} true if current environment support native features\n */\nexport const isNativeAndroid = (namespace = null) => {\n const nativeCheck =\n /DEV-Native-android|ForemWebView/i.test(navigator.userAgent) &&\n typeof AndroidBridge !== 'undefined';\n\n let namespaceCheck = true;\n if (nativeCheck && namespace) {\n namespaceCheck = AndroidBridge[namespace] != undefined;\n }\n\n return nativeCheck && namespaceCheck;\n};\n\n/**\n * This function copies text to clipboard taking in consideration all\n * supported platforms.\n *\n * @param {string} text to be copied to the clipboard\n *\n * @returns {Promise} Resolves when successful in copying to clipboard\n */\nexport const copyToClipboard = (text) => {\n return new Promise((resolve, reject) => {\n if (isNativeAndroid('copyToClipboard')) {\n AndroidBridge.copyToClipboard(text);\n resolve();\n } else if (navigator.clipboard != null) {\n navigator.clipboard\n .writeText(text)\n .then(() => {\n resolve();\n })\n .catch((e) => {\n reject(e);\n });\n } else {\n reject('Unable to copy the text. Try reloading the page');\n }\n });\n};\n\n/**\n * Returns true if the supplied KeyboardEvent includes the OS-specific\n * modifier key. For example, the Cmd key on Apple platforms or the Ctrl key\n * on others.\n *\n * @param {KeyboardEvent} The event to check for the OS-specific modifier key\n *\n * @returns {Boolean} true if the event was fired with the OS-specific\n * modifier key, false otherwise. Also returns false if\n * the event is not a KeyboardEvent.\n */\nexport const hasOSSpecificModifier = (event) => {\n if (!(event instanceof KeyboardEvent)) {\n return false;\n }\n\n if (navigator.userAgent.indexOf('Mac OS X') >= 0) {\n return event.metaKey;\n }\n return event.ctrlKey;\n};\n\n/**\n * Returns a string representation of the expected modifier key for the current OS.\n * This allows us to display correct shortcut key hints to users in the UI, and set up correct shortcut key bindings.\n *\n * @returns {string} either 'cmd' if on macOS, or 'ctrl' otherwise\n */\nexport const getOSKeyboardModifierKeyString = () =>\n currentOS() === 'macOS' ? 'cmd' : 'ctrl';\n\n/**\n * @returns {string} A string representing the locale as per the user's browser settings\n */\nexport const getCurrentLocale = () => navigator.language;\n","import { useState, useEffect } from 'preact/hooks';\n\n/**\n * Pre-defined breakpoints for width.\n *\n * Note: These were copied from _import.scss.\n */\nexport const BREAKPOINTS = Object.freeze({\n Small: 640,\n Medium: 768,\n Large: 1024,\n ExtraLarge: 1280,\n});\n\n/**\n * A custom Preact hook for evaluating whether or not a CSS media query is matched or not.\n *\n * @param {string} query The media query to evaluate.\n *\n * @returns {boolean} True if the media query is matched, false otherwise.\n *\n * @example\n * import { useMediaQuery } from '@components/useMediaQuery';\n *\n * function SomeComponent({ query }) {\n * const matchesBreakpoint = useMediaQuery(query);\n *\n * if (!matchesBreakpoint) {\n * return null;\n * }\n *\n * return \n * }\n */\nexport const useMediaQuery = (query) => {\n const mediaQuery = window.matchMedia(query);\n\n const [match, setMatch] = useState(!!mediaQuery.matches);\n\n useEffect(() => {\n const handler = () => {\n setMatch(!!mediaQuery.matches);\n };\n mediaQuery.addListener(handler);\n\n return () => mediaQuery.removeListener(handler);\n });\n\n return match;\n};\n"],"sourceRoot":""}