{"version":3,"sources":["webpack:///./node_modules/preact/dist/preact.module.js","webpack:///./node_modules/prop-types/index.js","webpack:///./app/javascript/crayons/Buttons/Button.jsx","webpack:///./app/javascript/crayons/Links/Link.jsx","webpack:///./app/javascript/crayons/CTAs/CTA.jsx","webpack:///./app/javascript/crayons/ButtonGroup/ButtonGroup.jsx","webpack:///./app/javascript/crayons/Dropdown/Dropdown.jsx","webpack:///./app/javascript/crayons/formElements/FormField/FormField.jsx","webpack:///./app/javascript/crayons/formElements/RadioButton/RadioButton.jsx","webpack:///./app/javascript/crayons/Icons/Icon.jsx","webpack:///./app/javascript/crayons/MobileDrawer/MobileDrawer.jsx","webpack:///./app/javascript/crayons/navigation/MobileDrawerNavigation/MobileDrawerNavigation.jsx","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","webpack:///./app/javascript/shared/components/useKeyboardShortcuts.js","webpack:///./app/javascript/utilities/http/errors.js","webpack:///./app/javascript/crayons/Button/index.js","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/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:///./app/javascript/shared/components/dateTime.jsx","webpack:///./app/javascript/listings/singleListing/listingPropTypes.js","webpack:///./app/javascript/listings/singleListing/DropdownMenu.jsx","webpack:///./app/javascript/listings/singleListing/TagLinks.jsx","webpack:///./app/javascript/listings/singleListing/Header.jsx","webpack:///./app/javascript/listings/singleListing/AuthorInfo.jsx","webpack:///./app/javascript/listings/singleListing/SingleListing.jsx","webpack:///./app/javascript/listings/components/Modal.jsx","webpack:///./app/javascript/listings/components/NextPageButton.jsx","webpack:///./app/javascript/listings/components/AllListings.jsx","webpack:///./app/javascript/listings/components/CategoryLinks.jsx","webpack:///./app/javascript/listings/components/CategoryLinksMobile.jsx","webpack:///./app/javascript/listings/components/ListingFiltersCategories.jsx","webpack:///./app/javascript/listings/components/ClearQueryButton.jsx","webpack:///./app/javascript/listings/components/SelectedTags.jsx","webpack:///./app/javascript/listings/components/ListingFiltersTags.jsx","webpack:///./app/javascript/listings/components/ListingFilters.jsx","webpack:///./app/javascript/listings/utils.js","webpack:///./app/javascript/listings/listings.jsx","webpack:///./app/javascript/packs/listings.jsx"],"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","ButtonNew","primary","icon","rounded","destructive","className","tooltip","onKeyUp","otherProps","useState","suppressTooltip","setSuppressTooltip","classes","classNames","focusable","src","displayName","propTypes","defaultChildrenPropTypes","PropTypes","bool","oneOf","string","oneOfType","node","func","elementType","Link","href","variant","block","undefined","isRequired","CTA","ButtonGroup","role","Dropdown","triggerButtonId","dropdownContentId","dropdownContentCloseButtonId","onOpen","onClose","restOfProps","isInitialized","setIsInitialized","useLayoutEffect","initializeDropdown","triggerElementId","id","FormField","RadioButton","onClick","Icon","InternalIcon","native","MobileDrawer","title","clickOutsideDeactivates","selector","onDeactivate","arrayOf","shape","url","isCurrentPage","userPropTypes","profile_image_url","summary","selectedTagsPropTypes","tags","onKeyPress","hiddenTextarea","SIZING_STYLE","calculateNodeStyling","window","getComputedStyle","boxSizing","getPropertyValue","paddingSize","parseFloat","borderSize","sizingStyle","map","join","getCursorXY","input","selectionPoint","bodyRect","body","getBoundingClientRect","elementRect","inputY","top","scrollTop","inputX","left","scrollLeft","div","copyStyle","prop","inputValue","tagName","textContent","substr","height","width","span","spanX","offsetLeft","spanY","offsetTop","getMentionWordData","textArea","selectionStart","valueBeforeKeystroke","isUserMention","indexOfMentionStart","indexOfAutocompleteStart","getLastIndexOfCharacter","content","selectionIndex","character","breakOnCharacters","currentCharacter","charAt","previousCharacter","includes","getNextIndexOfCharacter","nextCharacter","getNumberOfNewLinesPrecedingSelection","count","searchIndex","getNumberOfNewLinesFollowingSelection","selectionEnd","getSelectionData","textBeforeSelection","substring","textAfterSelection","selectedText","useTextAreaAutoResize","setTextArea","constrainToContentHeight","setConstrainToContentHeight","additionalElements","setAdditionalElements","useEffect","resizeTextArea","allContentHeights","element","uiTextNode","placeholder","baseHeight","scrollHeight","calculateTextAreaHeight","Math","max","newHeight","object","isFormField","HTMLElement","nodeName","getAttribute","isContentEditable","callShortcut","keys","chain","shortcuts","shortcut","code","defaultOptions","timeout","useKeyboardShortcuts","eventTarget","options","storedShortcuts","keyChain","setKeyChain","mergedOptions","setMergedOptions","newOptions","clearTimeout","Object","keyEvent","defaultPrevented","ctrlKeyEntry","ctrlKey","cmdKeyEntry","metaKey","altKeyEntry","altKey","shiftKeyEntry","shiftKey","target","Node","newChain","KeyboardShortcuts","number","instanceOf","Element","Window","handleFetchAPIErrors","response","ok","json","Error","error","SyntaxError","statusText","request","headers","method","csrfToken","getCsrfToken","restOfOptions","jsonifiedBody","JSON","stringify","fetchOptions","Accept","credentials","fetch","ReactPropTypesSecret","emptyFunction","emptyFunctionWithReset","resetWarningCache","shim","propName","componentName","location","propFullName","secret","err","getShim","ReactPropTypes","array","symbol","any","objectOf","exact","checkPropTypes","MAX_FILE_SIZE_MB","freeze","image","video","PERMITTED_FILE_TYPES","addErrorMessage","fileInput","msg","fileInputField","color","classList","add","append","validateFileSize","file","fileType","maxFileSizeMb","dataset","fileSizeErrorHandler","fileSizeMb","size","toFixed","isValidFileSize","Number","errorMessage","handleFileSizeError","validateFileType","permittedFileTypes","parse","fileTypeErrorHandler","isValidFileType","handleFileTypeError","validateFileNameLength","maxFileNameLength","fileNameLengthErrorHandler","isValidFileNameLength","handleFileNameLengthError","validateFileInput","isValidFileInput","querySelector","remove","removeErrorMessage","files","from","split","validateFileInputs","validFileInputs","fileInputs","querySelectorAll","isInViewport","allowPartialVisibility","boundingRect","clientHeight","innerHeight","documentElement","clientWidth","innerWidth","topIsInViewport","rightIsInViewport","right","bottomIsInViewport","bottom","leftIsInViewport","topIsOutOfViewport","bottomIsOutOfViewport","BREAKPOINTS","Small","Medium","Large","useMediaQuery","query","mediaQuery","matchMedia","matches","match","setMatch","handler","addListener","removeListener","articleSnippetResultPropTypes","body_text","articlePropTypes","path","cloudinary_video_url","video_duration_in_minutes","type_of","class_name","flare_tag","bg_color_hex","text_color_hex","tag_list","cached_tag_list_array","podcast","slug","image_url","user_id","user","username","organization","profile_image_90","highlight","public_reactions_count","reactions_count","comments_count","reading_time","getAdditionalClassNames","contentType","inverted","disabled","additionalClassNames","Button","buttonType","onMouseOver","onMouseOut","onFocus","onBlur","tabIndex","ComponentName","snackbarItemProps","actions","message","lifespan","SnackbarItem","text","FocusTrap","focusTrap","useRef","deactivate","useCallback","currentLocationHref","routeChangeObserver","MutationObserver","mutations","disconnect","createFocusTrap","escapeDeactivates","activate","observe","childList","escape","getDropdownRepositionListener","debounceAction","handleDropdownRepositions","isDropdownCurrentlyOpen","display","opacity","removeProperty","INTERACTIVE_ELEMENTS_QUERY","closeDropdown","dropdownContent","getElementById","triggerButton","keyUpListener","onCloseCleanupActions","focus","contains","activeElement","clickOutsideListener","openDropdown","action","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","exec","decodeURIComponent","getParameterByName","getFilterParameters","hasInstantClick","instantClick","fixedEncodeURIComponent","encodeURIComponent","charCodeAt","toString","displaySearchResults","searchTerm","baseUrl","origin","sanitizedQuery","filterParameters","sortParameters","InstantClick","getSearchTermFromUrl","querystring","searchParameters","URLSearchParams","filterXSS","get","divForDecode","nodeValue","preloadSearchResults","encodedQuery","searchUrl","preload","fetchSearch","endpoint","dataHash","searchParams","arrayValue","createSearchUrl","translationsDiv","locale","term","I18n","translations","defaultLocale","CloseIcon","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","Component","Overflow","Help","ORDERED_LIST_ITEM_REGEX","MARKDOWN_LINK_REGEX","URL_PLACEHOLDER_TEXT","getNewLinePrefixSuffixes","numberOfNewLinesBeforeSelection","numberOfNewLinesFollowingSelection","numberOfNewLinesNeededAtStart","newLinesPrefix","String","padStart","newLinesSuffix","undoOrAddFormattingForInlineSyntax","prefix","suffix","prefixLength","suffixLength","editSelectionStart","editSelectionEnd","replaceSelectionWith","newCursorStart","newCursorEnd","undoOrAddFormattingForMultilineSyntax","linePrefix","blockPrefix","blockSuffix","formattedText","lastNewLine","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","urlText","handleLinkFormattingForEmptyTextSelection","startsWith","basicFormattingForLinkSelection","indexOfSyntaxOpen","textToReplaceMarkdown","handleLinkFormattingForUrlSelection","linkDescriptionEnd","linkText","handleUndoMarkdownLinkSelection","orderedList","newLineSuffixLength","newText","indexOfFullStop","formattedList","textChunk","unorderedList","heading","currentLineSelectionStart","indexOfFirstLineCharacter","currentHeadingIndex","adjustingHeading","cursorOffset","quote","codeBlock","secondarySyntaxFormatters","underline","strikethrough","divider","UPLOADING_IMAGE_PLACEHOLDER","MarkdownToolbar","textAreaId","overflowMenuOpen","setOverflowMenuOpen","storedCursorPosition","setStoredCursorPosition","smallScreen","markdownSyntaxFormatters","keyboardShortcuts","fromEntries","syntaxName","preventDefault","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","class","multiple","imageMarkdownInput","copyToClipboard","Honeybadger","notify","useReducer","dispatch","onUploadError","abortSignal","handleInsertImageUploadSuccess","innerText","detail","namespace","isNativeIOS","DateTime","dateTime","timestampToLocalDateTimeLong","timestampToLocalDateTimeShort","Date","listingPropTypes","category","processed_html","author","DropdownMenu","componentRef","createRef","listing","isOwner","isModal","editUrl","reportUrl","TagLinks","tag","Header","currentUserId","onTitleClick","onAddTag","userId","bumped_at","originally_published_at","listingDate","LocationText","AuthorInfo","onCategoryClick","alt","loading","SingleListing","listingContent","onChangeCategory","onOpenModal","listingInline","listingModal","isOpen","NextPageButton","AllListings","listings","showNextPageButton","loadNextPage","CategoryLinks","categories","selectedCategory","dataTestIdProp","CategoryLinksMobile","selectNavigation","selected","ListingFiltersCategories","ClearQueryButton","SelectedTags","onRemoveTag","ListingFiltersTags","onClearQuery","shouldRenderClearQueryButton","autoComplete","defaultValue","ListingFilters","onSelectCategory","resizeAllMasonryItems","item","grid","rowGap","rowSpan","allItems","parseInt","ceil","gridRowEnd","getLocation","Listings","allCategories","initialFetch","openedListing","page","isModalOpen","addTag","newTags","listingSearch","scroll","removeTag","handleKeyPressedOnSelectedTags","selectCategory","cat","handleCloseModal","setLocation","handleOpenModal","history","replaceState","handleQuery","clearQuery","setUser","currentUser","triggerMasonry","newLocation","queryString","search","tokens","re","getQueryParams","container","allcategories","displayedlisting","debouncedListingSearch","listing_search","per_page","tag_boolean_mode","result","fullListings","updateListings","shouldRenderModal","loadElement","root","on"],"mappings":"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","file":"js/listings-100aa4a4a9489f0081b3.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 { 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 PropTypes from 'prop-types';\n\nexport const userPropTypes = PropTypes.shape({\n id: PropTypes.string.isRequired,\n name: PropTypes.string.isRequired,\n profile_image_url: PropTypes.string.isRequired,\n summary: PropTypes.string.isRequired,\n});\n","import PropTypes from 'prop-types';\n\nexport const selectedTagsPropTypes = PropTypes.shape({\n tags: PropTypes.arrayOf(PropTypes.string).isRequired,\n onClick: PropTypes.func.isRequired,\n onKeyPress: PropTypes.func.isRequired,\n});\n","// These styles are applied to the hidden element we use to measure the height.\n// !important styles are used to ensure no matter what style properties are attached to the given textarea, the hidden textarea will never become visible or cause layout jumps\nconst HIDDEN_TEXTAREA_STYLE = `\nmin-height:0 !important;\nmax-height:none !important;\nheight:0 !important;\nvisibility:hidden !important;\noverflow:hidden !important;\nposition:absolute !important;\nz-index:-1000 !important;\ntop:0 !important;\nright:0 !important\n`;\n\nconst SIZING_STYLE = [\n 'letter-spacing',\n 'line-height',\n 'padding-top',\n 'padding-bottom',\n 'font-family',\n 'font-weight',\n 'font-size',\n 'text-rendering',\n 'text-transform',\n 'width',\n 'text-indent',\n 'padding-left',\n 'padding-right',\n 'border-width',\n 'box-sizing',\n];\n\nlet hiddenTextarea;\n\n/**\n * Helper function to get the height of the textarea based on the current text content\n *\n * @param {HTMLElement} uiTextNode The textarea to measure height of\n *\n * @returns {{height: number}} Object with the calculated height\n */\nexport const calculateTextAreaHeight = (uiTextNode) => {\n if (!hiddenTextarea) {\n hiddenTextarea = document.createElement('textarea');\n document.body.appendChild(hiddenTextarea);\n }\n\n // Copy all CSS properties that have an impact on the height of the content in\n // the textbox\n const {\n paddingSize,\n borderSize,\n boxSizing,\n sizingStyle,\n } = calculateNodeStyling(uiTextNode);\n\n // Need to have the overflow attribute to hide the scrollbar otherwise\n // text-lines will not calculated properly as the shadow will technically be\n // narrower for content\n hiddenTextarea.setAttribute(\n 'style',\n `${sizingStyle};${HIDDEN_TEXTAREA_STYLE}`,\n );\n hiddenTextarea.value = uiTextNode.value || uiTextNode.placeholder || 'x';\n\n const baseHeight = hiddenTextarea.scrollHeight;\n\n if (boxSizing === 'border-box') {\n // border-box: add border, since height = content + padding + border\n return { height: baseHeight + borderSize };\n } else if (boxSizing === 'content-box') {\n // remove padding, since height = content\n return { height: baseHeight - paddingSize };\n }\n\n return { height: baseHeight };\n};\n\nconst calculateNodeStyling = (node) => {\n const style = window.getComputedStyle(node);\n\n const boxSizing =\n style.getPropertyValue('box-sizing') ||\n style.getPropertyValue('-moz-box-sizing') ||\n style.getPropertyValue('-webkit-box-sizing');\n\n const paddingSize =\n parseFloat(style.getPropertyValue('padding-bottom')) +\n parseFloat(style.getPropertyValue('padding-top'));\n\n const borderSize =\n parseFloat(style.getPropertyValue('border-bottom-width')) +\n parseFloat(style.getPropertyValue('border-top-width'));\n\n const sizingStyle = SIZING_STYLE.map(\n (name) => `${name}:${style.getPropertyValue(name)}`,\n ).join(';');\n\n return {\n sizingStyle,\n paddingSize,\n borderSize,\n boxSizing,\n };\n};\n","import { useEffect, useState } from 'preact/hooks';\nimport { calculateTextAreaHeight } from '@utilities/calculateTextAreaHeight';\n\n/**\n * A helper function to get the X/Y coordinates of the current cursor position within an element.\n * For a full explanation see the post by Jhey Tompkins: https://medium.com/@jh3y/how-to-where-s-the-caret-getting-the-xy-position-of-the-caret-a24ba372990a\n *\n * @param {element} input The DOM element the cursor is to be found within\n * @param {number} selectionPoint The current cursor position (e.g. either selectionStart or selectionEnd)\n *\n * @returns {object} An object with x and y properties (e.g. {x: 10, y: 0})\n *\n * @example\n * const coordinates = getCursorXY(elementRef.current, elementRef.current.selectionStart)\n */\nexport const getCursorXY = (input, selectionPoint) => {\n const bodyRect = document.body.getBoundingClientRect();\n const elementRect = input.getBoundingClientRect();\n\n const inputY = elementRect.top - bodyRect.top - input.scrollTop;\n const inputX = elementRect.left - bodyRect.left - input.scrollLeft;\n\n // create a dummy element with the computed style of the input\n const div = document.createElement('div');\n const copyStyle = getComputedStyle(input);\n for (const prop of copyStyle) {\n div.style[prop] = copyStyle[prop];\n }\n\n // set the div to the correct position\n div.style['position'] = 'absolute';\n div.style['top'] = `${inputY}px`;\n div.style['left'] = `${inputX}px`;\n div.style['opacity'] = 0;\n\n // replace whitespace with '.' when filling the dummy element if it's a single line \n const swap = '.';\n const inputValue =\n input.tagName === 'INPUT' ? input.value.replace(/ /g, swap) : input.value;\n\n // set the div content to that of the textarea up until selection point\n div.textContent = inputValue.substr(0, selectionPoint);\n\n if (input.tagName === 'TEXTAREA') div.style.height = 'auto';\n // if a single line input then the div needs to be single line and not break out like a text area\n if (input.tagName === 'INPUT') div.style.width = 'auto';\n\n // marker element to obtain caret position\n const span = document.createElement('span');\n // give the span the textContent of remaining content so that the recreated dummy element is as close as possible\n span.textContent = inputValue.substr(selectionPoint) || '.';\n\n // append the span marker to the div and the dummy element to the body\n div.appendChild(span);\n document.body.appendChild(div);\n\n // get the marker position, this is the caret position top and left relative to the input\n const { offsetLeft: spanX, offsetTop: spanY } = span;\n\n // remove dummy element\n document.body.removeChild(div);\n\n // return object with the x and y of the caret. account for input positioning so that you don't need to wrap the input\n return {\n x: inputX + spanX,\n y: inputY + spanY,\n };\n};\n\n/**\n * A helper function that searches back to the beginning of the currently typed word (indicated by cursor position) and verifies whether it begins with an '@' symbol for user mention\n *\n * @param {element} textArea The text area or input to inspect the current word of\n * @returns {{isUserMention: boolean, indexOfMentionStart: number}} Object with the word's mention data\n *\n * @example\n * const { isUserMention, indexOfMentionStart } = getMentionWordData(textArea);\n * if (isUserMention) {\n * // Do something\n * }\n */\nexport const getMentionWordData = (textArea) => {\n const { selectionStart, value: valueBeforeKeystroke } = textArea;\n\n if (selectionStart === 0 || valueBeforeKeystroke === '') {\n return {\n isUserMention: false,\n indexOfMentionStart: -1,\n };\n }\n\n const indexOfAutocompleteStart = getLastIndexOfCharacter({\n content: valueBeforeKeystroke,\n selectionIndex: selectionStart,\n character: '@',\n breakOnCharacters: [' ', '', '\\n'],\n });\n\n return {\n isUserMention: indexOfAutocompleteStart !== -1,\n indexOfMentionStart: indexOfAutocompleteStart,\n };\n};\n\n/**\n * Searches backwards through text content for the last occurrence of the given character\n *\n * @param {Object} params\n * @param {string} content The chunk of text to search within\n * @param {number} selectionIndex The starting point to search from\n * @param {string} character The character to search for\n * @param {string[]} breakOnCharacters Any characters which should result in an immediate halt to the search\n * @returns {number} Index of the last occurrence of the character, or -1 if it isn't found\n */\nexport const getLastIndexOfCharacter = ({\n content,\n selectionIndex,\n character,\n breakOnCharacters = [],\n}) => {\n const currentCharacter = content.charAt(selectionIndex);\n const previousCharacter = content.charAt(selectionIndex - 1);\n\n if (currentCharacter === character) {\n return selectionIndex;\n }\n\n if (selectionIndex !== 0 && !breakOnCharacters.includes(previousCharacter)) {\n return getLastIndexOfCharacter({\n content,\n selectionIndex: selectionIndex - 1,\n character,\n breakOnCharacters,\n });\n }\n\n return -1;\n};\n\n/**\n * Searches forwards through text content for the next occurrence of the given character\n *\n * @param {Object} params\n * @param {string} content The chunk of text to search within\n * @param {number} selectionIndex The starting point to search from\n * @param {string} character The character to search for\n * @param {string[]} breakOnCharacters Any characters which should result in an immediate halt to the search\n * @returns {number} Index of the next occurrence of the character, or -1 if it isn't found\n */\nexport const getNextIndexOfCharacter = ({\n content,\n selectionIndex,\n character,\n breakOnCharacters = [],\n}) => {\n const currentCharacter = content.charAt(selectionIndex);\n const nextCharacter = content.charAt(selectionIndex + 1);\n\n if (currentCharacter === character) {\n return selectionIndex;\n }\n\n if (\n selectionIndex <= content.length &&\n !breakOnCharacters.includes(nextCharacter)\n ) {\n return getNextIndexOfCharacter({\n content,\n selectionIndex: selectionIndex + 1,\n character,\n breakOnCharacters,\n });\n }\n\n return -1;\n};\n\n/**\n * Counts how many new lines come immediately before the user's current selection start\n * @param {object} args\n * @param {number} args.selectionStart The index of user's current selection start\n * @param {string} args.value The value of the textarea\n *\n * @returns {number} Number of new lines directly before selection start\n */\nexport const getNumberOfNewLinesPrecedingSelection = ({\n selectionStart,\n value,\n}) => {\n if (selectionStart === 0) {\n return 0;\n }\n\n let count = 0;\n let searchIndex = selectionStart - 1;\n\n while (searchIndex >= 0 && value.charAt(searchIndex) === '\\n') {\n count++;\n searchIndex--;\n }\n\n return count;\n};\n\n/**\n * Counts how many new lines come immediately after the user's current selection end\n *\n * @param {object} args\n * @param {number} args.selectionEnd The index of user's current selection end\n * @param {string} args.value The value of the textarea\n *\n * @returns {number} the count of new line characters immediately following selection\n */\nexport const getNumberOfNewLinesFollowingSelection = ({\n selectionEnd,\n value,\n}) => {\n if (selectionEnd === value.length) {\n return 0;\n }\n\n let count = 0;\n let searchIndex = selectionEnd;\n\n while (searchIndex < value.length && value.charAt(searchIndex) === '\\n') {\n count++;\n searchIndex++;\n }\n\n return count;\n};\n\n/**\n * Retrieve data about the user's current text selection\n *\n * @param {Object} params\n * @param {number} selectionStart The start point of user's selection\n * @param {number} selectionEnd The end point of user's selection\n * @param {string} value The current value of the textarea\n * @returns {Object} object containing the text chunks before and after insertion, and the currently selected text\n */\nexport const getSelectionData = ({ selectionStart, selectionEnd, value }) => ({\n textBeforeSelection: value.substring(0, selectionStart),\n textAfterSelection: value.substring(selectionEnd, value.length),\n selectedText: value.substring(selectionStart, selectionEnd),\n});\n\n/**\n * This hook can be used to keep the height of a textarea in step with the current content height, avoiding a scrolling textarea.\n * An optional array of additional elements can be set. If provided, all elements will be set to the greatest content height.\n * Optionally, it can be specified to also constrain the max-height to the content height. Otherwise the max-height will continue to be managed only by the textarea's CSS\n *\n * @example\n *\n * const { setTextArea } = useTextAreaAutoResize();\n * setTextArea(myTextAreaRef.current);\n * setAdditionalElements([myOtherElement.current]);\n */\nexport const useTextAreaAutoResize = () => {\n const [textArea, setTextArea] = useState(null);\n const [constrainToContentHeight, setConstrainToContentHeight] =\n useState(false);\n const [additionalElements, setAdditionalElements] = useState([]);\n\n useEffect(() => {\n if (!textArea) {\n return;\n }\n\n const resizeTextArea = () => {\n const allElements = [textArea, ...additionalElements];\n\n const allContentHeights = allElements.map(\n (element) => calculateTextAreaHeight(element).height,\n );\n\n const height = Math.max(...allContentHeights);\n const newHeight = `${height}px`;\n\n [textArea, ...additionalElements].forEach((element) => {\n element.style['min-height'] = newHeight;\n if (constrainToContentHeight) {\n // Don't allow the textarea to grow to a size larger than the content\n element.style['max-height'] = newHeight;\n }\n });\n };\n\n // Resize on first attach\n resizeTextArea();\n // Resize on subsequent value changes\n textArea.addEventListener('input', resizeTextArea);\n\n return () => textArea.removeEventListener('input', resizeTextArea);\n }, [textArea, additionalElements, constrainToContentHeight]);\n\n return { setTextArea, setAdditionalElements, setConstrainToContentHeight };\n};\n","import PropTypes from 'prop-types';\n\n// Use this whenever you need the standard children prop.\nexport const defaultChildrenPropTypes = PropTypes.oneOfType([\n PropTypes.arrayOf(PropTypes.node),\n PropTypes.node,\n PropTypes.object,\n PropTypes.arrayOf(PropTypes.object),\n]);\n","export * from './Snackbar';\nexport * from './SnackbarItem';\n","import { 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","/**\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 { 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