{"version":3,"sources":["webpack:///./node_modules/preact/dist/preact.module.js","webpack:///./node_modules/prop-types/index.js","webpack:///./app/javascript/shared/components/useKeyboardShortcuts.js","webpack:///./app/javascript/utilities/http/errors.js","webpack:///./app/javascript/crayons/Button/index.js","webpack:///./app/javascript/Search/SearchForm.jsx","webpack:///./app/javascript/Search/Search.jsx","webpack:///./app/javascript/Search/SearchFormSync.jsx","webpack:///./app/javascript/packs/Search.jsx","webpack:///./app/javascript/utilities/http/request.js","webpack:///./node_modules/prop-types/factoryWithThrowingShims.js","webpack:///./node_modules/prop-types/lib/ReactPropTypesSecret.js","webpack:///./app/javascript/packs/validateFileInputs.js","webpack:///./app/javascript/utilities/viewport.js","webpack:///./app/javascript/shared/components/useMediaQuery.js","webpack:///./app/javascript/common-prop-types/article-prop-types.js","webpack:///./app/javascript/crayons/Button/Button.jsx","webpack:///./app/javascript/Snackbar/SnackbarItem.jsx","webpack:///./app/javascript/shared/components/focusTrap.jsx","webpack:///./app/javascript/utilities/dropdownUtils.js","webpack:///./app/javascript/utilities/debounceAction.js","webpack:///./app/javascript/article-form/actions.js","webpack:///./app/javascript/utilities/search/index.js","webpack:///./app/javascript/utilities/locale.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/Icons/Icon.jsx","webpack:///./app/javascript/crayons/MobileDrawer/MobileDrawer.jsx","webpack:///./app/javascript/crayons/navigation/MobileDrawerNavigation/MobileDrawerNavigation.jsx","webpack:///./app/javascript/crayons/Modal/Modal.jsx","webpack:///./app/javascript/crayons/Spinner/Spinner.jsx","webpack:///./app/javascript/Snackbar/Snackbar.jsx","webpack:///./app/javascript/crayons/MarkdownToolbar/icons.jsx","webpack:///./app/javascript/crayons/MarkdownToolbar/markdownSyntaxFormatters.js","webpack:///./app/javascript/crayons/MarkdownToolbar/MarkdownToolbar.jsx","webpack:///./app/javascript/article-form/components/ClipboardButton.jsx","webpack:///./app/javascript/article-form/components/ImageUploader.jsx","webpack:///./node_modules/preact/compat/dist/compat.module.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/utilities/calculateTextAreaHeight.js","webpack:///./app/javascript/utilities/textAreaUtils.js","webpack:///./app/javascript/common-prop-types/default-children-prop-types.js","webpack:///./app/javascript/Snackbar/index.js"],"names":["v","n","l","u","i","t","r","o","f","e","c","s","a","h","parentNode","removeChild","arguments","length","children","call","defaultProps","y","type","props","key","ref","__k","__","__b","__e","__d","__c","__h","constructor","__v","vnode","p","current","d","_","this","context","k","indexOf","b","base","m","push","g","__r","debounceRendering","sort","some","__P","j","__n","ownerSVGElement","z","w","A","Array","isArray","x","P","N","M","appendChild","nextSibling","insertBefore","$","setProperty","test","H","style","cssText","replace","toLowerCase","slice","addEventListener","T","I","removeEventListener","setAttribute","removeAttribute","event","contextType","value","__E","prototype","render","O","sub","state","__s","getDerivedStateFromProps","componentWillMount","componentDidMount","componentWillReceiveProps","shouldComponentUpdate","forEach","componentWillUpdate","componentDidUpdate","getChildContext","getSnapshotBeforeUpdate","L","diffed","localName","nodeType","document","createTextNode","createElementNS","createElement","is","data","childNodes","dangerouslySetInnerHTML","attributes","name","__html","innerHTML","C","checked","unmount","componentWillUnmount","S","firstChild","q","B","D","Consumer","Provider","splice","getDerivedStateFromError","setState","componentDidCatch","forceUpdate","Promise","then","bind","resolve","setTimeout","module","exports","isFormField","element","HTMLElement","nodeName","getAttribute","isContentEditable","callShortcut","keys","chain","shortcuts","shortcut","join","code","defaultOptions","timeout","useKeyboardShortcuts","eventTarget","window","options","useState","storedShortcuts","keyChain","setKeyChain","mergedOptions","setMergedOptions","useEffect","newOptions","clearTimeout","Object","keyEvent","defaultPrevented","ctrlKeyEntry","ctrlKey","cmdKeyEntry","metaKey","altKeyEntry","altKey","shiftKeyEntry","shiftKey","target","Node","newChain","KeyboardShortcuts","propTypes","PropTypes","object","isRequired","shape","number","oneOfType","instanceOf","Element","Window","handleFetchAPIErrors","response","ok","json","Error","error","SyntaxError","statusText","SearchIcon","SearchForm","forwardRef","searchTerm","onSubmitSearch","action","acceptCharset","method","onSubmit","role","class","className","placeholder","locale","autoComplete","icon","string","func","Search","enableSearchPageListener","enableSearchPageChecker","hasKeyModifiers","submit","preventDefault","searchInputRef","currentSearchTerm","hasInstantClick","setSearchTerm","preloadSearchResults","displaySearchResults","minimizeHeader","body","classList","toggle","focusOnSearchBox","remove","searchBox","focus","select","syncSearchUrlWithInput","createRef","searchPageChecker","exec","location","href","getSearchTermFromUrl","search","InstantClick","on","globalKeysListener","off","Component","SearchFormSync","mobileSearchContainer","setMobileSearchContainer","syncSearchFormsListener","querystring","detail","updatedSearchTerm","getElementById","unmountComponentAtNode","form","querySelector","createPortal","root","request","url","headers","csrfToken","getCsrfToken","restOfOptions","jsonifiedBody","JSON","stringify","fetchOptions","Accept","credentials","fetch","ReactPropTypesSecret","emptyFunction","emptyFunctionWithReset","resetWarningCache","shim","propName","componentName","propFullName","secret","err","getShim","ReactPropTypes","array","bool","symbol","any","arrayOf","elementType","node","objectOf","oneOf","exact","checkPropTypes","MAX_FILE_SIZE_MB","freeze","image","video","PERMITTED_FILE_TYPES","addErrorMessage","fileInput","msg","fileInputField","color","add","append","validateFileSize","file","fileType","maxFileSizeMb","dataset","fileSizeErrorHandler","fileSizeMb","size","toFixed","isValidFileSize","Number","errorMessage","handleFileSizeError","validateFileType","permittedFileTypes","parse","fileTypeErrorHandler","isValidFileType","includes","handleFileTypeError","validateFileNameLength","maxFileNameLength","fileNameLengthErrorHandler","isValidFileNameLength","handleFileNameLengthError","validateFileInput","isValidFileInput","removeErrorMessage","files","from","split","validateFileInputs","validFileInputs","fileInputs","querySelectorAll","isInViewport","offsetTop","allowPartialVisibility","boundingRect","getBoundingClientRect","clientHeight","innerHeight","documentElement","clientWidth","innerWidth","topIsInViewport","top","rightIsInViewport","right","bottomIsInViewport","bottom","leftIsInViewport","left","topIsOutOfViewport","bottomIsOutOfViewport","BREAKPOINTS","Small","Medium","Large","useMediaQuery","query","mediaQuery","matchMedia","matches","match","setMatch","handler","addListener","removeListener","articleSnippetResultPropTypes","body_text","articlePropTypes","id","title","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","user","username","organization","profile_image_90","highlight","public_reactions_count","reactions_count","comments_count","reading_time","getAdditionalClassNames","variant","contentType","inverted","disabled","tooltip","additionalClassNames","Button","tagName","buttonType","onClick","onMouseOver","onMouseOut","onFocus","onBlur","onKeyUp","tabIndex","restOfProps","suppressTooltip","setSuppressTooltip","ComponentName","Icon","otherProps","undefined","displayName","defaultChildrenPropTypes","snackbarItemProps","actions","message","lifespan","SnackbarItem","map","text","FocusTrap","selector","onDeactivate","clickOutsideDeactivates","focusTrap","useRef","deactivate","useCallback","useLayoutEffect","currentLocationHref","routeChangeObserver","MutationObserver","mutations","disconnect","createFocusTrap","escapeDeactivates","activate","observe","childList","escape","getDropdownRepositionListener","debounceAction","handleDropdownRepositions","isDropdownCurrentlyOpen","display","opacity","removeProperty","INTERACTIVE_ELEMENTS_QUERY","closeDropdown","triggerElementId","dropdownContentId","onClose","dropdownContent","initializeDropdown","dropdownContentCloseButtonId","onOpen","triggerButton","keyUpListener","onCloseCleanupActions","contains","activeElement","clickOutsideListener","openDropdown","time","config","leading","configs","debounce","previewArticle","payload","successCb","failureCb","article_body","status","processPayload","previewShowing","helpShowing","previewResponse","helpHTML","imageManagementShowing","moreConfigShowing","errors","submitArticle","onSuccess","onError","article","current_state_path","generateUploadFormdata","token","formData","FormData","entries","generateMainImage","signal","links","processImageUpload","images","handleImageSuccess","handleImageFailure","getParameters","params","sanitizedName","results","RegExp","decodeURIComponent","getParameterByName","getFilterParameters","instantClick","fixedEncodeURIComponent","encodeURIComponent","charCodeAt","toString","baseUrl","origin","sanitizedQuery","filterParameters","sortParameters","searchParameters","URLSearchParams","filterXSS","get","divForDecode","nodeValue","encodedQuery","searchUrl","preload","fetchSearch","endpoint","dataHash","searchParams","arrayValue","createSearchUrl","translationsDiv","term","I18n","translations","defaultLocale","ButtonNew","primary","rounded","destructive","classes","classNames","focusable","src","Link","block","CTA","ButtonGroup","Dropdown","triggerButtonId","isInitialized","setIsInitialized","FormField","RadioButton","InternalIcon","native","MobileDrawer","isCurrentPage","CloseIcon","width","height","viewBox","xmlns","Modal","overlay","closeOnClickOutside","focusTrapSelector","Spinner","fill","snackbarItems","addSnackbarItem","snackbarItem","Snackbar","snacks","pollingId","paused","pauseLifespan","resumeLifespan","initializePolling","_event","stopPropagation","pollingTime","setInterval","newSnacks","updateSnackbarItems","snack","lifespanTimeoutId","decreaseLifespan","addCloseButton","prevState","filter","potentialSnackToFilterOut","updatedSnacks","currentSnack","index","Overflow","Help","ORDERED_LIST_ITEM_REGEX","MARKDOWN_LINK_REGEX","URL_PLACEHOLDER_TEXT","getNewLinePrefixSuffixes","selectionStart","selectionEnd","numberOfNewLinesBeforeSelection","getNumberOfNewLinesPrecedingSelection","numberOfNewLinesFollowingSelection","getNumberOfNewLinesFollowingSelection","numberOfNewLinesNeededAtStart","newLinesPrefix","String","padStart","newLinesSuffix","undoOrAddFormattingForInlineSyntax","prefix","suffix","prefixLength","suffixLength","getSelectionData","selectedText","textBeforeSelection","textAfterSelection","editSelectionStart","editSelectionEnd","replaceSelectionWith","newCursorStart","newCursorEnd","substring","undoOrAddFormattingForMultilineSyntax","linePrefix","blockPrefix","blockSuffix","formattedText","lastNewLine","getLastIndexOfCharacter","content","selectionIndex","character","lineStart","splitByNewLine","line","every","unformattedText","newLinePrefixLength","cursorStartBaseline","cursorStartBlockPrefixOffset","cursorStartLinePrefixOffset","coreSyntaxFormatters","bold","label","getKeyboardShortcut","modifier","Runtime","getOSKeyboardModifierKeyString","command","tooltipHint","toUpperCase","getFormatting","italic","link","startingText","basicFormattingForEmptySelection","indexOfLinkStructureEnd","getNextIndexOfCharacter","breakOnCharacters","urlText","handleLinkFormattingForEmptyTextSelection","startsWith","basicFormattingForLinkSelection","indexOfSyntaxOpen","textToReplaceMarkdown","handleLinkFormattingForUrlSelection","linkDescriptionEnd","linkText","handleUndoMarkdownLinkSelection","orderedList","newLineSuffixLength","newText","indexOfFullStop","formattedList","textChunk","unorderedList","heading","currentLineSelectionStart","indexOfFirstLineCharacter","charAt","currentHeadingIndex","adjustingHeading","cursorOffset","quote","codeBlock","secondarySyntaxFormatters","underline","strikethrough","divider","UPLOADING_IMAGE_PLACEHOLDER","MarkdownToolbar","textAreaId","textArea","setTextArea","overflowMenuOpen","setOverflowMenuOpen","storedCursorPosition","setStoredCursorPosition","smallScreen","markdownSyntaxFormatters","keyboardShortcuts","fromEntries","syntaxName","insertSyntax","clickOutsideHandler","escapePressHandler","getElementsByClassName","handleToolbarButtonKeyPress","nextButton","sibling","nextElementSibling","getNextMatchingSibling","previousButton","previousElementSibling","getPreviousMatchingSibling","firstButton","allButtons","lastButton","contentEditable","preventScroll","setSelectionRange","execCommand","textAreaValue","getNewTextAreaValueWithEdits","dispatchEvent","Event","handleImageUploadEnd","imageMarkdown","currentTextAreaValue","indexOfPlaceholder","newTextValue","differenceInLength","getSecondaryFormatterButtons","isOverflow","controlName","tabindex","ImageUploader","editorVersion","onImageUploadStart","textWithPlaceholder","newCursorPosition","onImageUploadSuccess","onImageUploadError","buttonProps","rel","CopyIcon","ClipboardButton","imageLinks","onCopy","imageUrls","showCopyMessage","for","readOnly","imageLink","ImageIcon","CancelIcon","SpinnerOrCancel","imageUploaderReducer","uploadErrorMessage","uploadingImage","insertionImageUrls","initNativeImagePicker","ForemMobile","injectNativeMessage","NativeIosV1ImageUpload","V2EditorImageUpload","handleInsertionImageUpload","useNativeUpload","handleNativeMessage","abortRequestController","setAbortRequestController","actionTooltip","onChange","controller","AbortController","accept","abort","click","V1EditorImageUpload","showCopiedImageText","setShowCopiedImageText","multiple","imageMarkdownInput","copyToClipboard","Honeybadger","notify","useReducer","dispatch","onUploadError","abortSignal","handleInsertImageUploadSuccess","innerText","namespace","isNativeIOS","E","isReactComponent","__f","isPureReactComponent","R","Symbol","$$typeof","__u","U","__R","__O","pop","__H","fallback","delete","revealOrder","W","Map","reverse","set","V","defineProperty","configurable","writable","Z","Y","cancelBubble","persist","isPropagationStopped","isDefaultPrevented","nativeEvent","J","K","selected","defaultValue","enumerable","Q","un","userPropTypes","profile_image_url","summary","selectedTagsPropTypes","tags","onKeyPress","hiddenTextarea","SIZING_STYLE","calculateNodeStyling","getComputedStyle","boxSizing","getPropertyValue","paddingSize","parseFloat","borderSize","sizingStyle","getCursorXY","input","selectionPoint","bodyRect","elementRect","inputY","scrollTop","inputX","scrollLeft","div","copyStyle","prop","inputValue","textContent","substr","span","spanX","offsetLeft","spanY","getMentionWordData","valueBeforeKeystroke","isUserMention","indexOfMentionStart","indexOfAutocompleteStart","currentCharacter","previousCharacter","nextCharacter","count","searchIndex","useTextAreaAutoResize","constrainToContentHeight","setConstrainToContentHeight","additionalElements","setAdditionalElements","resizeTextArea","allContentHeights","uiTextNode","baseHeight","scrollHeight","calculateTextAreaHeight","Math","max","newHeight"],"mappings":"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","file":"js/Search-cc4127868b16c35e79ca.chunk.js","sourcesContent":["var n,l,u,i,t,r,o,f,e={},c=[],s=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;function a(n,l){for(var u in l)n[u]=l[u];return n}function h(n){var l=n.parentNode;l&&l.removeChild(n)}function v(l,u,i){var t,r,o,f={};for(o in u)\"key\"==o?t=u[o]:\"ref\"==o?r=u[o]:f[o]=u[o];if(arguments.length>2&&(f.children=arguments.length>3?n.call(arguments,2):i),\"function\"==typeof l&&null!=l.defaultProps)for(o in l.defaultProps)void 0===f[o]&&(f[o]=l.defaultProps[o]);return y(l,f,t,r,null)}function y(n,i,t,r,o){var f={type:n,props:i,key:t,ref:r,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,__h:null,constructor:void 0,__v:null==o?++u:o};return null==o&&null!=l.vnode&&l.vnode(f),f}function p(){return{current:null}}function d(n){return n.children}function _(n,l){this.props=n,this.context=l}function k(n,l){if(null==l)return n.__?k(n.__,n.__.__k.indexOf(n)+1):null;for(var u;l0?y(_.type,_.props,_.key,null,_.__v):_)){if(_.__=u,_.__b=u.__b+1,null===(p=w[h])||p&&_.key==p.key&&_.type===p.type)w[h]=void 0;else for(v=0;v2&&(f.children=arguments.length>3?n.call(arguments,2):i),y(l.type,f,t||l.key,r||l.ref,null)}function D(n,l){var u={__c:l=\"__cC\"+f++,__:n,Consumer:function(n,l){return n.children(l)},Provider:function(n){var u,i;return this.getChildContext||(u=[],(i={})[l]=this,this.getChildContext=function(){return i},this.shouldComponentUpdate=function(n){this.props.value!==n.value&&u.some(m)},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=c.slice,l={__e:function(n,l){for(var u,i,t;l=l.__;)if((u=l.__c)&&!u.__)try{if((i=u.constructor)&&null!=i.getDerivedStateFromError&&(u.setState(i.getDerivedStateFromError(n)),t=u.__d),null!=u.componentDidCatch&&(u.componentDidCatch(n),t=u.__d),t)return u.__E=u}catch(l){n=l}throw n}},u=0,i=function(n){return null!=n&&void 0===n.constructor},_.prototype.setState=function(n,l){var u;u=null!=this.__s&&this.__s!==this.state?this.__s:this.__s=a({},this.state),\"function\"==typeof n&&(n=n(a({},u),this.props)),n&&a(u,n),null!=n&&this.__v&&(l&&this.__h.push(l),m(this))},_.prototype.forceUpdate=function(n){this.__v&&(this.__e=!0,n&&this.__h.push(n),m(this))},_.prototype.render=d,t=[],r=\"function\"==typeof Promise?Promise.prototype.then.bind(Promise.resolve()):setTimeout,g.__r=0,f=0;export{S as render,q as hydrate,v as createElement,v as h,d as Fragment,p as createRef,i as isValidElement,_ as Component,B as cloneElement,D as createContext,A as toChildArray,l as options};\n//# sourceMappingURL=preact.module.js.map\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nif (process.env.NODE_ENV !== 'production') {\n var ReactIs = require('react-is');\n\n // By explicitly using `prop-types` you are opting into new development behavior.\n // http://fb.me/prop-types-in-prod\n var throwOnDirectAccess = true;\n module.exports = require('./factoryWithTypeCheckers')(ReactIs.isElement, throwOnDirectAccess);\n} else {\n // By explicitly using `prop-types` you are opting into new production behavior.\n // http://fb.me/prop-types-in-prod\n module.exports = require('./factoryWithThrowingShims')();\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","// eslint-disable-next-line consistent-return\nexport function handleFetchAPIErrors(response) {\n // pass along a correct response\n if (response.ok) {\n return response;\n }\n\n // API errors contain the error message in {\"error\": \"error message\"}\n // but they could be unhandled 500 errors\n try {\n response.json().then((data) => {\n throw new Error(data.error);\n });\n } catch (e) {\n if (e instanceof SyntaxError) {\n throw new Error(response.statusText);\n } else {\n throw e;\n }\n }\n}\n","export * from './Button';\n","import PropTypes from 'prop-types';\nimport { h } from 'preact';\nimport { forwardRef } from 'preact/compat';\nimport { locale } from '../utilities/locale';\nimport { ButtonNew as Button } from '@crayons';\nimport SearchIcon from '@images/search.svg';\n\nexport const SearchForm = forwardRef(({ searchTerm, onSubmitSearch }, ref) => (\n \n \n
\n
\n \n \n
\n
\n \n));\n\nSearchForm.propTypes = {\n searchTerm: PropTypes.string.isRequired,\n onSubmitSearch: PropTypes.func.isRequired,\n};\n","import { h, Component, Fragment, createRef } from 'preact';\nimport PropTypes from 'prop-types';\nimport {\n displaySearchResults,\n getSearchTermFromUrl,\n hasInstantClick,\n preloadSearchResults,\n} from '../utilities/search';\nimport { KeyboardShortcuts } from '../shared/components/useKeyboardShortcuts';\nimport { SearchForm } from './SearchForm';\n\nconst GLOBAL_MINIMIZE_KEY = 'Digit0';\nconst GLOBAL_SEARCH_KEY = '/';\n\nexport class Search extends Component {\n constructor(props) {\n super(props);\n this.enableSearchPageChecker = true;\n this.syncSearchUrlWithInput = this.syncSearchUrlWithInput.bind(this);\n this.searchInputRef = createRef(null);\n }\n\n componentWillMount() {\n const { searchTerm, setSearchTerm } = this.props;\n\n const searchPageChecker = () => {\n if (\n this.enableSearchPageChecker &&\n searchTerm !== '' &&\n /^http(s)?:\\/\\/[^/]+\\/search/.exec(window.location.href) === null\n ) {\n setSearchTerm('');\n }\n\n setTimeout(searchPageChecker, 500);\n };\n\n searchPageChecker();\n }\n\n /**\n * Synchronizes the search input value with the search term defined in the URL.\n */\n syncSearchUrlWithInput() {\n // TODO: Consolidate search functionality.\n // Note that push states for search occur in _search.html.erb\n // in initializeSortingTabs(query)\n const { setSearchTerm } = this.props;\n const searchTerm = getSearchTermFromUrl(window.location.search);\n\n // We set the value outside of React state so that there is no flickering of placeholder\n // to search term.\n const searchBox = this.searchInputRef.current;\n searchBox.value = searchTerm;\n\n // Even though we set the search term directly via the DOM, it still needs to reside\n // in component state.\n setSearchTerm(searchTerm);\n }\n\n componentDidMount() {\n InstantClick.on('change', this.enableSearchPageListener);\n\n window.addEventListener('popstate', this.syncSearchUrlWithInput);\n }\n\n enableSearchPageListener = () => {\n this.enableSearchPageChecker = true;\n };\n\n hasKeyModifiers = (event) => {\n return event.altKey || event.ctrlKey || event.metaKey || event.shiftKey;\n };\n\n submit = (event) => {\n event.preventDefault();\n\n const { value: searchTerm } = this.searchInputRef.current;\n const { searchTerm: currentSearchTerm } = this.props;\n\n this.enableSearchPageChecker = false;\n\n if (hasInstantClick() && searchTerm !== currentSearchTerm) {\n const { setSearchTerm } = this.props;\n setSearchTerm(searchTerm);\n\n preloadSearchResults({ searchTerm });\n displaySearchResults({ searchTerm });\n }\n };\n\n componentWillUnmount() {\n document.removeEventListener('keydown', this.globalKeysListener);\n window.removeEventListener('popstate', this.syncSearchUrlWithInput);\n InstantClick.off &&\n InstantClick.off('change', this.enableSearchPageListener);\n }\n\n minimizeHeader = (event) => {\n event.preventDefault();\n document.body.classList.toggle('zen-mode');\n };\n\n focusOnSearchBox = (event) => {\n event.preventDefault();\n document.body.classList.remove('zen-mode');\n\n const searchBox = this.searchInputRef.current;\n searchBox.focus();\n searchBox.select();\n };\n\n render({ searchTerm }) {\n return (\n \n \n \n \n );\n }\n}\n\nSearch.propTypes = {\n searchTerm: PropTypes.string.isRequired,\n setSearchTerm: PropTypes.func.isRequired,\n};\n","import { h } from 'preact';\nimport { useEffect, useState } from 'preact/hooks';\nimport { createPortal, Fragment, unmountComponentAtNode } from 'preact/compat';\nimport { Search } from './Search';\nimport { getSearchTermFromUrl } from '@utilities/search';\n\n/**\n * Manages the synchronization of search state between the top search bar (desktop) and\n * mobile (in search results page).\n */\nexport function SearchFormSync() {\n const [searchTerm, setSearchTerm] = useState(() => {\n return getSearchTermFromUrl(location.search);\n });\n const [mobileSearchContainer, setMobileSearchContainer] = useState(null);\n\n /**\n * A listener for handling the synchronization of search forms.\n *\n * @param {CustomEvent<{ querystring: string }>} event A custom event for synching search forms.\n */\n function syncSearchFormsListener(event) {\n const { querystring } = event.detail;\n const updatedSearchTerm = getSearchTermFromUrl(querystring);\n\n // Server-side rendering of search results means the DOM node is destroyed everytime a search is performed,\n // So we need to get the reference every time and use that for the parent in the portal.\n const element = document.getElementById('mobile-search-container');\n\n // The DOM element has changed because server-sde rendering returns new\n // search results which destroys the existing search form in mobile view.\n // Because of this we need to unmount the component at the old element reference\n // i.e. the container for the createPortal call in the render.\n // If we do not unmount, it will result in an unmounting error that will throw as the\n // container element (search form that was wiped out because of the new search results) no longer exists.\n if (mobileSearchContainer && element !== mobileSearchContainer) {\n unmountComponentAtNode(mobileSearchContainer);\n }\n\n // We need to delete the existing server-side rendered form because createPortal only appends to it's container.\n if (element) {\n const form = element.querySelector('form');\n form && element.removeChild(form);\n }\n\n setMobileSearchContainer(element);\n setSearchTerm(updatedSearchTerm);\n }\n\n useEffect(() => {\n window.addEventListener('syncSearchForms', syncSearchFormsListener);\n\n return () => {\n window.removeEventListener('syncSearchForms', syncSearchFormsListener);\n };\n });\n\n return (\n \n \n {mobileSearchContainer &&\n createPortal(\n ,\n mobileSearchContainer,\n )}\n \n );\n}\n","import { h, render } from 'preact';\nimport { SearchFormSync } from '../Search/SearchFormSync';\n\ndocument.addEventListener('DOMContentLoaded', () => {\n const root = document.getElementById('header-search');\n\n render(, root);\n});\n","/**\n * Generic request with all the default headers required by the application.\n *\n * @example\n * import { request } from '@utilities/http';\n *\n * const response = await request('/notification_subscriptions/Article/26')\n *\n * Note:\n * The body option will typically be passed in as a JavaScript object.\n * A check is performed for this and automatically convert it to JSON if necessary.\n *\n * Requests send JSON by default but this can be easily overridden by adding\n * the Accept and Content-Type headers to the request options.\n *\n * The default method is GET.\n *\n * @param {string} url The URL to make the request to.\n * @param {RequestInit} [options={}] The request options.\n *\n * @return {Promise} the response\n */\nexport async function request(url, options = {}) {\n const {\n headers,\n body,\n method = 'GET',\n csrfToken = await getCsrfToken(),\n // These are any other options that might be passed in e.g. keepalive\n ...restOfOptions\n } = options;\n\n // There should never be a scenario where null is passed as the body,\n // but if ever there is, this logic should change.\n const jsonifiedBody = {\n body: body && typeof body !== 'string' ? JSON.stringify(body) : body,\n };\n\n const fetchOptions = {\n method,\n headers: {\n Accept: 'application/json',\n 'X-CSRF-Token': csrfToken,\n 'Content-Type': 'application/json',\n ...headers,\n },\n credentials: 'same-origin',\n ...jsonifiedBody,\n ...restOfOptions,\n };\n\n return fetch(url, fetchOptions);\n}\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');\n\nfunction emptyFunction() {}\nfunction emptyFunctionWithReset() {}\nemptyFunctionWithReset.resetWarningCache = emptyFunction;\n\nmodule.exports = function() {\n function shim(props, propName, componentName, location, propFullName, secret) {\n if (secret === ReactPropTypesSecret) {\n // It is still safe when called from React.\n return;\n }\n var err = new Error(\n 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +\n 'Use PropTypes.checkPropTypes() to call them. ' +\n 'Read more at http://fb.me/use-check-prop-types'\n );\n err.name = 'Invariant Violation';\n throw err;\n };\n shim.isRequired = shim;\n function getShim() {\n return shim;\n };\n // Important!\n // Keep this list in sync with production version in `./factoryWithTypeCheckers.js`.\n var ReactPropTypes = {\n array: shim,\n bool: shim,\n func: shim,\n number: shim,\n object: shim,\n string: shim,\n symbol: shim,\n\n any: shim,\n arrayOf: getShim,\n element: shim,\n elementType: shim,\n instanceOf: getShim,\n node: shim,\n objectOf: getShim,\n oneOf: getShim,\n oneOfType: getShim,\n shape: getShim,\n exact: getShim,\n\n checkPropTypes: emptyFunctionWithReset,\n resetWarningCache: emptyFunction\n };\n\n ReactPropTypes.PropTypes = ReactPropTypes;\n\n return ReactPropTypes;\n};\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\nmodule.exports = ReactPropTypesSecret;\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 * Removes any pre-existing error messages from the DOM related to file\n * validation.\n *\n * @param {HTMLElement} fileInput - An input form field with type of file\n */\nfunction removeErrorMessage(fileInput) {\n const errorMessage = fileInput.parentNode.querySelector(\n 'div.file-upload-error',\n );\n\n if (errorMessage) {\n errorMessage.remove();\n }\n}\n\n/**\n * Adds error messages in the form of a div with red text.\n *\n * @param {HTMLElement} fileInput - An input form field with type of file\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(fileInput, msg) {\n const fileInputField = fileInput;\n const error = document.createElement('div');\n error.style.color = 'red';\n error.innerHTML = msg;\n error.classList.add('file-upload-error');\n\n fileInputField.parentNode.append(error);\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 {HTMLElement} fileInput - An input form field with type of file\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(\n fileSizeErrorHandler,\n fileInput,\n fileSizeMb,\n maxFileSizeMb,\n) {\n const fileInputField = fileInput;\n fileInputField.value = null;\n\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(fileInput, 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 {HTMLElement} fileInput - An input form field with type of file\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 fileInput,\n fileType,\n permittedFileTypes,\n) {\n const fileInputField = fileInput;\n fileInputField.value = null;\n\n if (fileTypeErrorHandler) {\n fileTypeErrorHandler();\n } else {\n const errorMessage = `Invalid file format (${fileType}). Only ${permittedFileTypes.join(\n ', ',\n )} files are permitted.`;\n addErrorMessage(fileInput, 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 {HTMLElement} fileInput - An input form field with type of file\n * @param {number} maxFileNameLength - The max number of characters permitted for a file name\n */\nfunction handleFileNameLengthError(\n fileNameLengthErrorHandler,\n fileInput,\n maxFileNameLength,\n) {\n const fileInputField = fileInput;\n fileInputField.value = null;\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(fileInput, 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(\n fileSizeErrorHandler,\n fileInput,\n fileSizeMb,\n maxFileSizeMb,\n );\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(\n fileTypeErrorHandler,\n fileInput,\n fileType,\n permittedFileTypes,\n );\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(\n fileNameLengthErrorHandler,\n fileInput,\n maxFileNameLength,\n );\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 removeErrorMessage(fileInput);\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","/**\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 { 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});\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","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 } 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';\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","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}) => {\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 });\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]);\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","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 */\nconst 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 */\nconst 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 */\nconst closeDropdown = ({ triggerElementId, dropdownContentId, onClose }) => {\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 if (\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","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 { 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(failureCb);\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 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 generateMainImage({\n payload,\n successCb: handleImageSuccess,\n failureCb: handleImageFailure,\n });\n }\n}\n","// TODO: We should really be using the xss package by installing it in package.json\n// but for now filterXSS is global because of legacy JS\n\nimport { request } from '@utilities/http';\n\nfunction getParameterByName(name, url = window.location.href) {\n const sanitizedName = name.replace(/[[\\]]/g, '\\\\$&');\n const regex = new RegExp(`[?&]${sanitizedName}(=([^&#]*)|&|#|$)`);\n const results = regex.exec(url);\n\n if (!results) {\n return null;\n }\n\n if (!results[2]) {\n return '';\n }\n\n return decodeURIComponent(results[2].replace(/\\+/g, ' '));\n}\n\nfunction getParameters(name, url) {\n const params = getParameterByName(name, url);\n\n if (params) {\n return `&${name}=${params}`;\n }\n\n return '';\n}\n\nfunction getFilterParameters(url) {\n return getParameters('filters', url);\n}\n\nfunction getSortParameters(url) {\n const sortBy = getParameters('sort_by', url);\n const sortDirection = getParameters('sort_direction', url);\n\n return sortBy + sortDirection;\n}\n\n/**\n * Determines whether or not InstantClick is enabled.\n *\n * @returns True if InstantClick is enabled, otherwise false.\n */\nexport function hasInstantClick() {\n return typeof instantClick !== 'undefined';\n}\n\nfunction fixedEncodeURIComponent(value) {\n // from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent\n return encodeURIComponent(value).replace(\n /[!'()*]/g,\n (c) => `%${c.charCodeAt(0).toString(16)}`,\n );\n}\n\nfunction createSearchUrl(dataHash) {\n const searchParams = new URLSearchParams();\n Object.keys(dataHash).forEach((key) => {\n const value = dataHash[key];\n if (Array.isArray(value)) {\n value.forEach((arrayValue) => {\n searchParams.append(`${key}[]`, arrayValue);\n });\n } else {\n searchParams.append(key, value);\n }\n });\n\n return searchParams.toString();\n}\n\n/**\n *\n * @param {*} param0\n */\nexport function displaySearchResults({\n searchTerm,\n location = window.location,\n}) {\n const baseUrl = location.origin;\n const sanitizedQuery = fixedEncodeURIComponent(searchTerm);\n const filterParameters = getFilterParameters(location.href);\n const sortParameters = getSortParameters(location.href);\n\n InstantClick.display(\n `${baseUrl}/search?q=${sanitizedQuery}${filterParameters}${sortParameters}`,\n );\n}\n\n/**\n * Extracts the search term from an URL's query string.\n *\n * @param {string} querystring A URL query string\n *\n * @returns The extracted search term from the query string\n */\nexport function getSearchTermFromUrl(querystring) {\n const searchParameters = new URLSearchParams(querystring);\n const query = filterXSS(searchParameters.get('q')) ?? '';\n const divForDecode = document.createElement('div');\n\n divForDecode.innerHTML = query;\n\n return divForDecode.firstChild !== null\n ? divForDecode.firstChild.nodeValue\n : query;\n}\n\n/**\n * Preloads search results for the given search term\n * @param {string} searchTerm The search term\n * @param {Location} location[window.location] The location (URL) of the object it is linked to.\n * By default it is linked to the Window object.\n */\nexport function preloadSearchResults({\n searchTerm,\n location = window.location,\n}) {\n const encodedQuery = fixedEncodeURIComponent(\n searchTerm.replace(/^[ ]+|[ ]+$/g, ''),\n );\n const searchUrl = `${\n location.origin\n }/search?q=${encodedQuery}${getFilterParameters(location.href)}`;\n InstantClick.preload(searchUrl);\n}\n\n/**\n * A helper method to call /search endpoints.\n *\n * @param {string} endpoint - The search endpoint you want to request (i.e. tags).\n * @param {object} dataHash - A hash with the search params that need to be included in the request.\n *\n * @returns {Promise} A promise object with response formatted as JSON.\n */\nexport function fetchSearch(endpoint, dataHash) {\n const searchUrl = createSearchUrl(dataHash);\n\n return request(`/search/${endpoint}?${searchUrl}`).then((response) =>\n response.json(),\n );\n}\n","import I18n from \"i18n-js\"\nconst translationsDiv = document.getElementById('i18n-translations')\nif (translationsDiv) {\n I18n.translations = JSON.parse(translationsDiv.dataset.translations);\n}\nI18n.defaultLocale = 'en';\nI18n.locale = document.body.dataset.locale;\nexport function locale(term) {\n return I18n.t(term);\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 primary,\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--primary': primary,\n 'c-btn--destructive': destructive,\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 primary: PropTypes.bool,\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,\n block,\n icon,\n rounded,\n className,\n ...otherProps\n } = props;\n\n const classes = classNames('c-link', {\n [`c-link--${variant}`]: variant,\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([undefined, '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,\n icon,\n className,\n ...otherProps\n } = props;\n\n const classes = classNames('c-cta', {\n [`c-cta--${variant}`]: variant,\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([undefined, '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 { defaultChildrenPropTypes } from '../../common-prop-types/default-children-prop-types';\n\nexport const ButtonGroup = ({ children }) => (\n
\n {children}\n
\n);\n\nButtonGroup.displayName = 'ButtonGroup';\n\nButtonGroup.propTypes = {\n children: defaultChildrenPropTypes,\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 } 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, Fragment } from 'preact';\nimport { useState } from 'preact/hooks';\nimport PropTypes from 'prop-types';\nimport { MobileDrawer } from '@crayons/MobileDrawer';\nimport { Button } from '@crayons/Button';\n\nconst OverflowIcon = () => (\n \n \n \n);\n\nconst CheckIcon = () => (\n \n \n \n);\n\n/**\n * Renders a page heading with a button which activates a with a list of the given navigation links.\n *\n * @param {object} props\n * @param {number} headingLevel The level of heading to render as the page title (e.g. 1-6)\n * @param {string} navigationTitle The title to be used for the navigation element (e.g. 'Feed timeframes')\n * @param {Array} navigationLinks An array of navigationLink objects to display\n *\n * @example\n * \n */\nexport const MobileDrawerNavigation = ({\n headingLevel,\n navigationTitle,\n navigationLinks,\n}) => {\n const [isDrawerOpen, setIsDrawerOpen] = useState(false);\n const currentPage = navigationLinks.find((item) => item.isCurrentPage);\n\n const Heading = `h${headingLevel}`;\n\n return (\n \n
\n {currentPage.displayName}\n setIsDrawerOpen(true)}\n />\n
\n\n {isDrawerOpen && (\n setIsDrawerOpen(false)}\n >\n \n setIsDrawerOpen(false)}\n >\n Cancel\n \n
\n )}\n \n );\n};\n\nMobileDrawerNavigation.propTypes = {\n headingLevel: PropTypes.oneOf([1, 2, 3, 4, 5, 6]).isRequired,\n navigationTitle: PropTypes.string.isRequired,\n navigationLinks: PropTypes.arrayOf(\n PropTypes.shape({\n url: PropTypes.string,\n isCurrentPage: PropTypes.bool,\n displayName: PropTypes.string,\n }),\n ).isRequired,\n};\n","import { h } from 'preact';\nimport PropTypes from 'prop-types';\nimport { FocusTrap } from '../../shared/components/focusTrap';\nimport { defaultChildrenPropTypes } from '../../common-prop-types';\nimport { Button } from '@crayons';\n\nfunction getAdditionalClassNames({ size, className }) {\n let additionalClassNames = '';\n\n if (size && size.length > 0 && size !== 'default') {\n additionalClassNames += ` crayons-modal--${size}`;\n }\n\n if (className && className.length > 0) {\n additionalClassNames += ` ${className}`;\n }\n\n return additionalClassNames;\n}\n\nconst CloseIcon = () => (\n \n Close\n \n \n);\n\n/**\n * A modal component which can be presented with or without an overlay.\n * The modal is presented within a focus trap for accessibility purposes - please note that the selector used for the focusTrap must be unique on the given page, otherwise focus may be trapped on the wrong element.\n *\n * @param {Object} props\n * @param {Array} props.children The content to be displayed inside the Modal. Can be provided by composition (see example).\n * @param {string} props.size The desired modal size ('s', 'm' or 'default')\n * @param {string} props.className Optional additional classnames to apply to the modal container\n * @param {string} props.title The title to be displayed in the modal heading. If provided, a title bar with a close button will be displayed.\n * @param {boolean} props.overlay Whether or not to show a semi-opaque overlay behind the modal\n * @param {Function} props.onClose Callback for any function to be executed on close button click or Escape\n * @param {boolean} props.closeOnClickOutside Whether the modal should close if the user clicks outside of it\n * @param {string} props.focusTrapSelector The CSS selector for where to trap the user's focus. This should be unique to the page in which the modal is presented.\n *\n * @example\n * \n
\n

Some modal content

\n
\n \n */\nexport const Modal = ({\n children,\n size,\n className,\n title,\n overlay = true,\n onClose = () => {},\n closeOnClickOutside = false,\n focusTrapSelector = '.crayons-modal',\n}) => {\n return (\n \n \n \n {title && (\n
\n

{title}

\n \n
\n )}\n
{children}
\n \n {overlay && (\n \n )}\n \n \n );\n};\n\nModal.displayName = 'Modal';\n\nModal.defaultProps = {\n size: 'default',\n};\n\nModal.propTypes = {\n children: defaultChildrenPropTypes.isRequired,\n className: PropTypes.string,\n title: PropTypes.string.isRequired,\n overlay: PropTypes.bool,\n onClose: PropTypes.func,\n size: PropTypes.oneOf(['default', 's', 'm']).isRequired,\n focusTrapSelector: PropTypes.string,\n};\n","import { h } from 'preact';\n\nexport const Spinner = () => (\n \n \n \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 { h } from 'preact';\n\nexport const Bold = () => (\n \n \n \n);\n\nexport const Italic = () => (\n \n \n \n);\n\nexport const Link = () => (\n \n \n \n);\n\nexport const OrderedList = () => (\n \n \n \n);\n\nexport const UnorderedList = () => (\n \n \n \n);\n\nexport const Heading = () => (\n \n \n \n);\n\nexport const Quote = () => (\n \n \n \n);\n\nexport const Code = () => (\n \n \n \n);\n\nexport const CodeBlock = () => (\n \n \n \n);\n\nexport const Overflow = () => (\n \n \n \n);\n\nexport const Underline = () => (\n \n \n \n);\n\nexport const Strikethrough = () => (\n \n \n \n);\n\nexport const Divider = () => (\n \n \n \n \n \n \n \n \n \n \n \n \n);\n\nexport const Help = () => (\n \n \n \n);\n","/* global Runtime */\nimport {\n getLastIndexOfCharacter,\n getNextIndexOfCharacter,\n getNumberOfNewLinesFollowingSelection,\n getNumberOfNewLinesPrecedingSelection,\n getSelectionData,\n} from '../../utilities/textAreaUtils';\nimport {\n Bold,\n Italic,\n Link,\n OrderedList,\n UnorderedList,\n Heading,\n Quote,\n Code,\n CodeBlock,\n Underline,\n Strikethrough,\n Divider,\n} from './icons';\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 coreSyntaxFormatters = {\n bold: {\n icon: Bold,\n label: 'Bold',\n getKeyboardShortcut: () => {\n const modifier = Runtime.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: Italic,\n label: 'Italic',\n getKeyboardShortcut: () => {\n const modifier = Runtime.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: Link,\n label: 'Link',\n getKeyboardShortcut: () => {\n const modifier = Runtime.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: OrderedList,\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: UnorderedList,\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: Heading,\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: Quote,\n label: 'Quote',\n getFormatting: ({ selectionStart, selectionEnd, value }) =>\n undoOrAddFormattingForMultilineSyntax({\n selectionStart,\n selectionEnd,\n value,\n linePrefix: '> ',\n }),\n },\n code: {\n icon: Code,\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: CodeBlock,\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};\n\nexport const secondarySyntaxFormatters = {\n underline: {\n icon: Underline,\n label: 'Underline',\n getKeyboardShortcut: () => {\n const modifier = Runtime.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: Strikethrough,\n label: 'Strikethrough',\n getKeyboardShortcut: () => {\n const modifier = Runtime.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: Divider,\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 } from 'preact';\nimport { useState, useLayoutEffect } from 'preact/hooks';\nimport { ImageUploader } from '../../article-form/components/ImageUploader';\nimport {\n coreSyntaxFormatters,\n secondarySyntaxFormatters,\n getNewTextAreaValueWithEdits,\n} from './markdownSyntaxFormatters';\nimport { Overflow, Help } from './icons';\nimport { Button } from '@crayons';\nimport { KeyboardShortcuts } 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\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 = ({ textAreaId }) => {\n const [textArea, setTextArea] = useState(null);\n const [overflowMenuOpen, setOverflowMenuOpen] = useState(false);\n const [storedCursorPosition, setStoredCursorPosition] = useState({});\n const smallScreen = useMediaQuery(`(max-width: ${BREAKPOINTS.Medium - 1}px)`);\n\n const markdownSyntaxFormatters = {\n ...coreSyntaxFormatters,\n ...secondarySyntaxFormatters,\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 useLayoutEffect(() => {\n setTextArea(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]);\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 {\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 { 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 {\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 getSecondaryFormatterButtons = (isOverflow) =>\n Object.keys(secondarySyntaxFormatters).map((controlName, index) => {\n const { icon, label, getKeyboardShortcut } =\n secondarySyntaxFormatters[controlName];\n\n return (\n