Files
phanpy-cz/assets/ScheduledAtField-B9b7q7O5.js.map
2026-02-07 19:49:28 +01:00

1 line
879 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"version":3,"mappings":"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","names":["j","Q","K","e","D","H","n","P","r","i","u","f","o","y","c","m","_","I","L","R","U","V","X","Y","Z","F","ee","te","re","t","a","l","h","w","p","$","T","ne","M","x","W","se","ie","S","N","ue","z","J","de","k","s","B","v","g","C","G","O","q","E","root","factory","module","this","global","Toastify","options","version","divElement","property","avatarElement","closeElement","event","width","self","getAxisOffsetAValue","xOffset","yOffset","rootElement","elementToInsert","toastElement","topLeftOffsetSize","topRightOffsetSize","offsetSize","allToasts","classUsed","containsClass","height","offset","axis","elem","yourClass","window","_showToast","showToast","props","text","onClick","delay","rest","toast","className","destination","gravity","position","setTimeout","useInterval","fn","deps","immediate","savedCallback","useRef","useEffect","current","id","setInterval","tick","clearInterval","isMenuOpen","state","batchedUpdates","unstable_batchedUpdates","getTransition","transition","name","safeCall","arg","internalKey","getName","component","mergeProps","target","source","key","targetProp","sourceProp","parsePadding","paddingStr","padding","top","right","getScrollAncestor","node","overflow","overflowX","overflowY","commonProps","isDisabled","isHovering","indexOfNode","nodeList","useBEM","block","element","modifiers","useMemo","blockElement","classString","value","expandedClassName","menuContainerClass","menuClass","menuArrowClass","menuItemClass","menuDividerClass","menuHeaderClass","menuGroupClass","subMenuClass","HoverItemContext","createContext","MenuListItemContext","MenuListContext","EventHandlersContext","RadioGroupContext","SettingsContext","Keys","HoverActionTypes","CloseReason","FocusPositions","MenuStateMap","positionAbsolute","roleNone","roleMenuitem","noScrollFocus","MenuContainer","containerRef","containerProps","children","isOpen","theming","onClose","itemTransition","jsx","createSubmenuCtx","timer","count","closeDelay","pending","settled","useItems","menuRef","hoverItem","setHoverItem","useState","mutableState","updateItems","useCallback","item","isMounted","items","index","dispatch","actionType","nextIndex","hoverIndex","sortItems","orderedNodes","newItem","prevItem","getNativeDimension","transformed","untransformed","getNormalizedClientRect","rect","getPositionHelpers","containerElt","menuElt","menuScroll","boundingBoxPadding","menuRect","containerRect","boundingRect","getLeftOverflow","getRightOverflow","getTopOverflow","getBottomOverflow","leftOverflow","rightOverflow","topOverflow","bottomOverflow","placeArrowVertical","arrowRef","menuY","anchorRect","placeLeftorRight","placeLeftorRightY","placeLeftX","placeRightX","confineHorizontally","confineVertically","arrow","direction","computedDirection","placeArrowHorizontal","menuX","placeToporBottom","placeToporBottomX","placeTopY","placeBottomY","positionMenu","align","gap","shift","positionHelpers","isHorizontal","horizontalOffset","verticalOffset","arrowElt","useIsomorphicLayoutEffect","useLayoutEffect","setRef","ref","instance","useCombinedRef","refA","refB","offScreen","MenuList","ariaLabel","menuClassName","menuStyle","arrowProps","anchorPoint","anchorRef","externalRef","parentScrollingRef","setDownOverflow","repositionFlag","captureFocus","endTransition","menuItemFocus","_1","restProps","menuPosition","setMenuPosition","arrowPosition","setArrowPosition","overflowData","setOverflowData","expandedDirection","setExpandedDirection","submenuCtx","reposSubmenu","forceReposSubmenu","useReducer","boundingBoxRef","rootMenuRef","rootAnchorRef","scrollNodesRef","reposition","viewScroll","submenuCloseDelay","useContext","parentSubmenuCtx","reposFlag","prevOpen","openTransition","closeTransition","scrollNodes","onKeyDown","onAnimationEnd","onPointerMove","onPointerLeave","handlePosition","noOverflowCheck","arrowX","arrowY","menuHeight","overflowAmt","anchorScroll","scroll","handleScroll","scrollObservers","hasOverflow","parentScroll","targetList","resizeObserver","entries","flushSync","resizeObserverOptions","anchor","alwaysUpdate","setItemFocus","itemContext","maxHeight","listContext","overflowStyle","arrowModifiers","_arrowClassName","menu","ControlledMenu","forwardRef","initialMounted","unmountOnClose","transitionTimeout","submenuOpenDelay","portal","onItemClick","settings","eventHandlers","isCheckorRadio","keepOpen","menuList","createPortal","PRE_ENTER","ENTERING","ENTERED","PRE_EXIT","EXITING","EXITED","UNMOUNTED","STATUS","getState","status","startOrEnd","unmounted","getEndStatus","unmountOnExit","getTimeout","timeout","nextTick","transitState","updateState","setState","latestState","timeoutId","onChange","useTransitionState","enter","exit","preEnter","preExit","initialEntered","mountOnEnter","enterTimeout","exitTimeout","toggle","toEnter","enterStage","useMenuState","initialOpen","onMenuChange","toggleMenu","isEnter","isResolved","useMenuStateAndFocus","menuProps","setMenuItemFocus","openMenu","useClick","onToggle","skipOpen","isLegacyReact","Menu","menuButton","instanceRef","stateProps","buttonRef","anchorProps","handleClose","button","buttonProps","renderButton","cloneElement","useImperativeHandle","jsxs","Fragment","withHovering","WrappedComponent","Component","memo","WithHovering","itemRef","useMouseOver","mouseOver","setMouseOver","useItemEffect","SubMenu","disabled","label","openTrigger","_2","itemProps","parentMenuRef","parentDir","parentOverflow","isParentOpen","isPortal","_openMenu","mouseOverStart","mouseOverEnd","timerId","stopTimer","args","setHover","delayOpen","onKeyDownOfRoot","handled","externalItemRef","itemClassName","restItemProps","mergedItemProps","getMenuList","container","useItemState","focusRef","unsetHover","onBlur","keepHover","MenuItem","href","type","checked","restStateProps","radioGroup","isRadio","isCheckBox","isAnchor","isChecked","handleClick","handleKeyDown","mergedProps","menuItemProps","FocusableItem","renderChildren","MenuDivider","MenuHeader","MenuGroup","style","takeOverflow","setOverflowStyle","b","A","d","DTFLOCALE_CACHE_KEY","_getDtfLocale","cachedDtf","store","session","get","dtfLocale","Intl","DateTimeFormat","resolvedOptions","locale","set","getDtfLocale","mem","initLocales","newLocales","navigator","languages","includes","unshift","locales","createLocale","language","Locale","langPart","parts","split","regionPart","pop","fallbackLocale","region","toString","lang","middle","length","join","reg","_DateTimeFormat","opts","appLocale","userRegion","loc","userRegionLocale","matchedLocale","localeMatch","replace","undefined","niceDateTime","date","dtfOpts","Date","hideTime","formatOpts","forceOpts","currentYear","getFullYear","year","month","day","hour","minute","i18n","format","openCompose","url","URL","parse","location","screenWidth","screenHeight","screen","left","Math","max","min","winUID","uid","random","newWin","open","__COMPOSE__","alert","_i18n","isSafari","test","userAgent","openOSK","fauxEl","document","createElement","opacity","body","appendChild","focus","removeChild","documentElement","getComputedStyle","defaultBoundingBoxPadding","safeAreaInsets","getSafeAreaInsets","safeAreaInsetTop","getPropertyValue","safeAreaInsetRight","safeAreaInsetBottom","safeAreaInsetLeft","parseInt","requestAnimationFrame","safeBoundingBoxPadding","paddings","map","CSS","supports","addEventListener","passive","TOAST_DURATION","showCompose","states","composerState","minimized","duration","template","PARAGRAPH_END_RE","LIST_ITEM_END_RE","MULTIPLE_LINE_BREAKS_RE","getHTMLText","html","preProcess","truncateLinks","innerHTML","content","brElements","querySelectorAll","replaceWith","invisibleElements","remove","ellipsisElements","append","textContent","childNodes","innerText","trim","statusPeek","spoilerText","poll","mediaAttachments","quote","hasQuote","quotedStatus","dom","reContainer","querySelector","multiple","title","image","gifv","video","audio","unknown","quotePeek","SIZES","xs","xl","xxl","INVALID_ID_CHARS_REGEX","Icon","icon","size","alt","class","loadIcon","isIconLoaded","useIconSprite","iconSize","iconBlock","ICONS","console","rotate","flip","rtl","isArray","sanitizedTitle","loaded","role","titleID","_jsx","Icon$1","prevProps","nextProps","Link","routerLocation","useLocation","hash","to","parsedHash","origin","searchParams","searchParamsStr","Array","from","encodeURIComponent","pathname","isActive","decodeURIComponent","currentTarget","parentNode","closest","stopPropagation","prevLocation","MenuLink","closeMenu","detail","RTF","RelativeTimeFormat","isValidDate","isNaN","getTime","rtfFromNow","rtf","seconds","now","absSeconds","abs","floor","twitterFromNow","values","0","RelativeTime","datetime","renderCount","rerender","dateStr","dt","str","dateStyle","toISOString","toLocaleString","raf","rafRerender","scheduleRerender","clearTimeout","cancelAnimationFrame","SubMenu2","setComputedDirection","computedShift","setComputedShift","offsetWidth","viewportWidth","innerWidth","pointerType","useCloseWatcher","watcher","CloseWatcher","useCloseWatcher$1","$modalContainer","getElementById","getBackdropThemeColor","Modal","modalRef","focusElement","supportsCloseWatcher","escRef","useHotkeys","enabled","keydown","keyup","useKey","ignoreEventWhen","metaKey","ctrlKey","altKey","shiftKey","$deckContainers","page","tabIndex","forEach","$deckContainer","setAttribute","removeAttribute","$meta","metaColor","local","backdropColor","colorScheme","log","removeProperty","Modal2","xxxl","alphaCache","canvas","OffscreenCanvas","ctx","getContext","willReadFrequently","imageSmoothingEnabled","MISSING_IMAGE_PATH_REGEX","Avatar","staticUrl","squircle","avatarRef","isMissing","_jsxs","srcset","media","src","loading","decoding","fetchPriority","crossOrigin","onError","onLoad","dataset","drawImage","allPixels","getImageData","hasAlpha","data","filter","pixel","classList","add","clearRect","Avatar$1","IS_RTL","observer","MutationObserver","mutations","mutation","dir","isRTL","observe","useWindowSize","setSize","handleResize","innerHeight","removeEventListener","Menu2","_instanceRef","rtlAlign","MenuConfirm","subMenu","confirm","confirmLabel","menuItemClassName","menuFooter","menuExtras","lib","stream","schema","result","parent","partSchema","conditional","conditionFunc","loop","continueFunc","arr","lastStreamPos","newParent","uint8","buildStream","uint8Data","readByte","peekByte","readBytes","peekBytes","readString","readUnsigned","littleEndian","bytes","readArray","byteSize","totalOrFunc","total","parser","subBitsTotal","bits","startIndex","readBits","_byte","res","def","exports","require$$0","_uint","require$$1","subBlocksSchema","terminator","chunks","streamSize","availableSize","gceSchema","codes","imageSchema","textSchema","applicationSchema","commentSchema","nextCode","_default","deinterlace_1","deinterlace","pixels","newPixels","rows","cpRow","toRow","fromRow","fromPixels","offsets","steps","pass","lzw_1","lzw","minCodeSize","pixelCount","MAX_STACK_SIZE","nullCode","npix","available","clear","code_mask","code_size","end_of_information","in_code","old_code","code","datum","data_size","first","bi","pi","dstPixels","prefix","suffix","pixelStack","_gif","_interopRequireDefault","_jsBinarySchemaParser","require$$2","_deinterlace","require$$3","_lzw","require$$4","obj","parseGIF","arrayBuffer","byteData","generatePatch","totalPixels","patchData","pos","colorIndex","color","decompressFrame","frame","gct","buildImagePatch","resultImage","decompressFrames","parsedGif","buildImagePatches","getGifFirstFrame","gifUrl","buffer","fetch","gif","frames","dims","patch","imageData","ImageData","putImageData","blob","Promise","resolve","toBlob","createObjectURL","CustomEmoji","isLarger","naturalWidth","naturalHeight","fetchQueue","PQueue","concurrency","interval","intervalCap","throttledFetch","signal","SHORTCODES_REGEX","shortcodesRegexp","shortcodes","RegExp","resolvedEmojisCache","Map","MAX_CACHE_SIZE","resolveEmojis","resolverURL","has","emojiTags","headers","accept","referrerPolicy","json","tag","emojis","all","emoji","shortcode","mediaType","firstKey","keys","next","delete","renderEmojiText","allEmojis","staticEmoji","elements","regex","word","EmojiText","resolvedEmojis","setResolvedEmojis","setLoading","matches","match","hasUnresolved","some","slice","emojis2","resolved","RolesTags","roles","accountId","accountUrl","hideSelf","isSelf","getCurrentAccountID","parsedAccountInstance","getDomain","_Fragment","nameCollator","sensitivity","Collator","ACCT_REGEX","SPACES_REGEX","NON_ALPHA_NUMERIC_REGEX","NameText","account","showAvatar","showAcct","short","external","useLingui","acct","avatar","avatarStatic","displayName","bot","username","acct1","acct2","api","trimmedUsername","toLowerCase","trimmedDisplayName","shortenedDisplayName","shortenedAlphaNumericDisplayName","hideUsername","compare","preventDefault","which","internalURL","showAccount","codeMappings","zh_HANT","IntlDN","DisplayNames","_localeCode2Text","fallback","of","anotherText","yetAnotherText","translangLanguagesNative","localeCode2Text","translationTargetLanguages","Object","tl","localeTargetLanguages","getTranslateTargetLanguage","fromSettings","contentTranslationTargetLanguage","BYTES_UNITS","prettyBytes","unitIndex","log2","number","unit","unitDisplay","maximumFractionDigits","supportsNativeQuote","getAPIVersions","mastodon","getPostQuoteApprovalPolicy","quoteApproval","currentUser","ESCAPE_REGEX","HTML_ESCAPE_MAP","HTML_ESCAPE_REGEX","escapeRegex","escapeHTML","char","emojifyText","emojiMap","pattern","sc","escapedShortcode","HTML_CHARS_REGEX","HTML_ENTITIES","fauxDiv","whitelistLinkClasses","LINK_REGEX","HTTP_LINK_REGEX","MENTION_REGEX","HASHTAG_REGEX","CODE_BLOCK_REGEX","CODE_BLOCK_START_REGEX","CODE_BLOCK_END_REGEX","INLINE_CODE_REGEX","TWITTER_DOMAIN_REGEX","TWITTER_MENTION_REGEX","TWITTER_MENTION_CAPTURE_REGEX","CODE_INLINE_CAPTURE_REGEX","createDOM","isDocumentFragment","tpl","_enhanceContent","returnDOM","postEnhanceDOM","enhancedContent","hasLink","hasCodeBlock","noTargetBlankLinks","link","links","shortenLink","usernames","hasChildren","atSymbol","domain","push","hashSymbol","textNodes","extractTextNodes","nodeValue","blocks","pre","br","codeBlocks","nextParagraphs","currentBlock","nextElementSibling","tagName","codeText","replaceAll","rejectFilter","prevIndex","hashtagStuffedParagraphs","hashtagCount","nodeType","Node","TEXT_NODE","linkText","startsWith","imgs","img","getAttribute","setProperty","span","replaceChild","queueMicrotask","enhanceContent","defaultRejectFilter","defaultRejectFilterMap","fromEntries","nodeName","URL_PREFIX_REGEX","URL_DISPLAY_LENGTH","displayURL","cutoff","rejectFilterMap","assign","reduce","acc","cur","walk","createTreeWalker","NodeFilter","SHOW_TEXT","acceptNode","FILTER_REJECT","FILTER_ACCEPT","nextNode","supportsHover","matchMedia","handleContentLinks","mentions","previewMode","statusURL","kindaLargeRatio","showMediaModal","description","contains","prevText","previousSibling","textBeforeLinkIsAt","endsWith","textStartsWithAt","targetText","mention","find","textBeforeLinkIsHash","hashURL","unfurledLinks","hostname","containsDomain","shortenNumber","num","notation","roundingMode","containPixelfed","notContainPixelfed","containPleroma","containAkkoma","platformFeatures","supportsCache","semverExtract","atSoftwareSlashMatch","feature","getCurrentInstance","softwareName","getCurrentNodeInfo","software","featureMatch","range","features","doesSoftwareMatch","satisfiesRange","satisfies","includePrerelease","loose","AccountBlock","skeleton","avatarSize","useAvatarStatic","internal","showActivity","showStats","accountInstance","hideDisplayName","relationship","excludeRelationshipAttrs","_useLingui","statusesCount","lastStatusAt","fields","note","group","followersCount","createdAt","locked","verifiedField","verifiedAt","excludedRelationship","hasRelationship","following","followedBy","requested","_t","_Trans","dangerouslySetInnerHTML","__html","components","fetchRelationships","accounts","relationshipsMap","masto","currentAccount","uniqueAccountIds","v1","relationships","i18nDuration","objectToString","isError","errorMessages","isNetworkError","error","message","stack","validateRetries","retries","validateNumberOption","allowInfinity","AbortError","calculateDelay","retriesConsumed","attempt","calculateRemainingTime","start","onAttemptFailure","attemptNumber","startTime","normalizedError","retriesLeft","maxRetryTime","context","consumeRetry","remainingTime","delayTime","finalDelay","reject","onAbort","timeoutToken","pRetry","input","supportsLanguageDetector","supportsBrowserTranslator","langDetector","availability","LanguageDetector","originalSource","detect","detectedSourceLanguage","groupLabel","translatorCapabilities","groupCollapsed","targetLanguage","translator","Translator","sourceLanguage","__defProp","__defNormalProp","__publicField","observerMap","RootIds","rootId","unsupportedValue","getRootId","optionsToId","createObserver","thresholds","entry","_a2","inView","threshold","callback","fallbackInView","bounds","callbacks","isPlainChildren","InView","React.Component","previousInView","rootMargin","trackVisibility","as","triggerOnce","skip","initialInView","React.createElement","_a","_b","useSyncEffect","React3.useInsertionEffect","React3.useLayoutEffect","React3.useEffect","useOnInView","onIntersectionChange","onIntersectionChangeRef","React3.useRef","observedElementRef","observerCleanupRef","lastInViewRef","React3.useCallback","cleanupExisting","cleanup","destroyed","destroyObserver","stopObserving","TOP","shazamIDs","LazyShazam","visibleStart","setVisibleStart","onInView","hidden","getBoundingClientRect","bottom","sourceLanguages","sl","PHANPY_TRANSLANG_INSTANCES","import","TRANSLANG_INSTANCES","translationQueue","TRANSLATED_MAX_AGE","currentTranslangInstance","_translangTranslate","fetchCall","fetchPromise","method","priority","JSON","then","ok","provider","translated_text","detected_language","pronunciation","onFailedAttempt","translangTranslate","pmem","expires","forceTranslate","onTranslate","mini","autoDetected","setUIState","targetLang","uiState","setTranslatedContent","pronunciationContent","setPronunciationContent","detailsRef","translatedContent","abortControllerRef","setDetectedLang","sourceLangText","apiSourceLang","throttledBrowserTranslate","throttledTranslangTranslate","translate","detectedLangText","AbortController","detectedLang","targetLangText","common","showCommon","native","Loader","abrupt","TranslationBlock$1","TranslationBlock","promisifyRequest","request","createStore","dbName","storeName","dbp","getDB","db","txMode","defaultGetStoreFunc","defaultGetStore","customStore","getMany","del","delMany","eachCursor","cursor","initDB","val","drafts","catchup","yearInPosts","EditHistoryContext","supportsViewTransition","startViewTransition","EditHistoryProvider","statusID","editHistoryRef","editHistoryMode","setEditHistoryMode","editedAtIndex","_setEditedAtIndex","setEditedAtIndex","fetchEditHistory","history","statuses","$select","list","sort","initEditHistory","exitEditHistory","prevEditedAt","nextEditedAt","useEditHistory","FilterContext","_isFiltered","filtered","filterContext","appliedFilters","hasContext","expiresAt","filterAction","action","every","filterTitles","titles","titlesStr","isFiltered","filteredItem","currentAccountID","filterState","filteredItems","htmlContentLength","supportsTTS","speak","speechSynthesis","speaking","cancel","utterance","SpeechSynthesisUtterance","useResolvedElement","subscriber","refOrElement","lastReportRef","refOrElementRef","cbElementRef","evaluateSubscription","cbElement","extractSize","boxProp","sizeType","useResizeObserver","onResize","onResizeRef","round","resizeObserverRef","_useState","didUnmount","previous","refCallback","reportedWidth","reportedHeight","newWidth","newHeight","newSize","useThrottledResizeObserver","useThrottledCallback","useTruncated","onTruncated","prevTruncatedRef","box","scrollHeight","truncated","_height","computedHeight","visibilityIconsMap","public","unlisted","private","direct","visibilityText","DELIMITERS_PATTERNS","DELIMITERS_REGEX","cleanDOMForTemml","START_DELIMITERS","startRegex","walker","textNode","startMatch","endDelimiter","nodesToCombine","currentNode","foundEnd","combinedText","nextSibling","ELEMENT_NODE","MathBlock","contentRef","onRevert","lastIndex","mathRendered","setMathRendered","toggleMathRendering","temml","__vitePreload","__vite_default__","default","originalContentRefHTML","renderMathInElement","fences","annotate","throwOnError","errorCallback","err","hasMath","htmlChanged","digitLookup","decode83","end","pow","PI","PI2","sRGBToLinear","linearTosRGB","signSqr","fastCos","cos","getBlurHashAverageColor","blurHash","decodeBlurHash","punch","sizeFlag","numX","numY","basis","basisY","pixelIndex","maximumValue","colors","averageColor","cosinesY","cosinesX","bytesPerRow","extendStatics","__extends","__","__assign","styleRoot","styleChild","styles","isSsr","isTouch","make3dTransformValue","scale","getOffsetBounds","containerDimension","childDimension","centerContained","diff","classnames","base","other","sqrt","isMac","isDragInteraction","isZoomInteraction","isZoomGesture","wheelEvent","cancelEvent","getDistance","calculateScale","startTouches","endTouches","startDistance","endDistance","isCloseTo","expected","swing","getPointByPageCoordinates","touch","getPageCoordinatesByTouches","touches","sum","getVectorAvg","vectors","clamp","shouldInterceptWheel","getElementSize","offsetHeight","calculateVelocity","startPoint","endPoint","comparePoints","p1","p2","noup","zeroPoint","PinchZoom","_super","_this","createRef","clickEvent","touchEndEvent","touchStartEvent","touchMoveEvent","pageX","pageY","deltaY","deltaMode","scaleDelta","likeTouchEvent","center","dScale","inertiaFriction","inertia","renderFrame","prevOffset","currentCoordinates","prevPoint","newScale","touchCenter","needZoomOut","zoomFactor","startZoomFactor","updateProgress","progress","elWidth","elHeight","minOffsetX","maxOffsetX","_c","minOffsetY","maxOffsetY","__x","__y","animated","startOffset","containerCenter","diffZoomFactor","diffOffset","updateFrame","originalZoomFactor","lastCenter","sanitizedOffset","targetOffset","scaleFactor","offsetLeft","offsetTop","_document","_html","_body","scrollTop","scrollLeft","posTop","posLeft","frameFn","timeFn","frameTime","div","xZoomFactor","yZoomFactor","eventName","_i","newInteraction","interaction","fingers","time","mouseEvent","isEnd","isStart","nonce","child","Children","React","any","object","func","bool","string","formatDuration","hours","minutes","padStart","dataAltLabel","AltBadge","showMediaAlt","MEDIA_CAPTION_LIMIT","MEDIA_CAPTION_LIMIT_LONGER","isMediaCaptionLong","caption","Media","showOriginal","autoAnimate","showCaption","allowLongerCaption","altIndex","checkAspectRatio","blurhash","meta","previewRemoteUrl","previewUrl","remoteUrl","mediaVTN","getSafeViewTransitionName","original","small","mediaURL","remoteMediaURL","hasPreviewDimensions","orientation","rgbAverageColor","videoRef","focalPosition","toFixed","mediaRef","onUpdate","touchAction","pinchZoomEnabled","setPinchZoomEnabled","quickPinchZoomProps","draggableUnZoomed","tapZoomFactor","doubleTapToggleZoom","mediaLoadError","setMediaLoadError","Parent","remoteMediaURLObj","getURLObj","isVideoMaybe","isAudioMaybe","isImage","isPreviewVideoMaybe","parentRef","imageSmallerThanParent","setImageSmallerThanParent","smaller","maxAspectHeight","averageColorStyle","mediaStyles","aspectRatio","longDesc","showInlineDesc","Figure","postViewState","interceptOnClick","isOnPostPage","el","viewTransitioned","viewTransitionName","backgroundImage","backgroundSize","mediaImage","$media","clientWidth","clientHeight","minDimension","displayNaturalHeight","almostSimilarHeight","$mediaParent","hasDuration","shortDuration","isGIF","loopable","formattedDuration","hoverAnimate","autoGIFAnimate","showProgress","videoHTML","QuickPinchZoom","gifHTML","poster","preload","playsinline","muted","onTimeUpdate","percentage","currentTime","disablePictureInPicture","formattedDuration2","background","controls","controlsList","autoPlay","playsInline","inputString","safeName","Media$1","oldProps","newProps","oldMedia","newMedia","MediaFirstContainer","postID","moreThanOne","carouselRef","currentIndex","setCurrentIndex","scrollTo","behavior","MultipleMediaFigure","captionChildren","POLL_OPTIONS_BATCH_SIZE","Poll","readOnly","refresh","votePoll","visibleOptionsCount","setVisibleOptionsCount","loadMoreRef","expired","ownVotes","voted","votersCount","votesCount","expiresAtDate","pollVotesCount","roundPrecision","showResults","setShowResults","optionsHaveVoteCounts","resultsView","selectedOptions","setSelectedOptions","IntersectionObserver","isIntersecting","prev","disconnect","voteOptionsSelectionCount","showPollInfo","setShowPollInfo","option","optionVotesCount","ratio","isLeading","minHeight","onSubmit","choices","isSelected","1","HTTP_REGEX","PostContent","post","snapStates","useSnapshot","sKey","statusKey","quotes","statusQuotes","divRef","replaceChildren","cloneNode","originalURL","addIndentation_1","splittedHtml","level","opened","indented","elTag","newIndented","removeEmptyLines","nonFormattedString","toLines","markup","splittedMarkup","mergedLines","currentElement","line","addIndentation","mergeAttributesWithElements","splitted","generateHTMLCode","accountURL","accountEmojis","editedAt","uniqueQuotes","findIndex","q2","quoteStatusesHTML","createdAtDate","contentHTML","sourceMediaURL","previewMediaURL","sourceMediaURLObj","isVideo","isAudio","mediaHTML","htmlCode","prettify","PostEmbedModal","readonly","select","clipboard","writeText","download","TruncatedLink","FETCH_DELAY","BATCH_LIMIT","QuoteChainModal","statusId","posts","setPosts","nextPostID","setNextPostID","fetchQuoteChain","fetchCount","currentPostID","aborted","fullStatus","getStatus","cached","quotedStatusId","tabindex","_t2","postEl","dispatchEvent","clientX","clientY","Status","showCommentCount","showQuoteCount","QuoteSettingsSheet","currentPolicy","selectedPolicy","setSelectedPolicy","handleFormSubmit","quoteApprovalPolicy","FormData","newStatus","interactionPolicy","update","quote_approval_policy","saveStatus","skipThreading","skipUnfurling","LIMIT","QuotesModal","showMore","setShowMore","quotesIterator","firstLoad","loadQuotes","isFirstLoad","limit","done","post2","StatusButton","extraCount","otherProps","buttonTitle","setButtonTitle","iconAlt","setIconAlt","LiteYTEmbed","shadowDom","oldVal","newVal","eleNoScript","isIntersectionObserver","autoplay","autoPause","wantsNoCookie","embedTarget","iframeHTML","oEmbedUrl","response","thumbnailUrl","videoIdMatch","extractedVideoId","videoId","posterUrlWebp","posterUrlJpeg","webpUrl","kind","linkElem","Byline","authors","author","isCardPost","StatusCard","card","selfReferential","selfAuthor","providerName","providerUrl","authorName","authorUrl","imageDescription","embedUrl","publishedAt","hasText","cardStatusURL","setCardStatusURL","isMastodonLinkMaybe","abortController","unfurlMastodonLink","abort","hasIframeHTML","showEmbedModal","blurhashImage","setBlurhashImage","blurhashPixels","createImageData","convertToBlob","toDataURL","isPost","rel","videoID","videoid","StatusCompact","statusReply","sensitive","visibility","srKey","statusPeekText","getCurrentAccID","filterInfo","filterTitleStr","extractTagsFromStatus","indexOf","hashtagLinks","getElementsByClassName","tags","StatusTags","hashtagsInContent","tagsToShow","ThreadCountContext","ThreadIcon","ThreadBadge","showIcon","showText","hasIndex","hasTotal","SHOW_COMMENT_COUNT_LIMIT","INLINE_TRANSLATE_LIMIT","accountQueue","fetchAccount","memFetchAccount","isIOS","ontouchstart","REACTIONS_LIMIT","getPollText","getPostText","maskCustomEmojis","maskURLs","hideInlineQuote","htmlTextOpts","emojisRegex","forgivingQSA","selectors","selector","getHTMLTextForDetectLang","isTranslateble","SIZE_CLASS","detectLang","langs","detectedLanguage","groupEnd","lang2","detectAll","readMoreText","DIFFERENT_LANG_CHECK","diffLangCheckCacheKey","hls","contentTranslationHideLanguages","checkDifferentLanguage","cacheKey","different","quoteMessages","quotePrivate","requestQuote","quoteManualReview","quoteFollowersOnly","quoteCannot","quoteApprovalPolicyMessages","followers","nobody","QUESTION_REGEX","DEV","__vite_import_meta_env__","contentTextWeight","enableCommentHint","withinContext","enableTranslate","allowFilters","onMediaClick","quoted","quoteDomain","onStatusLinkClick","allowContextMenu","showFollowedTags","showActionsBar","showReplyParent","mediaFirst","forceShowCommentCount","ghost","inReplyToAccountId2","inReplyToAccountId","ghostAccount","authenticated","currentInstance","sameInstance","eStatus","repliesCount","reblogged","reblogsCount","favourited","favouritesCount","quotesCount","bookmarked","inReplyToId","reblog","uri","_pinned","emojiReactions","languageAutoDetected","_language","detected","setLanguageAutoDetected","hasMediaAttachments","debugHover","FilteredStatus","onMouseEnter","inReplyToAccountRef","setInReplyToAccount","inReplyToAccount","account2","mentionSelf","prefs","getPreferences","readingExpandSpoilers","showSpoiler","showSpoilerMedia","readingExpandMedia","FollowedTagsParent","StatusParent","contentTranslation","contentLength","setForceTranslate","_forceTranslate","isSizeLarge","contentTranslationAutoInline","inlineTranslate","showQuotes","setShowQuotes","showQuoteChain","setShowQuoteChain","spoilerContentRef","mediaContainerRef","setShowEdited","statusRef","setShowEmbed","showQuoteSettings","setShowQuoteSettings","unauthInteractionErrorMessage","textWeight","reloadPostContent","isPublic","canBoost","quoteDisabled","createdDateText","quoteText","editedDateText","isMineAndPrivate","isMine","isQuoteAutomaticallyAccepted","isQuoteManuallyAccepted","isQuoteFollowersOnly","quoteMetaText","automatic","replyStatus","replyMode","postQuoteApprovalPolicy","mediaNoDesc","attachment","replyToStatus","confirmBoostStatus","favouriteStatus","bookmarkStatus","bookmarkStatusNotify","differentLanguage","setDifferentLanguage","reblogIterator","fetchBoostedLikedByAccounts","reblogResults","favouriteResults","favouriteIterator","_types","isQuotingMyPost","statusMonthsAgo","tooManyMentions","mentionsCount","ReplyMenuContent","replyModeMenuItems","StatusMenuItems","quoteStatus","draftStatus","canQuote","showGenericAccounts","fetchAccounts","postText","nicePostURL","maxWidth","share","isPinnable","pinned","editStatus","cachedStatus","_deleted","reloadStatusPage","contextMenuRef","isContextMenuOpen","setIsContextMenuOpen","contextMenuProps","setContextMenuProps","showReportModal","bindLongPressContext","showContextMenu","rRef","handler","favouriteStatusNotify","hotkeysEnabled","captureEvent","cancelOnMovement","fRef","xRef","activeStatus","spoilerButton","spoilerMediaButton","showMultipleMediaCaptions","displayedMediaAttachments","attachments","indices","isThread","showCommentHint","forceShowQuoteCount","dRef","nodeRef","bRef","containsQuestion","qRef","selection","anchorNode","actionsRef","statusThreadNumber","newPoll","pollResponse","reloadPostContentCount","QuoteStatuses","collapsed","fallbackQuote","editedAtDate","me","url2","emojiReaction","isShortCode","showEdited","showEmbed","EditedAtModal","fetchStatusHistory","urlObj","host","restPath","path","handledUnfulfilledStates","revealableUnfulfilledStates","filterHidden","deleted","unauthorized","rejected","revoked","unfulfilledState","isStaticQuote","quotedAccountAcct","isRevealable","unfulfilledText","quoteKey","revealedQuotes","originalDomain","QuoteStatus","ShallowQuote","editHistory","setEditHistory","second","_t3","isReblog","setShowPeek","isFollowedTags","ssKey","actualStatusID","onContextMenu","bindLongPressPeek","showPeek","statusPeekRef","restNewProps","shallowEqual","restOldProps","IDX","HEX","len","getTag","INFINITY","baseToString","isString","isNumber","isBoolean","isObjectLike","isObject","isDefined","isBlank","INCORRECT_INDEX_TYPE","LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY","PATTERN_LENGTH_TOO_LARGE","MISSING_KEY_PROPERTY","INVALID_KEY_WEIGHT_VALUE","hasOwn","KeyStore","totalWeight","createKey","keyId","weight","getFn","createKeyPath","createKeyId","deepGet","MatchOptions","BasicOptions","FuzzyOptions","AdvancedOptions","Config","SPACE","norm","mantissa","cache","numTokens","FuseIndex","fieldNormWeight","docs","records","idx","doc","docIndex","record","keyIndex","subRecords","nestedArrIndex","subRecord","createIndex","myIndex","parseIndex","computeScore$1","errors","currentLocation","expectedLocation","distance","ignoreLocation","accuracy","proximity","convertMaskToIndices","matchmask","minMatchCharLength","MAX_BITS","search","patternAlphabet","findAllMatches","includeMatches","patternLen","textLen","currentThreshold","bestLocation","computeMatches","matchMask","score","lastBitArr","finalScore","binMax","mask","binMin","binMid","finish","bitArr","charMatch","createPatternAlphabet","stripDiacritics","BitapSearch","isCaseSensitive","ignoreDiacritics","addChunk","remainder","allIndices","totalScore","hasMatches","alphabet","isMatch","BaseMatch","getMatch","exp","ExactMatch","InverseExactMatch","PrefixExactMatch","InversePrefixExactMatch","SuffixExactMatch","InverseSuffixExactMatch","FuzzyMatch","IncludeMatch","searchers","searchersLen","SPACE_RE","OR_TOKEN","parseQuery","query","results","queryItem","found","searcher","token","MultiMatchSet","ExtendedSearch","numMatches","qLen","pLen","registeredSearchers","register","createSearcher","searcherClass","LogicalOperator","KeyType","isExpression","isPath","isLeaf","convertToExplicit","auto","isQueryPath","computeScore","ignoreFieldNorm","transformMatches","transformScore","includeScore","transformers","transformer","Fuse","predicate","shouldSort","sortFn","expression","evaluate","resultMap","expResults","MIN_SCHEDULED_AT","MAX_SCHEDULED_AT","ScheduledAtField","scheduledAt","setScheduledAt","minStr","setMinStr","timezoneOffset","setMaxStr","updateMinStr","updateMaxStr","intervalId","defaultValue","maxStr","required","getLocalTimezoneName","formatter","formatToParts","part"],"ignoreList":[0,1,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,60,61,62,63,64,65,71,85,86,88,91,98,104,105,106,107,108,109,116,117,118,124,132,133],"sources":["../../node_modules/react-hotkeys-hook/dist/index.js","../../node_modules/toastify-js/src/toastify.js","../../src/utils/show-toast.js","../../src/utils/useInterval.js","../../node_modules/@szhsin/react-menu/dist/esm/utils/utils.mjs","../../node_modules/@szhsin/react-menu/dist/esm/hooks/useBEM.mjs","../../node_modules/@szhsin/react-menu/dist/esm/utils/constants.mjs","../../node_modules/@szhsin/react-menu/dist/esm/components/MenuContainer.mjs","../../node_modules/@szhsin/react-menu/dist/esm/utils/submenuCtx.mjs","../../node_modules/@szhsin/react-menu/dist/esm/hooks/useItems.mjs","../../node_modules/@szhsin/react-menu/dist/esm/positionUtils/getNormalizedClientRect.mjs","../../node_modules/@szhsin/react-menu/dist/esm/positionUtils/getPositionHelpers.mjs","../../node_modules/@szhsin/react-menu/dist/esm/positionUtils/placeArrowVertical.mjs","../../node_modules/@szhsin/react-menu/dist/esm/positionUtils/placeLeftorRight.mjs","../../node_modules/@szhsin/react-menu/dist/esm/positionUtils/placeArrowHorizontal.mjs","../../node_modules/@szhsin/react-menu/dist/esm/positionUtils/placeToporBottom.mjs","../../node_modules/@szhsin/react-menu/dist/esm/positionUtils/positionMenu.mjs","../../node_modules/@szhsin/react-menu/dist/esm/hooks/useIsomorphicLayoutEffect.mjs","../../node_modules/@szhsin/react-menu/dist/esm/hooks/useCombinedRef.mjs","../../node_modules/@szhsin/react-menu/dist/esm/components/MenuList.mjs","../../node_modules/@szhsin/react-menu/dist/esm/components/ControlledMenu.mjs","../../node_modules/react-transition-state/dist/esm/hooks/utils.mjs","../../node_modules/react-transition-state/dist/esm/hooks/useTransitionState.mjs","../../node_modules/@szhsin/react-menu/dist/esm/hooks/useMenuState.mjs","../../node_modules/@szhsin/react-menu/dist/esm/hooks/useMenuStateAndFocus.mjs","../../node_modules/@szhsin/react-menu/dist/esm/hooks/useClick.mjs","../../node_modules/@szhsin/react-menu/dist/esm/components/Menu.mjs","../../node_modules/@szhsin/react-menu/dist/esm/utils/withHovering.mjs","../../node_modules/@szhsin/react-menu/dist/esm/hooks/useMouseOver.mjs","../../node_modules/@szhsin/react-menu/dist/esm/hooks/useItemEffect.mjs","../../node_modules/@szhsin/react-menu/dist/esm/components/SubMenu.mjs","../../node_modules/@szhsin/react-menu/dist/esm/hooks/useItemState.mjs","../../node_modules/@szhsin/react-menu/dist/esm/components/MenuItem.mjs","../../node_modules/@szhsin/react-menu/dist/esm/components/FocusableItem.mjs","../../node_modules/@szhsin/react-menu/dist/esm/components/MenuDivider.mjs","../../node_modules/@szhsin/react-menu/dist/esm/components/MenuHeader.mjs","../../node_modules/@szhsin/react-menu/dist/esm/components/MenuGroup.mjs","../../node_modules/use-long-press/index.mjs","../../src/utils/dtf-locale.js","../../src/utils/date-time-format.js","../../src/utils/nice-date-time.js","../../src/utils/open-compose.js","../../src/utils/open-osk.js","../../src/utils/safe-bounding-box-padding.js","../../src/utils/show-compose.js","../../src/utils/getHTMLText.js","../../src/utils/status-peek.js","../../src/components/icon.jsx","../../src/components/link.jsx","../../src/components/menu-link.jsx","../../src/utils/relative-time-format.js","../../src/components/relative-time.jsx","../../src/components/submenu2.jsx","../../src/utils/useCloseWatcher.js","../../src/components/modal.jsx","../../src/components/avatar.jsx","../../src/utils/is-rtl.js","../../src/utils/useWindowSize.js","../../src/components/menu2.jsx","../../src/components/menu-confirm.jsx","../../node_modules/js-binary-schema-parser/lib/index.js","../../node_modules/js-binary-schema-parser/lib/parsers/uint8.js","../../node_modules/js-binary-schema-parser/lib/schemas/gif.js","../../node_modules/gifuct-js/lib/deinterlace.js","../../node_modules/gifuct-js/lib/lzw.js","../../node_modules/gifuct-js/lib/index.js","../../src/utils/get-gif-first-frame.js","../../src/components/custom-emoji.jsx","../../src/components/emoji-text.jsx","../../src/components/roles-tags.jsx","../../src/components/name-text.jsx","../../node_modules/use-debounce/dist/index.module.js","../../src/utils/localeCode2Text.js","../../src/utils/get-translate-target-language.js","../../src/utils/pretty-bytes.js","../../src/utils/quote-utils.js","../../src/utils/emojify-text.js","../../src/utils/escape-html.js","../../src/utils/enhance-content.js","../../src/utils/handle-content-links.js","../../src/utils/shorten-number.js","../../src/utils/supports.js","../../src/components/account-block.jsx","../../src/utils/relationships.js","../../src/utils/i18n-duration.js","../../node_modules/is-network-error/index.js","../../node_modules/p-retry/index.js","../../src/utils/browser-translator.js","../../node_modules/react-intersection-observer/dist/index.mjs","../../src/components/lazy-shazam.jsx","../../src/components/translation-block.jsx","../../node_modules/idb-keyval/dist/index.js","../../src/utils/db.js","../../src/utils/edit-history-context.jsx","../../src/utils/filter-context.js","../../src/utils/filters.js","../../src/utils/html-content-length.js","../../src/utils/speech.js","../../node_modules/use-resize-observer/dist/bundle.esm.js","../../src/utils/useThrottledResizeObserver.js","../../src/utils/useTruncated.js","../../src/utils/visibility-icons-map.js","../../src/utils/visibility-text.jsx","../../src/components/math-block.jsx","../../node_modules/fast-blurhash/index.js","../../node_modules/tslib/tslib.es6.mjs","../../node_modules/react-quick-pinch-zoom/esm/PinchZoom/styles.css.js","../../node_modules/react-quick-pinch-zoom/esm/utils.js","../../node_modules/react-quick-pinch-zoom/esm/PinchZoom/getOffsetBounds.js","../../node_modules/react-quick-pinch-zoom/esm/PinchZoom/component.js","../../src/utils/format-duration.js","../../src/components/media.jsx","../../src/components/media-first-container.jsx","../../src/components/multiple-media-figure.jsx","../../src/components/poll.jsx","../../src/components/post-content.jsx","../../node_modules/html-prettify/src/utils/addIndentation.js","../../node_modules/html-prettify/src/utils/toLines.js","../../node_modules/html-prettify/src/index.js","../../src/components/post-embed-modal.jsx","../../src/components/quote-chain-modal.jsx","../../src/components/quote-settings-sheet.jsx","../../src/components/quotes-modal.jsx","../../src/components/status-button.jsx","../../node_modules/@justinribeiro/lite-youtube/lite-youtube.js","../../src/components/byline.jsx","../../src/components/status-card.jsx","../../src/components/status-compact.jsx","../../src/components/status-tags.jsx","../../src/utils/thread-count-context.js","../../src/components/thread-badge.jsx","../../src/components/status.jsx","../../node_modules/uid/single/index.mjs","../../node_modules/fuse.js/dist/fuse.mjs","../../src/components/ScheduledAtField.jsx"],"sourcesContent":["import { createContext as T, useContext as M, useState as A, useCallback as k, useRef as S, useLayoutEffect as z, useEffect as J } from \"react\";\nimport { jsx as b } from \"react/jsx-runtime\";\nconst j = [\"shift\", \"alt\", \"meta\", \"mod\", \"ctrl\", \"control\"], Q = {\n esc: \"escape\",\n return: \"enter\",\n left: \"arrowleft\",\n right: \"arrowright\",\n up: \"arrowup\",\n down: \"arrowdown\",\n ShiftLeft: \"shift\",\n ShiftRight: \"shift\",\n AltLeft: \"alt\",\n AltRight: \"alt\",\n MetaLeft: \"meta\",\n MetaRight: \"meta\",\n OSLeft: \"meta\",\n OSRight: \"meta\",\n ControlLeft: \"ctrl\",\n ControlRight: \"ctrl\"\n};\nfunction K(e) {\n return (Q[e.trim()] || e.trim()).toLowerCase().replace(/key|digit|numpad/, \"\");\n}\nfunction D(e) {\n return j.includes(e);\n}\nfunction H(e, n = \",\") {\n return e.toLowerCase().split(n);\n}\nfunction P(e, n = \"+\", r = \">\", i = !1, u, f) {\n let o = [], y = !1;\n e = e.trim(), e.includes(r) ? (y = !0, o = e.toLocaleLowerCase().split(r).map((d) => K(d))) : o = e.toLocaleLowerCase().split(n).map((d) => K(d));\n const c = {\n alt: o.includes(\"alt\"),\n ctrl: o.includes(\"ctrl\") || o.includes(\"control\"),\n shift: o.includes(\"shift\"),\n meta: o.includes(\"meta\"),\n mod: o.includes(\"mod\"),\n useKey: i\n }, m = o.filter((d) => !j.includes(d));\n return {\n ...c,\n keys: m,\n description: u,\n isSequence: y,\n hotkey: e,\n metadata: f\n };\n}\ntypeof document < \"u\" && (document.addEventListener(\"keydown\", (e) => {\n e.code !== void 0 && _([K(e.code)]);\n}), document.addEventListener(\"keyup\", (e) => {\n e.code !== void 0 && I([K(e.code)]);\n})), typeof window < \"u\" && (window.addEventListener(\"blur\", () => {\n L.clear();\n}), window.addEventListener(\"contextmenu\", () => {\n setTimeout(() => {\n L.clear();\n }, 0);\n}));\nconst L = /* @__PURE__ */ new Set();\nfunction R(e) {\n return Array.isArray(e);\n}\nfunction U(e, n = \",\") {\n return (R(e) ? e : e.split(n)).every((i) => L.has(i.trim().toLowerCase()));\n}\nfunction _(e) {\n const n = Array.isArray(e) ? e : [e];\n L.has(\"meta\") && L.forEach((r) => {\n D(r) || L.delete(r.toLowerCase());\n }), n.forEach((r) => {\n L.add(r.toLowerCase());\n });\n}\nfunction I(e) {\n const n = Array.isArray(e) ? e : [e];\n e === \"meta\" ? L.clear() : n.forEach((r) => {\n L.delete(r.toLowerCase());\n });\n}\nfunction V(e, n, r) {\n (typeof r == \"function\" && r(e, n) || r === !0) && e.preventDefault();\n}\nfunction X(e, n, r) {\n return typeof r == \"function\" ? r(e, n) : r === !0 || r === void 0;\n}\nconst Y = [\n \"input\",\n \"textarea\",\n \"select\",\n \"searchbox\",\n \"slider\",\n \"spinbutton\",\n \"menuitem\",\n \"menuitemcheckbox\",\n \"menuitemradio\",\n \"option\",\n \"radio\",\n \"textbox\"\n];\nfunction Z(e) {\n return F(e, Y);\n}\nfunction F(e, n = !1) {\n const { target: r, composed: i } = e;\n let u, f;\n return ee(r) && i ? (u = e.composedPath()[0] && e.composedPath()[0].tagName, f = e.composedPath()[0] && e.composedPath()[0].role) : (u = r && r.tagName, f = r && r.role), R(n) ? !!(u && n && n.some((o) => o.toLowerCase() === u.toLowerCase() || o === f)) : !!(u && n && n);\n}\nfunction ee(e) {\n return !!e.tagName && !e.tagName.startsWith(\"-\") && e.tagName.includes(\"-\");\n}\nfunction te(e, n) {\n return e.length === 0 && n ? !1 : n ? e.some((r) => n.includes(r)) || e.includes(\"*\") : !0;\n}\nconst re = (e, n, r = !1) => {\n const { alt: i, meta: u, mod: f, shift: o, ctrl: y, keys: c, useKey: m } = n, { code: d, key: t, ctrlKey: a, metaKey: l, shiftKey: h, altKey: w } = e, p = K(d);\n if (m) {\n if (c?.length === 1 && c.includes(t.toLowerCase())) {\n if (!r) {\n if (i !== w || o !== h) return !1;\n if (f) {\n if (!l && !a) return !1;\n } else if (u !== l || y !== a) return !1;\n }\n return !0;\n }\n return !1;\n }\n if (!c?.includes(p) && ![\"ctrl\", \"control\", \"unknown\", \"meta\", \"alt\", \"shift\", \"os\"].includes(p))\n return !1;\n if (!r) {\n if (i !== w && p !== \"alt\" || o !== h && p !== \"shift\")\n return !1;\n if (f) {\n if (!l && !a)\n return !1;\n } else if (u !== l && p !== \"meta\" && p !== \"os\" || y !== a && p !== \"ctrl\" && p !== \"control\")\n return !1;\n }\n return c && c.length === 1 && c.includes(p) ? !0 : c && c.length > 0 ? c.includes(p) ? U(c) : !1 : !c || c.length === 0;\n}, $ = T(void 0), ne = () => M($);\nfunction oe({ addHotkey: e, removeHotkey: n, children: r }) {\n return /* @__PURE__ */ b($.Provider, { value: { addHotkey: e, removeHotkey: n }, children: r });\n}\nfunction x(e, n) {\n return e && n && typeof e == \"object\" && typeof n == \"object\" ? Object.keys(e).length === Object.keys(n).length && // @ts-expect-error TS7053\n Object.keys(e).reduce((r, i) => r && x(e[i], n[i]), !0) : e === n;\n}\nconst W = T({\n hotkeys: [],\n activeScopes: [],\n // This array has to be empty instead of containing '*' as default, to check if the provider is set or not\n toggleScope: () => {\n },\n enableScope: () => {\n },\n disableScope: () => {\n }\n}), se = () => M(W), fe = ({ initiallyActiveScopes: e = [\"*\"], children: n }) => {\n const [r, i] = A(e), [u, f] = A([]), o = k((t) => {\n i((a) => a.includes(\"*\") ? [t] : Array.from(/* @__PURE__ */ new Set([...a, t])));\n }, []), y = k((t) => {\n i((a) => a.filter((l) => l !== t));\n }, []), c = k((t) => {\n i((a) => a.includes(t) ? a.filter((l) => l !== t) : a.includes(\"*\") ? [t] : Array.from(/* @__PURE__ */ new Set([...a, t])));\n }, []), m = k((t) => {\n f((a) => [...a, t]);\n }, []), d = k((t) => {\n f((a) => a.filter((l) => !x(l, t)));\n }, []);\n return /* @__PURE__ */ b(\n W.Provider,\n {\n value: { activeScopes: r, hotkeys: u, enableScope: o, disableScope: y, toggleScope: c },\n children: /* @__PURE__ */ b(oe, { addHotkey: m, removeHotkey: d, children: n })\n }\n );\n};\nfunction ie(e) {\n const n = S(void 0);\n return x(n.current, e) || (n.current = e), n.current;\n}\nconst N = (e) => {\n e.stopPropagation(), e.preventDefault(), e.stopImmediatePropagation();\n}, ue = typeof window < \"u\" ? z : J;\nfunction de(e, n, r, i) {\n const u = S(null), f = S(!1), o = Array.isArray(r) ? Array.isArray(i) ? void 0 : i : r, y = R(e) ? e.join(o?.delimiter) : e, c = Array.isArray(r) ? r : Array.isArray(i) ? i : void 0, m = k(n, c ?? []), d = S(m);\n c ? d.current = m : d.current = n;\n const t = ie(o), { activeScopes: a } = se(), l = ne();\n return ue(() => {\n if (t?.enabled === !1 || !te(a, t?.scopes))\n return;\n let h = [], w;\n const p = (s, B = !1) => {\n if (!(Z(s) && !F(s, t?.enableOnFormTags))) {\n if (u.current !== null) {\n const v = u.current.getRootNode();\n if ((v instanceof Document || v instanceof ShadowRoot) && v.activeElement !== u.current && !u.current.contains(v.activeElement)) {\n N(s);\n return;\n }\n }\n s.target?.isContentEditable && !t?.enableOnContentEditable || H(y, t?.delimiter).forEach((v) => {\n if (v.includes(t?.splitKey ?? \"+\") && v.includes(t?.sequenceSplitKey ?? \">\")) {\n console.warn(\n `Hotkey ${v} contains both ${t?.splitKey ?? \"+\"} and ${t?.sequenceSplitKey ?? \">\"} which is not supported.`\n );\n return;\n }\n const g = P(\n v,\n t?.splitKey,\n t?.sequenceSplitKey,\n t?.useKey,\n t?.description,\n t?.metadata\n );\n if (g.isSequence) {\n w = setTimeout(() => {\n h = [];\n }, t?.sequenceTimeoutMs ?? 1e3);\n const C = g.useKey ? s.key : K(s.code);\n if (D(C.toLowerCase()))\n return;\n h.push(C);\n const G = g.keys?.[h.length - 1];\n if (C !== G) {\n h = [], w && clearTimeout(w);\n return;\n }\n h.length === g.keys?.length && (d.current(s, g), w && clearTimeout(w), h = []);\n } else if (re(s, g, t?.ignoreModifiers) || g.keys?.includes(\"*\")) {\n if (t?.ignoreEventWhen?.(s) || B && f.current)\n return;\n if (V(s, g, t?.preventDefault), !X(s, g, t?.enabled)) {\n N(s);\n return;\n }\n d.current(s, g), B || (f.current = !0);\n }\n });\n }\n }, O = (s) => {\n s.code !== void 0 && (_(K(s.code)), (t?.keydown === void 0 && t?.keyup !== !0 || t?.keydown) && p(s));\n }, q = (s) => {\n s.code !== void 0 && (I(K(s.code)), f.current = !1, t?.keyup && p(s, !0));\n }, E = u.current || o?.document || document;\n return E.addEventListener(\"keyup\", q, o?.eventListenerOptions), E.addEventListener(\"keydown\", O, o?.eventListenerOptions), l && H(y, t?.delimiter).forEach((s) => {\n l.addHotkey(\n P(\n s,\n t?.splitKey,\n t?.sequenceSplitKey,\n t?.useKey,\n t?.description,\n t?.metadata\n )\n );\n }), () => {\n E.removeEventListener(\"keyup\", q, o?.eventListenerOptions), E.removeEventListener(\"keydown\", O, o?.eventListenerOptions), l && H(y, t?.delimiter).forEach((s) => {\n l.removeHotkey(\n P(\n s,\n t?.splitKey,\n t?.sequenceSplitKey,\n t?.useKey,\n t?.description,\n t?.metadata\n )\n );\n }), h = [], w && clearTimeout(w);\n };\n }, [y, t, a]), u;\n}\nfunction le(e = !1) {\n const [n, r] = A(/* @__PURE__ */ new Set()), [i, u] = A(!1), f = k(\n (m) => {\n m.code !== void 0 && (m.preventDefault(), m.stopPropagation(), r((d) => {\n const t = new Set(d);\n return t.add(K(e ? m.key : m.code)), t;\n }));\n },\n [e]\n ), o = k(() => {\n typeof document < \"u\" && (document.removeEventListener(\"keydown\", f), u(!1));\n }, [f]), y = k(() => {\n r(/* @__PURE__ */ new Set()), typeof document < \"u\" && (o(), document.addEventListener(\"keydown\", f), u(!0));\n }, [f, o]), c = k(() => {\n r(/* @__PURE__ */ new Set());\n }, []);\n return [n, { start: y, stop: o, resetKeys: c, isRecording: i }];\n}\nexport {\n fe as HotkeysProvider,\n U as isHotkeyPressed,\n de as useHotkeys,\n se as useHotkeysContext,\n le as useRecordHotkeys\n};\n","/*!\n * Toastify js 1.12.0\n * https://github.com/apvarun/toastify-js\n * @license MIT licensed\n *\n * Copyright (C) 2018 Varun A P\n */\n(function(root, factory) {\n if (typeof module === \"object\" && module.exports) {\n module.exports = factory();\n } else {\n root.Toastify = factory();\n }\n})(this, function(global) {\n // Object initialization\n var Toastify = function(options) {\n // Returning a new init object\n return new Toastify.lib.init(options);\n },\n // Library version\n version = \"1.12.0\";\n\n // Set the default global options\n Toastify.defaults = {\n oldestFirst: true,\n text: \"Toastify is awesome!\",\n node: undefined,\n duration: 3000,\n selector: undefined,\n callback: function () {\n },\n destination: undefined,\n newWindow: false,\n close: false,\n gravity: \"toastify-top\",\n positionLeft: false,\n position: '',\n backgroundColor: '',\n avatar: \"\",\n className: \"\",\n stopOnFocus: true,\n onClick: function () {\n },\n offset: {x: 0, y: 0},\n escapeMarkup: true,\n ariaLive: 'polite',\n style: {background: ''}\n };\n\n // Defining the prototype of the object\n Toastify.lib = Toastify.prototype = {\n toastify: version,\n\n constructor: Toastify,\n\n // Initializing the object with required parameters\n init: function(options) {\n // Verifying and validating the input object\n if (!options) {\n options = {};\n }\n\n // Creating the options object\n this.options = {};\n\n this.toastElement = null;\n\n // Validating the options\n this.options.text = options.text || Toastify.defaults.text; // Display message\n this.options.node = options.node || Toastify.defaults.node; // Display content as node\n this.options.duration = options.duration === 0 ? 0 : options.duration || Toastify.defaults.duration; // Display duration\n this.options.selector = options.selector || Toastify.defaults.selector; // Parent selector\n this.options.callback = options.callback || Toastify.defaults.callback; // Callback after display\n this.options.destination = options.destination || Toastify.defaults.destination; // On-click destination\n this.options.newWindow = options.newWindow || Toastify.defaults.newWindow; // Open destination in new window\n this.options.close = options.close || Toastify.defaults.close; // Show toast close icon\n this.options.gravity = options.gravity === \"bottom\" ? \"toastify-bottom\" : Toastify.defaults.gravity; // toast position - top or bottom\n this.options.positionLeft = options.positionLeft || Toastify.defaults.positionLeft; // toast position - left or right\n this.options.position = options.position || Toastify.defaults.position; // toast position - left or right\n this.options.backgroundColor = options.backgroundColor || Toastify.defaults.backgroundColor; // toast background color\n this.options.avatar = options.avatar || Toastify.defaults.avatar; // img element src - url or a path\n this.options.className = options.className || Toastify.defaults.className; // additional class names for the toast\n this.options.stopOnFocus = options.stopOnFocus === undefined ? Toastify.defaults.stopOnFocus : options.stopOnFocus; // stop timeout on focus\n this.options.onClick = options.onClick || Toastify.defaults.onClick; // Callback after click\n this.options.offset = options.offset || Toastify.defaults.offset; // toast offset\n this.options.escapeMarkup = options.escapeMarkup !== undefined ? options.escapeMarkup : Toastify.defaults.escapeMarkup;\n this.options.ariaLive = options.ariaLive || Toastify.defaults.ariaLive;\n this.options.style = options.style || Toastify.defaults.style;\n if(options.backgroundColor) {\n this.options.style.background = options.backgroundColor;\n }\n\n // Returning the current object for chaining functions\n return this;\n },\n\n // Building the DOM element\n buildToast: function() {\n // Validating if the options are defined\n if (!this.options) {\n throw \"Toastify is not initialized\";\n }\n\n // Creating the DOM object\n var divElement = document.createElement(\"div\");\n divElement.className = \"toastify on \" + this.options.className;\n\n // Positioning toast to left or right or center\n if (!!this.options.position) {\n divElement.className += \" toastify-\" + this.options.position;\n } else {\n // To be depreciated in further versions\n if (this.options.positionLeft === true) {\n divElement.className += \" toastify-left\";\n console.warn('Property `positionLeft` will be depreciated in further versions. Please use `position` instead.')\n } else {\n // Default position\n divElement.className += \" toastify-right\";\n }\n }\n\n // Assigning gravity of element\n divElement.className += \" \" + this.options.gravity;\n\n if (this.options.backgroundColor) {\n // This is being deprecated in favor of using the style HTML DOM property\n console.warn('DEPRECATION NOTICE: \"backgroundColor\" is being deprecated. Please use the \"style.background\" property.');\n }\n\n // Loop through our style object and apply styles to divElement\n for (var property in this.options.style) {\n divElement.style[property] = this.options.style[property];\n }\n\n // Announce the toast to screen readers\n if (this.options.ariaLive) {\n divElement.setAttribute('aria-live', this.options.ariaLive)\n }\n\n // Adding the toast message/node\n if (this.options.node && this.options.node.nodeType === Node.ELEMENT_NODE) {\n // If we have a valid node, we insert it\n divElement.appendChild(this.options.node)\n } else {\n if (this.options.escapeMarkup) {\n divElement.innerText = this.options.text;\n } else {\n divElement.innerHTML = this.options.text;\n }\n\n if (this.options.avatar !== \"\") {\n var avatarElement = document.createElement(\"img\");\n avatarElement.src = this.options.avatar;\n\n avatarElement.className = \"toastify-avatar\";\n\n if (this.options.position == \"left\" || this.options.positionLeft === true) {\n // Adding close icon on the left of content\n divElement.appendChild(avatarElement);\n } else {\n // Adding close icon on the right of content\n divElement.insertAdjacentElement(\"afterbegin\", avatarElement);\n }\n }\n }\n\n // Adding a close icon to the toast\n if (this.options.close === true) {\n // Create a span for close element\n var closeElement = document.createElement(\"button\");\n closeElement.type = \"button\";\n closeElement.setAttribute(\"aria-label\", \"Close\");\n closeElement.className = \"toast-close\";\n closeElement.innerHTML = \"&#10006;\";\n\n // Triggering the removal of toast from DOM on close click\n closeElement.addEventListener(\n \"click\",\n function(event) {\n event.stopPropagation();\n this.removeElement(this.toastElement);\n window.clearTimeout(this.toastElement.timeOutValue);\n }.bind(this)\n );\n\n //Calculating screen width\n var width = window.innerWidth > 0 ? window.innerWidth : screen.width;\n\n // Adding the close icon to the toast element\n // Display on the right if screen width is less than or equal to 360px\n if ((this.options.position == \"left\" || this.options.positionLeft === true) && width > 360) {\n // Adding close icon on the left of content\n divElement.insertAdjacentElement(\"afterbegin\", closeElement);\n } else {\n // Adding close icon on the right of content\n divElement.appendChild(closeElement);\n }\n }\n\n // Clear timeout while toast is focused\n if (this.options.stopOnFocus && this.options.duration > 0) {\n var self = this;\n // stop countdown\n divElement.addEventListener(\n \"mouseover\",\n function(event) {\n window.clearTimeout(divElement.timeOutValue);\n }\n )\n // add back the timeout\n divElement.addEventListener(\n \"mouseleave\",\n function() {\n divElement.timeOutValue = window.setTimeout(\n function() {\n // Remove the toast from DOM\n self.removeElement(divElement);\n },\n self.options.duration\n )\n }\n )\n }\n\n // Adding an on-click destination path\n if (typeof this.options.destination !== \"undefined\") {\n divElement.addEventListener(\n \"click\",\n function(event) {\n event.stopPropagation();\n if (this.options.newWindow === true) {\n window.open(this.options.destination, \"_blank\");\n } else {\n window.location = this.options.destination;\n }\n }.bind(this)\n );\n }\n\n if (typeof this.options.onClick === \"function\" && typeof this.options.destination === \"undefined\") {\n divElement.addEventListener(\n \"click\",\n function(event) {\n event.stopPropagation();\n this.options.onClick();\n }.bind(this)\n );\n }\n\n // Adding offset\n if(typeof this.options.offset === \"object\") {\n\n var x = getAxisOffsetAValue(\"x\", this.options);\n var y = getAxisOffsetAValue(\"y\", this.options);\n\n var xOffset = this.options.position == \"left\" ? x : \"-\" + x;\n var yOffset = this.options.gravity == \"toastify-top\" ? y : \"-\" + y;\n\n divElement.style.transform = \"translate(\" + xOffset + \",\" + yOffset + \")\";\n\n }\n\n // Returning the generated element\n return divElement;\n },\n\n // Displaying the toast\n showToast: function() {\n // Creating the DOM object for the toast\n this.toastElement = this.buildToast();\n\n // Getting the root element to with the toast needs to be added\n var rootElement;\n if (typeof this.options.selector === \"string\") {\n rootElement = document.getElementById(this.options.selector);\n } else if (this.options.selector instanceof HTMLElement || (typeof ShadowRoot !== 'undefined' && this.options.selector instanceof ShadowRoot)) {\n rootElement = this.options.selector;\n } else {\n rootElement = document.body;\n }\n\n // Validating if root element is present in DOM\n if (!rootElement) {\n throw \"Root element is not defined\";\n }\n\n // Adding the DOM element\n var elementToInsert = Toastify.defaults.oldestFirst ? rootElement.firstChild : rootElement.lastChild;\n rootElement.insertBefore(this.toastElement, elementToInsert);\n\n // Repositioning the toasts in case multiple toasts are present\n Toastify.reposition();\n\n if (this.options.duration > 0) {\n this.toastElement.timeOutValue = window.setTimeout(\n function() {\n // Remove the toast from DOM\n this.removeElement(this.toastElement);\n }.bind(this),\n this.options.duration\n ); // Binding `this` for function invocation\n }\n\n // Supporting function chaining\n return this;\n },\n\n hideToast: function() {\n if (this.toastElement.timeOutValue) {\n clearTimeout(this.toastElement.timeOutValue);\n }\n this.removeElement(this.toastElement);\n },\n\n // Removing the element from the DOM\n removeElement: function(toastElement) {\n // Hiding the element\n // toastElement.classList.remove(\"on\");\n toastElement.className = toastElement.className.replace(\" on\", \"\");\n\n // Removing the element from DOM after transition end\n window.setTimeout(\n function() {\n // remove options node if any\n if (this.options.node && this.options.node.parentNode) {\n this.options.node.parentNode.removeChild(this.options.node);\n }\n\n // Remove the element from the DOM, only when the parent node was not removed before.\n if (toastElement.parentNode) {\n toastElement.parentNode.removeChild(toastElement);\n }\n\n // Calling the callback function\n this.options.callback.call(toastElement);\n\n // Repositioning the toasts again\n Toastify.reposition();\n }.bind(this),\n 400\n ); // Binding `this` for function invocation\n },\n };\n\n // Positioning the toasts on the DOM\n Toastify.reposition = function() {\n\n // Top margins with gravity\n var topLeftOffsetSize = {\n top: 15,\n bottom: 15,\n };\n var topRightOffsetSize = {\n top: 15,\n bottom: 15,\n };\n var offsetSize = {\n top: 15,\n bottom: 15,\n };\n\n // Get all toast messages on the DOM\n var allToasts = document.getElementsByClassName(\"toastify\");\n\n var classUsed;\n\n // Modifying the position of each toast element\n for (var i = 0; i < allToasts.length; i++) {\n // Getting the applied gravity\n if (containsClass(allToasts[i], \"toastify-top\") === true) {\n classUsed = \"toastify-top\";\n } else {\n classUsed = \"toastify-bottom\";\n }\n\n var height = allToasts[i].offsetHeight;\n classUsed = classUsed.substr(9, classUsed.length-1)\n // Spacing between toasts\n var offset = 15;\n\n var width = window.innerWidth > 0 ? window.innerWidth : screen.width;\n\n // Show toast in center if screen with less than or equal to 360px\n if (width <= 360) {\n // Setting the position\n allToasts[i].style[classUsed] = offsetSize[classUsed] + \"px\";\n\n offsetSize[classUsed] += height + offset;\n } else {\n if (containsClass(allToasts[i], \"toastify-left\") === true) {\n // Setting the position\n allToasts[i].style[classUsed] = topLeftOffsetSize[classUsed] + \"px\";\n\n topLeftOffsetSize[classUsed] += height + offset;\n } else {\n // Setting the position\n allToasts[i].style[classUsed] = topRightOffsetSize[classUsed] + \"px\";\n\n topRightOffsetSize[classUsed] += height + offset;\n }\n }\n }\n\n // Supporting function chaining\n return this;\n };\n\n // Helper function to get offset.\n function getAxisOffsetAValue(axis, options) {\n\n if(options.offset[axis]) {\n if(isNaN(options.offset[axis])) {\n return options.offset[axis];\n }\n else {\n return options.offset[axis] + 'px';\n }\n }\n\n return '0px';\n\n }\n\n function containsClass(elem, yourClass) {\n if (!elem || typeof yourClass !== \"string\") {\n return false;\n } else if (\n elem.className &&\n elem.className\n .trim()\n .split(/\\s+/gi)\n .indexOf(yourClass) > -1\n ) {\n return true;\n } else {\n return false;\n }\n }\n\n // Setting up the prototype for the init object\n Toastify.lib.init.prototype = Toastify.lib;\n\n // Returning the Toastify function to be assigned to the window object/module\n return Toastify;\n});\n","import Toastify from 'toastify-js';\n\nwindow._showToast = showToast;\n\nfunction showToast(props) {\n if (typeof props === 'string') {\n props = { text: props };\n }\n const { onClick, delay, ...rest } = props;\n const toast = Toastify({\n className: `${onClick || props.destination ? 'shiny-pill' : ''}`,\n gravity: 'bottom',\n position: 'center',\n ...rest,\n onClick: () => {\n onClick?.(toast); // Pass in the object itself!\n },\n });\n if (delay) {\n setTimeout(() => {\n toast.showToast();\n }, delay);\n } else {\n toast.showToast();\n }\n return toast;\n}\n\nexport default showToast;\n","import { useEffect, useRef } from 'preact/hooks';\n\nfunction useInterval(fn, delay, deps, immediate) {\n const savedCallback = useRef(fn);\n useEffect(() => {\n savedCallback.current = fn;\n }, [fn, deps]);\n\n useEffect(() => {\n if (!immediate || delay === null || delay === false) return;\n savedCallback.current();\n }, [immediate]);\n\n useEffect(() => {\n if (delay === null || delay === false) return;\n const tick = () => savedCallback.current();\n const id = setInterval(tick, delay);\n return () => clearInterval(id);\n }, [delay]);\n}\n\nexport default useInterval;\n","import { unstable_batchedUpdates } from 'react-dom';\n\nconst isMenuOpen = state => !!state && state[0] === 'o';\nconst batchedUpdates = unstable_batchedUpdates;\nconst getTransition = (transition, name) => transition === true || !!(transition && transition[name]);\nconst safeCall = (fn, arg) => typeof fn === 'function' ? fn(arg) : fn;\nconst internalKey = '_szhsinMenu';\nconst getName = component => component[internalKey];\nconst defineName = (name, component) => Object.defineProperty(component, internalKey, {\n value: name\n});\nconst mergeProps = (target, source) => {\n source && Object.keys(source).forEach(key => {\n const targetProp = target[key];\n const sourceProp = source[key];\n if (typeof sourceProp === 'function' && targetProp) {\n target[key] = (...arg) => {\n sourceProp(...arg);\n targetProp(...arg);\n };\n } else {\n target[key] = sourceProp;\n }\n });\n return target;\n};\nconst parsePadding = paddingStr => {\n if (typeof paddingStr !== 'string') return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n };\n const padding = paddingStr.trim().split(/\\s+/, 4).map(parseFloat);\n const top = !isNaN(padding[0]) ? padding[0] : 0;\n const right = !isNaN(padding[1]) ? padding[1] : top;\n return {\n top,\n right,\n bottom: !isNaN(padding[2]) ? padding[2] : top,\n left: !isNaN(padding[3]) ? padding[3] : right\n };\n};\nconst getScrollAncestor = node => {\n while (node) {\n node = node.parentNode;\n if (!node || node === document.body || !node.parentNode) return;\n const {\n overflow,\n overflowX,\n overflowY\n } = getComputedStyle(node);\n if (/auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX)) return node;\n }\n};\nfunction commonProps(isDisabled, isHovering) {\n return {\n 'aria-disabled': isDisabled || undefined,\n tabIndex: isHovering ? 0 : -1\n };\n}\nfunction indexOfNode(nodeList, node) {\n for (let i = 0; i < nodeList.length; i++) {\n if (nodeList[i] === node) return i;\n }\n return -1;\n}\n\nexport { batchedUpdates, commonProps, defineName, getName, getScrollAncestor, getTransition, indexOfNode, isMenuOpen, mergeProps, parsePadding, safeCall };\n","import { useMemo } from 'react';\n\nconst useBEM = ({\n block,\n element,\n modifiers,\n className\n}) => useMemo(() => {\n const blockElement = element ? `${block}__${element}` : block;\n let classString = blockElement;\n modifiers && Object.keys(modifiers).forEach(name => {\n const value = modifiers[name];\n if (value) classString += ` ${blockElement}--${value === true ? name : `${name}-${value}`}`;\n });\n let expandedClassName = typeof className === 'function' ? className(modifiers) : className;\n if (typeof expandedClassName === 'string') {\n expandedClassName = expandedClassName.trim();\n if (expandedClassName) classString += ` ${expandedClassName}`;\n }\n return classString;\n}, [block, element, modifiers, className]);\n\nexport { useBEM };\n","import { createContext } from 'react';\n\nconst menuContainerClass = 'szh-menu-container';\nconst menuClass = 'szh-menu';\nconst menuButtonClass = 'szh-menu-button';\nconst menuArrowClass = 'arrow';\nconst menuItemClass = 'item';\nconst menuDividerClass = 'divider';\nconst menuHeaderClass = 'header';\nconst menuGroupClass = 'group';\nconst subMenuClass = 'submenu';\nconst radioGroupClass = 'radio-group';\nconst HoverItemContext = /*#__PURE__*/createContext();\nconst MenuListItemContext = /*#__PURE__*/createContext({});\nconst MenuListContext = /*#__PURE__*/createContext({});\nconst EventHandlersContext = /*#__PURE__*/createContext({});\nconst RadioGroupContext = /*#__PURE__*/createContext({});\nconst SettingsContext = /*#__PURE__*/createContext({});\nconst Keys = /*#__PURE__*/Object.freeze({\n ENTER: 'Enter',\n ESC: 'Escape',\n SPACE: ' ',\n HOME: 'Home',\n END: 'End',\n LEFT: 'ArrowLeft',\n RIGHT: 'ArrowRight',\n UP: 'ArrowUp',\n DOWN: 'ArrowDown'\n});\nconst HoverActionTypes = /*#__PURE__*/Object.freeze({\n RESET: 0,\n SET: 1,\n UNSET: 2,\n INCREASE: 3,\n DECREASE: 4,\n FIRST: 5,\n LAST: 6,\n SET_INDEX: 7\n});\nconst CloseReason = /*#__PURE__*/Object.freeze({\n CLICK: 'click',\n CANCEL: 'cancel',\n BLUR: 'blur',\n SCROLL: 'scroll'\n});\nconst FocusPositions = /*#__PURE__*/Object.freeze({\n FIRST: 'first',\n LAST: 'last'\n});\nconst MenuStateMap = /*#__PURE__*/Object.freeze({\n entering: 'opening',\n entered: 'open',\n exiting: 'closing',\n exited: 'closed'\n});\nconst positionAbsolute = 'absolute';\nconst roleNone = 'none';\nconst roleMenuitem = 'menuitem';\nconst noScrollFocus = {\n preventScroll: true\n};\n\nexport { CloseReason, EventHandlersContext, FocusPositions, HoverActionTypes, HoverItemContext, Keys, MenuListContext, MenuListItemContext, MenuStateMap, RadioGroupContext, SettingsContext, menuArrowClass, menuButtonClass, menuClass, menuContainerClass, menuDividerClass, menuGroupClass, menuHeaderClass, menuItemClass, noScrollFocus, positionAbsolute, radioGroupClass, roleMenuitem, roleNone, subMenuClass };\n","import { useMemo } from 'react';\nimport { jsx } from 'react/jsx-runtime';\nimport { useBEM } from '../hooks/useBEM.mjs';\nimport { mergeProps, getTransition, safeCall } from '../utils/utils.mjs';\nimport { menuContainerClass, CloseReason, Keys } from '../utils/constants.mjs';\n\nconst MenuContainer = ({\n className,\n containerRef,\n containerProps,\n children,\n isOpen,\n theming,\n transition,\n onClose\n}) => {\n const itemTransition = getTransition(transition, 'item');\n const onKeyDown = ({\n key\n }) => {\n switch (key) {\n case Keys.ESC:\n safeCall(onClose, {\n key,\n reason: CloseReason.CANCEL\n });\n break;\n }\n };\n const onBlur = e => {\n if (isOpen && !e.currentTarget.contains(e.relatedTarget)) {\n safeCall(onClose, {\n reason: CloseReason.BLUR\n });\n }\n };\n return /*#__PURE__*/jsx(\"div\", {\n ...mergeProps({\n onKeyDown,\n onBlur\n }, containerProps),\n className: useBEM({\n block: menuContainerClass,\n modifiers: useMemo(() => ({\n theme: theming,\n itemTransition\n }), [theming, itemTransition]),\n className\n }),\n style: {\n position: 'absolute',\n ...containerProps?.style\n },\n ref: containerRef,\n children: children\n });\n};\n\nexport { MenuContainer };\n","const createSubmenuCtx = () => {\n let timer,\n count = 0;\n return {\n toggle: isOpen => {\n isOpen ? count++ : count--;\n count = Math.max(count, 0);\n },\n on: (closeDelay, pending, settled) => {\n if (count) {\n if (!timer) timer = setTimeout(() => {\n timer = 0;\n pending();\n }, closeDelay);\n } else {\n settled?.();\n }\n },\n off: () => {\n if (timer) {\n clearTimeout(timer);\n timer = 0;\n }\n }\n };\n};\n\nexport { createSubmenuCtx };\n","import { useState, useRef, useCallback } from 'react';\nimport { noScrollFocus, HoverActionTypes } from '../utils/constants.mjs';\nimport { indexOfNode } from '../utils/utils.mjs';\n\nconst useItems = menuRef => {\n const [hoverItem, setHoverItem] = useState();\n const stateRef = useRef({\n items: [],\n hoverIndex: -1,\n sorted: false\n });\n const mutableState = stateRef.current;\n const updateItems = useCallback((item, isMounted) => {\n const {\n items\n } = mutableState;\n if (!item) {\n mutableState.items = [];\n } else if (isMounted) {\n items.push(item);\n } else {\n const index = items.indexOf(item);\n if (index > -1) {\n items.splice(index, 1);\n if (item.contains(document.activeElement)) {\n menuRef.current.focus(noScrollFocus);\n setHoverItem();\n }\n }\n }\n mutableState.hoverIndex = -1;\n mutableState.sorted = false;\n }, [mutableState, menuRef]);\n const dispatch = useCallback((actionType, item, nextIndex) => {\n const {\n items,\n hoverIndex\n } = mutableState;\n const sortItems = () => {\n if (mutableState.sorted) return;\n const orderedNodes = menuRef.current.querySelectorAll('.szh-menu__item');\n items.sort((a, b) => indexOfNode(orderedNodes, a) - indexOfNode(orderedNodes, b));\n mutableState.sorted = true;\n };\n let index = -1,\n newItem = undefined;\n switch (actionType) {\n case HoverActionTypes.RESET:\n break;\n case HoverActionTypes.SET:\n newItem = item;\n break;\n case HoverActionTypes.UNSET:\n newItem = prevItem => prevItem === item ? undefined : prevItem;\n break;\n case HoverActionTypes.FIRST:\n sortItems();\n index = 0;\n newItem = items[index];\n break;\n case HoverActionTypes.LAST:\n sortItems();\n index = items.length - 1;\n newItem = items[index];\n break;\n case HoverActionTypes.SET_INDEX:\n sortItems();\n index = nextIndex;\n newItem = items[index];\n break;\n case HoverActionTypes.INCREASE:\n sortItems();\n index = hoverIndex;\n if (index < 0) index = items.indexOf(item);\n index++;\n if (index >= items.length) index = 0;\n newItem = items[index];\n break;\n case HoverActionTypes.DECREASE:\n sortItems();\n index = hoverIndex;\n if (index < 0) index = items.indexOf(item);\n index--;\n if (index < 0) index = items.length - 1;\n newItem = items[index];\n break;\n default:\n if (process.env.NODE_ENV !== 'production') throw new Error(`[React-Menu] Unknown hover action type: ${actionType}`);\n }\n if (!newItem) index = -1;\n setHoverItem(newItem);\n mutableState.hoverIndex = index;\n }, [menuRef, mutableState]);\n return {\n hoverItem,\n dispatch,\n updateItems\n };\n};\n\nexport { useItems };\n","const getNativeDimension = (transformed, untransformed) => Math.round(transformed) === untransformed ? transformed : untransformed;\nconst getNormalizedClientRect = element => {\n const rect = element.getBoundingClientRect();\n rect.width = getNativeDimension(rect.width, element.offsetWidth);\n rect.height = getNativeDimension(rect.height, element.offsetHeight);\n return rect;\n};\n\nexport { getNormalizedClientRect };\n","import { getNormalizedClientRect } from './getNormalizedClientRect.mjs';\nimport { parsePadding } from '../utils/utils.mjs';\n\nconst getPositionHelpers = (containerElt, menuElt, menuScroll, boundingBoxPadding) => {\n const menuRect = getNormalizedClientRect(menuElt);\n const containerRect = containerElt.getBoundingClientRect();\n const boundingRect = menuScroll === window ? {\n left: 0,\n top: 0,\n right: document.documentElement.clientWidth,\n bottom: window.innerHeight\n } : menuScroll.getBoundingClientRect();\n const padding = parsePadding(boundingBoxPadding);\n const getLeftOverflow = x => x + containerRect.left - boundingRect.left - padding.left;\n const getRightOverflow = x => x + containerRect.left + menuRect.width - boundingRect.right + padding.right;\n const getTopOverflow = y => y + containerRect.top - boundingRect.top - padding.top;\n const getBottomOverflow = y => y + containerRect.top + menuRect.height - boundingRect.bottom + padding.bottom;\n const confineHorizontally = x => {\n let leftOverflow = getLeftOverflow(x);\n if (leftOverflow < 0) {\n x -= leftOverflow;\n } else {\n const rightOverflow = getRightOverflow(x);\n if (rightOverflow > 0) {\n x -= rightOverflow;\n leftOverflow = getLeftOverflow(x);\n if (leftOverflow < 0) x -= leftOverflow;\n }\n }\n return x;\n };\n const confineVertically = y => {\n let topOverflow = getTopOverflow(y);\n if (topOverflow < 0) {\n y -= topOverflow;\n } else {\n const bottomOverflow = getBottomOverflow(y);\n if (bottomOverflow > 0) {\n y -= bottomOverflow;\n topOverflow = getTopOverflow(y);\n if (topOverflow < 0) y -= topOverflow;\n }\n }\n return y;\n };\n return {\n menuRect,\n containerRect,\n getLeftOverflow,\n getRightOverflow,\n getTopOverflow,\n getBottomOverflow,\n confineHorizontally,\n confineVertically\n };\n};\n\nexport { getPositionHelpers };\n","const placeArrowVertical = ({\n arrowRef,\n menuY,\n anchorRect,\n containerRect,\n menuRect\n}) => {\n let y = anchorRect.top - containerRect.top - menuY + anchorRect.height / 2;\n const offset = arrowRef.current.offsetHeight * 1.25;\n y = Math.max(offset, y);\n y = Math.min(y, menuRect.height - offset);\n return y;\n};\n\nexport { placeArrowVertical };\n","import { placeArrowVertical } from './placeArrowVertical.mjs';\n\nconst placeLeftorRight = ({\n anchorRect,\n containerRect,\n menuRect,\n placeLeftorRightY,\n placeLeftX,\n placeRightX,\n getLeftOverflow,\n getRightOverflow,\n confineHorizontally,\n confineVertically,\n arrowRef,\n arrow,\n direction,\n position\n}) => {\n let computedDirection = direction;\n let y = placeLeftorRightY;\n if (position !== 'initial') {\n y = confineVertically(y);\n if (position === 'anchor') {\n y = Math.min(y, anchorRect.bottom - containerRect.top);\n y = Math.max(y, anchorRect.top - containerRect.top - menuRect.height);\n }\n }\n let x, leftOverflow, rightOverflow;\n if (computedDirection === 'left') {\n x = placeLeftX;\n if (position !== 'initial') {\n leftOverflow = getLeftOverflow(x);\n if (leftOverflow < 0) {\n rightOverflow = getRightOverflow(placeRightX);\n if (rightOverflow <= 0 || -leftOverflow > rightOverflow) {\n x = placeRightX;\n computedDirection = 'right';\n }\n }\n }\n } else {\n x = placeRightX;\n if (position !== 'initial') {\n rightOverflow = getRightOverflow(x);\n if (rightOverflow > 0) {\n leftOverflow = getLeftOverflow(placeLeftX);\n if (leftOverflow >= 0 || -leftOverflow < rightOverflow) {\n x = placeLeftX;\n computedDirection = 'left';\n }\n }\n }\n }\n if (position === 'auto') x = confineHorizontally(x);\n const arrowY = arrow ? placeArrowVertical({\n menuY: y,\n arrowRef,\n anchorRect,\n containerRect,\n menuRect\n }) : undefined;\n return {\n arrowY,\n x,\n y,\n computedDirection\n };\n};\n\nexport { placeLeftorRight };\n","const placeArrowHorizontal = ({\n arrowRef,\n menuX,\n anchorRect,\n containerRect,\n menuRect\n}) => {\n let x = anchorRect.left - containerRect.left - menuX + anchorRect.width / 2;\n const offset = arrowRef.current.offsetWidth * 1.25;\n x = Math.max(offset, x);\n x = Math.min(x, menuRect.width - offset);\n return x;\n};\n\nexport { placeArrowHorizontal };\n","import { placeArrowHorizontal } from './placeArrowHorizontal.mjs';\n\nconst placeToporBottom = ({\n anchorRect,\n containerRect,\n menuRect,\n placeToporBottomX,\n placeTopY,\n placeBottomY,\n getTopOverflow,\n getBottomOverflow,\n confineHorizontally,\n confineVertically,\n arrowRef,\n arrow,\n direction,\n position\n}) => {\n let computedDirection = direction === 'top' ? 'top' : 'bottom';\n let x = placeToporBottomX;\n if (position !== 'initial') {\n x = confineHorizontally(x);\n if (position === 'anchor') {\n x = Math.min(x, anchorRect.right - containerRect.left);\n x = Math.max(x, anchorRect.left - containerRect.left - menuRect.width);\n }\n }\n let y, topOverflow, bottomOverflow;\n if (computedDirection === 'top') {\n y = placeTopY;\n if (position !== 'initial') {\n topOverflow = getTopOverflow(y);\n if (topOverflow < 0) {\n bottomOverflow = getBottomOverflow(placeBottomY);\n if (bottomOverflow <= 0 || -topOverflow > bottomOverflow) {\n y = placeBottomY;\n computedDirection = 'bottom';\n }\n }\n }\n } else {\n y = placeBottomY;\n if (position !== 'initial') {\n bottomOverflow = getBottomOverflow(y);\n if (bottomOverflow > 0) {\n topOverflow = getTopOverflow(placeTopY);\n if (topOverflow >= 0 || -topOverflow < bottomOverflow) {\n y = placeTopY;\n computedDirection = 'top';\n }\n }\n }\n }\n if (position === 'auto') y = confineVertically(y);\n const arrowX = arrow ? placeArrowHorizontal({\n menuX: x,\n arrowRef,\n anchorRect,\n containerRect,\n menuRect\n }) : undefined;\n return {\n arrowX,\n x,\n y,\n computedDirection\n };\n};\n\nexport { placeToporBottom };\n","import { placeLeftorRight } from './placeLeftorRight.mjs';\nimport { placeToporBottom } from './placeToporBottom.mjs';\n\nconst positionMenu = ({\n arrow,\n align,\n direction,\n gap,\n shift,\n position,\n anchorRect,\n arrowRef,\n positionHelpers\n}) => {\n const {\n menuRect,\n containerRect\n } = positionHelpers;\n const isHorizontal = direction === 'left' || direction === 'right';\n let horizontalOffset = isHorizontal ? gap : shift;\n let verticalOffset = isHorizontal ? shift : gap;\n if (arrow) {\n const arrowElt = arrowRef.current;\n if (isHorizontal) {\n horizontalOffset += arrowElt.offsetWidth;\n } else {\n verticalOffset += arrowElt.offsetHeight;\n }\n }\n const placeLeftX = anchorRect.left - containerRect.left - menuRect.width - horizontalOffset;\n const placeRightX = anchorRect.right - containerRect.left + horizontalOffset;\n const placeTopY = anchorRect.top - containerRect.top - menuRect.height - verticalOffset;\n const placeBottomY = anchorRect.bottom - containerRect.top + verticalOffset;\n let placeToporBottomX, placeLeftorRightY;\n if (align === 'end') {\n placeToporBottomX = anchorRect.right - containerRect.left - menuRect.width;\n placeLeftorRightY = anchorRect.bottom - containerRect.top - menuRect.height;\n } else if (align === 'center') {\n placeToporBottomX = anchorRect.left - containerRect.left - (menuRect.width - anchorRect.width) / 2;\n placeLeftorRightY = anchorRect.top - containerRect.top - (menuRect.height - anchorRect.height) / 2;\n } else {\n placeToporBottomX = anchorRect.left - containerRect.left;\n placeLeftorRightY = anchorRect.top - containerRect.top;\n }\n placeToporBottomX += horizontalOffset;\n placeLeftorRightY += verticalOffset;\n const options = {\n ...positionHelpers,\n anchorRect,\n placeLeftX,\n placeRightX,\n placeLeftorRightY,\n placeTopY,\n placeBottomY,\n placeToporBottomX,\n arrowRef,\n arrow,\n direction,\n position\n };\n switch (direction) {\n case 'left':\n case 'right':\n return placeLeftorRight(options);\n case 'top':\n case 'bottom':\n default:\n return placeToporBottom(options);\n }\n};\n\nexport { positionMenu };\n","import { useLayoutEffect, useEffect } from 'react';\n\nconst useIsomorphicLayoutEffect = typeof window !== 'undefined' && typeof window.document !== 'undefined' && typeof window.document.createElement !== 'undefined' ? useLayoutEffect : useEffect;\n\nexport { useIsomorphicLayoutEffect as useLayoutEffect };\n","import { useMemo } from 'react';\n\nfunction setRef(ref, instance) {\n typeof ref === 'function' ? ref(instance) : ref.current = instance;\n}\nconst useCombinedRef = (refA, refB) => useMemo(() => {\n if (!refA) return refB;\n if (!refB) return refA;\n return instance => {\n setRef(refA, instance);\n setRef(refB, instance);\n };\n}, [refA, refB]);\n\nexport { useCombinedRef };\n","import { useState, useReducer, useContext, useRef, useCallback, useEffect, useMemo } from 'react';\nimport { flushSync } from 'react-dom';\nimport { MenuContainer } from './MenuContainer.mjs';\nimport { jsxs, jsx } from 'react/jsx-runtime';\nimport { createSubmenuCtx } from '../utils/submenuCtx.mjs';\nimport { SettingsContext, MenuListContext, HoverActionTypes, noScrollFocus, menuClass, menuArrowClass, positionAbsolute, MenuListItemContext, HoverItemContext, CloseReason, FocusPositions, Keys } from '../utils/constants.mjs';\nimport { useItems } from '../hooks/useItems.mjs';\nimport { getScrollAncestor, isMenuOpen, batchedUpdates, getTransition, mergeProps, commonProps, safeCall } from '../utils/utils.mjs';\nimport { getPositionHelpers } from '../positionUtils/getPositionHelpers.mjs';\nimport { positionMenu } from '../positionUtils/positionMenu.mjs';\nimport { useLayoutEffect as useIsomorphicLayoutEffect } from '../hooks/useIsomorphicLayoutEffect.mjs';\nimport { useBEM } from '../hooks/useBEM.mjs';\nimport { useCombinedRef } from '../hooks/useCombinedRef.mjs';\n\nconst offScreen = -9999;\nconst MenuList = ({\n ariaLabel,\n menuClassName,\n menuStyle,\n arrow,\n arrowProps = {},\n anchorPoint,\n anchorRef,\n containerRef,\n containerProps,\n externalRef,\n parentScrollingRef,\n align = 'start',\n direction = 'bottom',\n position = 'auto',\n overflow = 'visible',\n setDownOverflow,\n repositionFlag,\n captureFocus = true,\n state,\n endTransition,\n isDisabled,\n menuItemFocus,\n gap = 0,\n shift = 0,\n children,\n onClose,\n focusProps: _1,\n ...restProps\n}) => {\n const [menuPosition, setMenuPosition] = useState({\n x: offScreen,\n y: offScreen\n });\n const [arrowPosition, setArrowPosition] = useState({});\n const [overflowData, setOverflowData] = useState();\n const [expandedDirection, setExpandedDirection] = useState(direction);\n const [submenuCtx] = useState(createSubmenuCtx);\n const [reposSubmenu, forceReposSubmenu] = useReducer(c => c + 1, 1);\n const {\n transition,\n boundingBoxRef,\n boundingBoxPadding,\n rootMenuRef,\n rootAnchorRef,\n scrollNodesRef,\n reposition,\n viewScroll,\n submenuCloseDelay\n } = useContext(SettingsContext);\n const {\n submenuCtx: parentSubmenuCtx,\n reposSubmenu: reposFlag = repositionFlag\n } = useContext(MenuListContext);\n const menuRef = useRef();\n const arrowRef = useRef();\n const prevOpen = useRef(false);\n const {\n hoverItem,\n dispatch,\n updateItems\n } = useItems(menuRef);\n const isOpen = isMenuOpen(state);\n const openTransition = getTransition(transition, 'open');\n const closeTransition = getTransition(transition, 'close');\n const scrollNodes = scrollNodesRef.current;\n const onKeyDown = e => {\n switch (e.key) {\n case Keys.HOME:\n dispatch(HoverActionTypes.FIRST);\n break;\n case Keys.END:\n dispatch(HoverActionTypes.LAST);\n break;\n case Keys.UP:\n dispatch(HoverActionTypes.DECREASE, hoverItem);\n break;\n case Keys.DOWN:\n dispatch(HoverActionTypes.INCREASE, hoverItem);\n break;\n case Keys.SPACE:\n if (e.target && e.target.className.indexOf(menuClass) !== -1) {\n e.preventDefault();\n }\n return;\n default:\n return;\n }\n e.preventDefault();\n e.stopPropagation();\n };\n const onAnimationEnd = () => {\n if (state === 'closing') {\n setOverflowData();\n }\n safeCall(endTransition);\n };\n const onPointerMove = e => {\n e.stopPropagation();\n submenuCtx.on(submenuCloseDelay, () => {\n dispatch(HoverActionTypes.RESET);\n menuRef.current.focus(noScrollFocus);\n });\n };\n const onPointerLeave = e => {\n if (e.target === e.currentTarget) submenuCtx.off();\n };\n const handlePosition = useCallback(noOverflowCheck => {\n const menuElt = menuRef.current;\n const containerElt = containerRef.current;\n if (!menuElt || !containerElt) return;\n const anchorRect = anchorRef ? anchorRef.current?.getBoundingClientRect() : anchorPoint ? {\n left: anchorPoint.x,\n right: anchorPoint.x,\n top: anchorPoint.y,\n bottom: anchorPoint.y,\n width: 0,\n height: 0\n } : null;\n if (!anchorRect) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn('[React-Menu] Menu might not be positioned properly as one of the anchorRef or anchorPoint prop should be provided. If `anchorRef` is provided, the anchor must be mounted before menu is open.');\n }\n return;\n }\n if (!scrollNodes.menu) {\n scrollNodes.menu = (boundingBoxRef ? boundingBoxRef.current : getScrollAncestor(rootMenuRef.current)) || window;\n }\n const positionHelpers = getPositionHelpers(containerElt, menuElt, scrollNodes.menu, boundingBoxPadding);\n let {\n arrowX,\n arrowY,\n x,\n y,\n computedDirection\n } = positionMenu({\n arrow,\n align,\n direction,\n gap,\n shift,\n position,\n anchorRect,\n arrowRef,\n positionHelpers\n });\n const {\n menuRect\n } = positionHelpers;\n const menuHeight = menuRect.height;\n if (!noOverflowCheck && overflow !== 'visible') {\n const {\n getTopOverflow,\n getBottomOverflow\n } = positionHelpers;\n let height, overflowAmt;\n const bottomOverflow = getBottomOverflow(y);\n if (bottomOverflow > 0) {\n height = menuHeight - bottomOverflow;\n overflowAmt = bottomOverflow;\n } else {\n const topOverflow = getTopOverflow(y);\n if (topOverflow < 0) {\n height = menuHeight + topOverflow;\n overflowAmt = 0 - topOverflow;\n if (height >= 0) y -= topOverflow;\n }\n }\n if (height >= 0) {\n setOverflowData({\n height,\n overflowAmt\n });\n }\n }\n if (arrow) setArrowPosition({\n x: arrowX,\n y: arrowY\n });\n setMenuPosition({\n x,\n y\n });\n setExpandedDirection(computedDirection);\n }, [arrow, align, boundingBoxPadding, direction, gap, shift, position, overflow, anchorPoint, anchorRef, containerRef, boundingBoxRef, rootMenuRef, scrollNodes]);\n useIsomorphicLayoutEffect(() => {\n if (isOpen) {\n handlePosition();\n if (prevOpen.current) forceReposSubmenu();\n }\n prevOpen.current = isOpen;\n }, [isOpen, handlePosition, reposFlag]);\n useIsomorphicLayoutEffect(() => {\n if (overflowData && !setDownOverflow) menuRef.current.scrollTop = 0;\n }, [overflowData, setDownOverflow]);\n useIsomorphicLayoutEffect(() => updateItems, [updateItems]);\n useEffect(() => {\n let {\n menu: menuScroll\n } = scrollNodes;\n if (!isOpen || !menuScroll) return;\n menuScroll = menuScroll.addEventListener ? menuScroll : window;\n if (!scrollNodes.anchors) {\n scrollNodes.anchors = [];\n let anchorScroll = getScrollAncestor(rootAnchorRef && rootAnchorRef.current);\n while (anchorScroll && anchorScroll !== menuScroll) {\n scrollNodes.anchors.push(anchorScroll);\n anchorScroll = getScrollAncestor(anchorScroll);\n }\n }\n let scroll = viewScroll;\n if (scrollNodes.anchors.length && scroll === 'initial') scroll = 'auto';\n if (scroll === 'initial') return;\n const handleScroll = () => {\n if (scroll === 'auto') {\n batchedUpdates(() => handlePosition(true));\n } else {\n safeCall(onClose, {\n reason: CloseReason.SCROLL\n });\n }\n };\n const scrollObservers = scrollNodes.anchors.concat(viewScroll !== 'initial' ? menuScroll : []);\n scrollObservers.forEach(o => o.addEventListener('scroll', handleScroll));\n return () => scrollObservers.forEach(o => o.removeEventListener('scroll', handleScroll));\n }, [rootAnchorRef, scrollNodes, isOpen, onClose, viewScroll, handlePosition]);\n const hasOverflow = !!overflowData && overflowData.overflowAmt > 0;\n useEffect(() => {\n if (hasOverflow || !isOpen || !parentScrollingRef) return;\n const handleScroll = () => batchedUpdates(handlePosition);\n const parentScroll = parentScrollingRef.current;\n parentScroll.addEventListener('scroll', handleScroll);\n return () => parentScroll.removeEventListener('scroll', handleScroll);\n }, [isOpen, hasOverflow, parentScrollingRef, handlePosition]);\n useEffect(() => {\n if (!isOpen || typeof ResizeObserver !== 'function' || reposition === 'initial') return;\n const targetList = [];\n const resizeObserver = new ResizeObserver(entries => entries.forEach(({\n target\n }) => {\n if (targetList.indexOf(target) < 0) {\n targetList.push(target);\n } else {\n flushSync(() => {\n handlePosition();\n forceReposSubmenu();\n });\n }\n }));\n const resizeObserverOptions = {\n box: 'border-box'\n };\n resizeObserver.observe(menuRef.current, resizeObserverOptions);\n const anchor = anchorRef?.current;\n anchor && resizeObserver.observe(anchor, resizeObserverOptions);\n return () => resizeObserver.disconnect();\n }, [isOpen, reposition, anchorRef, handlePosition]);\n useEffect(() => {\n if (!isOpen) {\n dispatch(HoverActionTypes.RESET);\n if (!closeTransition) setOverflowData();\n return;\n }\n const {\n position,\n alwaysUpdate\n } = menuItemFocus || {};\n const setItemFocus = () => {\n if (position === FocusPositions.FIRST) {\n dispatch(HoverActionTypes.FIRST);\n } else if (position === FocusPositions.LAST) {\n dispatch(HoverActionTypes.LAST);\n } else if (position >= -1) {\n dispatch(HoverActionTypes.SET_INDEX, undefined, position);\n }\n };\n if (alwaysUpdate) {\n setItemFocus();\n } else if (captureFocus) {\n const id = setTimeout(() => {\n const menuElt = menuRef.current;\n if (menuElt && !menuElt.contains(document.activeElement)) {\n menuElt.focus(noScrollFocus);\n setItemFocus();\n }\n }, openTransition ? 170 : 100);\n return () => clearTimeout(id);\n }\n }, [isOpen, openTransition, closeTransition, captureFocus, menuItemFocus, dispatch]);\n const itemContext = useMemo(() => ({\n isParentOpen: isOpen,\n submenuCtx,\n dispatch,\n updateItems\n }), [isOpen, submenuCtx, dispatch, updateItems]);\n let maxHeight, overflowAmt;\n if (overflowData) {\n setDownOverflow ? overflowAmt = overflowData.overflowAmt : maxHeight = overflowData.height;\n }\n const listContext = useMemo(() => ({\n reposSubmenu,\n submenuCtx,\n overflow,\n overflowAmt,\n parentMenuRef: menuRef,\n parentDir: expandedDirection\n }), [reposSubmenu, submenuCtx, overflow, overflowAmt, expandedDirection]);\n const overflowStyle = maxHeight >= 0 ? {\n maxHeight,\n overflow\n } : undefined;\n const modifiers = useMemo(() => ({\n state,\n align,\n dir: expandedDirection\n }), [state, align, expandedDirection]);\n const arrowModifiers = useMemo(() => ({\n dir: expandedDirection\n }), [expandedDirection]);\n const _arrowClassName = useBEM({\n block: menuClass,\n element: menuArrowClass,\n modifiers: arrowModifiers,\n className: arrowProps.className\n });\n const menu = /*#__PURE__*/jsxs(\"ul\", {\n role: \"menu\",\n \"aria-label\": ariaLabel,\n ...commonProps(isDisabled),\n ...mergeProps({\n onPointerEnter: parentSubmenuCtx?.off,\n onPointerMove,\n onPointerLeave,\n onKeyDown,\n onAnimationEnd\n }, restProps),\n ref: useCombinedRef(externalRef, menuRef),\n className: useBEM({\n block: menuClass,\n modifiers,\n className: menuClassName\n }),\n style: {\n ...menuStyle,\n ...overflowStyle,\n margin: 0,\n display: state === 'closed' ? 'none' : undefined,\n position: positionAbsolute,\n left: menuPosition.x,\n top: menuPosition.y\n },\n children: [arrow && /*#__PURE__*/jsx(\"li\", {\n \"aria-hidden\": true,\n ...arrowProps,\n className: _arrowClassName,\n style: {\n display: 'block',\n position: positionAbsolute,\n left: arrowPosition.x,\n top: arrowPosition.y,\n ...arrowProps.style\n },\n ref: arrowRef\n }), /*#__PURE__*/jsx(MenuListContext.Provider, {\n value: listContext,\n children: /*#__PURE__*/jsx(MenuListItemContext.Provider, {\n value: itemContext,\n children: /*#__PURE__*/jsx(HoverItemContext.Provider, {\n value: hoverItem,\n children: safeCall(children, modifiers)\n })\n })\n })]\n });\n return containerProps ? /*#__PURE__*/jsx(MenuContainer, {\n ...containerProps,\n isOpen: isOpen,\n children: menu\n }) : menu;\n};\n\nexport { MenuList };\n","import { forwardRef, useRef, useMemo } from 'react';\nimport { createPortal } from 'react-dom';\nimport { MenuList } from './MenuList.mjs';\nimport { jsx } from 'react/jsx-runtime';\nimport { SettingsContext, EventHandlersContext, CloseReason, Keys } from '../utils/constants.mjs';\nimport { safeCall } from '../utils/utils.mjs';\n\nconst ControlledMenu = /*#__PURE__*/forwardRef(function ControlledMenu({\n 'aria-label': ariaLabel,\n className,\n containerProps,\n initialMounted,\n unmountOnClose,\n transition,\n transitionTimeout,\n boundingBoxRef,\n boundingBoxPadding,\n reposition = 'auto',\n submenuOpenDelay = 300,\n submenuCloseDelay = 150,\n viewScroll = 'initial',\n portal,\n theming,\n onItemClick,\n ...restProps\n}, externalRef) {\n const containerRef = useRef(null);\n const scrollNodesRef = useRef({});\n const {\n anchorRef,\n state,\n onClose\n } = restProps;\n const settings = useMemo(() => ({\n initialMounted,\n unmountOnClose,\n transition,\n transitionTimeout,\n boundingBoxRef,\n boundingBoxPadding,\n rootMenuRef: containerRef,\n rootAnchorRef: anchorRef,\n scrollNodesRef,\n reposition,\n viewScroll,\n submenuOpenDelay,\n submenuCloseDelay\n }), [initialMounted, unmountOnClose, transition, transitionTimeout, anchorRef, boundingBoxRef, boundingBoxPadding, reposition, viewScroll, submenuOpenDelay, submenuCloseDelay]);\n const eventHandlers = useMemo(() => ({\n handleClick(event, isCheckorRadio) {\n if (!event.stopPropagation) safeCall(onItemClick, event);\n let keepOpen = event.keepOpen;\n if (keepOpen === undefined) {\n keepOpen = isCheckorRadio && event.key === Keys.SPACE;\n }\n if (!keepOpen) {\n safeCall(onClose, {\n value: event.value,\n key: event.key,\n reason: CloseReason.CLICK\n });\n }\n },\n handleClose(key) {\n safeCall(onClose, {\n key,\n reason: CloseReason.CLICK\n });\n }\n }), [onItemClick, onClose]);\n if (!state) return null;\n const menuList = /*#__PURE__*/jsx(SettingsContext.Provider, {\n value: settings,\n children: /*#__PURE__*/jsx(EventHandlersContext.Provider, {\n value: eventHandlers,\n children: /*#__PURE__*/jsx(MenuList, {\n ...restProps,\n ariaLabel: ariaLabel || 'Menu',\n externalRef: externalRef,\n containerRef: containerRef,\n containerProps: {\n className,\n containerRef,\n containerProps,\n theming,\n transition,\n onClose\n }\n })\n })\n });\n if (portal === true && typeof document !== 'undefined') {\n return /*#__PURE__*/createPortal(menuList, document.body);\n } else if (portal) {\n return portal.target ? /*#__PURE__*/createPortal(menuList, portal.target) : portal.stablePosition ? null : menuList;\n }\n return menuList;\n});\n\nexport { ControlledMenu };\n","const PRE_ENTER = 0;\nconst ENTERING = 1;\nconst ENTERED = 2;\nconst PRE_EXIT = 3;\nconst EXITING = 4;\nconst EXITED = 5;\nconst UNMOUNTED = 6;\nconst STATUS = ['preEnter', 'entering', 'entered', 'preExit', 'exiting', 'exited', 'unmounted'];\nconst getState = status => ({\n _s: status,\n status: STATUS[status],\n isEnter: status < PRE_EXIT,\n isMounted: status !== UNMOUNTED,\n isResolved: status === ENTERED || status > EXITING\n});\nconst startOrEnd = unmounted => unmounted ? UNMOUNTED : EXITED;\nconst getEndStatus = (status, unmountOnExit) => {\n switch (status) {\n case ENTERING:\n case PRE_ENTER:\n return ENTERED;\n case EXITING:\n case PRE_EXIT:\n return startOrEnd(unmountOnExit);\n }\n};\nconst getTimeout = timeout => typeof timeout === 'object' ? [timeout.enter, timeout.exit] : [timeout, timeout];\nconst nextTick = (transitState, status) => setTimeout(() => {\n // Reading document.body.offsetTop can force browser to repaint before transition to the next state\n isNaN(document.body.offsetTop) || transitState(status + 1);\n}, 0);\n\nexport { ENTERED, ENTERING, EXITED, EXITING, PRE_ENTER, PRE_EXIT, STATUS, UNMOUNTED, getEndStatus, getState, getTimeout, nextTick, startOrEnd };\n","import { useState, useRef, useCallback } from 'react';\nimport { getState, ENTERED, startOrEnd, getTimeout, getEndStatus, PRE_EXIT, nextTick, PRE_ENTER, EXITING, ENTERING } from './utils.mjs';\n\nconst updateState = (status, setState, latestState, timeoutId, onChange) => {\n clearTimeout(timeoutId.current);\n const state = getState(status);\n setState(state);\n latestState.current = state;\n onChange && onChange({\n current: state\n });\n};\nconst useTransitionState = ({\n enter = true,\n exit = true,\n preEnter,\n preExit,\n timeout,\n initialEntered,\n mountOnEnter,\n unmountOnExit,\n onStateChange: onChange\n} = {}) => {\n const [state, setState] = useState(() => getState(initialEntered ? ENTERED : startOrEnd(mountOnEnter)));\n const latestState = useRef(state);\n const timeoutId = useRef();\n const [enterTimeout, exitTimeout] = getTimeout(timeout);\n const endTransition = useCallback(() => {\n const status = getEndStatus(latestState.current._s, unmountOnExit);\n status && updateState(status, setState, latestState, timeoutId, onChange);\n }, [onChange, unmountOnExit]);\n const toggle = useCallback(toEnter => {\n const transitState = status => {\n updateState(status, setState, latestState, timeoutId, onChange);\n switch (status) {\n case ENTERING:\n if (enterTimeout >= 0) timeoutId.current = setTimeout(endTransition, enterTimeout);\n break;\n case EXITING:\n if (exitTimeout >= 0) timeoutId.current = setTimeout(endTransition, exitTimeout);\n break;\n case PRE_ENTER:\n case PRE_EXIT:\n timeoutId.current = nextTick(transitState, status);\n break;\n }\n };\n const enterStage = latestState.current.isEnter;\n if (typeof toEnter !== 'boolean') toEnter = !enterStage;\n if (toEnter) {\n !enterStage && transitState(enter ? preEnter ? PRE_ENTER : ENTERING : ENTERED);\n } else {\n enterStage && transitState(exit ? preExit ? PRE_EXIT : EXITING : startOrEnd(unmountOnExit));\n }\n }, [endTransition, onChange, enter, exit, preEnter, preExit, enterTimeout, exitTimeout, unmountOnExit]);\n return [state, toggle, endTransition];\n};\n\nexport { useTransitionState };\n","import { useCallback } from 'react';\nimport { useTransitionState } from 'react-transition-state';\nimport { getTransition } from '../utils/utils.mjs';\nimport { MenuStateMap } from '../utils/constants.mjs';\n\nconst useMenuState = ({\n initialOpen,\n initialMounted,\n unmountOnClose,\n transition,\n transitionTimeout = 500,\n onMenuChange\n} = {}) => {\n const enter = getTransition(transition, 'open');\n const exit = getTransition(transition, 'close');\n const [{\n status\n }, toggleMenu, endTransition] = useTransitionState({\n initialEntered: initialOpen,\n mountOnEnter: !initialMounted,\n unmountOnExit: unmountOnClose,\n timeout: transitionTimeout,\n enter,\n exit,\n onStateChange: useCallback(({\n current: {\n isEnter,\n isResolved\n }\n }) => {\n if (!onMenuChange || isEnter && enter && isResolved || !isEnter && exit && isResolved) {\n return;\n }\n onMenuChange({\n open: isEnter\n });\n }, [onMenuChange, enter, exit])\n });\n return [{\n state: MenuStateMap[status],\n endTransition\n }, toggleMenu];\n};\n\nexport { useMenuState };\n","import { useState } from 'react';\nimport { useMenuState } from './useMenuState.mjs';\n\nconst useMenuStateAndFocus = options => {\n const [menuProps, toggleMenu] = useMenuState(options);\n const [menuItemFocus, setMenuItemFocus] = useState();\n const openMenu = (position, alwaysUpdate) => {\n setMenuItemFocus({\n position,\n alwaysUpdate\n });\n toggleMenu(true);\n };\n return [{\n menuItemFocus,\n ...menuProps\n }, toggleMenu, openMenu];\n};\n\nexport { useMenuStateAndFocus };\n","import { useState } from 'react';\n\nconst useClick = (state, onToggle) => {\n if (process.env.NODE_ENV !== 'production' && typeof onToggle !== 'function') {\n throw new Error('[React-Menu] useClick/useHover requires a function in the second parameter.');\n }\n const [skipOpen] = useState({});\n return {\n onMouseDown: () => {\n skipOpen.v = state && state !== 'closed';\n },\n onClick: e => skipOpen.v ? skipOpen.v = false : onToggle(true, e)\n };\n};\n\nexport { useClick };\n","import { forwardRef, useRef, useCallback, useImperativeHandle, Fragment, cloneElement, version } from 'react';\nimport { ControlledMenu } from './ControlledMenu.mjs';\nimport { jsxs, jsx } from 'react/jsx-runtime';\nimport { useMenuStateAndFocus } from '../hooks/useMenuStateAndFocus.mjs';\nimport { useClick } from '../hooks/useClick.mjs';\nimport { useCombinedRef } from '../hooks/useCombinedRef.mjs';\nimport { safeCall, mergeProps, isMenuOpen, getName } from '../utils/utils.mjs';\nimport { FocusPositions, Keys } from '../utils/constants.mjs';\n\nconst isLegacyReact = parseInt(version) < 19;\nconst Menu = /*#__PURE__*/forwardRef(function Menu({\n 'aria-label': ariaLabel,\n captureFocus: _,\n initialOpen: _1,\n menuButton,\n instanceRef,\n onMenuChange,\n ...restProps\n}, externalRef) {\n const [stateProps, toggleMenu, openMenu] = useMenuStateAndFocus({\n ...restProps,\n onMenuChange\n });\n const {\n state\n } = stateProps;\n const isOpen = isMenuOpen(state);\n const buttonRef = useRef(null);\n const anchorProps = useClick(state, (_, e) => openMenu(!e.detail ? FocusPositions.FIRST : undefined));\n const handleClose = useCallback(e => {\n toggleMenu(false);\n if (e.key) buttonRef.current.focus();\n }, [toggleMenu]);\n const onKeyDown = e => {\n switch (e.key) {\n case Keys.UP:\n openMenu(FocusPositions.LAST);\n break;\n case Keys.DOWN:\n openMenu(FocusPositions.FIRST);\n break;\n default:\n return;\n }\n e.preventDefault();\n };\n const button = safeCall(menuButton, {\n open: isOpen\n });\n if (!button || !button.type) throw new Error('Menu requires a menuButton prop.');\n const buttonProps = {\n ...mergeProps({\n onKeyDown,\n ...anchorProps\n }, button.props),\n ref: useCombinedRef(isLegacyReact ? button.ref : button.props.ref, buttonRef)\n };\n if (getName(button.type) === 'MenuButton') {\n buttonProps.isOpen = isOpen;\n }\n const renderButton = /*#__PURE__*/cloneElement(button, buttonProps);\n useImperativeHandle(instanceRef, () => ({\n openMenu,\n closeMenu: () => toggleMenu(false)\n }));\n return /*#__PURE__*/jsxs(Fragment, {\n children: [renderButton, /*#__PURE__*/jsx(ControlledMenu, {\n ...restProps,\n ...stateProps,\n \"aria-label\": ariaLabel || (typeof button.props.children === 'string' ? button.props.children : 'Menu'),\n anchorRef: buttonRef,\n ref: externalRef,\n onClose: handleClose\n })]\n });\n});\n\nexport { Menu };\n","import { forwardRef, useRef, memo, useContext } from 'react';\nimport { HoverItemContext } from './constants.mjs';\nimport { jsx } from 'react/jsx-runtime';\n\nconst withHovering = (name, WrappedComponent) => {\n const Component = /*#__PURE__*/memo(WrappedComponent);\n const WithHovering = /*#__PURE__*/forwardRef((props, ref) => {\n const itemRef = useRef(null);\n return /*#__PURE__*/jsx(Component, {\n ...props,\n itemRef: itemRef,\n externalRef: ref,\n isHovering: useContext(HoverItemContext) === itemRef.current\n });\n });\n WithHovering.displayName = `WithHovering(${name})`;\n return WithHovering;\n};\n\nexport { withHovering };\n","import { useState, useEffect } from 'react';\n\nconst useMouseOver = isHovering => {\n const [mouseOver, setMouseOver] = useState(false);\n useEffect(() => {\n !isHovering && setMouseOver(false);\n }, [isHovering]);\n return [mouseOver, () => !mouseOver && setMouseOver(true), () => setMouseOver(false)];\n};\n\nexport { useMouseOver };\n","import { useLayoutEffect as useIsomorphicLayoutEffect } from './useIsomorphicLayoutEffect.mjs';\n\nconst useItemEffect = (isDisabled, itemRef, updateItems) => {\n useIsomorphicLayoutEffect(() => {\n if (process.env.NODE_ENV !== 'production' && !updateItems) {\n throw new Error(`[React-Menu] This menu item or submenu should be rendered under a menu: ${itemRef.current.outerHTML}`);\n }\n if (isDisabled) return;\n const item = itemRef.current;\n updateItems(item, true);\n return () => {\n updateItems(item);\n };\n }, [isDisabled, itemRef, updateItems]);\n};\n\nexport { useItemEffect };\n","import { useContext, useRef, useState, useEffect, useImperativeHandle, useMemo } from 'react';\nimport { createPortal } from 'react-dom';\nimport { MenuList } from './MenuList.mjs';\nimport { jsxs, jsx } from 'react/jsx-runtime';\nimport { withHovering } from '../utils/withHovering.mjs';\nimport { useMenuStateAndFocus } from '../hooks/useMenuStateAndFocus.mjs';\nimport { useMouseOver } from '../hooks/useMouseOver.mjs';\nimport { useItemEffect } from '../hooks/useItemEffect.mjs';\nimport { SettingsContext, MenuListContext, MenuListItemContext, roleNone, roleMenuitem, menuClass, menuItemClass, subMenuClass, HoverActionTypes, Keys, FocusPositions } from '../utils/constants.mjs';\nimport { useBEM } from '../hooks/useBEM.mjs';\nimport { useCombinedRef } from '../hooks/useCombinedRef.mjs';\nimport { isMenuOpen, mergeProps, commonProps, safeCall, batchedUpdates } from '../utils/utils.mjs';\n\nconst SubMenu = /*#__PURE__*/withHovering('SubMenu', function SubMenu({\n 'aria-label': ariaLabel,\n className,\n disabled,\n direction,\n label,\n openTrigger,\n onMenuChange,\n isHovering,\n instanceRef,\n itemRef,\n captureFocus: _1,\n repositionFlag: _2,\n itemProps = {},\n portal = false,\n ...restProps\n}) {\n const settings = useContext(SettingsContext);\n const {\n rootMenuRef,\n submenuOpenDelay,\n submenuCloseDelay\n } = settings;\n const {\n parentMenuRef,\n parentDir,\n overflow: parentOverflow\n } = useContext(MenuListContext);\n const {\n isParentOpen,\n submenuCtx,\n dispatch,\n updateItems\n } = useContext(MenuListItemContext);\n const isPortal = portal || parentOverflow !== 'visible';\n const [stateProps, toggleMenu, _openMenu] = useMenuStateAndFocus({\n ...settings,\n onMenuChange\n });\n const [mouseOver, mouseOverStart, mouseOverEnd] = useMouseOver(isHovering);\n const {\n state\n } = stateProps;\n const isDisabled = !!disabled;\n const isOpen = isMenuOpen(state);\n const containerRef = useRef(null);\n const [timerId] = useState({\n v: 0\n });\n const stopTimer = () => {\n submenuCtx.off();\n if (timerId.v) {\n clearTimeout(timerId.v);\n timerId.v = 0;\n }\n };\n const openMenu = (...args) => {\n stopTimer();\n setHover();\n !isDisabled && _openMenu(...args);\n };\n const setHover = () => !isHovering && !isDisabled && dispatch(HoverActionTypes.SET, itemRef.current);\n const delayOpen = delay => {\n setHover();\n if (!openTrigger) timerId.v = setTimeout(() => batchedUpdates(openMenu), Math.max(delay, 0));\n };\n const onPointerMove = e => {\n if (isDisabled) return;\n e.stopPropagation();\n mouseOverStart();\n if (timerId.v || isOpen) return;\n submenuCtx.on(submenuCloseDelay, () => delayOpen(submenuOpenDelay - submenuCloseDelay), () => delayOpen(submenuOpenDelay));\n };\n const onPointerLeave = () => {\n mouseOverEnd();\n stopTimer();\n if (!isOpen) dispatch(HoverActionTypes.UNSET, itemRef.current);\n };\n const onKeyDown = e => {\n if (!isHovering) return;\n switch (e.key) {\n case Keys.ENTER:\n e.preventDefault();\n case Keys.SPACE:\n case Keys.RIGHT:\n openTrigger !== 'none' && openMenu(FocusPositions.FIRST);\n }\n };\n const onKeyDownOfRoot = e => {\n let handled = false;\n switch (e.key) {\n case Keys.LEFT:\n if (isOpen) {\n itemRef.current.focus();\n toggleMenu(false);\n handled = true;\n }\n break;\n case Keys.RIGHT:\n if (!isOpen) handled = true;\n break;\n }\n if (handled) {\n e.preventDefault();\n e.stopPropagation();\n }\n };\n useItemEffect(isDisabled, itemRef, updateItems);\n useEffect(() => submenuCtx.toggle(isOpen), [submenuCtx, isOpen]);\n useEffect(() => () => {\n clearTimeout(timerId.v);\n submenuCtx.toggle(false);\n }, [timerId, submenuCtx]);\n useEffect(() => {\n if (isHovering && isParentOpen) {\n itemRef.current.focus();\n } else {\n toggleMenu(false);\n }\n }, [isHovering, isParentOpen, toggleMenu, itemRef]);\n useImperativeHandle(instanceRef, () => ({\n openMenu: (...args) => {\n isParentOpen && openMenu(...args);\n },\n closeMenu: () => {\n if (isOpen) {\n itemRef.current.focus();\n toggleMenu(false);\n }\n }\n }));\n const modifiers = useMemo(() => ({\n open: isOpen,\n hover: mouseOver || isHovering,\n disabled: isDisabled,\n submenu: true\n }), [isOpen, isHovering, isDisabled, mouseOver]);\n const {\n ref: externalItemRef,\n className: itemClassName,\n ...restItemProps\n } = itemProps;\n const mergedItemProps = mergeProps({\n onPointerEnter: submenuCtx.off,\n onPointerMove,\n onPointerLeave,\n onKeyDown,\n onClick: () => openTrigger !== 'none' && openMenu()\n }, restItemProps);\n const getMenuList = () => {\n const menuList = /*#__PURE__*/jsx(MenuList, {\n ...restProps,\n ...stateProps,\n ariaLabel: ariaLabel || (typeof label === 'string' ? label : 'Submenu'),\n anchorRef: itemRef,\n containerRef: isPortal ? rootMenuRef : containerRef,\n direction: direction || (parentDir === 'right' || parentDir === 'left' ? parentDir : 'right'),\n parentScrollingRef: isPortal && parentMenuRef,\n isDisabled: isDisabled\n });\n const container = rootMenuRef.current;\n return isPortal && container ? /*#__PURE__*/createPortal(menuList, container) : menuList;\n };\n return /*#__PURE__*/jsxs(\"li\", {\n className: useBEM({\n block: menuClass,\n element: subMenuClass,\n className\n }),\n style: {\n position: 'relative'\n },\n role: roleNone,\n ref: containerRef,\n onKeyDown: onKeyDownOfRoot,\n children: [/*#__PURE__*/jsx(\"div\", {\n role: roleMenuitem,\n \"aria-haspopup\": true,\n \"aria-expanded\": isOpen,\n ...commonProps(isDisabled, isHovering),\n ...mergedItemProps,\n ref: useCombinedRef(externalItemRef, itemRef),\n className: useBEM({\n block: menuClass,\n element: menuItemClass,\n modifiers,\n className: itemClassName\n }),\n children: useMemo(() => safeCall(label, modifiers), [label, modifiers])\n }), state && getMenuList()]\n });\n});\n\nexport { SubMenu };\n","import { useContext, useEffect } from 'react';\nimport { useItemEffect } from './useItemEffect.mjs';\nimport { useMouseOver } from './useMouseOver.mjs';\nimport { SettingsContext, MenuListItemContext, HoverActionTypes } from '../utils/constants.mjs';\n\nconst useItemState = (itemRef, focusRef, isHovering, isDisabled) => {\n const [mouseOver, mouseOverStart, mouseOverEnd] = useMouseOver(isHovering);\n const {\n submenuCloseDelay\n } = useContext(SettingsContext);\n const {\n isParentOpen,\n submenuCtx,\n dispatch,\n updateItems\n } = useContext(MenuListItemContext);\n const setHover = () => {\n !isHovering && !isDisabled && dispatch(HoverActionTypes.SET, itemRef.current);\n };\n const unsetHover = () => {\n !isDisabled && dispatch(HoverActionTypes.UNSET, itemRef.current);\n };\n const onBlur = e => {\n if (isHovering && !e.currentTarget.contains(e.relatedTarget)) unsetHover();\n };\n const onPointerMove = e => {\n if (!isDisabled) {\n e.stopPropagation();\n mouseOverStart();\n submenuCtx.on(submenuCloseDelay, setHover, setHover);\n }\n };\n const onPointerLeave = (_, keepHover) => {\n mouseOverEnd();\n submenuCtx.off();\n !keepHover && unsetHover();\n };\n useItemEffect(isDisabled, itemRef, updateItems);\n useEffect(() => {\n if (isHovering && isParentOpen) {\n focusRef.current && focusRef.current.focus();\n }\n }, [focusRef, isHovering, isParentOpen]);\n return {\n mouseOver,\n setHover,\n onBlur,\n onPointerMove,\n onPointerLeave\n };\n};\n\nexport { useItemState };\n","import { useContext, useMemo } from 'react';\nimport { jsx } from 'react/jsx-runtime';\nimport { useItemState } from '../hooks/useItemState.mjs';\nimport { EventHandlersContext, RadioGroupContext, menuClass, menuItemClass, roleNone, roleMenuitem, Keys } from '../utils/constants.mjs';\nimport { useBEM } from '../hooks/useBEM.mjs';\nimport { useCombinedRef } from '../hooks/useCombinedRef.mjs';\nimport { withHovering } from '../utils/withHovering.mjs';\nimport { mergeProps, safeCall, commonProps } from '../utils/utils.mjs';\n\nconst MenuItem = /*#__PURE__*/withHovering('MenuItem', function MenuItem({\n className,\n value,\n href,\n type,\n checked,\n disabled,\n children,\n onClick,\n isHovering,\n itemRef,\n externalRef,\n ...restProps\n}) {\n const isDisabled = !!disabled;\n const {\n mouseOver,\n setHover,\n ...restStateProps\n } = useItemState(itemRef, itemRef, isHovering, isDisabled);\n const eventHandlers = useContext(EventHandlersContext);\n const radioGroup = useContext(RadioGroupContext);\n const isRadio = type === 'radio';\n const isCheckBox = type === 'checkbox';\n const isAnchor = !!href && !isDisabled && !isRadio && !isCheckBox;\n const isChecked = isRadio ? radioGroup.value === value : isCheckBox ? !!checked : false;\n const handleClick = e => {\n if (isDisabled) {\n e.stopPropagation();\n e.preventDefault();\n return;\n }\n const event = {\n value,\n syntheticEvent: e\n };\n if (e.key !== undefined) event.key = e.key;\n if (isCheckBox) event.checked = !isChecked;\n if (isRadio) event.name = radioGroup.name;\n safeCall(onClick, event);\n if (isRadio) safeCall(radioGroup.onRadioChange, event);\n eventHandlers.handleClick(event, isCheckBox || isRadio);\n };\n const handleKeyDown = e => {\n if (!isHovering) return;\n switch (e.key) {\n case Keys.ENTER:\n e.preventDefault();\n case Keys.SPACE:\n isAnchor ? itemRef.current.click() : handleClick(e);\n }\n };\n const modifiers = useMemo(() => ({\n type,\n disabled: isDisabled,\n hover: mouseOver || isHovering,\n checked: isChecked,\n anchor: isAnchor\n }), [type, isDisabled, mouseOver, isHovering, isChecked, isAnchor]);\n const mergedProps = mergeProps({\n ...restStateProps,\n onPointerDown: setHover,\n onKeyDown: handleKeyDown,\n onClick: handleClick\n }, restProps);\n const menuItemProps = {\n role: isRadio ? 'menuitemradio' : isCheckBox ? 'menuitemcheckbox' : roleMenuitem,\n 'aria-checked': isRadio || isCheckBox ? isChecked : undefined,\n ...commonProps(isDisabled, isHovering),\n ...mergedProps,\n ref: useCombinedRef(externalRef, itemRef),\n className: useBEM({\n block: menuClass,\n element: menuItemClass,\n modifiers,\n className\n }),\n children: useMemo(() => safeCall(children, modifiers), [children, modifiers])\n };\n return isAnchor ? /*#__PURE__*/jsx(\"li\", {\n role: roleNone,\n children: /*#__PURE__*/jsx(\"a\", {\n href: href,\n ...menuItemProps\n })\n }) : /*#__PURE__*/jsx(\"li\", {\n ...menuItemProps\n });\n});\n\nexport { MenuItem };\n","import { useRef, useContext, useMemo } from 'react';\nimport { jsx } from 'react/jsx-runtime';\nimport { useItemState } from '../hooks/useItemState.mjs';\nimport { useBEM } from '../hooks/useBEM.mjs';\nimport { useCombinedRef } from '../hooks/useCombinedRef.mjs';\nimport { withHovering } from '../utils/withHovering.mjs';\nimport { EventHandlersContext, roleMenuitem, menuClass, menuItemClass } from '../utils/constants.mjs';\nimport { safeCall, mergeProps, commonProps } from '../utils/utils.mjs';\n\nconst FocusableItem = /*#__PURE__*/withHovering('FocusableItem', function FocusableItem({\n className,\n disabled,\n children,\n isHovering,\n itemRef,\n externalRef,\n ...restProps\n}) {\n const isDisabled = !!disabled;\n const ref = useRef(null);\n const {\n mouseOver,\n setHover,\n onPointerLeave,\n ...restStateProps\n } = useItemState(itemRef, ref, isHovering, isDisabled);\n const {\n handleClose\n } = useContext(EventHandlersContext);\n const modifiers = useMemo(() => ({\n disabled: isDisabled,\n hover: mouseOver || isHovering,\n focusable: true\n }), [isDisabled, isHovering, mouseOver]);\n const renderChildren = useMemo(() => safeCall(children, {\n ...modifiers,\n ref,\n closeMenu: handleClose\n }), [children, modifiers, handleClose]);\n const mergedProps = mergeProps({\n ...restStateProps,\n onPointerLeave: e => onPointerLeave(e, true),\n onFocus: setHover\n }, restProps);\n return /*#__PURE__*/jsx(\"li\", {\n role: roleMenuitem,\n ...commonProps(isDisabled),\n ...mergedProps,\n ref: useCombinedRef(externalRef, itemRef),\n className: useBEM({\n block: menuClass,\n element: menuItemClass,\n modifiers,\n className\n }),\n children: renderChildren\n });\n});\n\nexport { FocusableItem };\n","import { memo, forwardRef } from 'react';\nimport { jsx } from 'react/jsx-runtime';\nimport { useBEM } from '../hooks/useBEM.mjs';\nimport { menuClass, menuDividerClass } from '../utils/constants.mjs';\n\nconst MenuDivider = /*#__PURE__*/memo(/*#__PURE__*/forwardRef(function MenuDivider({\n className,\n ...restProps\n}, externalRef) {\n return /*#__PURE__*/jsx(\"li\", {\n role: \"separator\",\n ...restProps,\n ref: externalRef,\n className: useBEM({\n block: menuClass,\n element: menuDividerClass,\n className\n })\n });\n}));\n\nexport { MenuDivider };\n","import { memo, forwardRef } from 'react';\nimport { jsx } from 'react/jsx-runtime';\nimport { useBEM } from '../hooks/useBEM.mjs';\nimport { roleNone, menuClass, menuHeaderClass } from '../utils/constants.mjs';\n\nconst MenuHeader = /*#__PURE__*/memo(/*#__PURE__*/forwardRef(function MenuHeader({\n className,\n ...restProps\n}, externalRef) {\n return /*#__PURE__*/jsx(\"li\", {\n role: roleNone,\n ...restProps,\n ref: externalRef,\n className: useBEM({\n block: menuClass,\n element: menuHeaderClass,\n className\n })\n });\n}));\n\nexport { MenuHeader };\n","import { forwardRef, useRef, useState, useContext } from 'react';\nimport { jsx } from 'react/jsx-runtime';\nimport { useLayoutEffect as useIsomorphicLayoutEffect } from '../hooks/useIsomorphicLayoutEffect.mjs';\nimport { getNormalizedClientRect } from '../positionUtils/getNormalizedClientRect.mjs';\nimport { useBEM } from '../hooks/useBEM.mjs';\nimport { useCombinedRef } from '../hooks/useCombinedRef.mjs';\nimport { MenuListContext, menuClass, menuGroupClass } from '../utils/constants.mjs';\n\nconst MenuGroup = /*#__PURE__*/forwardRef(function MenuGroup({\n className,\n style,\n takeOverflow,\n ...restProps\n}, externalRef) {\n const ref = useRef(null);\n const [overflowStyle, setOverflowStyle] = useState();\n const {\n overflow,\n overflowAmt\n } = useContext(MenuListContext);\n useIsomorphicLayoutEffect(() => {\n let maxHeight;\n if (takeOverflow && overflowAmt >= 0) {\n maxHeight = getNormalizedClientRect(ref.current).height - overflowAmt;\n if (maxHeight < 0) maxHeight = 0;\n }\n setOverflowStyle(maxHeight >= 0 ? {\n maxHeight,\n overflow\n } : undefined);\n }, [takeOverflow, overflow, overflowAmt]);\n useIsomorphicLayoutEffect(() => {\n if (overflowStyle) ref.current.scrollTop = 0;\n }, [overflowStyle]);\n return /*#__PURE__*/jsx(\"div\", {\n ...restProps,\n ref: useCombinedRef(externalRef, ref),\n className: useBEM({\n block: menuClass,\n element: menuGroupClass,\n className\n }),\n style: {\n ...style,\n ...overflowStyle\n }\n });\n});\n\nexport { MenuGroup };\n","import { useRef as i, useCallback as P, useEffect as C } from \"react\";\nvar f = /* @__PURE__ */ ((e) => (e.Mouse = \"mouse\", e.Touch = \"touch\", e.Pointer = \"pointer\", e))(f || {}), l = /* @__PURE__ */ ((e) => (e.CancelledByMovement = \"cancelled-by-movement\", e.CancelledByRelease = \"cancelled-by-release\", e.CancelledOutsideElement = \"cancelled-outside-element\", e))(l || {});\nconst b = [\n \"mousedown\",\n \"mousemove\",\n \"mouseup\",\n \"mouseleave\",\n \"mouseout\"\n], q = [\n \"touchstart\",\n \"touchmove\",\n \"touchend\",\n \"touchcancel\"\n], z = [\n \"pointerdown\",\n \"pointermove\",\n \"pointerup\",\n \"pointerleave\",\n \"pointerout\"\n];\nfunction G(e) {\n return typeof e == \"object\" && e !== null && \"pageX\" in e && typeof e.pageX == \"number\" && \"pageY\" in e && typeof e.pageY == \"number\";\n}\nfunction J(e) {\n var u;\n return b.includes((u = e == null ? void 0 : e.nativeEvent) == null ? void 0 : u.type);\n}\nfunction U(e) {\n var u;\n return q.includes((u = e == null ? void 0 : e.nativeEvent) == null ? void 0 : u.type) || \"touches\" in e;\n}\nfunction K(e) {\n const { nativeEvent: u } = e;\n return u ? z.includes(u == null ? void 0 : u.type) || \"pointerId\" in u : !1;\n}\nfunction D(e) {\n return J(e) || U(e) || K(e);\n}\nfunction A(e) {\n var s;\n const u = U(e) ? (s = e == null ? void 0 : e.touches) == null ? void 0 : s[0] : e;\n return G(u) ? {\n x: u.pageX,\n y: u.pageY\n } : null;\n}\nfunction N(e) {\n return {\n target: e.target,\n currentTarget: e.currentTarget,\n nativeEvent: e,\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n persist: () => {\n }\n };\n}\nfunction V(e, {\n threshold: u = 400,\n captureEvent: s = !1,\n detect: R = f.Pointer,\n cancelOnMovement: p = !1,\n cancelOutsideElement: T = !0,\n filterEvents: M,\n onStart: m,\n onMove: w,\n onFinish: g,\n onCancel: h\n} = {}) {\n const L = i(!1), c = i(!1), H = i(), d = i(), B = i(e), a = i(null), y = P(\n (r) => (t) => {\n c.current || D(t) && (M !== void 0 && !M(t) || (s && t.persist(), m == null || m(t, { context: r }), a.current = A(t), c.current = !0, H.current = t.currentTarget, d.current = setTimeout(() => {\n B.current && (B.current(t, { context: r }), L.current = !0);\n }, u)));\n },\n [s, M, m, u]\n ), o = P(\n (r) => (t, n) => {\n D(t) && c.current && (a.current = null, s && t.persist(), L.current ? g == null || g(t, { context: r }) : c.current && (h == null || h(t, { context: r, reason: n ?? l.CancelledByRelease })), L.current = !1, c.current = !1, d.current !== void 0 && clearTimeout(d.current));\n },\n [s, g, h]\n ), E = P(\n (r) => (t) => {\n if (D(t) && (w == null || w(t, { context: r }), p !== !1 && a.current)) {\n const n = A(t);\n if (n) {\n const X = p === !0 ? 25 : p, Y = {\n x: Math.abs(n.x - a.current.x),\n y: Math.abs(n.y - a.current.y)\n };\n (Y.x > X || Y.y > X) && o(r)(t, l.CancelledByMovement);\n }\n }\n },\n [o, p, w]\n ), I = P(\n (r) => {\n if (e === null)\n return {};\n switch (R) {\n case f.Mouse: {\n const t = {\n onMouseDown: y(r),\n onMouseMove: E(r),\n onMouseUp: o(r)\n };\n return T && (t.onMouseLeave = (n) => {\n o(r)(n, l.CancelledOutsideElement);\n }), t;\n }\n case f.Touch:\n return {\n onTouchStart: y(r),\n onTouchMove: E(r),\n onTouchEnd: o(r)\n };\n case f.Pointer: {\n const t = {\n onPointerDown: y(r),\n onPointerMove: E(r),\n onPointerUp: o(r)\n };\n return T && (t.onPointerLeave = (n) => o(r)(n, l.CancelledOutsideElement)), t;\n }\n }\n },\n [e, o, T, R, E, y]\n );\n return C(() => {\n function r(t) {\n const n = N(t);\n o()(n);\n }\n return window.addEventListener(\"mouseup\", r), window.addEventListener(\"touchend\", r), window.addEventListener(\"pointerup\", r), () => {\n window.removeEventListener(\"mouseup\", r), window.removeEventListener(\"touchend\", r), window.removeEventListener(\"pointerup\", r);\n };\n }, [o]), C(\n () => () => {\n d.current !== void 0 && clearTimeout(d.current);\n },\n []\n ), C(() => {\n B.current = e;\n }, [e]), I;\n}\nexport {\n l as LongPressCallbackReason,\n f as LongPressEventType,\n V as useLongPress\n};\n","import mem from './mem';\nimport store from './store';\n\nconst DTFLOCALE_CACHE_KEY = 'dtflocale';\n\nfunction _getDtfLocale() {\n try {\n const cachedDtf = store.session.get(DTFLOCALE_CACHE_KEY);\n if (cachedDtf) return cachedDtf;\n const dtfLocale = new Intl.DateTimeFormat().resolvedOptions().locale;\n store.session.set(DTFLOCALE_CACHE_KEY, dtfLocale);\n return dtfLocale;\n } catch (e) {\n return null;\n }\n}\nexport const getDtfLocale = mem(_getDtfLocale);\n\nexport function clearDtfLocaleCache() {\n store.session.del(DTFLOCALE_CACHE_KEY);\n}\n","import { clearDtfLocaleCache, getDtfLocale } from './dtf-locale';\nimport localeMatch from './locale-match';\nimport mem from './mem';\n\nfunction initLocales() {\n const newLocales = [...navigator.languages];\n const dtfLocale = getDtfLocale();\n if (dtfLocale && !newLocales.includes(dtfLocale)) {\n newLocales.unshift(dtfLocale);\n }\n return newLocales;\n}\n\nlet locales = initLocales();\n\n// For testing: refresh locales from current navigator state\nexport function refreshLocales() {\n clearDtfLocaleCache();\n locales = initLocales();\n}\n\nconst createLocale = mem((language, options = {}) => {\n try {\n return new Intl.Locale(language, options);\n } catch (e) {\n // Fallback to simple string splitting\n // May not work properly due to how complicated this is\n if (!language) return null;\n\n // https://www.w3.org/International/articles/language-tags/\n // Parts: language-extlang-script-region-variant-extension-privateuse\n const [langPart, ...parts] = language.split('-', 4);\n const regionPart = parts.pop() || null;\n const fallbackLocale = {\n language: langPart,\n region: regionPart,\n ...options,\n toString: () => {\n const lang = fallbackLocale.language;\n const middle = parts.length > 0 ? `-${parts.join('-')}-` : '-';\n const reg = fallbackLocale.region;\n return reg ? `${lang}${middle}${reg}` : lang;\n },\n };\n return fallbackLocale;\n }\n});\n\nconst _DateTimeFormat = (locale, opts) => {\n const options = opts;\n\n const appLocale = createLocale(locale);\n\n // Find first user locale with a region\n let userRegion = null;\n for (const loc of locales) {\n const region = createLocale(loc)?.region;\n if (region) {\n userRegion = region;\n break;\n }\n }\n\n const userRegionLocale =\n userRegion && appLocale && appLocale.region !== userRegion\n ? createLocale(appLocale.language, {\n ...appLocale,\n region: userRegion,\n })?.toString()\n : null;\n\n const matchedLocale = localeMatch(\n [userRegionLocale, locale, locale?.replace(/-[a-z]+$/i, '')],\n locales,\n locale,\n );\n\n try {\n return new Intl.DateTimeFormat(matchedLocale, options);\n } catch (e) {\n return new Intl.DateTimeFormat(undefined, options);\n }\n};\n\nconst DateTimeFormat = mem(_DateTimeFormat);\n\nexport default DateTimeFormat;\n","import { i18n } from '@lingui/core';\n\nimport DateTimeFormat from './date-time-format';\n\nfunction niceDateTime(date, dtfOpts) {\n if (!(date instanceof Date)) {\n date = new Date(date);\n }\n\n const { hideTime, formatOpts, forceOpts } = dtfOpts || {};\n const currentYear = new Date().getFullYear();\n const options = forceOpts || {\n // Show year if not current year\n year: date.getFullYear() === currentYear ? undefined : 'numeric',\n month: 'short',\n day: 'numeric',\n // Hide time if requested\n hour: hideTime ? undefined : 'numeric',\n minute: hideTime ? undefined : 'numeric',\n ...formatOpts,\n };\n\n const DTF = DateTimeFormat(i18n.locale, options);\n const dateText = DTF.format(date);\n return dateText;\n}\n\nexport default niceDateTime;\n","import { t } from '@lingui/core/macro';\n\nexport default function openCompose(opts) {\n const url = URL.parse('./compose/', window.location);\n const { width: screenWidth, height: screenHeight } = window.screen;\n const left = Math.max(0, (screenWidth - 600) / 2);\n const top = Math.max(0, (screenHeight - 450) / 2);\n const width = Math.min(screenWidth, 600);\n const height = Math.min(screenHeight, 450);\n const winUID = opts?.uid || Math.random();\n const newWin = window.open(\n url,\n 'compose' + winUID,\n `width=${width},height=${height},left=${left},top=${top}`,\n );\n\n if (newWin) {\n // if (masto) {\n // newWin.masto = masto;\n // }\n\n newWin.__COMPOSE__ = opts;\n } else {\n alert(t`Looks like your browser is blocking popups.`);\n }\n\n return newWin;\n}\n","const isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent); // https://stackoverflow.com/a/23522755\n\nexport default function openOSK() {\n if (isSafari) {\n const fauxEl = document.createElement('input');\n fauxEl.style.position = 'absolute';\n fauxEl.style.top = '0';\n fauxEl.style.left = '0';\n fauxEl.style.opacity = '0';\n document.body.appendChild(fauxEl);\n fauxEl.focus();\n setTimeout(() => {\n document.body.removeChild(fauxEl);\n }, 500);\n }\n}\n","const root = document.documentElement;\nconst style = getComputedStyle(root);\nconst defaultBoundingBoxPadding = 8;\n\nlet safeAreaInsets = [0, 0, 0, 0];\nfunction getSafeAreaInsets() {\n // Get safe area inset variables from root\n const safeAreaInsetTop = style.getPropertyValue('--sai-top');\n const safeAreaInsetRight = style.getPropertyValue('--sai-right');\n const safeAreaInsetBottom = style.getPropertyValue('--sai-bottom');\n const safeAreaInsetLeft = style.getPropertyValue('--sai-left');\n safeAreaInsets = [\n // top, right, bottom, left (clockwise)\n Math.max(0, parseInt(safeAreaInsetTop, 10)),\n Math.max(0, parseInt(safeAreaInsetRight, 10)),\n Math.max(0, parseInt(safeAreaInsetBottom, 10)),\n Math.max(0, parseInt(safeAreaInsetLeft, 10)),\n ];\n}\nrequestAnimationFrame(getSafeAreaInsets);\n\nfunction safeBoundingBoxPadding(paddings = []) {\n const str = safeAreaInsets\n .map((v, i) => (v || defaultBoundingBoxPadding) + (paddings[i] || 0))\n .join(' ');\n // console.log(str);\n return str;\n}\n\n// Update safe area insets when orientation or resize\nif (CSS.supports('top: env(safe-area-inset-top)')) {\n window.addEventListener('resize', getSafeAreaInsets, { passive: true });\n}\n\nexport default safeBoundingBoxPadding;\n","import { t } from '@lingui/core/macro';\n\nimport openOSK from './open-osk';\nimport showToast from './show-toast';\nimport states from './states';\n\nconst TOAST_DURATION = 5_000; // 5 seconds\n\nexport default function showCompose(opts) {\n if (!opts) opts = true;\n\n if (states.showCompose) {\n if (states.composerState.minimized) {\n showToast({\n duration: TOAST_DURATION,\n text: t`A draft post is currently minimized. Post or discard it before creating a new one.`,\n });\n } else {\n showToast({\n duration: TOAST_DURATION,\n text: t`A post is currently open. Post or discard it before creating a new one.`,\n });\n }\n return;\n }\n\n openOSK();\n states.showCompose = opts;\n}\n","const template = document.createElement('template');\n\n// Regex patterns for HTML text processing\nconst PARAGRAPH_END_RE = /<\\/p>/g;\nconst LIST_ITEM_END_RE = /<\\/li>/g;\nconst MULTIPLE_LINE_BREAKS_RE = /[\\r\\n]{3,}/g;\nfunction getHTMLText(html, opts) {\n if (!html) return '';\n const { preProcess, truncateLinks = true } = opts || {};\n\n template.innerHTML = html\n .replace(PARAGRAPH_END_RE, '</p>\\n\\n')\n .replace(LIST_ITEM_END_RE, '</li>\\n');\n\n const content = template.content;\n const brElements = content.querySelectorAll('br');\n for (let i = 0; i < brElements.length; i++) {\n brElements[i].replaceWith('\\n');\n }\n\n preProcess?.(content);\n\n if (truncateLinks) {\n // MASTODON-SPECIFIC classes\n // Remove .invisible\n const invisibleElements = content.querySelectorAll('.invisible');\n for (let i = 0; i < invisibleElements.length; i++) {\n invisibleElements[i].remove();\n }\n // Add … at end of .ellipsis\n const ellipsisElements = content.querySelectorAll('.ellipsis');\n for (let i = 0; i < ellipsisElements.length; i++) {\n ellipsisElements[i].append('…');\n }\n }\n\n // Collect innerText from all child nodes since DocumentFragment doesn't have innerText\n let textContent = '';\n for (let i = 0; i < content.childNodes.length; i++) {\n const n = content.childNodes[i];\n textContent += n.innerText || n.textContent || '';\n }\n\n return textContent.replace(MULTIPLE_LINE_BREAKS_RE, '\\n\\n').trim();\n}\n\nexport default getHTMLText;\n","import getHTMLText from './getHTMLText';\n\nfunction statusPeek(status) {\n const { spoilerText, content, poll, mediaAttachments, quote } = status;\n let text = '';\n // Don't need supportsNativeQuote because checking quotedStatus ID is enough\n const hasQuote = !!quote?.quotedStatus?.id;\n if (spoilerText?.trim()) {\n text += spoilerText;\n } else {\n text += getHTMLText(content, {\n preProcess: (dom) => {\n if (hasQuote) {\n const reContainer = dom.querySelector('.quote-inline');\n if (reContainer) {\n reContainer.remove();\n }\n }\n },\n });\n }\n text = text.trim();\n if (poll?.options?.length) {\n text += `\\n\\n📊:\\n${poll.options\n .map((o) => `${poll.multiple ? '▪️' : '•'} ${o.title}`)\n .join('\\n')}`;\n }\n if (mediaAttachments?.length) {\n text +=\n ' ' +\n mediaAttachments\n .map(\n (m) =>\n ({\n image: '🖼️',\n gifv: '🎞️',\n video: '📹',\n audio: '🎵',\n unknown: '',\n })[m.type] || '',\n )\n .join('');\n }\n if (hasQuote) {\n const quotePeek = statusPeek(quote.quotedStatus);\n text += `\\n\\n❝\\n${quotePeek}\\n❞`;\n }\n return text;\n}\n\nexport default statusPeek;\n","import { memo } from 'preact/compat';\nimport { useEffect } from 'preact/hooks';\n\nimport { ICONS } from './ICONS';\nimport { ICON_NAMESPACE, useIconSprite } from './icon-sprite-manager';\n\nconst SIZES = {\n xs: 8,\n s: 12,\n m: 16,\n l: 20,\n xl: 24,\n xxl: 32,\n};\n\nconst INVALID_ID_CHARS_REGEX = /[^a-zA-Z0-9]/g;\n\nfunction Icon({\n icon,\n size = 'm',\n alt,\n title,\n class: className = '',\n style = {},\n}) {\n title = title || alt;\n const { loadIcon, isIconLoaded } = useIconSprite();\n\n if (!icon) return null;\n\n const iconSize = SIZES[size];\n let iconBlock = ICONS[icon];\n if (!iconBlock) {\n console.warn(`Icon ${icon} not found`);\n return null;\n }\n\n let rotate,\n flip,\n rtl = false;\n if (Array.isArray(iconBlock)) {\n [iconBlock, rotate, flip] = iconBlock;\n } else if (typeof iconBlock === 'object') {\n ({ rotate, flip, rtl } = iconBlock);\n iconBlock = iconBlock.module;\n }\n\n const sanitizedTitle = title?.replace(INVALID_ID_CHARS_REGEX, '-');\n const titleID = `${ICON_NAMESPACE}-title-${icon}-${sanitizedTitle}`;\n\n useEffect(() => {\n if (!isIconLoaded(icon)) {\n loadIcon(icon);\n }\n }, [icon]);\n\n const loaded = isIconLoaded(icon);\n\n return (\n <span\n class={`icon ${className} ${rtl ? 'rtl-flip' : ''}`}\n style={{\n width: `${iconSize}px`,\n height: `${iconSize}px`,\n ...style,\n }}\n data-icon={icon}\n title={loaded ? undefined : title || undefined}\n >\n {loaded && (\n <svg\n width={iconSize}\n height={iconSize}\n role={title ? 'img' : 'presentation'}\n aria-labelledby={titleID}\n style={{\n transform: `${rotate ? `rotate(${rotate})` : ''} ${\n flip ? `scaleX(-1)` : ''\n }`,\n }}\n >\n {title ? <title id={titleID}>{title}</title> : null}\n <use href={`#${ICON_NAMESPACE}-${icon}`} />\n </svg>\n )}\n </span>\n );\n}\n\nexport default memo(Icon, (prevProps, nextProps) => {\n return (\n prevProps.icon === nextProps.icon &&\n prevProps.title === nextProps.title &&\n prevProps.alt === nextProps.alt\n );\n});\n","import { forwardRef } from 'preact/compat';\nimport { useLocation } from 'react-router-dom';\n\nimport states from '../utils/states';\n\n/* NOTES\n =====\n Initially this uses <NavLink> from react-router-dom, but it doesn't work:\n 1. It interferes with nested <a> inside <a> and it's difficult to preventDefault/stopPropagation from the nested <a>\n 2. isActive doesn't work properly with the weird routes that's set up in this app, due to the faux \"location\" to make the modals work and prevent unmounting\n 3. Not using <Link state/> because it modifies history.state that *persists* across page reloads. I don't need that, so using valtio's states instead.\n*/\n\nconst Link = forwardRef((props, ref) => {\n let routerLocation;\n try {\n routerLocation = useLocation();\n } catch (e) {}\n let hash = (location.hash || '').replace(/^#/, '').trim();\n if (hash === '') hash = '/';\n const { to, ...restProps } = props;\n\n // Handle encodeURIComponent of searchParams values\n if (!!hash && hash !== '/' && hash.includes('?')) {\n const parsedHash = URL.parse(hash, location.origin); // Fake base URL\n if (parsedHash?.searchParams?.size) {\n const searchParamsStr = Array.from(parsedHash.searchParams.entries())\n .map(([key, value]) => `${key}=${encodeURIComponent(value)}`)\n .join('&');\n hash = parsedHash.pathname + '?' + searchParamsStr;\n }\n }\n\n const isActive = hash === to || decodeURIComponent(hash) === to;\n return (\n <a\n ref={ref}\n href={`#${to}`}\n {...restProps}\n class={`${props.class || ''} ${isActive ? 'is-active' : ''}`}\n onClick={(e) => {\n if (e.currentTarget?.parentNode?.closest('a')) {\n // If this <a> is nested inside another <a>\n e.stopPropagation();\n }\n if (routerLocation) states.prevLocation = routerLocation;\n props.onClick?.(e);\n }}\n />\n );\n});\n\nexport default Link;\n","import { FocusableItem } from '@szhsin/react-menu';\n\nimport Link from './link';\n\nfunction MenuLink(props) {\n const { className, disabled, ...restProps } = props;\n return (\n <FocusableItem className={className} disabled={disabled}>\n {({ ref, closeMenu }) => (\n <Link\n {...restProps}\n ref={ref}\n onClick={({ detail }) =>\n closeMenu(detail === 0 ? 'Enter' : undefined)\n }\n />\n )}\n </FocusableItem>\n );\n}\n\nexport default MenuLink;\n","import mem from './mem.js';\n\nexport default mem(\n (locale) => new Intl.RelativeTimeFormat(locale || undefined),\n);\n","import { i18n } from '@lingui/core';\nimport { t } from '@lingui/core/macro';\nimport { useEffect, useMemo, useReducer } from 'preact/hooks';\n\nimport DateTimeFormat from '../utils/date-time-format';\nimport RTF from '../utils/relative-time-format';\n\nfunction isValidDate(value) {\n if (value instanceof Date) {\n return !isNaN(value.getTime());\n } else {\n const date = new Date(value);\n return !isNaN(date.getTime());\n }\n}\n\nconst minute = 60;\nconst hour = 60 * minute;\nconst day = 24 * hour;\n\nconst rtfFromNow = (date) => {\n // date = Date object\n const rtf = RTF(i18n.locale);\n const seconds = (date.getTime() - Date.now()) / 1000;\n const absSeconds = Math.abs(seconds);\n if (absSeconds < minute) {\n return rtf.format(Math.floor(seconds), 'second');\n } else if (absSeconds < hour) {\n return rtf.format(Math.floor(seconds / minute), 'minute');\n } else if (absSeconds < day) {\n return rtf.format(Math.floor(seconds / hour), 'hour');\n } else if (absSeconds < 30 * day) {\n return rtf.format(Math.floor(seconds / day), 'day');\n } else if (absSeconds < 365 * day) {\n return rtf.format(Math.floor(seconds / day / 30), 'month');\n } else {\n return rtf.format(Math.floor(seconds / day / 365), 'year');\n }\n};\n\nconst twitterFromNow = (date) => {\n // date = Date object\n const seconds = (Date.now() - date.getTime()) / 1000;\n if (seconds < minute) {\n return t({\n comment: 'Relative time in seconds, as short as possible',\n message: `${seconds < 1 ? 1 : Math.floor(seconds)}s`,\n });\n } else if (seconds < hour) {\n return t({\n comment: 'Relative time in minutes, as short as possible',\n message: `${Math.floor(seconds / minute)}m`,\n });\n } else {\n return t({\n comment: 'Relative time in hours, as short as possible',\n message: `${Math.floor(seconds / hour)}h`,\n });\n }\n};\n\nexport default function RelativeTime({ datetime, format }) {\n if (!datetime) return null;\n const [renderCount, rerender] = useReducer((x) => x + 1, 0);\n const date = useMemo(() => new Date(datetime), [datetime]);\n const [dateStr, dt, title] = useMemo(() => {\n if (!isValidDate(date))\n return ['' + (typeof datetime === 'string' ? datetime : ''), '', ''];\n let str;\n if (format === 'micro') {\n // If date <= 1 day ago or day is within this year\n const now = new Date();\n const dayDiff = (now.getTime() - date.getTime()) / 1000 / day;\n if (dayDiff <= 1) {\n str = twitterFromNow(date);\n } else {\n const sameYear = now.getFullYear() === date.getFullYear();\n if (sameYear) {\n str = DateTimeFormat(i18n.locale, {\n year: undefined,\n month: 'short',\n day: 'numeric',\n }).format(date);\n } else {\n str = DateTimeFormat(i18n.locale, {\n dateStyle: 'short',\n }).format(date);\n }\n }\n }\n if (!str) str = rtfFromNow(date);\n return [str, date.toISOString(), date.toLocaleString()];\n }, [date, format, renderCount]);\n\n useEffect(() => {\n if (!isValidDate(date)) return;\n let timeout;\n let raf;\n function rafRerender() {\n raf = requestAnimationFrame(() => {\n rerender();\n scheduleRerender();\n });\n }\n function scheduleRerender() {\n // If less than 1 minute, rerender every 10s\n // If less than 1 hour rerender every 1m\n // Else, don't need to rerender\n const seconds = (Date.now() - date.getTime()) / 1000;\n if (seconds < minute) {\n timeout = setTimeout(rafRerender, 10_000);\n } else if (seconds < hour) {\n timeout = setTimeout(rafRerender, 60_000);\n }\n }\n scheduleRerender();\n return () => {\n clearTimeout(timeout);\n cancelAnimationFrame(raf);\n };\n }, []);\n\n return (\n <time datetime={dt} title={title}>\n {dateStr}\n </time>\n );\n}\n","import { SubMenu } from '@szhsin/react-menu';\nimport { useLayoutEffect, useRef, useState } from 'preact/hooks';\n\nexport default function SubMenu2(props) {\n const menuRef = useRef();\n const itemRef = useRef();\n const { label, direction, shift, ...restProps } = props;\n const [computedDirection, setComputedDirection] = useState(direction);\n const [computedShift, setComputedShift] = useState(shift);\n\n // If menu item width is >50% of viewport, use bottom direction\n useLayoutEffect(() => {\n if (itemRef.current) {\n const width = itemRef.current.offsetWidth;\n const viewportWidth = window.innerWidth;\n if (width > viewportWidth * 0.5) {\n setComputedDirection('bottom');\n setComputedShift(shift || 8);\n } else {\n setComputedDirection(direction);\n setComputedShift(shift);\n }\n }\n }, [direction, shift]);\n\n return (\n <SubMenu\n {...restProps}\n direction={computedDirection}\n shift={computedShift}\n label={label}\n instanceRef={menuRef}\n // Test fix for bug; submenus not opening on Android\n itemProps={{\n ref: itemRef,\n onPointerMove: (e) => {\n if (e.pointerType === 'touch') {\n menuRef.current?.openMenu?.();\n }\n },\n onPointerLeave: (e) => {\n if (e.pointerType === 'touch') {\n menuRef.current?.openMenu?.();\n }\n },\n ...props.itemProps,\n }}\n />\n );\n}\n","import { useEffect } from 'preact/hooks';\n\n// NOTE: The order of initialized close watchers is important\n// Last one will intercept first if there are multiple/nested close watchers\n// So if this hook reruns, the previous close watcher will be destroyed, the new one will be created and the order will change\nfunction useCloseWatcher(fn, deps = []) {\n if (!fn || typeof fn !== 'function') return;\n useEffect(() => {\n console.log('useCloseWatcher');\n const watcher = new CloseWatcher();\n watcher.addEventListener('close', fn);\n return () => {\n watcher.destroy();\n };\n }, deps);\n}\n\nexport default window.CloseWatcher ? useCloseWatcher : () => {};\n","import './modal.css';\n\nimport { createPortal } from 'preact/compat';\nimport { useEffect, useLayoutEffect, useRef } from 'preact/hooks';\nimport { useHotkeys } from 'react-hotkeys-hook';\n\nimport store from '../utils/store';\nimport useCloseWatcher from '../utils/useCloseWatcher';\n\nconst $modalContainer = document.getElementById('modal-container');\n\nfunction getBackdropThemeColor() {\n return getComputedStyle(document.documentElement).getPropertyValue(\n '--backdrop-theme-color',\n );\n}\n\nfunction Modal({ children, onClose, onClick, class: className, minimized }) {\n if (!children) return null;\n\n const modalRef = useRef();\n useEffect(() => {\n let timer = setTimeout(() => {\n const focusElement = modalRef.current?.querySelector('[tabindex=\"-1\"]');\n if (focusElement) {\n focusElement.focus();\n }\n }, 100);\n return () => clearTimeout(timer);\n }, []);\n\n const supportsCloseWatcher = window.CloseWatcher;\n const escRef = useHotkeys(\n 'esc',\n () => {\n setTimeout(() => {\n onClose?.();\n }, 0);\n },\n {\n enabled: !supportsCloseWatcher && !!onClose,\n // Using keyup and setTimeout above\n // This will run \"later\" to prevent clash with esc handlers from other components\n keydown: false,\n keyup: true,\n useKey: true,\n ignoreEventWhen: (e) => e.metaKey || e.ctrlKey || e.altKey || e.shiftKey,\n },\n [onClose],\n );\n useCloseWatcher(onClose, [onClose]);\n\n useEffect(() => {\n const $deckContainers = document.querySelectorAll('.deck-container');\n if (minimized) {\n // Similar to focusDeck in focus-deck.jsx\n // Focus last deck\n const page = $deckContainers[$deckContainers.length - 1]; // last one\n if (page && page.tabIndex === -1) {\n page.focus();\n }\n } else {\n if (children) {\n $deckContainers.forEach(($deckContainer) => {\n $deckContainer.setAttribute('inert', '');\n });\n } else {\n $deckContainers.forEach(($deckContainer) => {\n $deckContainer.removeAttribute('inert');\n });\n }\n }\n return () => {\n $deckContainers.forEach(($deckContainer) => {\n $deckContainer.removeAttribute('inert');\n });\n };\n }, [children, minimized]);\n\n const $meta = useRef();\n const metaColor = useRef();\n useLayoutEffect(() => {\n if (children && !minimized) {\n const theme = store.local.get('theme');\n if (theme) {\n const backdropColor = getBackdropThemeColor();\n console.log({ backdropColor });\n $meta.current = document.querySelector(\n `meta[name=\"theme-color\"][data-theme-setting=\"manual\"]`,\n );\n if ($meta.current) {\n metaColor.current = $meta.current.content;\n $meta.current.content = backdropColor;\n }\n document.documentElement.style.setProperty(\n '--meta-theme-color',\n backdropColor,\n );\n } else {\n const colorScheme = window.matchMedia('(prefers-color-scheme: dark)')\n .matches\n ? 'dark'\n : 'light';\n const backdropColor = getBackdropThemeColor();\n console.log({ backdropColor });\n $meta.current = document.querySelector(\n `meta[name=\"theme-color\"][media*=\"${colorScheme}\"]`,\n );\n if ($meta.current) {\n metaColor.current = $meta.current.content;\n $meta.current.content = backdropColor;\n }\n document.documentElement.style.setProperty(\n '--meta-theme-color',\n backdropColor,\n );\n }\n } else {\n // Reset meta color\n if ($meta.current && metaColor.current) {\n $meta.current.content = metaColor.current;\n }\n document.documentElement.style.removeProperty('--meta-theme-color');\n }\n return () => {\n // Reset meta color\n if ($meta.current && metaColor.current) {\n $meta.current.content = metaColor.current;\n }\n document.documentElement.style.removeProperty('--meta-theme-color');\n };\n }, [children, minimized]);\n\n const Modal = (\n <div\n ref={(node) => {\n modalRef.current = node;\n escRef.current = node?.querySelector?.('[tabindex=\"-1\"]') || node;\n }}\n className={className}\n onClick={(e) => {\n onClick?.(e);\n if (e.target === e.currentTarget) {\n onClose?.(e);\n }\n }}\n tabIndex={minimized ? 0 : '-1'}\n inert={minimized}\n onFocus={(e) => {\n try {\n if (e.target === e.currentTarget) {\n const focusElement =\n modalRef.current?.querySelector('[tabindex=\"-1\"]');\n const isFocusable =\n !!focusElement &&\n getComputedStyle(focusElement)?.pointerEvents !== 'none';\n if (focusElement && isFocusable) {\n focusElement.focus();\n }\n }\n } catch (err) {\n console.error(err);\n }\n }}\n >\n {children}\n </div>\n );\n\n return createPortal(Modal, $modalContainer);\n\n // return createPortal(children, $modalContainer);\n}\n\nexport default Modal;\n","import './avatar.css';\n\nimport { useRef } from 'preact/hooks';\n\nimport mem from '../utils/mem';\n\nconst SIZES = {\n s: 16,\n m: 20,\n l: 24,\n xl: 32,\n xxl: 50,\n xxxl: 64,\n};\n\nconst alphaCache = {};\n\nconst canvas = window.OffscreenCanvas\n ? new OffscreenCanvas(1, 1)\n : document.createElement('canvas');\nconst ctx = canvas.getContext('2d', {\n willReadFrequently: true,\n});\nctx.imageSmoothingEnabled = false;\n\nconst MISSING_IMAGE_PATH_REGEX = /missing\\.png$/;\n\nfunction Avatar({ url, staticUrl, size, alt = '', squircle, ...props }) {\n size = SIZES[size] || size || SIZES.m;\n const avatarRef = useRef();\n const isMissing = MISSING_IMAGE_PATH_REGEX.test(url);\n return (\n <picture\n ref={avatarRef}\n class={`avatar ${squircle ? 'squircle' : ''} ${\n alphaCache[url] ? 'has-alpha' : ''\n }`}\n style={{\n width: size,\n height: size,\n }}\n title={alt}\n {...props}\n >\n {!!staticUrl && (\n <source srcset={staticUrl} media=\"(prefers-reduced-motion: reduce)\" />\n )}\n {!!url && (\n <img\n src={url}\n width={size}\n height={size}\n alt={alt}\n loading=\"lazy\"\n decoding=\"async\"\n fetchPriority=\"low\"\n crossOrigin={\n alphaCache[url] === undefined && !isMissing\n ? 'anonymous'\n : undefined\n }\n onError={(e) => {\n if (e.target.crossOrigin) {\n e.target.crossOrigin = null;\n e.target.src = url;\n }\n }}\n onLoad={(e) => {\n if (avatarRef.current) avatarRef.current.dataset.loaded = true;\n if (alphaCache[url] !== undefined) return;\n if (isMissing) return;\n setTimeout(() => {\n try {\n // Check if image has alpha channel\n const { width, height } = e.target;\n if (canvas.width !== width) canvas.width = width;\n if (canvas.height !== height) canvas.height = height;\n ctx.drawImage(e.target, 0, 0);\n const allPixels = ctx.getImageData(0, 0, width, height);\n // At least 10% of pixels have alpha <= 128\n const hasAlpha =\n allPixels.data.filter(\n (pixel, i) => i % 4 === 3 && pixel <= 128,\n ).length /\n (allPixels.data.length / 4) >\n 0.1;\n if (hasAlpha) {\n // console.log('hasAlpha', hasAlpha, allPixels.data);\n avatarRef.current.classList.add('has-alpha');\n }\n alphaCache[url] = hasAlpha;\n ctx.clearRect(0, 0, width, height);\n } catch (e) {\n // Silent fail\n alphaCache[url] = false;\n }\n }, 1);\n }}\n />\n )}\n </picture>\n );\n}\n\nexport default mem(Avatar);\n","let IS_RTL = false;\n\n// Use MutationObserver to detect RTL\nconst observer = new MutationObserver((mutations) => {\n mutations.forEach((mutation) => {\n if (mutation.type === 'attributes') {\n const { dir } = mutation.target;\n if (dir === 'rtl') {\n IS_RTL = true;\n } else {\n IS_RTL = false;\n }\n console.log({ IS_RTL });\n // Fire custom event 'dirchange' on document\n // document.dispatchEvent(new Event('dirchange'));\n }\n });\n});\nobserver.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['dir'],\n});\n\nexport default function isRTL() {\n return IS_RTL;\n // return document.documentElement.dir === 'rtl';\n}\n","import { useLayoutEffect, useState } from 'preact/hooks';\n\nexport default function useWindowSize() {\n const [size, setSize] = useState({\n width: null,\n height: null,\n });\n\n useLayoutEffect(() => {\n const handleResize = () => {\n setSize({\n width: window.innerWidth,\n height: window.innerHeight,\n });\n };\n\n handleResize();\n window.addEventListener('resize', handleResize, {\n passive: true,\n });\n\n return () => {\n window.removeEventListener('resize', handleResize);\n };\n }, []);\n\n return size;\n}\n","import { Menu } from '@szhsin/react-menu';\nimport { useRef } from 'preact/hooks';\n\nimport isRTL from '../utils/is-rtl';\nimport safeBoundingBoxPadding from '../utils/safe-bounding-box-padding';\nimport useWindowSize from '../utils/useWindowSize';\n\n// It's like Menu but with sensible defaults, bug fixes and improvements.\nfunction Menu2(props) {\n const { containerProps, instanceRef: _instanceRef, align } = props;\n const size = useWindowSize();\n const instanceRef = _instanceRef?.current ? _instanceRef : useRef();\n\n // Values: start, end, center\n // Note: don't mess with 'center'\n const rtlAlign = isRTL()\n ? align === 'end'\n ? 'start'\n : align === 'start'\n ? 'end'\n : align\n : align;\n\n return (\n <Menu\n boundingBoxPadding={safeBoundingBoxPadding()}\n repositionFlag={`${size.width}x${size.height}`}\n unmountOnClose\n {...props}\n align={rtlAlign}\n instanceRef={instanceRef}\n containerProps={{\n onClick: (e) => {\n if (e.target === e.currentTarget) {\n instanceRef.current?.closeMenu?.();\n }\n containerProps?.onClick?.(e);\n },\n ...containerProps,\n }}\n />\n );\n}\n\nexport default Menu2;\n","import { MenuItem } from '@szhsin/react-menu';\nimport { cloneElement } from 'preact';\n\nimport Menu2 from './menu2';\nimport SubMenu2 from './submenu2';\n\nfunction MenuConfirm({\n subMenu = false,\n confirm = true,\n confirmLabel,\n menuItemClassName,\n menuFooter,\n menuExtras,\n ...props\n}) {\n const { children, onClick, ...restProps } = props;\n if (!confirm) {\n if (subMenu) return <MenuItem {...props} />;\n if (onClick) {\n return cloneElement(children, {\n onClick,\n });\n }\n return children;\n }\n const Parent = subMenu ? SubMenu2 : Menu2;\n return (\n <Parent\n openTrigger=\"clickOnly\"\n direction=\"bottom\"\n overflow=\"auto\"\n gap={-8}\n shift={8}\n menuClassName=\"menu-emphasized\"\n {...restProps}\n menuButton={subMenu ? undefined : children}\n label={subMenu ? children : undefined}\n >\n <MenuItem className={menuItemClassName} onClick={onClick}>\n {confirmLabel}\n </MenuItem>\n {menuExtras}\n {menuFooter}\n </Parent>\n );\n}\n\nexport default MenuConfirm;\n","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.loop = exports.conditional = exports.parse = void 0;\n\nvar parse = function parse(stream, schema) {\n var result = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n var parent = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : result;\n\n if (Array.isArray(schema)) {\n schema.forEach(function (partSchema) {\n return parse(stream, partSchema, result, parent);\n });\n } else if (typeof schema === 'function') {\n schema(stream, result, parent, parse);\n } else {\n var key = Object.keys(schema)[0];\n\n if (Array.isArray(schema[key])) {\n parent[key] = {};\n parse(stream, schema[key], result, parent[key]);\n } else {\n parent[key] = schema[key](stream, result, parent, parse);\n }\n }\n\n return result;\n};\n\nexports.parse = parse;\n\nvar conditional = function conditional(schema, conditionFunc) {\n return function (stream, result, parent, parse) {\n if (conditionFunc(stream, result, parent)) {\n parse(stream, schema, result, parent);\n }\n };\n};\n\nexports.conditional = conditional;\n\nvar loop = function loop(schema, continueFunc) {\n return function (stream, result, parent, parse) {\n var arr = [];\n var lastStreamPos = stream.pos;\n\n while (continueFunc(stream, result, parent)) {\n var newParent = {};\n parse(stream, schema, result, newParent); // cases when whole file is parsed but no termination is there and stream position is not getting updated as well\n // it falls into infinite recursion, null check to avoid the same\n\n if (stream.pos === lastStreamPos) {\n break;\n }\n\n lastStreamPos = stream.pos;\n arr.push(newParent);\n }\n\n return arr;\n };\n};\n\nexports.loop = loop;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.readBits = exports.readArray = exports.readUnsigned = exports.readString = exports.peekBytes = exports.readBytes = exports.peekByte = exports.readByte = exports.buildStream = void 0;\n\n// Default stream and parsers for Uint8TypedArray data type\nvar buildStream = function buildStream(uint8Data) {\n return {\n data: uint8Data,\n pos: 0\n };\n};\n\nexports.buildStream = buildStream;\n\nvar readByte = function readByte() {\n return function (stream) {\n return stream.data[stream.pos++];\n };\n};\n\nexports.readByte = readByte;\n\nvar peekByte = function peekByte() {\n var offset = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n return function (stream) {\n return stream.data[stream.pos + offset];\n };\n};\n\nexports.peekByte = peekByte;\n\nvar readBytes = function readBytes(length) {\n return function (stream) {\n return stream.data.subarray(stream.pos, stream.pos += length);\n };\n};\n\nexports.readBytes = readBytes;\n\nvar peekBytes = function peekBytes(length) {\n return function (stream) {\n return stream.data.subarray(stream.pos, stream.pos + length);\n };\n};\n\nexports.peekBytes = peekBytes;\n\nvar readString = function readString(length) {\n return function (stream) {\n return Array.from(readBytes(length)(stream)).map(function (value) {\n return String.fromCharCode(value);\n }).join('');\n };\n};\n\nexports.readString = readString;\n\nvar readUnsigned = function readUnsigned(littleEndian) {\n return function (stream) {\n var bytes = readBytes(2)(stream);\n return littleEndian ? (bytes[1] << 8) + bytes[0] : (bytes[0] << 8) + bytes[1];\n };\n};\n\nexports.readUnsigned = readUnsigned;\n\nvar readArray = function readArray(byteSize, totalOrFunc) {\n return function (stream, result, parent) {\n var total = typeof totalOrFunc === 'function' ? totalOrFunc(stream, result, parent) : totalOrFunc;\n var parser = readBytes(byteSize);\n var arr = new Array(total);\n\n for (var i = 0; i < total; i++) {\n arr[i] = parser(stream);\n }\n\n return arr;\n };\n};\n\nexports.readArray = readArray;\n\nvar subBitsTotal = function subBitsTotal(bits, startIndex, length) {\n var result = 0;\n\n for (var i = 0; i < length; i++) {\n result += bits[startIndex + i] && Math.pow(2, length - i - 1);\n }\n\n return result;\n};\n\nvar readBits = function readBits(schema) {\n return function (stream) {\n var _byte = readByte()(stream); // convert the byte to bit array\n\n\n var bits = new Array(8);\n\n for (var i = 0; i < 8; i++) {\n bits[7 - i] = !!(_byte & 1 << i);\n } // convert the bit array to values based on the schema\n\n\n return Object.keys(schema).reduce(function (res, key) {\n var def = schema[key];\n\n if (def.length) {\n res[key] = subBitsTotal(bits, def.index, def.length);\n } else {\n res[key] = bits[def.index];\n }\n\n return res;\n }, {});\n };\n};\n\nexports.readBits = readBits;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = void 0;\n\nvar _ = require(\"../\");\n\nvar _uint = require(\"../parsers/uint8\");\n\n// a set of 0x00 terminated subblocks\nvar subBlocksSchema = {\n blocks: function blocks(stream) {\n var terminator = 0x00;\n var chunks = [];\n var streamSize = stream.data.length;\n var total = 0;\n\n for (var size = (0, _uint.readByte)()(stream); size !== terminator; size = (0, _uint.readByte)()(stream)) {\n // size becomes undefined for some case when file is corrupted and terminator is not proper \n // null check to avoid recursion\n if (!size) break; // catch corrupted files with no terminator\n\n if (stream.pos + size >= streamSize) {\n var availableSize = streamSize - stream.pos;\n chunks.push((0, _uint.readBytes)(availableSize)(stream));\n total += availableSize;\n break;\n }\n\n chunks.push((0, _uint.readBytes)(size)(stream));\n total += size;\n }\n\n var result = new Uint8Array(total);\n var offset = 0;\n\n for (var i = 0; i < chunks.length; i++) {\n result.set(chunks[i], offset);\n offset += chunks[i].length;\n }\n\n return result;\n }\n}; // global control extension\n\nvar gceSchema = (0, _.conditional)({\n gce: [{\n codes: (0, _uint.readBytes)(2)\n }, {\n byteSize: (0, _uint.readByte)()\n }, {\n extras: (0, _uint.readBits)({\n future: {\n index: 0,\n length: 3\n },\n disposal: {\n index: 3,\n length: 3\n },\n userInput: {\n index: 6\n },\n transparentColorGiven: {\n index: 7\n }\n })\n }, {\n delay: (0, _uint.readUnsigned)(true)\n }, {\n transparentColorIndex: (0, _uint.readByte)()\n }, {\n terminator: (0, _uint.readByte)()\n }]\n}, function (stream) {\n var codes = (0, _uint.peekBytes)(2)(stream);\n return codes[0] === 0x21 && codes[1] === 0xf9;\n}); // image pipeline block\n\nvar imageSchema = (0, _.conditional)({\n image: [{\n code: (0, _uint.readByte)()\n }, {\n descriptor: [{\n left: (0, _uint.readUnsigned)(true)\n }, {\n top: (0, _uint.readUnsigned)(true)\n }, {\n width: (0, _uint.readUnsigned)(true)\n }, {\n height: (0, _uint.readUnsigned)(true)\n }, {\n lct: (0, _uint.readBits)({\n exists: {\n index: 0\n },\n interlaced: {\n index: 1\n },\n sort: {\n index: 2\n },\n future: {\n index: 3,\n length: 2\n },\n size: {\n index: 5,\n length: 3\n }\n })\n }]\n }, (0, _.conditional)({\n lct: (0, _uint.readArray)(3, function (stream, result, parent) {\n return Math.pow(2, parent.descriptor.lct.size + 1);\n })\n }, function (stream, result, parent) {\n return parent.descriptor.lct.exists;\n }), {\n data: [{\n minCodeSize: (0, _uint.readByte)()\n }, subBlocksSchema]\n }]\n}, function (stream) {\n return (0, _uint.peekByte)()(stream) === 0x2c;\n}); // plain text block\n\nvar textSchema = (0, _.conditional)({\n text: [{\n codes: (0, _uint.readBytes)(2)\n }, {\n blockSize: (0, _uint.readByte)()\n }, {\n preData: function preData(stream, result, parent) {\n return (0, _uint.readBytes)(parent.text.blockSize)(stream);\n }\n }, subBlocksSchema]\n}, function (stream) {\n var codes = (0, _uint.peekBytes)(2)(stream);\n return codes[0] === 0x21 && codes[1] === 0x01;\n}); // application block\n\nvar applicationSchema = (0, _.conditional)({\n application: [{\n codes: (0, _uint.readBytes)(2)\n }, {\n blockSize: (0, _uint.readByte)()\n }, {\n id: function id(stream, result, parent) {\n return (0, _uint.readString)(parent.blockSize)(stream);\n }\n }, subBlocksSchema]\n}, function (stream) {\n var codes = (0, _uint.peekBytes)(2)(stream);\n return codes[0] === 0x21 && codes[1] === 0xff;\n}); // comment block\n\nvar commentSchema = (0, _.conditional)({\n comment: [{\n codes: (0, _uint.readBytes)(2)\n }, subBlocksSchema]\n}, function (stream) {\n var codes = (0, _uint.peekBytes)(2)(stream);\n return codes[0] === 0x21 && codes[1] === 0xfe;\n});\nvar schema = [{\n header: [{\n signature: (0, _uint.readString)(3)\n }, {\n version: (0, _uint.readString)(3)\n }]\n}, {\n lsd: [{\n width: (0, _uint.readUnsigned)(true)\n }, {\n height: (0, _uint.readUnsigned)(true)\n }, {\n gct: (0, _uint.readBits)({\n exists: {\n index: 0\n },\n resolution: {\n index: 1,\n length: 3\n },\n sort: {\n index: 4\n },\n size: {\n index: 5,\n length: 3\n }\n })\n }, {\n backgroundColorIndex: (0, _uint.readByte)()\n }, {\n pixelAspectRatio: (0, _uint.readByte)()\n }]\n}, (0, _.conditional)({\n gct: (0, _uint.readArray)(3, function (stream, result) {\n return Math.pow(2, result.lsd.gct.size + 1);\n })\n}, function (stream, result) {\n return result.lsd.gct.exists;\n}), // content frames\n{\n frames: (0, _.loop)([gceSchema, applicationSchema, commentSchema, imageSchema, textSchema], function (stream) {\n var nextCode = (0, _uint.peekByte)()(stream); // rather than check for a terminator, we should check for the existence\n // of an ext or image block to avoid infinite loops\n //var terminator = 0x3B;\n //return nextCode !== terminator;\n\n return nextCode === 0x21 || nextCode === 0x2c;\n })\n}];\nvar _default = schema;\nexports[\"default\"] = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.deinterlace = void 0;\n\n/**\r\n * Deinterlace function from https://github.com/shachaf/jsgif\r\n */\nvar deinterlace = function deinterlace(pixels, width) {\n var newPixels = new Array(pixels.length);\n var rows = pixels.length / width;\n\n var cpRow = function cpRow(toRow, fromRow) {\n var fromPixels = pixels.slice(fromRow * width, (fromRow + 1) * width);\n newPixels.splice.apply(newPixels, [toRow * width, width].concat(fromPixels));\n }; // See appendix E.\n\n\n var offsets = [0, 4, 2, 1];\n var steps = [8, 8, 4, 2];\n var fromRow = 0;\n\n for (var pass = 0; pass < 4; pass++) {\n for (var toRow = offsets[pass]; toRow < rows; toRow += steps[pass]) {\n cpRow(toRow, fromRow);\n fromRow++;\n }\n }\n\n return newPixels;\n};\n\nexports.deinterlace = deinterlace;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.lzw = void 0;\n\n/**\r\n * javascript port of java LZW decompression\r\n * Original java author url: https://gist.github.com/devunwired/4479231\r\n */\nvar lzw = function lzw(minCodeSize, data, pixelCount) {\n var MAX_STACK_SIZE = 4096;\n var nullCode = -1;\n var npix = pixelCount;\n var available, clear, code_mask, code_size, end_of_information, in_code, old_code, bits, code, i, datum, data_size, first, top, bi, pi;\n var dstPixels = new Array(pixelCount);\n var prefix = new Array(MAX_STACK_SIZE);\n var suffix = new Array(MAX_STACK_SIZE);\n var pixelStack = new Array(MAX_STACK_SIZE + 1); // Initialize GIF data stream decoder.\n\n data_size = minCodeSize;\n clear = 1 << data_size;\n end_of_information = clear + 1;\n available = clear + 2;\n old_code = nullCode;\n code_size = data_size + 1;\n code_mask = (1 << code_size) - 1;\n\n for (code = 0; code < clear; code++) {\n prefix[code] = 0;\n suffix[code] = code;\n } // Decode GIF pixel stream.\n\n\n var datum, bits, count, first, top, pi, bi;\n datum = bits = count = first = top = pi = bi = 0;\n\n for (i = 0; i < npix;) {\n if (top === 0) {\n if (bits < code_size) {\n // get the next byte\n datum += data[bi] << bits;\n bits += 8;\n bi++;\n continue;\n } // Get the next code.\n\n\n code = datum & code_mask;\n datum >>= code_size;\n bits -= code_size; // Interpret the code\n\n if (code > available || code == end_of_information) {\n break;\n }\n\n if (code == clear) {\n // Reset decoder.\n code_size = data_size + 1;\n code_mask = (1 << code_size) - 1;\n available = clear + 2;\n old_code = nullCode;\n continue;\n }\n\n if (old_code == nullCode) {\n pixelStack[top++] = suffix[code];\n old_code = code;\n first = code;\n continue;\n }\n\n in_code = code;\n\n if (code == available) {\n pixelStack[top++] = first;\n code = old_code;\n }\n\n while (code > clear) {\n pixelStack[top++] = suffix[code];\n code = prefix[code];\n }\n\n first = suffix[code] & 0xff;\n pixelStack[top++] = first; // add a new string to the table, but only if space is available\n // if not, just continue with current table until a clear code is found\n // (deferred clear code implementation as per GIF spec)\n\n if (available < MAX_STACK_SIZE) {\n prefix[available] = old_code;\n suffix[available] = first;\n available++;\n\n if ((available & code_mask) === 0 && available < MAX_STACK_SIZE) {\n code_size++;\n code_mask += available;\n }\n }\n\n old_code = in_code;\n } // Pop a pixel off the pixel stack.\n\n\n top--;\n dstPixels[pi++] = pixelStack[top];\n i++;\n }\n\n for (i = pi; i < npix; i++) {\n dstPixels[i] = 0; // clear missing pixels\n }\n\n return dstPixels;\n};\n\nexports.lzw = lzw;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.decompressFrames = exports.decompressFrame = exports.parseGIF = void 0;\n\nvar _gif = _interopRequireDefault(require(\"js-binary-schema-parser/lib/schemas/gif\"));\n\nvar _jsBinarySchemaParser = require(\"js-binary-schema-parser\");\n\nvar _uint = require(\"js-binary-schema-parser/lib/parsers/uint8\");\n\nvar _deinterlace = require(\"./deinterlace\");\n\nvar _lzw = require(\"./lzw\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nvar parseGIF = function parseGIF(arrayBuffer) {\n var byteData = new Uint8Array(arrayBuffer);\n return (0, _jsBinarySchemaParser.parse)((0, _uint.buildStream)(byteData), _gif[\"default\"]);\n};\n\nexports.parseGIF = parseGIF;\n\nvar generatePatch = function generatePatch(image) {\n var totalPixels = image.pixels.length;\n var patchData = new Uint8ClampedArray(totalPixels * 4);\n\n for (var i = 0; i < totalPixels; i++) {\n var pos = i * 4;\n var colorIndex = image.pixels[i];\n var color = image.colorTable[colorIndex] || [0, 0, 0];\n patchData[pos] = color[0];\n patchData[pos + 1] = color[1];\n patchData[pos + 2] = color[2];\n patchData[pos + 3] = colorIndex !== image.transparentIndex ? 255 : 0;\n }\n\n return patchData;\n};\n\nvar decompressFrame = function decompressFrame(frame, gct, buildImagePatch) {\n if (!frame.image) {\n console.warn('gif frame does not have associated image.');\n return;\n }\n\n var image = frame.image; // get the number of pixels\n\n var totalPixels = image.descriptor.width * image.descriptor.height; // do lzw decompression\n\n var pixels = (0, _lzw.lzw)(image.data.minCodeSize, image.data.blocks, totalPixels); // deal with interlacing if necessary\n\n if (image.descriptor.lct.interlaced) {\n pixels = (0, _deinterlace.deinterlace)(pixels, image.descriptor.width);\n }\n\n var resultImage = {\n pixels: pixels,\n dims: {\n top: frame.image.descriptor.top,\n left: frame.image.descriptor.left,\n width: frame.image.descriptor.width,\n height: frame.image.descriptor.height\n }\n }; // color table\n\n if (image.descriptor.lct && image.descriptor.lct.exists) {\n resultImage.colorTable = image.lct;\n } else {\n resultImage.colorTable = gct;\n } // add per frame relevant gce information\n\n\n if (frame.gce) {\n resultImage.delay = (frame.gce.delay || 10) * 10; // convert to ms\n\n resultImage.disposalType = frame.gce.extras.disposal; // transparency\n\n if (frame.gce.extras.transparentColorGiven) {\n resultImage.transparentIndex = frame.gce.transparentColorIndex;\n }\n } // create canvas usable imagedata if desired\n\n\n if (buildImagePatch) {\n resultImage.patch = generatePatch(resultImage);\n }\n\n return resultImage;\n};\n\nexports.decompressFrame = decompressFrame;\n\nvar decompressFrames = function decompressFrames(parsedGif, buildImagePatches) {\n return parsedGif.frames.filter(function (f) {\n return f.image;\n }).map(function (f) {\n return decompressFrame(f, parsedGif.gct, buildImagePatches);\n });\n};\n\nexports.decompressFrames = decompressFrames;","import { decompressFrames, parseGIF } from 'gifuct-js';\n\nexport async function getGifFirstFrame(gifUrl) {\n try {\n const response = await fetch(gifUrl);\n const buffer = await response.arrayBuffer();\n\n const gif = parseGIF(buffer);\n const frames = decompressFrames(gif, true);\n\n if (!frames?.length) return null;\n\n const { dims, patch } = frames[0];\n const { width, height } = dims;\n\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d');\n\n const imageData = new ImageData(patch, width, height);\n ctx.putImageData(imageData, 0, 0);\n\n const blob = await new Promise((resolve) => {\n canvas.toBlob(resolve, 'image/png');\n });\n\n return URL.createObjectURL(blob);\n } catch (e) {\n return null;\n }\n}\n","export default function CustomEmoji({ staticUrl, alt, url }) {\n return (\n <picture>\n {staticUrl && (\n <source srcset={staticUrl} media=\"(prefers-reduced-motion: reduce)\" />\n )}\n <img\n key={alt || url}\n src={url}\n alt={alt}\n class=\"shortcode-emoji emoji\"\n width=\"16\"\n height=\"16\"\n loading=\"lazy\"\n decoding=\"async\"\n fetchPriority=\"low\"\n onLoad={(e) => {\n try {\n e.target.dataset.isLarger =\n e.target.naturalWidth > e.target.width * 2 ||\n e.target.naturalHeight > e.target.height * 2;\n } catch (e) {}\n }}\n />\n </picture>\n );\n}\n","import PQueue from 'p-queue';\nimport { useEffect, useState } from 'preact/hooks';\n\nimport { getGifFirstFrame } from '../utils/get-gif-first-frame';\nimport mem from '../utils/mem';\n\nimport CustomEmoji from './custom-emoji';\n\nconst fetchQueue = new PQueue({\n concurrency: 2,\n interval: 1000,\n intervalCap: 2,\n});\n\nconst throttledFetch = (signal, ...args) =>\n fetchQueue.add(() => fetch(...args), { signal });\n\nconst SHORTCODES_REGEX = /(\\:(\\w|\\+|\\-)+\\:)(?=|[\\!\\.\\?]|$)/g;\n\nconst shortcodesRegexp = mem((shortcodes) => {\n return new RegExp(`:(${shortcodes.join('|')}):`, 'g');\n});\n\nconst resolvedEmojisCache = new Map();\nconst MAX_CACHE_SIZE = 30;\n\nconst resolveEmojis = async (resolverURL) => {\n if (resolvedEmojisCache.has(resolverURL)) {\n return resolvedEmojisCache.get(resolverURL);\n }\n\n try {\n const response = await throttledFetch(null, resolverURL, {\n headers: { accept: 'application/activity+json' },\n referrerPolicy: 'no-referrer',\n });\n\n const data = await response.json();\n const emojiTags = data.tag?.filter((t) => t.type === 'Emoji') || [];\n\n const emojis = emojiTags.length\n ? await Promise.all(\n emojiTags.map(async (t) => {\n const emoji = {\n shortcode: t.name.replace(/^:|:$/g, ''),\n url: t.icon.url,\n };\n if (t.icon?.mediaType === 'image/gif') {\n const staticUrl = await getGifFirstFrame(emoji.url);\n if (staticUrl) emoji.staticUrl = staticUrl;\n }\n return emoji;\n }),\n )\n : [];\n\n if (resolvedEmojisCache.size >= MAX_CACHE_SIZE) {\n const firstKey = resolvedEmojisCache.keys().next().value;\n resolvedEmojisCache.delete(firstKey);\n }\n\n resolvedEmojisCache.set(resolverURL, emojis);\n return emojis;\n } catch (error) {\n console.error('Failed to resolve emojis:', error);\n return [];\n }\n};\n\nconst renderEmojiText = mem((text, allEmojis, staticEmoji) => {\n if (!text) return '';\n if (!text.includes(':')) return text;\n if (!allEmojis.length) return text;\n\n const regex = shortcodesRegexp(allEmojis.map((e) => e.shortcode));\n const elements = text.split(regex).map((word, index) => {\n const emoji = allEmojis.find((e) => e.shortcode === word);\n\n if (emoji) {\n const { url, staticUrl } = emoji;\n return (\n <CustomEmoji\n key={`${word}-${index}`}\n staticUrl={staticEmoji ? undefined : staticUrl}\n url={staticEmoji ? staticUrl || url : url}\n alt={word}\n />\n );\n }\n\n return word;\n });\n\n return elements;\n});\n\nfunction EmojiText({ text, emojis = [], staticEmoji, resolverURL }) {\n const [resolvedEmojis, setResolvedEmojis] = useState(\n () => resolvedEmojisCache.get(resolverURL) || [],\n );\n const [loading, setLoading] = useState(false);\n\n useEffect(() => {\n if (!resolverURL || !text?.includes(':')) return;\n\n const matches = text.match(SHORTCODES_REGEX);\n if (!matches) return;\n\n const hasUnresolved = matches.some((match) => {\n const shortcode = match.slice(1, -1);\n return !emojis.some((e) => e.shortcode === shortcode);\n });\n if (!hasUnresolved) return;\n\n if (resolvedEmojisCache.has(resolverURL)) return;\n\n setLoading(true);\n\n (async () => {\n const emojis = await resolveEmojis(resolverURL);\n setResolvedEmojis(emojis);\n setLoading(false);\n })();\n }, [resolverURL, text, emojis?.length]);\n\n if (!text) return '';\n if (!text.includes(':')) return text;\n\n if (resolverURL && loading) {\n return text.replace(SHORTCODES_REGEX, '');\n }\n\n const allEmojis = [\n ...resolvedEmojis.filter(\n (resolved) =>\n !emojis.some((emoji) => emoji.shortcode === resolved.shortcode),\n ),\n ...emojis,\n ];\n\n return renderEmojiText(text, allEmojis, staticEmoji);\n}\n\nexport default EmojiText;\n","import getDomain from '../utils/get-domain';\nimport { getCurrentAccountID } from '../utils/store-utils';\n\nfunction RolesTags({ roles, accountId, accountUrl, hideSelf = false }) {\n if (!roles?.length) return null;\n\n const isSelf = accountId && accountId === getCurrentAccountID();\n if (!accountId && hideSelf) {\n console.warn('accountId is required if hideSelf is true');\n }\n if (hideSelf && isSelf) return null;\n\n const parsedAccountInstance = getDomain(accountUrl);\n\n return roles?.map((role) => (\n <>\n {' '}\n <span class=\"tag collapsed tag-role\">\n {role.name}\n {!!parsedAccountInstance && (\n <>\n {' '}\n <span class=\"more-insignificant\">{parsedAccountInstance}</span>\n </>\n )}\n </span>\n </>\n ));\n}\n\nexport default RolesTags;\n","import './name-text.css';\n\nimport { useLingui } from '@lingui/react';\n\nimport { api } from '../utils/api';\nimport mem from '../utils/mem';\nimport states from '../utils/states';\n\nimport Avatar from './avatar';\nimport EmojiText from './emoji-text';\nimport RolesTags from './roles-tags';\n\nconst nameCollator = mem((locale) => {\n const options = {\n sensitivity: 'base',\n };\n try {\n return new Intl.Collator(locale || undefined, options);\n } catch (e) {\n return new Intl.Collator(undefined, options);\n }\n});\n\nconst ACCT_REGEX = /([^@]+)(@.+)/i;\nconst SHORTCODES_REGEX = /(\\:(\\w|\\+|\\-)+\\:)(?=|[\\!\\.\\?]|$)/g;\nconst SPACES_REGEX = /\\s+/g;\nconst NON_ALPHA_NUMERIC_REGEX = /[^a-z0-9@\\.]/gi;\n\nfunction NameText({\n account,\n instance,\n showAvatar,\n showAcct,\n short,\n external,\n onClick,\n}) {\n const { i18n } = useLingui();\n if (!account) return null;\n const {\n acct,\n avatar,\n avatarStatic,\n id,\n url,\n displayName,\n emojis,\n bot,\n username,\n roles,\n } = account;\n const [_, acct1, acct2] = acct.match(ACCT_REGEX) || [, acct];\n\n if (!instance) instance = api().instance;\n\n const trimmedUsername = username.toLowerCase().trim();\n const trimmedDisplayName = (displayName || '').toLowerCase().trim();\n const shortenedDisplayName = trimmedDisplayName\n .replace(SHORTCODES_REGEX, '') // Remove shortcodes, regex from https://regex101.com/r/iE9uV0/1\n .replace(SPACES_REGEX, ''); // E.g. \"My name\" === \"myname\"\n const shortenedAlphaNumericDisplayName = shortenedDisplayName.replace(\n NON_ALPHA_NUMERIC_REGEX,\n '',\n ); // Remove non-alphanumeric characters\n\n const hideUsername =\n (!short &&\n (trimmedUsername === trimmedDisplayName ||\n trimmedUsername === shortenedDisplayName ||\n trimmedUsername === shortenedAlphaNumericDisplayName ||\n nameCollator(i18n.locale).compare(\n trimmedUsername,\n shortenedDisplayName,\n ) === 0)) ||\n shortenedAlphaNumericDisplayName === acct.toLowerCase();\n\n return (\n <a\n class={`name-text ${showAcct ? 'show-acct' : ''} ${short ? 'short' : ''}`}\n href={url}\n target={external ? '_blank' : null}\n title={\n displayName\n ? `${displayName} (${acct2 ? '' : '@'}${acct})`\n : `${acct2 ? '' : '@'}${acct}`\n }\n onClick={(e) => {\n if (external) return;\n if (e.shiftKey) return; // Save link? 🤷‍♂️\n e.preventDefault();\n e.stopPropagation();\n if (onClick) return onClick(e);\n if (e.metaKey || e.ctrlKey || e.shiftKey || e.which === 2) {\n const internalURL = `#/${instance}/a/${id}`;\n window.open(internalURL, '_blank');\n return;\n }\n states.showAccount = {\n account,\n instance,\n };\n }}\n >\n {showAvatar && (\n <>\n <Avatar url={avatarStatic || avatar} squircle={bot} />{' '}\n </>\n )}\n {displayName && !short ? (\n <>\n <b dir=\"auto\">\n <EmojiText\n text={displayName}\n emojis={emojis}\n resolverURL={account.url}\n staticEmoji\n />\n </b>\n {!showAcct && !hideUsername && (\n <>\n {' '}\n <i class=\"bidi-isolate\">@{username}</i>\n <RolesTags\n roles={roles}\n accountId={id}\n accountUrl={url}\n hideSelf\n />\n </>\n )}\n </>\n ) : short ? (\n <i>{username}</i>\n ) : (\n <b>{username}</b>\n )}\n {showAcct && (\n <>\n <br />\n <i class=\"bidi-isolate\">\n {acct2 ? '' : '@'}\n {acct1}\n {!!acct2 && <span class=\"ib\">{acct2}</span>}\n </i>\n <RolesTags roles={roles} accountUrl={url} />\n </>\n )}\n </a>\n );\n}\n\nexport default NameText;\n","import{useRef as r,useMemo as n,useEffect as t,useState as e,useCallback as u}from\"react\";function c(e,u,c,i){var l=this,a=r(null),o=r(0),f=r(0),v=r(null),d=r([]),m=r(),s=r(),g=r(e),h=r(!0),x=r(),E=r();g.current=e;var b=\"undefined\"!=typeof window,p=!u&&0!==u&&b;if(\"function\"!=typeof e)throw new TypeError(\"Expected a function\");u=+u||0;var y=!!(c=c||{}).leading,w=!(\"trailing\"in c)||!!c.trailing,O=!!c.flushOnExit&&w,F=\"maxWait\"in c,L=\"debounceOnServer\"in c&&!!c.debounceOnServer,A=F?Math.max(+c.maxWait||0,u):null,D=n(function(){var r=function(r){var n=d.current,t=m.current;return d.current=m.current=null,o.current=r,f.current=f.current||r,s.current=g.current.apply(t,n)},n=function(r,n){p&&cancelAnimationFrame(v.current),v.current=p?requestAnimationFrame(r):setTimeout(r,n)},t=function(r){if(!h.current)return!1;var n=r-a.current;return!a.current||n>=u||n<0||F&&r-o.current>=A},e=function(n){return v.current=null,w&&d.current?r(n):(d.current=m.current=null,s.current)},c=function r(){var c=Date.now();if(y&&f.current===o.current&&D(),t(c))return e(c);if(h.current){var i=u-(c-a.current),l=F?Math.min(i,A-(c-o.current)):i;n(r,l)}},D=function(){i&&i({})},S=function(){if(b||L){var e,i=Date.now(),f=t(i);if(d.current=[].slice.call(arguments),m.current=l,a.current=i,O&&!x.current&&(x.current=function(){var r;\"hidden\"===(null==(r=global.document)?void 0:r.visibilityState)&&E.current.flush()},null==(e=global.document)||null==e.addEventListener||e.addEventListener(\"visibilitychange\",x.current)),f){if(!v.current&&h.current)return o.current=a.current,n(c,u),y?r(a.current):s.current;if(F)return n(c,u),r(a.current)}return v.current||n(c,u),s.current}};return S.cancel=function(){var r=v.current;r&&(p?cancelAnimationFrame(v.current):clearTimeout(v.current)),o.current=0,d.current=a.current=m.current=v.current=null,r&&i&&i({})},S.isPending=function(){return!!v.current},S.flush=function(){return v.current?e(Date.now()):s.current},S},[y,F,u,A,w,O,p,b,L,i]);return E.current=D,t(function(){return h.current=!0,function(){var r;O&&E.current.flush(),x.current&&(null==(r=global.document)||null==r.removeEventListener||r.removeEventListener(\"visibilitychange\",x.current),x.current=null),h.current=!1}},[O]),D}function i(r,n){return r===n}function l(n,t,l){var a=l&&l.equalityFn||i,o=r(n),f=e({})[1],v=c(u(function(r){o.current=r,f({})},[f]),t,l,f),d=r(n);return a(d.current,n)||(v(n),d.current=n),[o.current,v]}function a(r,n,t){var e=void 0===t?{}:t,u=e.leading,i=e.trailing,l=e.flushOnExit;return c(r,n,{maxWait:n,leading:void 0===u||u,trailing:void 0===i||i,flushOnExit:void 0!==l&&l})}export{l as useDebounce,c as useDebouncedCallback,a as useThrottledCallback};\n//# sourceMappingURL=index.module.js.map\n","import { i18n } from '@lingui/core';\n\nimport translangLanguagesNative from '../data/translang-languages-native';\n\nimport mem from './mem';\n\n// Some codes are not supported by Intl.DisplayNames\n// These are mapped to other codes as fallback\nconst codeMappings = {\n 'zh-YUE': 'YUE',\n zh_HANT: 'zh-Hant',\n};\n\nconst IntlDN = mem(\n (locale) =>\n new Intl.DisplayNames(locale || undefined, {\n type: 'language',\n }),\n);\n\nfunction _localeCode2Text(code) {\n let locale;\n let fallback;\n if (typeof code === 'object') {\n ({ code, locale, fallback } = code);\n }\n try {\n const text = IntlDN(locale || i18n.locale).of(code);\n if (text !== code) return text;\n if (!fallback) {\n const anotherText = IntlDN(code).of(code);\n if (anotherText !== code) return anotherText;\n const yetAnotherText = translangLanguagesNative?.[locale];\n if (yetAnotherText !== code) return yetAnotherText;\n }\n return fallback || '';\n } catch (e) {\n if (codeMappings[code]) {\n try {\n const text = IntlDN(codeMappings[locale] || locale || i18n.locale).of(\n codeMappings[code],\n );\n if (text !== codeMappings[code]) return text;\n return fallback || '';\n } catch (e2) {\n console.warn(code, e2);\n }\n }\n return fallback || '';\n }\n}\n\nexport default mem(_localeCode2Text);\n","import languages from '../data/translang-languages';\n\nimport { getDtfLocale } from './dtf-locale';\nimport localeMatch from './locale-match';\nimport states from './states';\n\nconst translationTargetLanguages = Object.entries(languages.tl).map(\n ([code, { name }]) => ({\n code,\n name,\n }),\n);\n\nconst locales = [...navigator.languages];\nconst dtfLocale = getDtfLocale();\nif (dtfLocale && !locales.includes(dtfLocale)) {\n locales.unshift(dtfLocale);\n}\n\nconst localeTargetLanguages = () =>\n localeMatch(\n locales,\n translationTargetLanguages.map((l) => l.code.replace('_', '-')), // The underscore will fail Intl.Locale inside `match`\n 'en',\n );\n\nfunction getTranslateTargetLanguage(fromSettings = false) {\n if (fromSettings) {\n const { contentTranslationTargetLanguage } = states.settings;\n if (contentTranslationTargetLanguage) {\n return contentTranslationTargetLanguage;\n }\n }\n return localeTargetLanguages();\n}\n\nexport default getTranslateTargetLanguage;\n","import { i18n } from '@lingui/core';\n\n// https://tc39.es/ecma402/#table-sanctioned-single-unit-identifiers\nconst BYTES_UNITS = [\n 'byte',\n 'kilobyte',\n 'megabyte',\n 'gigabyte',\n 'terabyte',\n 'petabyte',\n];\nexport default function prettyBytes(bytes) {\n const unitIndex = Math.min(\n Math.floor(Math.log2(bytes) / 10),\n BYTES_UNITS.length - 1,\n );\n const value = bytes / 1024 ** unitIndex;\n return i18n.number(value, {\n style: 'unit',\n unit: BYTES_UNITS[unitIndex],\n unitDisplay: 'narrow',\n maximumFractionDigits: 0,\n });\n}\n","import { getAPIVersions } from './store-utils';\n\nexport function supportsNativeQuote() {\n return getAPIVersions()?.mastodon >= 7;\n}\n\nexport function getPostQuoteApprovalPolicy(quoteApproval) {\n return quoteApproval?.[quoteApproval?.currentUser]?.[0] || 'nobody';\n}\n","const ESCAPE_REGEX = /[.*+?^${}()|[\\]\\\\]/g;\nconst HTML_ESCAPE_MAP = {\n '&': '&amp;',\n '\"': '&quot;',\n '<': '&lt;',\n '>': '&gt;',\n};\nconst HTML_ESCAPE_REGEX = /[&\"<>]/g;\n\nfunction escapeRegex(str) {\n return str.replace(ESCAPE_REGEX, '\\\\$&');\n}\n\nfunction escapeHTML(str) {\n return str.replace(HTML_ESCAPE_REGEX, (char) => HTML_ESCAPE_MAP[char]);\n}\n\nfunction emojifyText(text, emojis = []) {\n if (!text) return '';\n if (!emojis.length) return text;\n if (!text.includes(':')) return text;\n\n // Deduplicate emojis by shortcode and filter out invalid entries\n const emojiMap = new Map();\n for (let i = 0; i < emojis.length; i++) {\n const emoji = emojis[i];\n if (emoji?.shortcode && emoji?.url) {\n emojiMap.set(emoji.shortcode, emoji);\n }\n }\n\n if (emojiMap.size === 0) return text;\n\n const shortcodes = Array.from(emojiMap.keys());\n const pattern = shortcodes.map((sc) => `:${escapeRegex(sc)}:`).join('|');\n const regex = new RegExp(pattern, 'g');\n\n return text.replace(regex, (match) => {\n const shortcode = match.slice(1, -1);\n const emoji = emojiMap.get(shortcode);\n\n if (!emoji) return match;\n\n const { staticUrl, url } = emoji;\n const escapedShortcode = escapeHTML(match);\n\n const sourceTag = staticUrl\n ? `<source srcset=\"${staticUrl}\" media=\"(prefers-reduced-motion: reduce)\"></source>`\n : '';\n\n return `<picture>${sourceTag}<img class=\"shortcode-emoji emoji\" src=\"${url}\" alt=\"${escapedShortcode}\" title=\"${shortcode}\" width=\"16\" height=\"16\" loading=\"lazy\" decoding=\"async\" fetchPriority=\"low\" onload=\"try { this.dataset.isLarger = this.naturalWidth > (this.width * 2) || this.naturalHeight > (this.height * 2) } catch (e) {}\" /></picture>`;\n });\n}\n\nexport default emojifyText;\n","const HTML_CHARS_REGEX = /[&<>\"']/g;\nconst HTML_ENTITIES = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;',\n \"'\": '&apos;',\n};\n\nexport default function escapeHTML(text) {\n return text.replace(HTML_CHARS_REGEX, (c) => HTML_ENTITIES[c]);\n}\n","import emojifyText from './emojify-text';\nimport escapeHTML from './escape-html';\nimport mem from './mem';\n\nconst fauxDiv = document.createElement('div');\nconst whitelistLinkClasses = ['u-url', 'mention', 'hashtag'];\n\nconst LINK_REGEX = /<a/i;\nconst HTTP_LINK_REGEX = /^https?:\\/\\//i;\nconst MENTION_REGEX = /^[@][^@]+(@[^@]+)?$/;\nconst HASHTAG_REGEX = /^[#][^#]+$/;\nconst CODE_BLOCK_REGEX = /^```[^]+```$/;\nconst CODE_BLOCK_START_REGEX = /^```/;\nconst CODE_BLOCK_END_REGEX = /```$/;\nconst INLINE_CODE_REGEX = /`[^`]+`/;\nconst TWITTER_DOMAIN_REGEX = /(twitter|x)\\.com/i;\nconst TWITTER_MENTION_REGEX = /@[a-zA-Z0-9_]+@(twitter|x)\\.com/;\nconst TWITTER_MENTION_CAPTURE_REGEX = /(@([a-zA-Z0-9_]+)@(twitter|x)\\.com)/g;\nconst CODE_INLINE_CAPTURE_REGEX = /(`[^]+?`)/g;\n\nfunction createDOM(html, isDocumentFragment) {\n if (isDocumentFragment) {\n const tpl = document.createElement('template');\n tpl.innerHTML = html;\n return tpl.content;\n } else {\n const tpl = document.createElement('div');\n tpl.innerHTML = html;\n return tpl;\n }\n}\n\nfunction _enhanceContent(content, opts = {}) {\n if (!content) return '';\n const { emojis, returnDOM, postEnhanceDOM = () => {} } = opts;\n let enhancedContent = content;\n // const dom = document.createElement('div');\n // dom.innerHTML = enhancedContent;\n const dom = createDOM(enhancedContent, returnDOM);\n const hasLink = LINK_REGEX.test(enhancedContent);\n const hasCodeBlock = enhancedContent.includes('```');\n\n if (hasLink) {\n // Add target=\"_blank\" to all links with no target=\"_blank\"\n // E.g. `note` in `account`\n const noTargetBlankLinks = dom.querySelectorAll('a:not([target=\"_blank\"])');\n for (const link of noTargetBlankLinks) {\n link.setAttribute('target', '_blank');\n }\n\n // Remove all classes except `u-url`, `mention`, `hashtag`\n const links = dom.querySelectorAll('a[class]');\n for (const link of links) {\n for (const c of link.classList) {\n if (!whitelistLinkClasses.includes(c)) {\n link.classList.remove(c);\n }\n }\n }\n }\n\n // Add 'has-url-text' to all links that contains a url\n if (hasLink) {\n const links = dom.querySelectorAll('a[href]');\n for (const link of links) {\n if (HTTP_LINK_REGEX.test(link.textContent.trim())) {\n link.classList.add('has-url-text');\n shortenLink(link);\n }\n }\n }\n\n // Spanify un-spanned mentions\n if (hasLink) {\n const links = dom.querySelectorAll('a[href]');\n const usernames = [];\n for (const link of links) {\n const text = link.innerText.trim();\n const hasChildren = link.querySelector('*');\n // If text looks like @username@domain, then it's a mention\n if (MENTION_REGEX.test(text)) {\n // Only show @username\n const atSymbol = text[0]; // Preserve the original @ or \n const [_, username, domain] = text.split(/[@]/);\n if (!hasChildren) {\n if (\n !usernames.some(([u]) => u === username) ||\n usernames.some(([u, d]) => u === username && d === domain)\n ) {\n link.innerHTML = `${atSymbol}<span>${username}</span>`;\n usernames.push([username, domain]);\n } else {\n link.innerHTML = `${atSymbol}<span>${username}@${domain}</span>`;\n }\n }\n link.classList.add('mention');\n }\n // If text looks like #hashtag, then it's a hashtag\n if (HASHTAG_REGEX.test(text)) {\n const hashSymbol = text[0]; // Preserve the original # or \n if (!hasChildren)\n link.innerHTML = `${hashSymbol}<span>${text.slice(1)}</span>`;\n link.classList.add('mention', 'hashtag');\n }\n }\n }\n\n // EMOJIS\n // ======\n // Convert :shortcode: to <img />\n let textNodes;\n if (enhancedContent.includes(':') && emojis?.length) {\n textNodes = extractTextNodes(dom);\n for (const node of textNodes) {\n let html = escapeHTML(node.nodeValue);\n html = emojifyText(html, emojis);\n fauxDiv.innerHTML = html;\n node.replaceWith(...fauxDiv.childNodes);\n }\n }\n\n // CODE BLOCKS\n // ===========\n // Convert ```code``` to <pre><code>code</code></pre>\n if (hasCodeBlock) {\n const blocks = [...dom.querySelectorAll('p')].filter((p) =>\n CODE_BLOCK_REGEX.test(p.innerText.trim()),\n );\n for (const block of blocks) {\n const pre = document.createElement('pre');\n // Replace <br /> with newlines\n for (const br of block.querySelectorAll('br')) {\n br.replaceWith('\\n');\n }\n pre.innerHTML = `<code>${block.innerHTML.trim()}</code>`;\n block.replaceWith(pre);\n }\n }\n\n // Convert multi-paragraph code blocks to <pre><code>code</code></pre>\n if (hasCodeBlock) {\n const paragraphs = [...dom.querySelectorAll('p')];\n // Filter out paragraphs with ``` in beginning only\n const codeBlocks = paragraphs.filter((p) =>\n CODE_BLOCK_START_REGEX.test(p.innerText),\n );\n // For each codeBlocks, get all paragraphs until the last paragraph with ``` at the end only\n for (const block of codeBlocks) {\n const nextParagraphs = [block];\n let hasCodeBlock = false;\n let currentBlock = block;\n while (currentBlock.nextElementSibling) {\n const next = currentBlock.nextElementSibling;\n if (next && next.tagName === 'P') {\n if (CODE_BLOCK_END_REGEX.test(next.innerText)) {\n nextParagraphs.push(next);\n hasCodeBlock = true;\n break;\n } else {\n nextParagraphs.push(next);\n }\n } else {\n break;\n }\n currentBlock = next;\n }\n if (hasCodeBlock) {\n const pre = document.createElement('pre');\n for (const p of nextParagraphs) {\n // Replace <br /> with newlines\n for (const br of p.querySelectorAll('br')) {\n br.replaceWith('\\n');\n }\n }\n const codeText = nextParagraphs.map((p) => p.innerHTML).join('\\n\\n');\n pre.innerHTML = `<code tabindex=\"0\">${codeText}</code>`;\n block.replaceWith(pre);\n for (const p of nextParagraphs) {\n p.remove();\n }\n }\n }\n }\n\n // INLINE CODE\n // ===========\n // Convert `code` to <code>code</code>\n if (enhancedContent.includes('`')) {\n textNodes = extractTextNodes(dom);\n for (const node of textNodes) {\n let html = escapeHTML(node.nodeValue);\n if (INLINE_CODE_REGEX.test(html)) {\n html = html.replaceAll(CODE_INLINE_CAPTURE_REGEX, '<code>$1</code>');\n }\n fauxDiv.innerHTML = html;\n // const nodes = [...fauxDiv.childNodes];\n node.replaceWith(...fauxDiv.childNodes);\n }\n }\n\n // TWITTER USERNAMES\n // =================\n // Convert @username@twitter.com to <a href=\"https://twitter.com/username\">@username@twitter.com</a>\n if (TWITTER_DOMAIN_REGEX.test(enhancedContent)) {\n textNodes = extractTextNodes(dom, {\n rejectFilter: ['A'],\n });\n for (const node of textNodes) {\n let html = escapeHTML(node.nodeValue);\n if (TWITTER_MENTION_REGEX.test(html)) {\n html = html.replaceAll(\n TWITTER_MENTION_CAPTURE_REGEX,\n '<a href=\"https://twitter.com/$2\" rel=\"nofollow noopener\" target=\"_blank\">$1</a>',\n );\n }\n fauxDiv.innerHTML = html;\n // const nodes = [...fauxDiv.childNodes];\n node.replaceWith(...fauxDiv.childNodes);\n }\n }\n\n // HASHTAG STUFFING\n // ================\n // Get the <p> that contains a lot of hashtags, add a class to it\n if (enhancedContent.includes('#') || enhancedContent.includes('')) {\n let prevIndex = null;\n const hashtagStuffedParagraphs = [...dom.querySelectorAll('p')].filter(\n (p, index) => {\n let hashtagCount = 0;\n for (let i = 0; i < p.childNodes.length; i++) {\n const node = p.childNodes[i];\n\n if (node.nodeType === Node.TEXT_NODE) {\n const text = node.textContent.trim();\n if (text !== '') {\n return false;\n }\n } else if (node.tagName === 'BR') {\n // Ignore <br />\n } else if (node.tagName === 'A') {\n const linkText = node.textContent.trim();\n if (\n !linkText ||\n !(linkText.startsWith('#') || linkText.startsWith(''))\n ) {\n return false;\n } else {\n hashtagCount++;\n }\n } else {\n return false;\n }\n }\n // Only consider \"stuffing\" if:\n // - there are more than 3 hashtags\n // - there are more than 1 hashtag in adjacent paragraphs\n if (hashtagCount > 3) {\n prevIndex = index;\n return true;\n }\n if (hashtagCount > 1 && prevIndex && index === prevIndex + 1) {\n prevIndex = index;\n return true;\n }\n },\n );\n if (hashtagStuffedParagraphs?.length) {\n for (const p of hashtagStuffedParagraphs) {\n p.classList.add('hashtag-stuffing');\n p.title = p.innerText;\n }\n }\n }\n\n // ADD ASPECT RATIO TO ALL IMAGES\n if (enhancedContent.includes('<img')) {\n const imgs = dom.querySelectorAll('img');\n for (let i = 0; i < imgs.length; i++) {\n const img = imgs[i];\n const width = img.getAttribute('width') || img.naturalWidth;\n const height = img.getAttribute('height') || img.naturalHeight;\n if (width && height) {\n img.style.setProperty('--original-aspect-ratio', `${width}/${height}`);\n }\n }\n }\n\n // FIX CLOAK MODE FOR SAFARI\n // Workaround for Safari so that `text-decoration-thickness` works\n // Wrap child text nodes in spans\n for (const node of dom.childNodes) {\n if (node.nodeType === Node.TEXT_NODE && node.textContent.trim?.()) {\n const span = document.createElement('span');\n span.textContent = node.textContent;\n dom.replaceChild(span, node);\n }\n }\n\n if (postEnhanceDOM) {\n queueMicrotask(() => postEnhanceDOM(dom));\n // postEnhanceDOM(dom); // mutate dom\n }\n\n return returnDOM ? dom : dom.innerHTML;\n}\nconst enhanceContent = mem(_enhanceContent);\n\nconst defaultRejectFilter = [\n // Document metadata\n 'STYLE',\n // Image and multimedia\n 'IMG',\n 'VIDEO',\n 'AUDIO',\n 'AREA',\n 'MAP',\n 'TRACK',\n // Embedded content\n 'EMBED',\n 'IFRAME',\n 'OBJECT',\n 'PICTURE',\n 'PORTAL',\n 'SOURCE',\n // SVG and MathML\n 'SVG',\n 'MATH',\n // Scripting\n 'CANVAS',\n 'NOSCRIPT',\n 'SCRIPT',\n // Forms\n 'INPUT',\n 'OPTION',\n 'TEXTAREA',\n // Web Components\n 'SLOT',\n 'TEMPLATE',\n];\nconst defaultRejectFilterMap = Object.fromEntries(\n defaultRejectFilter.map((nodeName) => [nodeName, true]),\n);\n\nconst URL_PREFIX_REGEX = /^(https?:\\/\\/(www\\.)?|xmpp:)/;\nconst URL_DISPLAY_LENGTH = 30;\n// Similar to https://github.com/mastodon/mastodon/blob/1666b1955992e16f4605b414c6563ca25b3a3f18/app/lib/text_formatter.rb#L54-L69\nfunction shortenLink(link) {\n if (!link || link.querySelector?.('*')) {\n return;\n }\n try {\n const url = link.innerText.trim();\n const prefix = (url.match(URL_PREFIX_REGEX) || [])[0] || '';\n if (!prefix) return;\n const displayURL = url.slice(\n prefix.length,\n prefix.length + URL_DISPLAY_LENGTH,\n );\n const suffix = url.slice(prefix.length + URL_DISPLAY_LENGTH);\n const cutoff = url.slice(prefix.length).length > URL_DISPLAY_LENGTH;\n link.innerHTML = `<span class=\"invisible\">${prefix}</span><span class=${\n cutoff ? 'ellipsis' : ''\n }>${displayURL}</span><span class=\"invisible\">${suffix}</span>`;\n } catch (e) {}\n}\n\nfunction extractTextNodes(dom, opts = {}) {\n const textNodes = [];\n const rejectFilterMap = Object.assign(\n {},\n defaultRejectFilterMap,\n opts.rejectFilter?.reduce((acc, cur) => {\n acc[cur] = true;\n return acc;\n }, {}),\n );\n const walk = document.createTreeWalker(\n dom,\n NodeFilter.SHOW_TEXT,\n {\n acceptNode(node) {\n if (rejectFilterMap[node.parentNode.nodeName]) {\n return NodeFilter.FILTER_REJECT;\n }\n return NodeFilter.FILTER_ACCEPT;\n },\n },\n false,\n );\n let node;\n while ((node = walk.nextNode())) {\n textNodes.push(node);\n }\n return textNodes;\n}\n\nexport default enhanceContent;\n","import states from './states';\n\nconst supportsHover = window.matchMedia('(hover: hover)').matches;\n\nfunction handleContentLinks(opts) {\n const { mentions = [], instance, previewMode, statusURL } = opts || {};\n return (e) => {\n // If cmd/ctrl/shift/alt key is pressed or middle-click, let the browser handle it\n if (e.metaKey || e.ctrlKey || e.shiftKey || e.altKey || e.which === 2) {\n return;\n }\n\n let { target } = e;\n\n // Experiment opening custom emoji in a modal\n // TODO: Rename this function because it's not just for links\n if (target.closest('.shortcode-emoji')) {\n const { naturalWidth, naturalHeight, width, height } = target;\n const kindaLargeRatio = 2;\n const kindaLarge =\n naturalWidth > width * kindaLargeRatio ||\n naturalHeight > height * kindaLargeRatio;\n if (kindaLarge) {\n e.preventDefault();\n e.stopPropagation();\n states.showMediaModal = {\n mediaAttachments: [\n {\n type: 'image',\n url: target.src,\n description: target.title || target.alt,\n },\n ],\n };\n return;\n }\n }\n\n target = target.closest('a');\n if (!target) return;\n // Only handle links inside, not itself or anything outside\n if (!e.currentTarget.contains(target)) return;\n\n const { href } = target;\n\n const prevText = target.previousSibling?.textContent;\n const textBeforeLinkIsAt =\n prevText?.endsWith('@') || prevText?.endsWith('');\n const textStartsWithAt =\n target.innerText.startsWith('@') || target.innerText.startsWith('');\n if (\n ((target.classList.contains('u-url') ||\n target.classList.contains('mention')) &&\n textStartsWithAt) ||\n (textBeforeLinkIsAt && !textStartsWithAt)\n ) {\n const targetText = (\n target.querySelector('span') || target\n ).innerText.trim();\n const username = targetText.replace(/^[@]/, '');\n // Only fallback to acct/username check if url doesn't match\n const mention =\n mentions.find((mention) => mention.url === href) ||\n mentions.find(\n (mention) =>\n mention.acct === username || mention.username === username,\n );\n console.warn('MENTION', mention, href);\n if (mention) {\n e.preventDefault();\n e.stopPropagation();\n states.showAccount = {\n account: mention.acct,\n instance,\n };\n return;\n } else if (!/^http/i.test(targetText)) {\n console.log('mention not found', targetText);\n e.preventDefault();\n e.stopPropagation();\n states.showAccount = {\n account: href,\n instance,\n };\n return;\n }\n } else if (!previewMode) {\n const textBeforeLinkIsHash =\n prevText?.endsWith('#') || prevText?.endsWith('');\n if (target.classList.contains('hashtag') || textBeforeLinkIsHash) {\n e.preventDefault();\n e.stopPropagation();\n const tag = target.innerText.replace(/^[#]/, '').trim();\n const hashURL = instance ? `#/${instance}/t/${tag}` : `#/t/${tag}`;\n console.log({ hashURL });\n location.hash = hashURL;\n return;\n } else if (states.unfurledLinks[href]?.url && statusURL !== href) {\n // If unfurled AND not self-referential\n e.preventDefault();\n e.stopPropagation();\n states.prevLocation = {\n pathname: location.hash.replace(/^#/, ''),\n };\n location.hash = `#${states.unfurledLinks[href].url}`;\n return;\n }\n }\n\n try {\n const urlObj = URL.parse(href);\n const domain = urlObj.hostname.replace(/^www\\./i, '');\n const containsDomain = target.innerText\n .toLowerCase()\n .includes(domain.toLowerCase());\n // Only show this on non-hover devices (touch-only)\n // Assuming that hover-supported = there's a statusbar to see the URL\n // Non-hover devices don't have statusbar, so we show this\n if (!containsDomain && !supportsHover) {\n e.preventDefault();\n e.stopPropagation();\n const linkText = target.innerText.trim();\n states.showOpenLink = {\n url: href,\n linkText,\n };\n }\n } catch (e) {}\n };\n}\n\nexport default handleContentLinks;\n","import { i18n } from '@lingui/core';\n\nexport default function shortenNumber(num) {\n try {\n return i18n.number(num, {\n notation: 'compact',\n roundingMode: 'floor',\n });\n } catch (e) {\n return num;\n }\n}\n","import { satisfies } from 'compare-versions';\n\nimport features from '../data/features.json';\n\nimport { getCurrentInstance, getCurrentNodeInfo } from './store-utils';\n\n// Non-semver(?) UA string detection\nconst containPixelfed = /pixelfed/i;\nconst notContainPixelfed = /^(?!.*pixelfed).*$/i;\nconst containPleroma = /pleroma/i;\nconst containAkkoma = /akkoma/i;\nconst containGTS = /gotosocial/i;\nconst platformFeatures = {\n '@mastodon/lists': notContainPixelfed,\n '@mastodon/filters': notContainPixelfed,\n '@mastodon/mentions': notContainPixelfed,\n '@mastodon/trending-hashtags': notContainPixelfed,\n '@mastodon/trending-links': notContainPixelfed,\n '@mastodon/post-bookmark': notContainPixelfed,\n '@mastodon/post-edit': notContainPixelfed,\n '@mastodon/profile-edit': notContainPixelfed,\n '@mastodon/profile-private-note': notContainPixelfed,\n '@mastodon/pinned-posts': notContainPixelfed,\n '@pixelfed/trending': containPixelfed,\n '@pixelfed/home-include-reblogs': containPixelfed,\n '@pixelfed/global-feed': containPixelfed,\n '@pleroma/local-visibility-post': containPleroma,\n '@akkoma/local-visibility-post': containAkkoma,\n};\n\nconst supportsCache = {};\n\nconst semverExtract = /^\\d+\\.\\d+(\\.\\d+)?/;\nconst atSoftwareSlashMatch = /^@([a-z]+)\\//i;\n\nfunction supports(feature) {\n try {\n let { version, domain } = getCurrentInstance();\n let softwareName = getCurrentNodeInfo()?.software?.name || 'mastodon';\n\n if (softwareName === 'hometown') {\n // Hometown is a Mastodon fork and inherits its features\n softwareName = 'mastodon';\n }\n\n const key = `${domain}-${feature}`;\n if (supportsCache[key]) return supportsCache[key];\n\n if (platformFeatures[feature]) {\n return (supportsCache[key] = platformFeatures[feature].test(version));\n }\n\n const featureMatch = feature.match(atSoftwareSlashMatch);\n if (!featureMatch) {\n // Only software match, e.g. supports('@mastodon')\n const software = feature.replace(/^@/, '');\n return (supportsCache[key] = softwareName === software);\n }\n\n const range = features[feature];\n if (!range) return false;\n\n // '@mastodon/blah' => 'mastodon'\n const featureSoftware = featureMatch[1];\n\n const doesSoftwareMatch = featureSoftware === softwareName.toLowerCase();\n let satisfiesRange = satisfies(version, range, {\n includePrerelease: true,\n loose: true,\n });\n if (!satisfiesRange) {\n try {\n // E.g. \"4.2.1 (compatible; Iceshrimp 2023.12.14-dev-046d237af)\" is invalid semver 😅\n // This regex extracts numbers with dots out and tries again\n // Hopefully this doesn't break anything\n satisfiesRange = satisfies(version.match(semverExtract)?.[0], range, {\n includePrerelease: true,\n loose: false,\n });\n } catch (e) {\n // Ignore\n }\n }\n return (supportsCache[key] = doesSoftwareMatch && satisfiesRange);\n } catch (e) {\n return false;\n }\n}\n\nexport default supports;\n","import './account-block.css';\n\nimport { Plural, Trans, useLingui } from '@lingui/react/macro';\n\n// import { useNavigate } from 'react-router-dom';\nimport enhanceContent from '../utils/enhance-content';\nimport niceDateTime from '../utils/nice-date-time';\nimport shortenNumber from '../utils/shorten-number';\nimport states from '../utils/states';\n\nimport Avatar from './avatar';\nimport EmojiText from './emoji-text';\nimport Icon from './icon';\nimport RolesTags from './roles-tags';\n\nfunction AccountBlock({\n skeleton,\n account,\n avatarSize = 'xl',\n useAvatarStatic = false,\n instance,\n external,\n internal,\n onClick,\n showActivity = false,\n showStats = false,\n accountInstance,\n hideDisplayName = false,\n relationship = {},\n excludeRelationshipAttrs = [],\n}) {\n const { t } = useLingui();\n if (skeleton) {\n return (\n <div class=\"account-block skeleton\">\n <Avatar size={avatarSize} />\n <span>\n <b>████████</b>\n <br />\n <span class=\"account-block-acct\">██████</span>\n </span>\n </div>\n );\n }\n\n if (!account) {\n return null;\n }\n\n // const navigate = useNavigate();\n\n const {\n id,\n acct,\n avatar,\n avatarStatic,\n displayName,\n username,\n emojis,\n url,\n statusesCount,\n lastStatusAt,\n bot,\n fields,\n note,\n group,\n followersCount,\n createdAt,\n locked,\n roles,\n } = account;\n let [_, acct1, acct2] = acct.match(/([^@]+)(@.+)/i) || [, acct];\n if (accountInstance) {\n acct2 = `@${accountInstance}`;\n }\n\n const verifiedField = fields?.find((f) => !!f.verifiedAt && !!f.value);\n\n const excludedRelationship = {};\n for (const r in relationship) {\n if (!excludeRelationshipAttrs.includes(r)) {\n excludedRelationship[r] = relationship[r];\n }\n }\n const hasRelationship =\n excludedRelationship.following ||\n excludedRelationship.followedBy ||\n excludedRelationship.requested;\n\n return (\n <a\n class=\"account-block\"\n href={url}\n target={external ? '_blank' : null}\n title={acct2 ? acct : `@${acct}`}\n onClick={(e) => {\n if (external) return;\n e.preventDefault();\n if (onClick) return onClick(e);\n if (internal) {\n // navigate(`/${instance}/a/${id}`);\n location.hash = `/${instance}/a/${id}`;\n } else {\n states.showAccount = {\n account,\n instance,\n };\n }\n }}\n >\n <div class=\"avatar-container\">\n <Avatar\n url={useAvatarStatic ? avatarStatic : avatar || avatarStatic}\n staticUrl={useAvatarStatic ? undefined : avatarStatic}\n size={avatarSize}\n squircle={bot}\n />\n </div>\n <span class=\"account-block-content\">\n {!hideDisplayName && (\n <>\n {displayName ? (\n <b>\n <EmojiText\n text={displayName}\n emojis={emojis}\n resolverURL={url}\n />\n </b>\n ) : (\n <b>{username}</b>\n )}\n </>\n )}{' '}\n <span class=\"account-block-acct bidi-isolate\">\n {acct2 ? '' : '@'}\n {acct1}\n <wbr />\n {acct2}\n {locked && (\n <>\n {' '}\n <Icon icon=\"lock\" size=\"s\" alt={t`Locked`} />\n </>\n )}\n </span>\n <RolesTags roles={roles} accountUrl={url} />\n {showActivity && (\n <div class=\"account-block-stats\">\n <Trans>Posts: {shortenNumber(statusesCount)}</Trans>\n {!!lastStatusAt && (\n <>\n {' '}\n &middot;{' '}\n <Trans>\n Last posted:{' '}\n {niceDateTime(lastStatusAt, {\n hideTime: true,\n })}\n </Trans>\n </>\n )}\n </div>\n )}\n {showStats && (\n <div class=\"account-block-stats\">\n {bot && (\n <>\n <span class=\"tag collapsed\">\n <Icon icon=\"bot\" /> <Trans>Automated</Trans>\n </span>\n </>\n )}\n {!!group && (\n <>\n <span class=\"tag collapsed\">\n <Icon icon=\"group\" /> <Trans>Group</Trans>\n </span>\n </>\n )}\n {hasRelationship && (\n <div key={relationship.id} class=\"shazam-container-horizontal\">\n <div class=\"shazam-container-inner\">\n {excludedRelationship.following &&\n excludedRelationship.followedBy ? (\n <span class=\"tag minimal\">\n <Trans>Mutual</Trans>\n </span>\n ) : excludedRelationship.requested ? (\n <span class=\"tag minimal\">\n <Trans>Requested</Trans>\n </span>\n ) : excludedRelationship.following ? (\n <span class=\"tag minimal\">\n <Trans>Following</Trans>\n </span>\n ) : excludedRelationship.followedBy ? (\n <span class=\"tag minimal\">\n <Trans>Follows you</Trans>\n </span>\n ) : null}\n </div>\n </div>\n )}\n {!!followersCount && (\n <span class=\"ib\">\n <Plural\n value={followersCount}\n one=\"# follower\"\n other=\"# followers\"\n />\n </span>\n )}\n {!!verifiedField && (\n <span class=\"verified-field\">\n <Icon icon=\"check-circle\" size=\"s\" alt={t`Verified`} />{' '}\n <span\n dangerouslySetInnerHTML={{\n __html: enhanceContent(verifiedField.value, { emojis }),\n }}\n />\n </span>\n )}\n {!bot &&\n !group &&\n !hasRelationship &&\n !followersCount &&\n !verifiedField &&\n !!createdAt && (\n <span class=\"created-at\">\n <Trans>\n Joined{' '}\n <time datetime={createdAt}>\n {niceDateTime(createdAt, {\n hideTime: true,\n })}\n </time>\n </Trans>\n </span>\n )}\n </div>\n )}\n </span>\n </a>\n );\n}\n\nexport default AccountBlock;\n","import { api } from './api';\nimport { getCurrentAccountID } from './store-utils';\n\nexport async function fetchRelationships(accounts, relationshipsMap = {}) {\n if (!accounts?.length) return;\n const { masto } = api();\n\n const currentAccount = getCurrentAccountID();\n const uniqueAccountIds = accounts.reduce((acc, a) => {\n // 1. Ignore duplicate accounts\n // 2. Ignore accounts that are already inside relationshipsMap\n // 3. Ignore currently logged in account\n if (\n !acc.includes(a.id) &&\n !relationshipsMap[a.id] &&\n a.id !== currentAccount\n ) {\n acc.push(a.id);\n }\n return acc;\n }, []);\n if (!uniqueAccountIds.length) return null;\n\n try {\n const relationships = await masto.v1.accounts.relationships.fetch({\n id: uniqueAccountIds,\n });\n const newRelationshipsMap = relationships.reduce((acc, r) => {\n acc[r.id] = r;\n return acc;\n }, {});\n return newRelationshipsMap;\n } catch (e) {\n console.error(e);\n // It's okay to fail\n return null;\n }\n}\n","import { i18n } from '@lingui/core';\n\nexport default function i18nDuration(duration, unit) {\n return () =>\n i18n.number(duration, {\n style: 'unit',\n unit,\n unitDisplay: 'long',\n });\n}\n","const objectToString = Object.prototype.toString;\n\nconst isError = value => objectToString.call(value) === '[object Error]';\n\nconst errorMessages = new Set([\n\t'network error', // Chrome\n\t'Failed to fetch', // Chrome\n\t'NetworkError when attempting to fetch resource.', // Firefox\n\t'The Internet connection appears to be offline.', // Safari 16\n\t'Network request failed', // `cross-fetch`\n\t'fetch failed', // Undici (Node.js)\n\t'terminated', // Undici (Node.js)\n\t' A network error occurred.', // Bun (WebKit)\n\t'Network connection lost', // Cloudflare Workers (fetch)\n]);\n\nexport default function isNetworkError(error) {\n\tconst isValid = error\n\t\t&& isError(error)\n\t\t&& error.name === 'TypeError'\n\t\t&& typeof error.message === 'string';\n\n\tif (!isValid) {\n\t\treturn false;\n\t}\n\n\tconst {message, stack} = error;\n\n\t// Safari 17+ has generic message but no stack for network errors\n\tif (message === 'Load failed') {\n\t\treturn stack === undefined\n\t\t\t// Sentry adds its own stack trace to the fetch error, so also check for that\n\t\t\t|| '__sentry_captured__' in error;\n\t}\n\n\t// Deno network errors start with specific text\n\tif (message.startsWith('error sending request for url')) {\n\t\treturn true;\n\t}\n\n\t// Standard network error messages\n\treturn errorMessages.has(message);\n}\n","import isNetworkError from 'is-network-error';\n\nfunction validateRetries(retries) {\n\tif (typeof retries === 'number') {\n\t\tif (retries < 0) {\n\t\t\tthrow new TypeError('Expected `retries` to be a non-negative number.');\n\t\t}\n\n\t\tif (Number.isNaN(retries)) {\n\t\t\tthrow new TypeError('Expected `retries` to be a valid number or Infinity, got NaN.');\n\t\t}\n\t} else if (retries !== undefined) {\n\t\tthrow new TypeError('Expected `retries` to be a number or Infinity.');\n\t}\n}\n\nfunction validateNumberOption(name, value, {min = 0, allowInfinity = false} = {}) {\n\tif (value === undefined) {\n\t\treturn;\n\t}\n\n\tif (typeof value !== 'number' || Number.isNaN(value)) {\n\t\tthrow new TypeError(`Expected \\`${name}\\` to be a number${allowInfinity ? ' or Infinity' : ''}.`);\n\t}\n\n\tif (!allowInfinity && !Number.isFinite(value)) {\n\t\tthrow new TypeError(`Expected \\`${name}\\` to be a finite number.`);\n\t}\n\n\tif (value < min) {\n\t\tthrow new TypeError(`Expected \\`${name}\\` to be \\u2265 ${min}.`);\n\t}\n}\n\nexport class AbortError extends Error {\n\tconstructor(message) {\n\t\tsuper();\n\n\t\tif (message instanceof Error) {\n\t\t\tthis.originalError = message;\n\t\t\t({message} = message);\n\t\t} else {\n\t\t\tthis.originalError = new Error(message);\n\t\t\tthis.originalError.stack = this.stack;\n\t\t}\n\n\t\tthis.name = 'AbortError';\n\t\tthis.message = message;\n\t}\n}\n\nfunction calculateDelay(retriesConsumed, options) {\n\tconst attempt = Math.max(1, retriesConsumed + 1);\n\tconst random = options.randomize ? (Math.random() + 1) : 1;\n\n\tlet timeout = Math.round(random * options.minTimeout * (options.factor ** (attempt - 1)));\n\ttimeout = Math.min(timeout, options.maxTimeout);\n\n\treturn timeout;\n}\n\nfunction calculateRemainingTime(start, max) {\n\tif (!Number.isFinite(max)) {\n\t\treturn max;\n\t}\n\n\treturn max - (performance.now() - start);\n}\n\nasync function onAttemptFailure({error, attemptNumber, retriesConsumed, startTime, options}) {\n\tconst normalizedError = error instanceof Error\n\t\t? error\n\t\t: new TypeError(`Non-error was thrown: \"${error}\". You should only throw errors.`);\n\n\tif (normalizedError instanceof AbortError) {\n\t\tthrow normalizedError.originalError;\n\t}\n\n\tconst retriesLeft = Number.isFinite(options.retries)\n\t\t? Math.max(0, options.retries - retriesConsumed)\n\t\t: options.retries;\n\n\tconst maxRetryTime = options.maxRetryTime ?? Number.POSITIVE_INFINITY;\n\n\tconst context = Object.freeze({\n\t\terror: normalizedError,\n\t\tattemptNumber,\n\t\tretriesLeft,\n\t\tretriesConsumed,\n\t});\n\n\tawait options.onFailedAttempt(context);\n\n\tif (calculateRemainingTime(startTime, maxRetryTime) <= 0) {\n\t\tthrow normalizedError;\n\t}\n\n\tconst consumeRetry = await options.shouldConsumeRetry(context);\n\n\tconst remainingTime = calculateRemainingTime(startTime, maxRetryTime);\n\n\tif (remainingTime <= 0 || retriesLeft <= 0) {\n\t\tthrow normalizedError;\n\t}\n\n\tif (normalizedError instanceof TypeError && !isNetworkError(normalizedError)) {\n\t\tif (consumeRetry) {\n\t\t\tthrow normalizedError;\n\t\t}\n\n\t\toptions.signal?.throwIfAborted();\n\t\treturn false;\n\t}\n\n\tif (!await options.shouldRetry(context)) {\n\t\tthrow normalizedError;\n\t}\n\n\tif (!consumeRetry) {\n\t\toptions.signal?.throwIfAborted();\n\t\treturn false;\n\t}\n\n\tconst delayTime = calculateDelay(retriesConsumed, options);\n\tconst finalDelay = Math.min(delayTime, remainingTime);\n\n\toptions.signal?.throwIfAborted();\n\n\tif (finalDelay > 0) {\n\t\tawait new Promise((resolve, reject) => {\n\t\t\tconst onAbort = () => {\n\t\t\t\tclearTimeout(timeoutToken);\n\t\t\t\toptions.signal?.removeEventListener('abort', onAbort);\n\t\t\t\treject(options.signal.reason);\n\t\t\t};\n\n\t\t\tconst timeoutToken = setTimeout(() => {\n\t\t\t\toptions.signal?.removeEventListener('abort', onAbort);\n\t\t\t\tresolve();\n\t\t\t}, finalDelay);\n\n\t\t\tif (options.unref) {\n\t\t\t\ttimeoutToken.unref?.();\n\t\t\t}\n\n\t\t\toptions.signal?.addEventListener('abort', onAbort, {once: true});\n\t\t});\n\t}\n\n\toptions.signal?.throwIfAborted();\n\n\treturn true;\n}\n\nexport default async function pRetry(input, options = {}) {\n\toptions = {...options};\n\n\tvalidateRetries(options.retries);\n\n\tif (Object.hasOwn(options, 'forever')) {\n\t\tthrow new Error('The `forever` option is no longer supported. For many use-cases, you can set `retries: Infinity` instead.');\n\t}\n\n\toptions.retries ??= 10;\n\toptions.factor ??= 2;\n\toptions.minTimeout ??= 1000;\n\toptions.maxTimeout ??= Number.POSITIVE_INFINITY;\n\toptions.maxRetryTime ??= Number.POSITIVE_INFINITY;\n\toptions.randomize ??= false;\n\toptions.onFailedAttempt ??= () => {};\n\toptions.shouldRetry ??= () => true;\n\toptions.shouldConsumeRetry ??= () => true;\n\n\t// Validate numeric options and normalize edge cases\n\tvalidateNumberOption('factor', options.factor, {min: 0, allowInfinity: false});\n\tvalidateNumberOption('minTimeout', options.minTimeout, {min: 0, allowInfinity: false});\n\tvalidateNumberOption('maxTimeout', options.maxTimeout, {min: 0, allowInfinity: true});\n\tvalidateNumberOption('maxRetryTime', options.maxRetryTime, {min: 0, allowInfinity: true});\n\n\t// Treat non-positive factor as 1 to avoid zero backoff or negative behavior\n\tif (!(options.factor > 0)) {\n\t\toptions.factor = 1;\n\t}\n\n\toptions.signal?.throwIfAborted();\n\n\tlet attemptNumber = 0;\n\tlet retriesConsumed = 0;\n\tconst startTime = performance.now();\n\n\twhile (Number.isFinite(options.retries) ? retriesConsumed <= options.retries : true) {\n\t\tattemptNumber++;\n\n\t\ttry {\n\t\t\toptions.signal?.throwIfAborted();\n\n\t\t\tconst result = await input(attemptNumber);\n\n\t\t\toptions.signal?.throwIfAborted();\n\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tif (await onAttemptFailure({\n\t\t\t\terror,\n\t\t\t\tattemptNumber,\n\t\t\t\tretriesConsumed,\n\t\t\t\tstartTime,\n\t\t\t\toptions,\n\t\t\t})) {\n\t\t\t\tretriesConsumed++;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Should not reach here, but in case it does, throw an error\n\tthrow new Error('Retry attempts exhausted without throwing an error.');\n}\n\nexport function makeRetriable(function_, options) {\n\treturn function (...arguments_) {\n\t\treturn pRetry(() => function_.apply(this, arguments_), options);\n\t};\n}\n","const supportsLanguageDetector = 'LanguageDetector' in self;\nexport const supportsBrowserTranslator =\n supportsLanguageDetector && 'Translator' in self;\n\n// https://developer.chrome.com/docs/ai/language-detection\nexport let langDetector;\nif (supportsLanguageDetector) {\n (async () => {\n try {\n const availability = await LanguageDetector.availability();\n if (availability === 'unavailable') {\n console.log('🎺 Language detector is unavailable');\n // The language detector isn't usable.\n return;\n }\n if (availability === 'available') {\n console.log('🎺 Language detector is available');\n // The language detector can immediately be used.\n langDetector = await LanguageDetector.create();\n } else {\n console.log(`🎺 Language detector is ${availability}`);\n // The language detector can be used after model download.\n langDetector = await LanguageDetector.create({\n monitor(m) {\n m.addEventListener('downloadprogress', (e) => {\n console.log(\n `🎺 Language detector: Downloaded ${e.loaded * 100}%`,\n );\n });\n },\n });\n await langDetector.ready;\n }\n } catch (e) {\n console.error(e);\n }\n })();\n}\n\n// https://developer.chrome.com/docs/ai/translator-api\nexport const translate = async (text, source, target) => {\n let detectedSourceLanguage;\n const originalSource = source;\n if (source === 'auto') {\n if (!langDetector?.detect) {\n return {\n error: 'No language detector',\n };\n }\n try {\n const results = await langDetector.detect(text);\n source = results[0].detectedLanguage;\n detectedSourceLanguage = source;\n } catch (e) {\n console.warn(e);\n return {\n error: e,\n };\n }\n }\n const groupLabel = `💬 BROWSER TRANSLATE ${text}`;\n console.groupCollapsed(groupLabel);\n console.log(originalSource, detectedSourceLanguage, target);\n try {\n const translatorCapabilities = await Translator.availability({\n sourceLanguage: source,\n targetLanguage: target,\n });\n // Note: Translator.availability() returns 'unavailable', 'downloadable', 'downloading', or 'available'.\n if (translatorCapabilities === 'unavailable') {\n console.groupEnd(groupLabel);\n return {\n error: `Unsupported language pair: ${source} -> ${target}`,\n };\n }\n let translator;\n if (translatorCapabilities === 'available') {\n translator = await Translator.create({\n sourceLanguage: source,\n targetLanguage: target,\n });\n } else {\n translator = await Translator.create({\n sourceLanguage: source,\n targetLanguage: target,\n monitor(m) {\n m.addEventListener('downloadprogress', (e) => {\n console.log(\n `Translate ${source} -> ${target}: Downloaded ${e.loaded * 100}%`,\n );\n });\n },\n });\n await translator.ready;\n }\n\n const content = await translator.translate(text);\n console.log(content);\n console.groupEnd(groupLabel);\n\n return {\n content,\n detectedSourceLanguage,\n provider: 'browser',\n };\n } catch (e) {\n console.groupEnd(groupLabel);\n console.error(e);\n return {\n error: e,\n };\n }\n};\n","\"use client\";\nvar __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\n\n// src/InView.tsx\nimport * as React from \"react\";\n\n// src/observe.ts\nvar observerMap = /* @__PURE__ */ new Map();\nvar RootIds = /* @__PURE__ */ new WeakMap();\nvar rootId = 0;\nvar unsupportedValue;\nfunction defaultFallbackInView(inView) {\n unsupportedValue = inView;\n}\nfunction getRootId(root) {\n if (!root) return \"0\";\n if (RootIds.has(root)) return RootIds.get(root);\n rootId += 1;\n RootIds.set(root, rootId.toString());\n return RootIds.get(root);\n}\nfunction optionsToId(options) {\n return Object.keys(options).sort().filter(\n (key) => options[key] !== void 0\n ).map((key) => {\n return `${key}_${key === \"root\" ? getRootId(options.root) : options[key]}`;\n }).toString();\n}\nfunction createObserver(options) {\n const id = optionsToId(options);\n let instance = observerMap.get(id);\n if (!instance) {\n const elements = /* @__PURE__ */ new Map();\n let thresholds;\n const observer = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n var _a2;\n const inView = entry.isIntersecting && thresholds.some((threshold) => entry.intersectionRatio >= threshold);\n if (options.trackVisibility && typeof entry.isVisible === \"undefined\") {\n entry.isVisible = inView;\n }\n (_a2 = elements.get(entry.target)) == null ? void 0 : _a2.forEach((callback) => {\n callback(inView, entry);\n });\n });\n }, options);\n thresholds = observer.thresholds || (Array.isArray(options.threshold) ? options.threshold : [options.threshold || 0]);\n instance = {\n id,\n observer,\n elements\n };\n observerMap.set(id, instance);\n }\n return instance;\n}\nfunction observe(element, callback, options = {}, fallbackInView = unsupportedValue) {\n if (typeof window.IntersectionObserver === \"undefined\" && fallbackInView !== void 0) {\n const bounds = element.getBoundingClientRect();\n callback(fallbackInView, {\n isIntersecting: fallbackInView,\n target: element,\n intersectionRatio: typeof options.threshold === \"number\" ? options.threshold : 0,\n time: 0,\n boundingClientRect: bounds,\n intersectionRect: bounds,\n rootBounds: bounds\n });\n return () => {\n };\n }\n const { id, observer, elements } = createObserver(options);\n const callbacks = elements.get(element) || [];\n if (!elements.has(element)) {\n elements.set(element, callbacks);\n }\n callbacks.push(callback);\n observer.observe(element);\n return function unobserve() {\n callbacks.splice(callbacks.indexOf(callback), 1);\n if (callbacks.length === 0) {\n elements.delete(element);\n observer.unobserve(element);\n }\n if (elements.size === 0) {\n observer.disconnect();\n observerMap.delete(id);\n }\n };\n}\n\n// src/InView.tsx\nfunction isPlainChildren(props) {\n return typeof props.children !== \"function\";\n}\nvar InView = class extends React.Component {\n constructor(props) {\n super(props);\n __publicField(this, \"node\", null);\n __publicField(this, \"_unobserveCb\", null);\n __publicField(this, \"lastInView\");\n __publicField(this, \"handleNode\", (node) => {\n if (this.node) {\n this.unobserve();\n if (!node && !this.props.triggerOnce && !this.props.skip) {\n this.setState({ inView: !!this.props.initialInView, entry: void 0 });\n this.lastInView = this.props.initialInView;\n }\n }\n this.node = node ? node : null;\n this.observeNode();\n });\n __publicField(this, \"handleChange\", (inView, entry) => {\n const previousInView = this.lastInView;\n this.lastInView = inView;\n if (previousInView === void 0 && !inView) {\n return;\n }\n if (inView && this.props.triggerOnce) {\n this.unobserve();\n }\n if (!isPlainChildren(this.props)) {\n this.setState({ inView, entry });\n }\n if (this.props.onChange) {\n this.props.onChange(inView, entry);\n }\n });\n this.state = {\n inView: !!props.initialInView,\n entry: void 0\n };\n this.lastInView = props.initialInView;\n }\n componentDidMount() {\n this.unobserve();\n this.observeNode();\n }\n componentDidUpdate(prevProps) {\n if (prevProps.rootMargin !== this.props.rootMargin || prevProps.root !== this.props.root || prevProps.threshold !== this.props.threshold || prevProps.skip !== this.props.skip || prevProps.trackVisibility !== this.props.trackVisibility || prevProps.delay !== this.props.delay) {\n this.unobserve();\n this.observeNode();\n }\n }\n componentWillUnmount() {\n this.unobserve();\n }\n observeNode() {\n if (!this.node || this.props.skip) return;\n const {\n threshold,\n root,\n rootMargin,\n trackVisibility,\n delay,\n fallbackInView\n } = this.props;\n if (this.lastInView === void 0) {\n this.lastInView = this.props.initialInView;\n }\n this._unobserveCb = observe(\n this.node,\n this.handleChange,\n {\n threshold,\n root,\n rootMargin,\n // @ts-expect-error\n trackVisibility,\n delay\n },\n fallbackInView\n );\n }\n unobserve() {\n if (this._unobserveCb) {\n this._unobserveCb();\n this._unobserveCb = null;\n }\n }\n render() {\n const { children } = this.props;\n if (typeof children === \"function\") {\n const { inView, entry } = this.state;\n return children({ inView, entry, ref: this.handleNode });\n }\n const {\n as,\n triggerOnce,\n threshold,\n root,\n rootMargin,\n onChange,\n skip,\n trackVisibility,\n delay,\n initialInView,\n fallbackInView,\n ...props\n } = this.props;\n return React.createElement(\n as || \"div\",\n { ref: this.handleNode, ...props },\n children\n );\n }\n};\n\n// src/useInView.tsx\nimport * as React2 from \"react\";\nfunction useInView({\n threshold,\n delay,\n trackVisibility,\n rootMargin,\n root,\n triggerOnce,\n skip,\n initialInView,\n fallbackInView,\n onChange\n} = {}) {\n var _a2;\n const [ref, setRef] = React2.useState(null);\n const callback = React2.useRef(onChange);\n const lastInViewRef = React2.useRef(initialInView);\n const [state, setState] = React2.useState({\n inView: !!initialInView,\n entry: void 0\n });\n callback.current = onChange;\n React2.useEffect(\n () => {\n if (lastInViewRef.current === void 0) {\n lastInViewRef.current = initialInView;\n }\n if (skip || !ref) return;\n let unobserve;\n unobserve = observe(\n ref,\n (inView, entry) => {\n const previousInView = lastInViewRef.current;\n lastInViewRef.current = inView;\n if (previousInView === void 0 && !inView) {\n return;\n }\n setState({\n inView,\n entry\n });\n if (callback.current) callback.current(inView, entry);\n if (entry.isIntersecting && triggerOnce && unobserve) {\n unobserve();\n unobserve = void 0;\n }\n },\n {\n root,\n rootMargin,\n threshold,\n // @ts-expect-error\n trackVisibility,\n delay\n },\n fallbackInView\n );\n return () => {\n if (unobserve) {\n unobserve();\n }\n };\n },\n // We break the rule here, because we aren't including the actual `threshold` variable\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n // If the threshold is an array, convert it to a string, so it won't change between renders.\n Array.isArray(threshold) ? threshold.toString() : threshold,\n ref,\n root,\n rootMargin,\n triggerOnce,\n skip,\n trackVisibility,\n fallbackInView,\n delay\n ]\n );\n const entryTarget = (_a2 = state.entry) == null ? void 0 : _a2.target;\n const previousEntryTarget = React2.useRef(void 0);\n if (!ref && entryTarget && !triggerOnce && !skip && previousEntryTarget.current !== entryTarget) {\n previousEntryTarget.current = entryTarget;\n setState({\n inView: !!initialInView,\n entry: void 0\n });\n lastInViewRef.current = initialInView;\n }\n const result = [setRef, state.inView, state.entry];\n result.ref = result[0];\n result.inView = result[1];\n result.entry = result[2];\n return result;\n}\n\n// src/useOnInView.tsx\nimport * as React3 from \"react\";\nvar _a, _b;\nvar useSyncEffect = (_b = (_a = \"useInsertionEffect\" in React3 ? React3.useInsertionEffect : void 0) != null ? _a : React3.useLayoutEffect) != null ? _b : React3.useEffect;\nvar useOnInView = (onIntersectionChange, {\n threshold,\n root,\n rootMargin,\n trackVisibility,\n delay,\n triggerOnce,\n skip\n} = {}) => {\n const onIntersectionChangeRef = React3.useRef(onIntersectionChange);\n const observedElementRef = React3.useRef(null);\n const observerCleanupRef = React3.useRef(void 0);\n const lastInViewRef = React3.useRef(void 0);\n useSyncEffect(() => {\n onIntersectionChangeRef.current = onIntersectionChange;\n }, [onIntersectionChange]);\n return React3.useCallback(\n (element) => {\n const cleanupExisting = () => {\n if (observerCleanupRef.current) {\n const cleanup = observerCleanupRef.current;\n observerCleanupRef.current = void 0;\n cleanup();\n }\n };\n if (element === observedElementRef.current) {\n return observerCleanupRef.current;\n }\n if (!element || skip) {\n cleanupExisting();\n observedElementRef.current = null;\n lastInViewRef.current = void 0;\n return;\n }\n cleanupExisting();\n observedElementRef.current = element;\n let destroyed = false;\n const destroyObserver = observe(\n element,\n (inView, entry) => {\n const previousInView = lastInViewRef.current;\n lastInViewRef.current = inView;\n if (previousInView === void 0 && !inView) {\n return;\n }\n onIntersectionChangeRef.current(\n inView,\n entry\n );\n if (triggerOnce && inView) {\n stopObserving();\n }\n },\n {\n threshold,\n root,\n rootMargin,\n trackVisibility,\n delay\n }\n );\n function stopObserving() {\n if (destroyed) return;\n destroyed = true;\n destroyObserver();\n observedElementRef.current = null;\n observerCleanupRef.current = void 0;\n lastInViewRef.current = void 0;\n }\n observerCleanupRef.current = stopObserving;\n return observerCleanupRef.current;\n },\n [\n Array.isArray(threshold) ? threshold.toString() : threshold,\n root,\n rootMargin,\n trackVisibility,\n delay,\n triggerOnce,\n skip\n ]\n );\n};\nexport {\n InView,\n defaultFallbackInView,\n observe,\n useInView,\n useOnInView\n};\n//# sourceMappingURL=index.mjs.map","/*\n Rendered but hidden. Only show when visible\n*/\nimport { useCallback, useLayoutEffect, useRef, useState } from 'preact/hooks';\nimport { useOnInView } from 'react-intersection-observer';\n\n// The sticky header, usually at the top\nconst TOP = 48;\n\nconst shazamIDs = {};\n\nexport default function LazyShazam({ id, children }) {\n const containerRef = useRef();\n const [visibleStart, setVisibleStart] = useState(!!shazamIDs[id]);\n\n const onInView = useCallback(\n (inView) => {\n if (inView && containerRef.current) {\n containerRef.current.hidden = false;\n if (id) shazamIDs[id] = true;\n }\n },\n [id],\n );\n\n const ref = useOnInView(onInView, {\n rootMargin: `-${TOP}px 0px 0px 0px`,\n trackVisibility: true,\n delay: 1000,\n triggerOnce: true,\n skip: visibleStart,\n });\n\n useLayoutEffect(() => {\n if (!containerRef.current) return;\n const rect = containerRef.current.getBoundingClientRect();\n if (rect.bottom > TOP) {\n if (rect.top < window.innerHeight) {\n containerRef.current.hidden = false;\n } else {\n setVisibleStart(true);\n }\n if (id) shazamIDs[id] = true;\n }\n }, []);\n\n if (visibleStart) return children;\n\n return (\n <div ref={containerRef} class=\"shazam-container no-animation\" hidden>\n <div ref={ref} class=\"shazam-container-inner\">\n {children}\n </div>\n </div>\n );\n}\n","import './translation-block.css';\n\nimport { Trans, useLingui } from '@lingui/react/macro';\nimport PQueue from 'p-queue';\nimport pRetry from 'p-retry';\nimport { useEffect, useRef, useState } from 'preact/hooks';\n\nimport languages from '../data/translang-languages';\nimport {\n translate as browserTranslate,\n supportsBrowserTranslator,\n} from '../utils/browser-translator';\nimport getTranslateTargetLanguage from '../utils/get-translate-target-language';\nimport localeCode2Text from '../utils/localeCode2Text';\nimport pmem from '../utils/pmem';\n\nimport Icon from './icon';\nimport LazyShazam from './lazy-shazam';\nimport Loader from './loader';\n\nconst sourceLanguages = Object.entries(languages.sl).map(([code, name]) => ({\n code,\n name,\n}));\n\nconst { PHANPY_TRANSLANG_INSTANCES } = import.meta.env;\nconst TRANSLANG_INSTANCES = PHANPY_TRANSLANG_INSTANCES\n ? PHANPY_TRANSLANG_INSTANCES.split(/\\s+/)\n : [];\n\nconst translationQueue = new PQueue({\n concurrency: 1,\n interval: 2000,\n intervalCap: 1,\n});\n\nconst TRANSLATED_MAX_AGE = 1000 * 60 * 60; // 1 hour\nlet currentTranslangInstance = 0;\n\nfunction _translangTranslate(text, source, target) {\n console.log('TRANSLATE', text, source, target);\n const fetchCall = () => {\n let instance = TRANSLANG_INSTANCES[currentTranslangInstance];\n const tooLong = text.length > 2000;\n let fetchPromise;\n if (tooLong) {\n // POST\n fetchPromise = fetch(`https://${instance}/api/v1/translate`, {\n method: 'POST',\n priority: 'low',\n referrerPolicy: 'no-referrer',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n sl: source,\n tl: target,\n text,\n }),\n });\n } else {\n // GET\n fetchPromise = fetch(\n `https://${instance}/api/v1/translate?sl=${encodeURIComponent(\n source,\n )}&tl=${encodeURIComponent(target)}&text=${encodeURIComponent(text)}`,\n {\n priority: 'low',\n referrerPolicy: 'no-referrer',\n },\n );\n }\n return fetchPromise\n .then((res) => {\n if (!res.ok) throw new Error(res.statusText);\n return res.json();\n })\n .then((res) => {\n return {\n provider: 'translang',\n content: res.translated_text,\n detectedSourceLanguage: res.detected_language,\n pronunciation: res.pronunciation,\n };\n });\n };\n return pRetry(fetchCall, {\n retries: 3,\n onFailedAttempt: (e) => {\n currentTranslangInstance =\n (currentTranslangInstance + 1) % TRANSLANG_INSTANCES.length;\n console.log(\n 'Retrying translation with another instance',\n currentTranslangInstance,\n );\n },\n });\n}\nconst translangTranslate = pmem(_translangTranslate, {\n expires: TRANSLATED_MAX_AGE,\n});\nconst throttledTranslangTranslate = pmem(\n ({ signal, text, source, target }) =>\n translationQueue.add(() => translangTranslate(text, source, target), {\n signal,\n }),\n {\n // I know, this is double-layered memoization\n expires: TRANSLATED_MAX_AGE,\n },\n);\n\nconst throttledBrowserTranslate = ({ text, source, target, signal }) =>\n translationQueue.add(() => browserTranslate(text, source, target), {\n signal,\n });\n\nfunction TranslationBlock({\n forceTranslate,\n sourceLanguage,\n onTranslate,\n text = '',\n mini,\n autoDetected,\n}) {\n const { t } = useLingui();\n const targetLang = getTranslateTargetLanguage(true);\n const [uiState, setUIState] = useState('default');\n const [pronunciationContent, setPronunciationContent] = useState(null);\n const [translatedContent, setTranslatedContent] = useState(null);\n const [detectedLang, setDetectedLang] = useState(null);\n const detailsRef = useRef();\n const abortControllerRef = useRef();\n\n const sourceLangText = sourceLanguage\n ? localeCode2Text(sourceLanguage)\n : null;\n const targetLangText = localeCode2Text(targetLang);\n const apiSourceLang = useRef('auto');\n\n if (!onTranslate) {\n onTranslate = async ({ text, source, target, signal }) => {\n if (supportsBrowserTranslator) {\n const result = await throttledBrowserTranslate({\n text,\n source,\n target,\n signal,\n });\n if (result && !result.error) {\n return result;\n }\n }\n return mini\n ? await throttledTranslangTranslate({ signal, text, source, target })\n : await translangTranslate(text, source, target);\n };\n }\n\n const translate = async () => {\n setUIState('loading');\n try {\n const { content, detectedSourceLanguage, provider, error, ...props } =\n await onTranslate({\n text,\n source: apiSourceLang.current,\n target: targetLang,\n signal: abortControllerRef.current?.signal,\n });\n if (content) {\n if (detectedSourceLanguage) {\n const detectedLangText = localeCode2Text(detectedSourceLanguage);\n setDetectedLang(detectedLangText);\n }\n if (provider === 'translang') {\n const pronunciation = props?.pronunciation;\n if (pronunciation) {\n setPronunciationContent(pronunciation);\n }\n }\n setTranslatedContent(content);\n setUIState('default');\n if (!mini && content.trim() !== text.trim() && detailsRef.current) {\n detailsRef.current.open = true;\n detailsRef.current.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n });\n }\n } else {\n if (error) console.error(error);\n setUIState('error');\n }\n } catch (e) {\n if (e.name !== 'AbortError') {\n console.error(e);\n setUIState('error');\n }\n }\n };\n\n useEffect(() => {\n if (forceTranslate) {\n translate();\n }\n }, [forceTranslate]);\n\n useEffect(() => {\n abortControllerRef.current = new AbortController();\n return () => {\n abortControllerRef.current.abort();\n };\n }, []);\n\n if (mini) {\n if (\n !!translatedContent &&\n translatedContent.trim() !== text.trim() &&\n detectedLang !== targetLangText\n ) {\n return (\n <LazyShazam>\n <div class=\"status-translation-block-mini\">\n <Icon\n icon=\"translate\"\n alt={t`Auto-translated from ${sourceLangText}`}\n />\n <output\n lang={targetLang}\n dir=\"auto\"\n title={pronunciationContent || ''}\n >\n {translatedContent}\n </output>\n </div>\n </LazyShazam>\n );\n }\n return null;\n }\n\n return (\n <div\n class=\"status-translation-block\"\n onClick={(e) => {\n e.preventDefault();\n }}\n >\n <details ref={detailsRef}>\n <summary>\n <button\n type=\"button\"\n class={uiState === 'loading' ? 'loading-mask' : ''}\n onClick={async (e) => {\n e.preventDefault();\n e.stopPropagation();\n detailsRef.current.open = !detailsRef.current.open;\n if (uiState === 'loading') return;\n if (!translatedContent) translate();\n }}\n >\n <Icon icon=\"translate\" />{' '}\n <span>\n {uiState === 'loading'\n ? t`Translating…`\n : sourceLanguage && sourceLangText && !detectedLang\n ? autoDetected\n ? t`Translate from ${sourceLangText} (auto-detected)`\n : t`Translate from ${sourceLangText}`\n : t`Translate`}\n </span>\n </button>\n </summary>\n <div class=\"translated-block\">\n <div class=\"translation-info insignificant\">\n <select\n class=\"translated-source-select\"\n disabled={uiState === 'loading'}\n onChange={(e) => {\n apiSourceLang.current = e.target.value;\n translate();\n }}\n >\n {sourceLanguages.map((l) => {\n const common = localeCode2Text({\n code: l.code,\n fallback: l.name,\n });\n const native = localeCode2Text({\n code: l.code,\n locale: l.code,\n });\n const showCommon = native && common !== native;\n return (\n <option value={l.code}>\n {l.code === 'auto'\n ? t`Auto (${detectedLang ?? '…'})`\n : showCommon\n ? `${native} - ${common}`\n : common}\n </option>\n );\n })}\n </select>{' '}\n <span>→ {targetLangText}</span>\n <Loader abrupt hidden={uiState !== 'loading'} />\n </div>\n {uiState === 'error' ? (\n <p class=\"ui-state\">\n <Trans>Failed to translate</Trans>\n </p>\n ) : (\n !!translatedContent && (\n <>\n <output class=\"translated-content\" lang={targetLang} dir=\"auto\">\n {translatedContent}\n </output>\n {!!pronunciationContent && (\n <output\n class=\"translated-pronunciation-content\"\n tabIndex={-1}\n onClick={(e) => {\n e.target.classList.toggle('expand');\n }}\n >\n {pronunciationContent}\n </output>\n )}\n </>\n )\n )}\n </div>\n </details>\n </div>\n );\n}\n\nexport default TRANSLANG_INSTANCES?.length ? TranslationBlock : () => null;\n","function promisifyRequest(request) {\n return new Promise((resolve, reject) => {\n // @ts-ignore - file size hacks\n request.oncomplete = request.onsuccess = () => resolve(request.result);\n // @ts-ignore - file size hacks\n request.onabort = request.onerror = () => reject(request.error);\n });\n}\nfunction createStore(dbName, storeName) {\n let dbp;\n const getDB = () => {\n if (dbp)\n return dbp;\n const request = indexedDB.open(dbName);\n request.onupgradeneeded = () => request.result.createObjectStore(storeName);\n dbp = promisifyRequest(request);\n dbp.then((db) => {\n // It seems like Safari sometimes likes to just close the connection.\n // It's supposed to fire this event when that happens. Let's hope it does!\n db.onclose = () => (dbp = undefined);\n }, () => { });\n return dbp;\n };\n return (txMode, callback) => getDB().then((db) => callback(db.transaction(storeName, txMode).objectStore(storeName)));\n}\nlet defaultGetStoreFunc;\nfunction defaultGetStore() {\n if (!defaultGetStoreFunc) {\n defaultGetStoreFunc = createStore('keyval-store', 'keyval');\n }\n return defaultGetStoreFunc;\n}\n/**\n * Get a value by its key.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction get(key, customStore = defaultGetStore()) {\n return customStore('readonly', (store) => promisifyRequest(store.get(key)));\n}\n/**\n * Set a value with a key.\n *\n * @param key\n * @param value\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction set(key, value, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.put(value, key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Set multiple values at once. This is faster than calling set() multiple times.\n * It's also atomic if one of the pairs can't be added, none will be added.\n *\n * @param entries Array of entries, where each entry is an array of `[key, value]`.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction setMany(entries, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n entries.forEach((entry) => store.put(entry[1], entry[0]));\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Get multiple values by their keys\n *\n * @param keys\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction getMany(keys, customStore = defaultGetStore()) {\n return customStore('readonly', (store) => Promise.all(keys.map((key) => promisifyRequest(store.get(key)))));\n}\n/**\n * Update a value. This lets you see the old value and update it as an atomic operation.\n *\n * @param key\n * @param updater A callback that takes the old value and returns a new value.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction update(key, updater, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => \n // Need to create the promise manually.\n // If I try to chain promises, the transaction closes in browsers\n // that use a promise polyfill (IE10/11).\n new Promise((resolve, reject) => {\n store.get(key).onsuccess = function () {\n try {\n store.put(updater(this.result), key);\n resolve(promisifyRequest(store.transaction));\n }\n catch (err) {\n reject(err);\n }\n };\n }));\n}\n/**\n * Delete a particular key from the store.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction del(key, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.delete(key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Delete multiple keys at once.\n *\n * @param keys List of keys to delete.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction delMany(keys, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n keys.forEach((key) => store.delete(key));\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Clear all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction clear(customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.clear();\n return promisifyRequest(store.transaction);\n });\n}\nfunction eachCursor(store, callback) {\n store.openCursor().onsuccess = function () {\n if (!this.result)\n return;\n callback(this.result);\n this.result.continue();\n };\n return promisifyRequest(store.transaction);\n}\n/**\n * Get all keys in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction keys(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n if (store.getAllKeys) {\n return promisifyRequest(store.getAllKeys());\n }\n const items = [];\n return eachCursor(store, (cursor) => items.push(cursor.key)).then(() => items);\n });\n}\n/**\n * Get all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction values(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n if (store.getAll) {\n return promisifyRequest(store.getAll());\n }\n const items = [];\n return eachCursor(store, (cursor) => items.push(cursor.value)).then(() => items);\n });\n}\n/**\n * Get all entries in the store. Each entry is an array of `[key, value]`.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction entries(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n // (although, hopefully we'll get a simpler path some day)\n if (store.getAll && store.getAllKeys) {\n return Promise.all([\n promisifyRequest(store.getAllKeys()),\n promisifyRequest(store.getAll()),\n ]).then(([keys, values]) => keys.map((key, i) => [key, values[i]]));\n }\n const items = [];\n return customStore('readonly', (store) => eachCursor(store, (cursor) => items.push([cursor.key, cursor.value])).then(() => items));\n });\n}\n\nexport { clear, createStore, del, delMany, entries, get, getMany, keys, promisifyRequest, set, setMany, update, values };\n","import {\n clear,\n createStore,\n del,\n delMany,\n get,\n getMany,\n keys,\n set,\n} from 'idb-keyval';\n\nfunction initDB(dbName, storeName) {\n const store = createStore(dbName, storeName);\n return {\n set: (key, val) => set(key, val, store),\n get: (key) => get(key, store),\n getMany: (keys) => getMany(keys, store),\n del: (key) => del(key, store),\n delMany: (keys) => delMany(keys, store),\n clear: () => clear(store),\n keys: () => keys(store),\n };\n}\n\nexport default {\n drafts: initDB('drafts-db', 'drafts-store'),\n catchup: initDB('catchup-db', 'catchup-store'),\n yearInPosts: initDB('year-in-posts-db', 'year-in-posts-store'),\n};\n","import { createContext } from 'preact';\nimport { useContext, useRef, useState } from 'preact/hooks';\n\nimport { api } from '../utils/api';\n\nconst EditHistoryContext = createContext({});\n\nconst supportsViewTransition = !!document.startViewTransition;\n\nexport function EditHistoryProvider({ children, statusID }) {\n const editHistoryRef = useRef([]);\n const [editHistoryMode, setEditHistoryMode] = useState(false);\n // 0 is latest\n const [editedAtIndex, _setEditedAtIndex] = useState(0);\n\n // setEditedAtIndex, with View Transitions API\n function setEditedAtIndex(i) {\n if (i === editedAtIndex) return;\n if (supportsViewTransition) {\n document.startViewTransition(() => {\n _setEditedAtIndex(i);\n });\n } else {\n _setEditedAtIndex(i);\n }\n }\n\n async function fetchEditHistory() {\n const { masto } = api();\n const history = await masto.v1.statuses.$select(statusID).history.list();\n // sort latest first\n history.sort((a, b) => Date.parse(b.createdAt) - Date.parse(a.createdAt));\n editHistoryRef.current = history;\n }\n\n async function initEditHistory() {\n console.log('initEditHistory', statusID);\n try {\n await fetchEditHistory();\n setEditHistoryMode(true);\n setEditedAtIndex(0);\n } catch (e) {\n console.error(e);\n setEditHistoryMode(false);\n }\n }\n\n function exitEditHistory() {\n editHistoryRef.current = [];\n setEditHistoryMode(false);\n setEditedAtIndex(0);\n }\n\n function prevEditedAt() {\n setEditedAtIndex((i) => Math.min(i + 1, editHistoryRef.current.length - 1));\n }\n\n function nextEditedAt() {\n setEditedAtIndex((i) => Math.max(i - 1, 0));\n }\n\n return (\n <EditHistoryContext.Provider\n value={{\n editHistoryRef,\n initEditHistory,\n exitEditHistory,\n editHistoryMode,\n editedAtIndex,\n prevEditedAt,\n nextEditedAt,\n }}\n >\n {children}\n </EditHistoryContext.Provider>\n );\n}\n\nexport function useEditHistory() {\n return useContext(EditHistoryContext);\n}\n","import { createContext } from 'preact';\n\nconst FilterContext = createContext();\nexport default FilterContext;\n","import mem from './mem';\nimport { getCurrentAccountID } from './store-utils';\n\nfunction _isFiltered(filtered, filterContext) {\n if (!filtered?.length) return false;\n const appliedFilters = filtered.filter((f) => {\n const { filter } = f;\n const hasContext = filter.context.includes(filterContext);\n if (!hasContext) return false;\n if (!filter.expiresAt) return hasContext;\n return Date.parse(filter.expiresAt) > Date.now();\n });\n if (!appliedFilters.length) return false;\n const isHidden = appliedFilters.some((f) => f.filter.filterAction === 'hide');\n if (isHidden)\n return {\n action: 'hide',\n };\n const isBlur = appliedFilters.every((f) => f.filter.filterAction === 'blur');\n if (isBlur) {\n const filterTitles = appliedFilters.map((f) => f.filter.title);\n return {\n action: 'blur',\n titles: filterTitles,\n titlesStr: filterTitles.join(' • '),\n };\n }\n // const isWarn = appliedFilters.some((f) => f.filter.filterAction === 'warn');\n const isWarn = appliedFilters.some((f) => !!f.filter.filterAction);\n // Re: spec; unknown values for filter_action should be treated as warn.\n if (isWarn) {\n const filterTitles = appliedFilters.map((f) => f.filter.title);\n return {\n action: 'warn',\n titles: filterTitles,\n titlesStr: filterTitles.join(' • '),\n };\n }\n return false;\n}\nexport const isFiltered = mem(_isFiltered);\n\nexport function filteredItem(item, filterContext, currentAccountID) {\n const { filtered } = item;\n if (!filtered?.length) return true;\n const isSelf = currentAccountID && item.account?.id === currentAccountID;\n if (isSelf) return true;\n const filterState = isFiltered(filtered, filterContext);\n if (!filterState) return true;\n if (filterState.action === 'hide') return false;\n // item._filtered = filterState;\n return true;\n}\nexport function filteredItems(items, filterContext) {\n if (!items?.length) return [];\n if (!filterContext) return items;\n const currentAccountID = getCurrentAccountID();\n return items.filter((item) =>\n filteredItem(item, filterContext, currentAccountID),\n );\n}\n","const template = document.createElement('template');\nexport default function htmlContentLength(html) {\n if (!html) return 0;\n template.innerHTML = html;\n // .invisible spans for links\n // e.g. <span class=\"invisible\">https://</span>mastodon.social\n const invisibleElements = template.content.querySelectorAll('.invisible');\n for (let i = 0; i < invisibleElements.length; i++) {\n invisibleElements[i].remove();\n }\n // Collect innerText from all child nodes since DocumentFragment doesn't have innerText\n let textContent = '';\n for (let i = 0; i < template.content.childNodes.length; i++) {\n const n = template.content.childNodes[i];\n textContent += n.innerText || n.textContent || '';\n }\n return textContent.length;\n}\n","export const supportsTTS = 'speechSynthesis' in window;\n\nexport function speak(text, lang) {\n if (!supportsTTS) return;\n try {\n if (speechSynthesis.speaking) {\n speechSynthesis.cancel();\n }\n const utterance = new SpeechSynthesisUtterance(text);\n if (lang) utterance.lang = lang;\n speechSynthesis.speak(utterance);\n } catch (e) {\n alert(e);\n }\n}\n","import { useRef, useEffect, useCallback, useState, useMemo } from 'react';\n\n// This could've been more streamlined with internal state instead of abusing\n// refs to such extent, but then composing hooks and components could not opt out of unnecessary renders.\nfunction useResolvedElement(subscriber, refOrElement) {\n var lastReportRef = useRef(null);\n var refOrElementRef = useRef(null);\n refOrElementRef.current = refOrElement;\n var cbElementRef = useRef(null); // Calling re-evaluation after each render without using a dep array,\n // as the ref object's current value could've changed since the last render.\n\n useEffect(function () {\n evaluateSubscription();\n });\n var evaluateSubscription = useCallback(function () {\n var cbElement = cbElementRef.current;\n var refOrElement = refOrElementRef.current; // Ugly ternary. But smaller than an if-else block.\n\n var element = cbElement ? cbElement : refOrElement ? refOrElement instanceof Element ? refOrElement : refOrElement.current : null;\n\n if (lastReportRef.current && lastReportRef.current.element === element && lastReportRef.current.subscriber === subscriber) {\n return;\n }\n\n if (lastReportRef.current && lastReportRef.current.cleanup) {\n lastReportRef.current.cleanup();\n }\n\n lastReportRef.current = {\n element: element,\n subscriber: subscriber,\n // Only calling the subscriber, if there's an actual element to report.\n // Setting cleanup to undefined unless a subscriber returns one, as an existing cleanup function would've been just called.\n cleanup: element ? subscriber(element) : undefined\n };\n }, [subscriber]); // making sure we call the cleanup function on unmount\n\n useEffect(function () {\n return function () {\n if (lastReportRef.current && lastReportRef.current.cleanup) {\n lastReportRef.current.cleanup();\n lastReportRef.current = null;\n }\n };\n }, []);\n return useCallback(function (element) {\n cbElementRef.current = element;\n evaluateSubscription();\n }, [evaluateSubscription]);\n}\n\n// We're only using the first element of the size sequences, until future versions of the spec solidify on how\n// exactly it'll be used for fragments in multi-column scenarios:\n// From the spec:\n// > The box size properties are exposed as FrozenArray in order to support elements that have multiple fragments,\n// > which occur in multi-column scenarios. However the current definitions of content rect and border box do not\n// > mention how those boxes are affected by multi-column layout. In this spec, there will only be a single\n// > ResizeObserverSize returned in the FrozenArray, which will correspond to the dimensions of the first column.\n// > A future version of this spec will extend the returned FrozenArray to contain the per-fragment size information.\n// (https://drafts.csswg.org/resize-observer/#resize-observer-entry-interface)\n//\n// Also, testing these new box options revealed that in both Chrome and FF everything is returned in the callback,\n// regardless of the \"box\" option.\n// The spec states the following on this:\n// > This does not have any impact on which box dimensions are returned to the defined callback when the event\n// > is fired, it solely defines which box the author wishes to observe layout changes on.\n// (https://drafts.csswg.org/resize-observer/#resize-observer-interface)\n// I'm not exactly clear on what this means, especially when you consider a later section stating the following:\n// > This section is non-normative. An author may desire to observe more than one CSS box.\n// > In this case, author will need to use multiple ResizeObservers.\n// (https://drafts.csswg.org/resize-observer/#resize-observer-interface)\n// Which is clearly not how current browser implementations behave, and seems to contradict the previous quote.\n// For this reason I decided to only return the requested size,\n// even though it seems we have access to results for all box types.\n// This also means that we get to keep the current api, being able to return a simple { width, height } pair,\n// regardless of box option.\nfunction extractSize(entry, boxProp, sizeType) {\n if (!entry[boxProp]) {\n if (boxProp === \"contentBoxSize\") {\n // The dimensions in `contentBoxSize` and `contentRect` are equivalent according to the spec.\n // See the 6th step in the description for the RO algorithm:\n // https://drafts.csswg.org/resize-observer/#create-and-populate-resizeobserverentry-h\n // > Set this.contentRect to logical this.contentBoxSize given target and observedBox of \"content-box\".\n // In real browser implementations of course these objects differ, but the width/height values should be equivalent.\n return entry.contentRect[sizeType === \"inlineSize\" ? \"width\" : \"height\"];\n }\n\n return undefined;\n } // A couple bytes smaller than calling Array.isArray() and just as effective here.\n\n\n return entry[boxProp][0] ? entry[boxProp][0][sizeType] : // TS complains about this, because the RO entry type follows the spec and does not reflect Firefox's current\n // behaviour of returning objects instead of arrays for `borderBoxSize` and `contentBoxSize`.\n // @ts-ignore\n entry[boxProp][sizeType];\n}\n\nfunction useResizeObserver(opts) {\n if (opts === void 0) {\n opts = {};\n }\n\n // Saving the callback as a ref. With this, I don't need to put onResize in the\n // effect dep array, and just passing in an anonymous function without memoising\n // will not reinstantiate the hook's ResizeObserver.\n var onResize = opts.onResize;\n var onResizeRef = useRef(undefined);\n onResizeRef.current = onResize;\n var round = opts.round || Math.round; // Using a single instance throughout the hook's lifetime\n\n var resizeObserverRef = useRef();\n\n var _useState = useState({\n width: undefined,\n height: undefined\n }),\n size = _useState[0],\n setSize = _useState[1]; // In certain edge cases the RO might want to report a size change just after\n // the component unmounted.\n\n\n var didUnmount = useRef(false);\n useEffect(function () {\n didUnmount.current = false;\n return function () {\n didUnmount.current = true;\n };\n }, []); // Using a ref to track the previous width / height to avoid unnecessary renders.\n\n var previous = useRef({\n width: undefined,\n height: undefined\n }); // This block is kinda like a useEffect, only it's called whenever a new\n // element could be resolved based on the ref option. It also has a cleanup\n // function.\n\n var refCallback = useResolvedElement(useCallback(function (element) {\n // We only use a single Resize Observer instance, and we're instantiating it on demand, only once there's something to observe.\n // This instance is also recreated when the `box` option changes, so that a new observation is fired if there was a previously observed element with a different box option.\n if (!resizeObserverRef.current || resizeObserverRef.current.box !== opts.box || resizeObserverRef.current.round !== round) {\n resizeObserverRef.current = {\n box: opts.box,\n round: round,\n instance: new ResizeObserver(function (entries) {\n var entry = entries[0];\n var boxProp = opts.box === \"border-box\" ? \"borderBoxSize\" : opts.box === \"device-pixel-content-box\" ? \"devicePixelContentBoxSize\" : \"contentBoxSize\";\n var reportedWidth = extractSize(entry, boxProp, \"inlineSize\");\n var reportedHeight = extractSize(entry, boxProp, \"blockSize\");\n var newWidth = reportedWidth ? round(reportedWidth) : undefined;\n var newHeight = reportedHeight ? round(reportedHeight) : undefined;\n\n if (previous.current.width !== newWidth || previous.current.height !== newHeight) {\n var newSize = {\n width: newWidth,\n height: newHeight\n };\n previous.current.width = newWidth;\n previous.current.height = newHeight;\n\n if (onResizeRef.current) {\n onResizeRef.current(newSize);\n } else {\n if (!didUnmount.current) {\n setSize(newSize);\n }\n }\n }\n })\n };\n }\n\n resizeObserverRef.current.instance.observe(element, {\n box: opts.box\n });\n return function () {\n if (resizeObserverRef.current) {\n resizeObserverRef.current.instance.unobserve(element);\n }\n };\n }, [opts.box, round]), opts.ref);\n return useMemo(function () {\n return {\n ref: refCallback,\n width: size.width,\n height: size.height\n };\n }, [refCallback, size.width, size.height]);\n}\n\nexport { useResizeObserver as default };\n","import { useThrottledCallback } from 'use-debounce';\nimport useResizeObserver from 'use-resize-observer';\n\nexport default function useThrottledResizeObserver(opts = {}) {\n const onResize = useThrottledCallback(opts.onResize, 300);\n return useResizeObserver({\n ...opts,\n onResize,\n });\n}\n","import { useRef } from 'preact/hooks';\n\nimport useThrottledResizeObserver from './useThrottledResizeObserver';\n\nexport default function useTruncated({\n className = 'truncated',\n onTruncated,\n} = {}) {\n const ref = useRef();\n const prevTruncatedRef = useRef();\n const onResize = ({ height }) => {\n if (ref.current) {\n const { scrollHeight } = ref.current;\n let truncated = scrollHeight > height;\n if (truncated) {\n const { height: _height, maxHeight } = getComputedStyle(ref.current);\n const computedHeight = parseInt(maxHeight || _height, 10);\n truncated = scrollHeight > computedHeight;\n }\n ref.current.classList.toggle(className, truncated);\n if (\n prevTruncatedRef.current !== truncated &&\n typeof onTruncated === 'function'\n ) {\n prevTruncatedRef.current = truncated;\n onTruncated(truncated);\n }\n }\n };\n useThrottledResizeObserver({\n ref,\n box: 'border-box',\n onResize,\n });\n return ref;\n}\n","export default {\n public: 'earth',\n unlisted: 'moon',\n private: 'lock',\n direct: 'message',\n local: 'building',\n};\n","import { msg } from '@lingui/core/macro';\n\nconst visibilityText = {\n public: msg`Public`,\n local: msg`Local`,\n unlisted: msg`Quiet public`,\n private: msg`Followers`,\n direct: msg`Private mention`,\n};\n\nexport default visibilityText;\n","import 'temml/dist/Temml-Local.css';\n\nimport { useLingui } from '@lingui/react/macro';\nimport { useCallback, useState } from 'preact/hooks';\n\nimport showToast from '../utils/show-toast';\n\nimport Icon from './icon';\n\n// Follow https://mathstodon.xyz/about\n// > You can use LaTeX in toots here! Use \\( and \\) for inline, and \\[ and \\] for display mode.\nconst DELIMITERS_PATTERNS = [\n // '\\\\$\\\\$[\\\\s\\\\S]*?\\\\$\\\\$', // $$...$$\n '\\\\\\\\\\\\[[\\\\s\\\\S]*?\\\\\\\\\\\\]', // \\[...\\]\n '\\\\\\\\\\\\([\\\\s\\\\S]*?\\\\\\\\\\\\)', // \\(...\\)\n // '\\\\\\\\begin\\\\{(?:equation\\\\*?|align\\\\*?|alignat\\\\*?|gather\\\\*?|CD)\\\\}[\\\\s\\\\S]*?\\\\\\\\end\\\\{(?:equation\\\\*?|align\\\\*?|alignat\\\\*?|gather\\\\*?|CD)\\\\}', // AMS environments\n // '\\\\\\\\(?:ref|eqref)\\\\{[^}]*\\\\}', // \\ref{...}, \\eqref{...}\n];\nconst DELIMITERS_REGEX = new RegExp(DELIMITERS_PATTERNS.join('|'), 'g');\n\nfunction cleanDOMForTemml(dom) {\n // Define start and end delimiter patterns\n const START_DELIMITERS = ['\\\\\\\\\\\\[', '\\\\\\\\\\\\(']; // \\[ and \\(\n const startRegex = new RegExp(`(${START_DELIMITERS.join('|')})`);\n\n // Walk through all text nodes\n const walker = document.createTreeWalker(dom, NodeFilter.SHOW_TEXT);\n const textNodes = [];\n let node;\n while ((node = walker.nextNode())) {\n textNodes.push(node);\n }\n\n for (const textNode of textNodes) {\n const text = textNode.textContent;\n const startMatch = text.match(startRegex);\n\n if (!startMatch) continue; // No start delimiter in this text node\n\n // Find the matching end delimiter\n const startDelimiter = startMatch[0];\n const endDelimiter = startDelimiter === '\\\\[' ? '\\\\]' : '\\\\)';\n\n // Collect nodes from start delimiter until end delimiter\n const nodesToCombine = [textNode];\n let currentNode = textNode;\n let foundEnd = false;\n let combinedText = text;\n\n // Check if end delimiter is in the same text node\n if (text.includes(endDelimiter)) {\n foundEnd = true;\n } else {\n // Look through sibling nodes\n while (currentNode.nextSibling && !foundEnd) {\n const nextSibling = currentNode.nextSibling;\n\n if (nextSibling.nodeType === Node.TEXT_NODE) {\n nodesToCombine.push(nextSibling);\n combinedText += nextSibling.textContent;\n if (nextSibling.textContent.includes(endDelimiter)) {\n foundEnd = true;\n }\n } else if (\n nextSibling.nodeType === Node.ELEMENT_NODE &&\n nextSibling.tagName === 'BR'\n ) {\n nodesToCombine.push(nextSibling);\n combinedText += '\\n';\n } else {\n // Found a non-BR element, stop and don't process\n break;\n }\n\n currentNode = nextSibling;\n }\n }\n\n // Only process if we found the end delimiter and have nodes to combine\n if (foundEnd && nodesToCombine.length > 1) {\n // Replace the first text node with combined text\n textNode.textContent = combinedText;\n\n // Remove the other nodes\n for (let i = 1; i < nodesToCombine.length; i++) {\n nodesToCombine[i].remove();\n }\n }\n }\n}\n\nconst MathBlock = ({ content, contentRef, onRevert }) => {\n DELIMITERS_REGEX.lastIndex = 0; // Reset index to prevent g trap\n const hasLatexContent = DELIMITERS_REGEX.test(content);\n\n if (!hasLatexContent) return null;\n\n const { t } = useLingui();\n const [mathRendered, setMathRendered] = useState(false);\n const toggleMathRendering = useCallback(\n async (e) => {\n e.preventDefault();\n e.stopPropagation();\n if (mathRendered) {\n // Revert to original content by refreshing PostContent\n setMathRendered(false);\n onRevert();\n } else {\n // Render math\n try {\n // This needs global because the codebase inside temml is calling a function from global.temml 🤦‍♂️\n const temml =\n window.temml || (window.temml = (await import('temml'))?.default);\n\n cleanDOMForTemml(contentRef.current);\n const originalContentRefHTML = contentRef.current.innerHTML;\n temml.renderMathInElement(contentRef.current, {\n fences: '(', // This should sync with DELIMITERS_REGEX\n annotate: true,\n throwOnError: true,\n errorCallback: (err) => {\n console.warn('Failed to render LaTeX:', err);\n },\n });\n\n const hasMath = contentRef.current.querySelector('math');\n const htmlChanged =\n contentRef.current.innerHTML !== originalContentRefHTML;\n if (hasMath && htmlChanged) {\n setMathRendered(true);\n } else {\n showToast(t`Unable to format math`);\n setMathRendered(false);\n onRevert(); // Revert because DOM modified by cleanDOMForTemml\n }\n } catch (e) {\n console.error('Failed to LaTeX:', e);\n }\n }\n },\n [mathRendered],\n );\n\n return (\n <div class=\"math-block\">\n <Icon icon=\"formula\" size=\"s\" /> <span>{t`Math expressions found.`}</span>{' '}\n <button type=\"button\" class=\"light small\" onClick={toggleMathRendering}>\n {mathRendered\n ? t({\n comment:\n 'Action to switch from rendered math back to raw (LaTeX) markup',\n message: 'Show markup',\n })\n : t({\n comment:\n 'Action to render math expressions from raw (LaTeX) markup',\n message: 'Format math',\n })}\n </button>\n </div>\n );\n};\n\nexport default MathBlock;\n","const digitLookup = new Uint8Array(128);\nfor (let i = 0; i < 83; i++) {\n digitLookup[\n '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz#$%*+,-.:;=?@[]^_{|}~'.charCodeAt(\n i,\n )\n ] = i;\n}\nconst decode83 = (str, start, end) => {\n let value = 0;\n while (start < end) {\n value *= 83;\n value += digitLookup[str.charCodeAt(start++)];\n }\n return value;\n};\n\nconst pow = Math.pow;\nconst PI = Math.PI;\nconst PI2 = PI * 2;\n\nconst d = 3294.6;\nconst e = 269.025;\nconst sRGBToLinear = (value) =>\n value > 10.31475 ? pow(value / e + 0.052132, 2.4) : value / d;\n\nconst linearTosRGB = (v) =>\n ~~(v > 0.00001227 ? e * pow(v, 0.416666) - 13.025 : v * d + 1);\n\nconst signSqr = (x) => (x < 0 ? -1 : 1) * x * x;\n\n/**\n * Fast approximate cosine implementation\n * Based on FTrig https://github.com/netcell/FTrig\n */\nconst fastCos = (x) => {\n x += PI / 2;\n while (x > PI) {\n x -= PI2;\n }\n const cos = 1.27323954 * x - 0.405284735 * signSqr(x);\n return 0.225 * (signSqr(cos) - cos) + cos;\n};\n\n/**\n * Extracts average color from BlurHash image\n * @param {string} blurHash BlurHash image string\n * @returns {[number, number, number]}\n */\nexport function getBlurHashAverageColor(blurHash) {\n const val = decode83(blurHash, 2, 6);\n return [val >> 16, (val >> 8) & 255, val & 255];\n}\n\n/**\n * Decodes BlurHash image\n * @param {string} blurHash BlurHash image string\n * @param {number} width Output image width\n * @param {number} height Output image height\n * @param {?number} punch\n * @returns {Uint8ClampedArray}\n */\nexport function decodeBlurHash(blurHash, width, height, punch) {\n const sizeFlag = decode83(blurHash, 0, 1);\n const numX = (sizeFlag % 9) + 1;\n const numY = ~~(sizeFlag / 9) + 1;\n const size = numX * numY;\n\n let i = 0,\n j = 0,\n x = 0,\n y = 0,\n r = 0,\n g = 0,\n b = 0,\n basis = 0,\n basisY = 0,\n colorIndex = 0,\n pixelIndex = 0,\n value = 0;\n\n const maximumValue = ((decode83(blurHash, 1, 2) + 1) / 13446) * (punch | 1);\n\n const colors = new Float64Array(size * 3);\n\n const averageColor = getBlurHashAverageColor(blurHash);\n for (i = 0; i < 3; i++) {\n colors[i] = sRGBToLinear(averageColor[i]);\n }\n\n for (i = 1; i < size; i++) {\n value = decode83(blurHash, 4 + i * 2, 6 + i * 2);\n colors[i * 3] = signSqr(~~(value / 361) - 9) * maximumValue;\n colors[i * 3 + 1] = signSqr((~~(value / 19) % 19) - 9) * maximumValue;\n colors[i * 3 + 2] = signSqr((value % 19) - 9) * maximumValue;\n }\n\n const cosinesY = new Float64Array(numY * height);\n const cosinesX = new Float64Array(numX * width);\n for (j = 0; j < numY; j++) {\n for (y = 0; y < height; y++) {\n cosinesY[j * height + y] = fastCos((PI * y * j) / height);\n }\n }\n for (i = 0; i < numX; i++) {\n for (x = 0; x < width; x++) {\n cosinesX[i * width + x] = fastCos((PI * x * i) / width);\n }\n }\n\n const bytesPerRow = width * 4;\n const pixels = new Uint8ClampedArray(bytesPerRow * height);\n\n for (y = 0; y < height; y++) {\n for (x = 0; x < width; x++) {\n r = g = b = 0;\n for (j = 0; j < numY; j++) {\n basisY = cosinesY[j * height + y];\n for (i = 0; i < numX; i++) {\n basis = cosinesX[i * width + x] * basisY;\n colorIndex = (i + j * numX) * 3;\n r += colors[colorIndex] * basis;\n g += colors[colorIndex + 1] * basis;\n b += colors[colorIndex + 2] * basis;\n }\n }\n\n pixelIndex = 4 * x + y * bytesPerRow;\n pixels[pixelIndex] = linearTosRGB(r);\n pixels[pixelIndex + 1] = linearTosRGB(g);\n pixels[pixelIndex + 2] = linearTosRGB(b);\n pixels[pixelIndex + 3] = 255; // alpha\n }\n }\n return pixels;\n}\n","/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\n\nvar extendStatics = function(d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n};\n\nexport function __extends(d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nexport var __assign = function() {\n __assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n return t;\n }\n return __assign.apply(this, arguments);\n}\n\nexport function __rest(s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n}\n\nexport function __decorate(decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nexport function __param(paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\n var _, done = false;\n for (var i = decorators.length - 1; i >= 0; i--) {\n var context = {};\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\n if (kind === \"accessor\") {\n if (result === void 0) continue;\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\n if (_ = accept(result.get)) descriptor.get = _;\n if (_ = accept(result.set)) descriptor.set = _;\n if (_ = accept(result.init)) initializers.unshift(_);\n }\n else if (_ = accept(result)) {\n if (kind === \"field\") initializers.unshift(_);\n else descriptor[key] = _;\n }\n }\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\n done = true;\n};\n\nexport function __runInitializers(thisArg, initializers, value) {\n var useValue = arguments.length > 2;\n for (var i = 0; i < initializers.length; i++) {\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\n }\n return useValue ? value : void 0;\n};\n\nexport function __propKey(x) {\n return typeof x === \"symbol\" ? x : \"\".concat(x);\n};\n\nexport function __setFunctionName(f, name, prefix) {\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\n};\n\nexport function __metadata(metadataKey, metadataValue) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nexport function __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\n\nexport function __generator(thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n}\n\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n});\n\nexport function __exportStar(m, o) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nexport function __values(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\n\nexport function __read(o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n}\n\n/** @deprecated */\nexport function __spread() {\n for (var ar = [], i = 0; i < arguments.length; i++)\n ar = ar.concat(__read(arguments[i]));\n return ar;\n}\n\n/** @deprecated */\nexport function __spreadArrays() {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n}\n\nexport function __spreadArray(to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nexport function __await(v) {\n return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\n\nexport function __asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n function fulfill(value) { resume(\"next\", value); }\n function reject(value) { resume(\"throw\", value); }\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nexport function __asyncDelegator(o) {\n var i, p;\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\n}\n\nexport function __asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var m = o[Symbol.asyncIterator], i;\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nexport function __makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\n return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n};\n\nvar ownKeys = function(o) {\n ownKeys = Object.getOwnPropertyNames || function (o) {\n var ar = [];\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n return ar;\n };\n return ownKeys(o);\n};\n\nexport function __importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n __setModuleDefault(result, mod);\n return result;\n}\n\nexport function __importDefault(mod) {\n return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nexport function __classPrivateFieldIn(state, receiver) {\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\n\nexport function __addDisposableResource(env, value, async) {\n if (value !== null && value !== void 0) {\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\n var dispose, inner;\n if (async) {\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\n dispose = value[Symbol.asyncDispose];\n }\n if (dispose === void 0) {\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\n dispose = value[Symbol.dispose];\n if (async) inner = dispose;\n }\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\n env.stack.push({ value: value, dispose: dispose, async: async });\n }\n else if (async) {\n env.stack.push({ async: true });\n }\n return value;\n}\n\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\n var e = new Error(message);\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\n};\n\nexport function __disposeResources(env) {\n function fail(e) {\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\n env.hasError = true;\n }\n var r, s = 0;\n function next() {\n while (r = env.stack.pop()) {\n try {\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\n if (r.dispose) {\n var result = r.dispose.call(r.value);\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\n }\n else s |= 1;\n }\n catch (e) {\n fail(e);\n }\n }\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\n if (env.hasError) throw env.error;\n }\n return next();\n}\n\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\n });\n }\n return path;\n}\n\nexport default {\n __extends,\n __assign,\n __rest,\n __decorate,\n __param,\n __esDecorate,\n __runInitializers,\n __propKey,\n __setFunctionName,\n __metadata,\n __awaiter,\n __generator,\n __createBinding,\n __exportStar,\n __values,\n __read,\n __spread,\n __spreadArrays,\n __spreadArray,\n __await,\n __asyncGenerator,\n __asyncDelegator,\n __asyncValues,\n __makeTemplateObject,\n __importStar,\n __importDefault,\n __classPrivateFieldGet,\n __classPrivateFieldSet,\n __classPrivateFieldIn,\n __addDisposableResource,\n __disposeResources,\n __rewriteRelativeImportExtension,\n};\n","export var styleRoot = 'kvfysmfp';\nexport var styleChild = 'ufhsfnkm';\nexport var styles = \".\".concat(styleRoot, \"{overflow:hidden;touch-action:none}.\").concat(styleChild, \"{transform-origin: 0 0}\");\n","var isSsr = typeof window === 'undefined';\nexport var isTouch = function () {\n return !isSsr && ('ontouchstart' in window || navigator.maxTouchPoints > 0);\n};\nexport var make2dTransformValue = function (_a) {\n var x = _a.x, y = _a.y, scale = _a.scale;\n return \"scale(\".concat(scale, \") translate(\").concat(x, \"px, \").concat(y, \"px)\");\n};\nexport var make3dTransformValue = function (_a) {\n var x = _a.x, y = _a.y, scale = _a.scale;\n return \"scale3d(\".concat(scale, \",\").concat(scale, \", 1) translate3d(\").concat(x, \"px, \").concat(y, \"px, 0)\");\n};\nexport var hasTranslate3DSupport = function () {\n var css = !isSsr && window.CSS;\n return css && css.supports && css.supports('transform', 'translate3d(0,0,0)');\n};\n","var min = Math.min, max = Math.max;\nexport function getOffsetBounds(_a) {\n var containerDimension = _a.containerDimension, childDimension = _a.childDimension, padding = _a.padding, centerContained = _a.centerContained;\n var diff = childDimension - containerDimension;\n if (diff + 2 * padding <= 0 && centerContained) {\n return [diff / 2, diff / 2];\n }\n else {\n return [min(diff + padding, 0) - padding, max(0, diff + padding)];\n }\n}\n","import { __assign, __extends } from \"tslib\";\nimport React, { Component, createRef, Children, cloneElement } from 'react';\nimport { styleRoot, styleChild, styles } from './styles.css';\nimport { isTouch } from '../utils';\nimport { getOffsetBounds } from './getOffsetBounds';\nvar classnames = function (base, other) {\n return other ? \"\".concat(base, \" \").concat(other) : base;\n};\nvar abs = Math.abs, min = Math.min, sqrt = Math.sqrt;\nvar isSsr = typeof window === 'undefined';\nvar isMac = isSsr ? false : /(Mac)/i.test(navigator.platform);\nvar isDragInteraction = function (i) { return i === 'drag'; };\nvar isZoomInteraction = function (i) { return i === 'zoom'; };\nvar isZoomGesture = function (wheelEvent) { return isMac && wheelEvent.ctrlKey; };\nvar cancelEvent = function (event) {\n event.stopPropagation();\n event.preventDefault();\n};\nvar getDistance = function (a, b) {\n var x = a.x - b.x;\n var y = a.y - b.y;\n return sqrt(x * x + y * y);\n};\nvar calculateScale = function (startTouches, endTouches) {\n var startDistance = getDistance(startTouches[0], startTouches[1]);\n var endDistance = getDistance(endTouches[0], endTouches[1]);\n return endDistance / startDistance;\n};\nvar isCloseTo = function (value, expected) {\n return value > expected - 0.01 && value < expected + 0.01;\n};\nvar swing = function (p) { return -Math.cos(p * Math.PI) / 2 + 0.5; };\nvar getPointByPageCoordinates = function (touch) { return ({\n x: touch.pageX,\n y: touch.pageY,\n}); };\nvar getPageCoordinatesByTouches = function (touches) {\n return Array.from(touches).map(getPointByPageCoordinates);\n};\nvar sum = function (a, b) { return a + b; };\nvar getVectorAvg = function (vectors) { return ({\n x: vectors.map(function (_a) {\n var x = _a.x;\n return x;\n }).reduce(sum, 0) / vectors.length,\n y: vectors.map(function (_a) {\n var y = _a.y;\n return y;\n }).reduce(sum, 0) / vectors.length,\n}); };\nvar clamp = function (min, max, value) {\n return value < min ? min : value > max ? max : value;\n};\nvar shouldInterceptWheel = function (event) {\n return !(event.ctrlKey || event.metaKey);\n};\nvar getElementSize = function (element) {\n if (element) {\n var offsetWidth = element.offsetWidth, offsetHeight = element.offsetHeight;\n // Any DOMElement\n if (offsetWidth && offsetHeight) {\n return { width: offsetWidth, height: offsetHeight };\n }\n // Svg support\n var style = getComputedStyle(element);\n var width = parseFloat(style.width);\n var height = parseFloat(style.height);\n if (height && width) {\n return { width: width, height: height };\n }\n }\n return { width: 0, height: 0 };\n};\nvar calculateVelocity = function (startPoint, endPoint) { return ({\n x: endPoint.x - startPoint.x,\n y: endPoint.y - startPoint.y,\n}); };\nvar comparePoints = function (p1, p2) { return p1.x === p2.x && p1.y === p2.y; };\nvar noup = function () { };\nvar zeroPoint = { x: 0, y: 0 };\nvar PinchZoom = /** @class */ (function (_super) {\n __extends(PinchZoom, _super);\n function PinchZoom() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this._prevDragMovePoint = null;\n _this._containerObserver = null;\n _this._fingers = 0;\n _this._firstMove = true;\n _this._initialOffset = __assign({}, zeroPoint);\n _this._interaction = null;\n _this._isDoubleTap = false;\n _this._isOffsetsSet = false;\n _this._lastDragPosition = null;\n _this._lastScale = 1;\n _this._lastTouchStart = 0;\n _this._lastZoomCenter = null;\n _this._listenMouseMove = false;\n _this._nthZoom = 0;\n _this._offset = __assign({}, zeroPoint);\n _this._startOffset = __assign({}, zeroPoint);\n _this._startTouches = null;\n _this._updatePlaned = false;\n _this._wheelTimeOut = null;\n _this._zoomFactor = 1;\n _this._initialZoomFactor = 1;\n _this._draggingPoint = __assign({}, zeroPoint);\n // It help reduce behavior difference between touch and mouse events\n _this._ignoreNextClick = false;\n // @ts-ignore\n _this._containerRef = createRef();\n _this._handleClick = function (clickEvent) {\n if (_this._ignoreNextClick) {\n _this._ignoreNextClick = false;\n clickEvent.stopPropagation();\n }\n };\n _this._onResize = function () {\n var _a;\n if ((_a = _this._containerRef) === null || _a === void 0 ? void 0 : _a.current) {\n _this._updateInitialZoomFactor();\n _this._setupOffsets();\n _this._update();\n }\n };\n _this._handlerOnTouchEnd = _this._handlerIfEnable(function (touchEndEvent) {\n _this._fingers = touchEndEvent.touches.length;\n if (_this.props.shouldCancelHandledTouchEndEvents &&\n (isZoomInteraction(_this._interaction) ||\n (isDragInteraction(_this._interaction) &&\n (_this._startOffset.x !== _this._offset.x ||\n _this._startOffset.y !== _this._offset.y)))) {\n cancelEvent(touchEndEvent);\n }\n if (isDragInteraction(_this._interaction) && !_this._enoughToDrag()) {\n _this._handleClick(touchEndEvent);\n }\n _this._updateInteraction(touchEndEvent);\n });\n _this._handlerOnTouchStart = _this._handlerIfEnable(function (touchStartEvent) {\n _this._firstMove = true;\n _this._fingers = touchStartEvent.touches.length;\n _this._detectDoubleTap(touchStartEvent);\n });\n _this._handlerOnTouchMove = _this._handlerIfEnable(function (touchMoveEvent) {\n if (_this._isDoubleTap) {\n return;\n }\n _this._collectInertia(touchMoveEvent);\n if (_this._firstMove) {\n _this._updateInteraction(touchMoveEvent);\n if (_this._interaction) {\n cancelEvent(touchMoveEvent);\n }\n _this._startOffset = __assign({}, _this._offset);\n _this._startTouches = getPageCoordinatesByTouches(touchMoveEvent.touches);\n }\n else {\n if (isZoomInteraction(_this._interaction)) {\n if (_this._startTouches &&\n _this._startTouches.length === 2 &&\n touchMoveEvent.touches.length === 2) {\n _this._handleZoom(touchMoveEvent, calculateScale(_this._startTouches, getPageCoordinatesByTouches(touchMoveEvent.touches)));\n }\n }\n else if (isDragInteraction(_this._interaction)) {\n _this._handleDrag(touchMoveEvent);\n }\n if (_this._interaction) {\n cancelEvent(touchMoveEvent);\n _this._update();\n }\n }\n _this._firstMove = false;\n });\n _this._handlerWheel = function (wheelEvent) {\n if (_this.props.shouldInterceptWheel(wheelEvent)) {\n return;\n }\n cancelEvent(wheelEvent);\n var pageX = wheelEvent.pageX, pageY = wheelEvent.pageY, deltaY = wheelEvent.deltaY, deltaMode = wheelEvent.deltaMode;\n var scaleDelta = 1;\n if (isZoomGesture(wheelEvent) || deltaMode === 1) {\n scaleDelta = 15;\n }\n var likeTouchEvent = {\n touches: [\n // @ts-ignore\n { pageX: pageX, pageY: pageY },\n ],\n };\n var center = _this._getOffsetByFirstTouch(likeTouchEvent);\n var dScale = deltaY * scaleDelta;\n _this._stopAnimation();\n _this._scaleTo(_this._zoomFactor - dScale / _this.props.wheelScaleFactor, center);\n _this._update();\n clearTimeout(\n // @ts-ignore\n _this._wheelTimeOut);\n _this._wheelTimeOut = setTimeout(function () { return _this._sanitize(); }, 100);\n };\n // @ts-ignore\n _this._handlers = _this.props.isTouch()\n ? [\n ['touchstart', _this._handlerOnTouchStart],\n ['touchend', _this._handlerOnTouchEnd],\n ['touchmove', _this._handlerOnTouchMove],\n ]\n : [\n [\n 'mousemove',\n _this.simulate(_this._handlerOnTouchMove),\n _this.props._document,\n ],\n [\n 'mouseup',\n _this.simulate(_this._handlerOnTouchEnd),\n _this.props._document,\n ],\n ['mousedown', _this.simulate(_this._handlerOnTouchStart)],\n ['click', _this._handleClick],\n ['wheel', _this._handlerWheel],\n ];\n return _this;\n }\n PinchZoom.prototype._handleDragStart = function (event) {\n this._ignoreNextClick = true;\n this.props.onDragStart();\n this._stopAnimation();\n this._resetInertia();\n this._lastDragPosition = null;\n this._hasInteraction = true;\n this._draggingPoint = this._offset;\n this._handleDrag(event);\n };\n PinchZoom.prototype._handleDrag = function (event) {\n var touch = this._getOffsetByFirstTouch(event);\n if (this._enoughToDrag()) {\n this._drag(touch, this._lastDragPosition);\n }\n else {\n this._virtualDrag(touch, this._lastDragPosition);\n }\n this._offset = this._sanitizeOffset(this._offset);\n this._lastDragPosition = touch;\n };\n PinchZoom.prototype._resetInertia = function () {\n this._velocity = null;\n this._prevDragMovePoint = null;\n };\n PinchZoom.prototype._realizeInertia = function () {\n var _this = this;\n var _a = this.props, inertiaFriction = _a.inertiaFriction, inertia = _a.inertia;\n if (!inertia || !this._velocity) {\n return;\n }\n var _b = this._velocity, x = _b.x, y = _b.y;\n if (x || y) {\n this._stopAnimation();\n this._resetInertia();\n var renderFrame = function () {\n x *= inertiaFriction;\n y *= inertiaFriction;\n if (!x && !y) {\n return _this._stopAnimation();\n }\n var prevOffset = __assign({}, _this._offset);\n _this._addOffset({ x: x, y: y });\n _this._offset = _this._sanitizeOffset(_this._offset);\n if (comparePoints(prevOffset, _this._offset)) {\n return _this._stopAnimation();\n }\n _this._update({ isAnimation: true });\n };\n this._animate(renderFrame, { duration: 9999 });\n }\n };\n PinchZoom.prototype._collectInertia = function (_a) {\n var touches = _a.touches;\n if (!this.props.inertia) {\n return;\n }\n var currentCoordinates = getPageCoordinatesByTouches(touches)[0];\n var prevPoint = this._prevDragMovePoint;\n if (prevPoint) {\n this._velocity = calculateVelocity(currentCoordinates, prevPoint);\n }\n this._prevDragMovePoint = currentCoordinates;\n };\n PinchZoom.prototype._handleDragEnd = function () {\n this.props.onDragEnd();\n this._end();\n this._realizeInertia();\n };\n PinchZoom.prototype._handleZoomStart = function () {\n this.props.onZoomStart();\n this._stopAnimation();\n this._lastScale = 1;\n this._nthZoom = 0;\n this._lastZoomCenter = null;\n this._hasInteraction = true;\n };\n PinchZoom.prototype._handleZoom = function (event, newScale) {\n var touchCenter = getVectorAvg(this._getOffsetTouches(event));\n var scale = newScale / this._lastScale;\n this._lastScale = newScale;\n // The first touch events are thrown away since they are not precise\n this._nthZoom += 1;\n if (this._nthZoom > 3) {\n this._scale(scale, touchCenter);\n this._drag(touchCenter, this._lastZoomCenter);\n if (this.props.enforceBoundsDuringZoom) {\n this._offset = this._sanitizeOffset(this._offset);\n }\n }\n this._lastZoomCenter = touchCenter;\n };\n PinchZoom.prototype._handleZoomEnd = function () {\n this.props.onZoomEnd();\n this._end();\n };\n PinchZoom.prototype._handleDoubleTap = function (event) {\n var _this = this;\n if (this._hasInteraction || this.props.tapZoomFactor === 0) {\n return;\n }\n var needZoomOut = (this.props.doubleTapZoomOutOnMaxScale &&\n this._zoomFactor === this.props.maxZoom) ||\n (this.props.doubleTapToggleZoom && this._zoomFactor > 1);\n this.props.onDoubleTap();\n this._ignoreNextClick = true;\n var zoomFactor = this._zoomFactor + this.props.tapZoomFactor;\n var startZoomFactor = this._zoomFactor;\n var updateProgress = function (progress) {\n _this._scaleTo(startZoomFactor + progress * (zoomFactor - startZoomFactor), center);\n };\n var center = this._getOffsetByFirstTouch(event);\n this._isDoubleTap = true;\n if (startZoomFactor > zoomFactor) {\n center = this._getCurrentZoomCenter();\n }\n needZoomOut ? this._zoomOutAnimation() : this._animate(updateProgress);\n };\n PinchZoom.prototype._computeInitialOffset = function () {\n var rect = this._getContainerRect();\n var _a = this._getChildSize(), width = _a.width, height = _a.height;\n var x = -abs(width * this._getInitialZoomFactor() - rect.width) / 2;\n var y = -abs(height * this._getInitialZoomFactor() - rect.height) / 2;\n this._initialOffset = { x: x, y: y };\n };\n PinchZoom.prototype._resetOffset = function () {\n this._offset = __assign({}, this._initialOffset);\n };\n PinchZoom.prototype._setupOffsets = function () {\n if (this.props.setOffsetsOnce && this._isOffsetsSet) {\n return;\n }\n this._isOffsetsSet = true;\n this._computeInitialOffset();\n this._resetOffset();\n };\n PinchZoom.prototype._sanitizeOffset = function (offset) {\n var rect = this._getContainerRect();\n var _a = this._getChildSize(), width = _a.width, height = _a.height;\n var elWidth = width * this._getInitialZoomFactor() * this._zoomFactor;\n var elHeight = height * this._getInitialZoomFactor() * this._zoomFactor;\n var _b = getOffsetBounds({\n containerDimension: rect.width,\n childDimension: elWidth,\n padding: this.props.horizontalPadding,\n centerContained: this.props.centerContained,\n }), minOffsetX = _b[0], maxOffsetX = _b[1];\n var _c = getOffsetBounds({\n containerDimension: rect.height,\n childDimension: elHeight,\n padding: this.props.verticalPadding,\n centerContained: this.props.centerContained,\n }), minOffsetY = _c[0], maxOffsetY = _c[1];\n return {\n x: clamp(minOffsetX, maxOffsetX, offset.x),\n y: clamp(minOffsetY, maxOffsetY, offset.y),\n };\n };\n PinchZoom.prototype.alignCenter = function (options) {\n var _this = this;\n var _a = __assign({ duration: 250, animated: true }, options), __x = _a.x, __y = _a.y, scale = _a.scale, animated = _a.animated, duration = _a.duration;\n // Bug-Fix: https://github.com/retyui/react-quick-pinch-zoom/issues/58\n var x = __x * this._initialZoomFactor;\n var y = __y * this._initialZoomFactor;\n var startZoomFactor = this._zoomFactor;\n var startOffset = __assign({}, this._offset);\n var rect = this._getContainerRect();\n var containerCenter = { x: rect.width / 2, y: rect.height / 2 };\n this._zoomFactor = 1;\n this._offset = { x: -(containerCenter.x - x), y: -(containerCenter.y - y) };\n this._scaleTo(scale, containerCenter);\n this._stopAnimation();\n if (!animated) {\n return this._update();\n }\n var diffZoomFactor = this._zoomFactor - startZoomFactor;\n var diffOffset = {\n x: this._offset.x - startOffset.x,\n y: this._offset.y - startOffset.y,\n };\n this._zoomFactor = startZoomFactor;\n this._offset = __assign({}, startOffset);\n var updateFrame = function (progress) {\n var x = startOffset.x + diffOffset.x * progress;\n var y = startOffset.y + diffOffset.y * progress;\n _this._zoomFactor = startZoomFactor + diffZoomFactor * progress;\n _this._offset = _this._sanitizeOffset({ x: x, y: y });\n _this._update();\n };\n this._animate(updateFrame, {\n callback: function () { return _this._sanitize(); },\n duration: duration,\n });\n };\n PinchZoom.prototype.scaleTo = function (options) {\n var _this = this;\n var _a = __assign({ duration: 250, animated: true }, options), x = _a.x, y = _a.y, scale = _a.scale, animated = _a.animated, duration = _a.duration;\n var startZoomFactor = this._zoomFactor;\n var startOffset = __assign({}, this._offset);\n this._zoomFactor = 1;\n this._offset = { x: 0, y: 0 };\n this._scaleTo(scale, { x: x, y: y });\n this._stopAnimation();\n if (!animated) {\n return this._update();\n }\n var diffZoomFactor = this._zoomFactor - startZoomFactor;\n var diffOffset = {\n x: this._offset.x - startOffset.x,\n y: this._offset.y - startOffset.y,\n };\n this._zoomFactor = startZoomFactor;\n this._offset = __assign({}, startOffset);\n var updateFrame = function (progress) {\n var x = startOffset.x + diffOffset.x * progress;\n var y = startOffset.y + diffOffset.y * progress;\n _this._zoomFactor = startZoomFactor + diffZoomFactor * progress;\n _this._offset = { x: x, y: y };\n _this._update();\n };\n this._animate(updateFrame, { callback: function () { return _this._sanitize(); }, duration: duration });\n };\n PinchZoom.prototype._scaleTo = function (zoomFactor, center) {\n this._scale(zoomFactor / this._zoomFactor, center);\n this._offset = this._sanitizeOffset(this._offset);\n };\n PinchZoom.prototype._scale = function (scale, center) {\n scale = this._scaleZoomFactor(scale);\n this._addOffset({\n x: (scale - 1) * (center.x + this._offset.x),\n y: (scale - 1) * (center.y + this._offset.y),\n });\n this.props.onZoomUpdate();\n };\n PinchZoom.prototype._scaleZoomFactor = function (scale) {\n var originalZoomFactor = this._zoomFactor;\n this._zoomFactor *= scale;\n this._zoomFactor = clamp(this.props.minZoom, this.props.maxZoom, this._zoomFactor);\n return this._zoomFactor / originalZoomFactor;\n };\n PinchZoom.prototype._canDrag = function () {\n return this.props.draggableUnZoomed || !isCloseTo(this._zoomFactor, 1);\n };\n PinchZoom.prototype._drag = function (center, lastCenter) {\n if (lastCenter) {\n var y = -(center.y - lastCenter.y);\n var x = -(center.x - lastCenter.x);\n if (!this.props.lockDragAxis) {\n this._addOffset({\n x: x,\n y: y,\n });\n }\n else {\n // lock scroll to position that was changed the most\n if (abs(x) > abs(y)) {\n this._addOffset({\n x: x,\n y: 0,\n });\n }\n else {\n this._addOffset({\n y: y,\n x: 0,\n });\n }\n }\n this.props.onDragUpdate();\n }\n };\n PinchZoom.prototype._virtualDrag = function (center, lastCenter) {\n if (lastCenter) {\n var y = -(center.y - lastCenter.y);\n var x = -(center.x - lastCenter.x);\n this._draggingPoint = {\n x: x + this._draggingPoint.x,\n y: y + this._draggingPoint.y,\n };\n }\n };\n PinchZoom.prototype._addOffset = function (offset) {\n var _a = this._offset, x = _a.x, y = _a.y;\n this._offset = {\n x: x + offset.x,\n y: y + offset.y,\n };\n };\n PinchZoom.prototype._sanitize = function () {\n if (this._zoomFactor < this.props.zoomOutFactor) {\n this._resetInertia();\n this._zoomOutAnimation();\n }\n else if (this._isInsaneOffset()) {\n this._sanitizeOffsetAnimation();\n }\n };\n PinchZoom.prototype._isInsaneOffset = function () {\n var offset = this._offset;\n var sanitizedOffset = this._sanitizeOffset(offset);\n return sanitizedOffset.x !== offset.x || sanitizedOffset.y !== offset.y;\n };\n PinchZoom.prototype._sanitizeOffsetAnimation = function () {\n var _this = this;\n var targetOffset = this._sanitizeOffset(this._offset);\n var startOffset = __assign({}, this._offset);\n var updateProgress = function (progress) {\n var x = startOffset.x + progress * (targetOffset.x - startOffset.x);\n var y = startOffset.y + progress * (targetOffset.y - startOffset.y);\n _this._offset = { x: x, y: y };\n _this._update();\n };\n this._animate(updateProgress);\n };\n PinchZoom.prototype._zoomOutAnimation = function () {\n var _this = this;\n if (this._zoomFactor === 1) {\n return;\n }\n var startZoomFactor = this._zoomFactor;\n var zoomFactor = 1;\n var center = this._getCurrentZoomCenter();\n var updateProgress = function (progress) {\n var scaleFactor = startZoomFactor + progress * (zoomFactor - startZoomFactor);\n _this._scaleTo(scaleFactor, center);\n };\n this._animate(updateProgress);\n };\n PinchZoom.prototype._getInitialZoomFactor = function () {\n return this._initialZoomFactor;\n };\n PinchZoom.prototype._getCurrentZoomCenter = function () {\n var _a = this._offset, x = _a.x, y = _a.y;\n var offsetLeft = x - this._initialOffset.x;\n var offsetTop = y - this._initialOffset.y;\n return {\n x: -1 * x - offsetLeft / (1 / this._zoomFactor - 1),\n y: -1 * y - offsetTop / (1 / this._zoomFactor - 1),\n };\n };\n PinchZoom.prototype._getOffsetByFirstTouch = function (event) {\n return this._getOffsetTouches(event)[0];\n };\n PinchZoom.prototype._getOffsetTouches = function (event) {\n var _document = this.props._document;\n var _html = _document.documentElement;\n var _body = _document.body;\n var _a = this._getContainerRect(), top = _a.top, left = _a.left;\n var scrollTop = _html.scrollTop || _body.scrollTop;\n var scrollLeft = _html.scrollLeft || _body.scrollLeft;\n var posTop = top + scrollTop;\n var posLeft = left + scrollLeft;\n return getPageCoordinatesByTouches(event.touches).map(function (_a) {\n var x = _a.x, y = _a.y;\n return ({\n x: x - posLeft,\n y: y - posTop,\n });\n });\n };\n PinchZoom.prototype._animate = function (frameFn, options) {\n var _this = this;\n var startTime = new Date().getTime();\n var _a = __assign({ timeFn: swing, callback: function () { }, duration: this.props.animationDuration }, options), timeFn = _a.timeFn, callback = _a.callback, duration = _a.duration;\n var renderFrame = function () {\n if (!_this._inAnimation) {\n return;\n }\n var frameTime = new Date().getTime() - startTime;\n var progress = frameTime / duration;\n if (frameTime >= duration) {\n frameFn(1);\n _this._stopAnimation();\n callback();\n _this._update();\n }\n else {\n progress = timeFn(progress);\n frameFn(progress);\n _this._update({ isAnimation: true });\n requestAnimationFrame(renderFrame);\n }\n };\n this._inAnimation = true;\n requestAnimationFrame(renderFrame);\n };\n PinchZoom.prototype._stopAnimation = function () {\n this._inAnimation = false;\n };\n PinchZoom.prototype._end = function () {\n this._hasInteraction = false;\n this._sanitize();\n this._update();\n };\n PinchZoom.prototype._getContainerRect = function () {\n var div = this._containerRef.current;\n return div.getBoundingClientRect();\n };\n PinchZoom.prototype._getChildSize = function () {\n var div = this._containerRef.current;\n return getElementSize(div === null || div === void 0 ? void 0 : div.firstElementChild);\n };\n PinchZoom.prototype._updateInitialZoomFactor = function () {\n var rect = this._getContainerRect();\n var size = this._getChildSize();\n var xZoomFactor = rect.width / size.width;\n var yZoomFactor = rect.height / size.height;\n this._initialZoomFactor = min(xZoomFactor, yZoomFactor);\n };\n PinchZoom.prototype._bindEvents = function () {\n var _this = this;\n var div = this._containerRef.current;\n if (window.ResizeObserver) {\n this._containerObserver = new ResizeObserver(this._onResize);\n this._containerObserver.observe(div);\n }\n else {\n window.addEventListener('resize', this._onResize);\n }\n this._handlers.forEach(function (_a) {\n var eventName = _a[0], fn = _a[1], target = _a[2];\n (target || div).addEventListener(eventName, fn, true);\n });\n Array.from(div.querySelectorAll('img')).forEach(function (img) {\n return img.addEventListener('load', _this._onResize);\n });\n };\n PinchZoom.prototype._unSubscribe = function () {\n var _this = this;\n var div = this._containerRef.current;\n if (this._containerObserver) {\n this._containerObserver.disconnect();\n this._containerObserver = null;\n }\n window.removeEventListener('resize', this._onResize);\n this._handlers.forEach(function (_a) {\n var eventName = _a[0], fn = _a[1], target = _a[2];\n (target || div).removeEventListener(eventName, fn, true);\n });\n Array.from(div.querySelectorAll('img')).forEach(function (img) {\n return img.removeEventListener('load', _this._onResize);\n });\n };\n PinchZoom.prototype._update = function (options) {\n var _this = this;\n if (this._updatePlaned) {\n return;\n }\n var updateFrame = function () {\n var scale = _this._getInitialZoomFactor() * _this._zoomFactor;\n var x = -_this._offset.x / scale;\n var y = -_this._offset.y / scale;\n _this.props.onUpdate({ scale: scale, x: x, y: y });\n };\n if (options === null || options === void 0 ? void 0 : options.isAnimation) {\n return updateFrame();\n }\n this._updatePlaned = true;\n requestAnimationFrame(function () {\n _this._updatePlaned = false;\n updateFrame();\n });\n };\n PinchZoom.prototype._handlerIfEnable = function (fn) {\n var _this = this;\n return function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n if (_this.props.enabled) {\n fn.apply(void 0, args);\n }\n };\n };\n PinchZoom.prototype._setInteraction = function (newInteraction, event) {\n var interaction = this._interaction;\n if (interaction !== newInteraction) {\n if (interaction && !newInteraction) {\n if (isZoomInteraction(interaction)) {\n this._handleZoomEnd();\n }\n else if (isDragInteraction(interaction)) {\n this._handleDragEnd();\n }\n }\n if (isZoomInteraction(newInteraction)) {\n this._handleZoomStart();\n }\n else if (isDragInteraction(newInteraction)) {\n this._handleDragStart(event);\n }\n }\n this._interaction = newInteraction;\n };\n PinchZoom.prototype._distanceBetweenNumbers = function (a, b) {\n return a > b ? a - b : b - a;\n };\n PinchZoom.prototype._enoughToDrag = function () {\n if (this._distanceBetweenNumbers(this._startOffset.x, this._draggingPoint.x) >\n 5 ||\n this._distanceBetweenNumbers(this._startOffset.y, this._draggingPoint.y) >\n 5)\n return true;\n return false;\n };\n PinchZoom.prototype._updateInteraction = function (event) {\n var fingers = this._fingers;\n if (fingers === 2) {\n return this._setInteraction('zoom', event);\n }\n if (fingers === 1 && this._canDrag()) {\n return this._setInteraction('drag', event);\n }\n this._setInteraction(null, event);\n };\n PinchZoom.prototype._detectDoubleTap = function (event) {\n var time = new Date().getTime();\n if (this._fingers > 1) {\n this._lastTouchStart = 0;\n }\n if (time - this._lastTouchStart < 300) {\n cancelEvent(event);\n this._handleDoubleTap(event);\n if (isZoomInteraction(this._interaction)) {\n this._handleZoomEnd();\n }\n else if (isDragInteraction(this._interaction)) {\n this._handleDragEnd();\n }\n }\n else {\n this._isDoubleTap = false;\n }\n if (this._fingers === 1) {\n this._lastTouchStart = time;\n }\n };\n PinchZoom.prototype.simulate = function (fn) {\n var _this = this;\n return function (mouseEvent) {\n var pageX = mouseEvent.pageX, pageY = mouseEvent.pageY, type = mouseEvent.type;\n var isEnd = type === 'mouseup';\n var isStart = type === 'mousedown';\n if (isStart) {\n mouseEvent.preventDefault();\n _this._listenMouseMove = true;\n }\n if (_this._listenMouseMove) {\n // @ts-ignore\n mouseEvent.touches = isEnd ? [] : [{ pageX: pageX, pageY: pageY }];\n fn(\n // @ts-ignore\n mouseEvent);\n }\n if (isEnd) {\n _this._listenMouseMove = false;\n }\n };\n };\n PinchZoom.prototype.componentDidMount = function () {\n this._bindEvents();\n this._update();\n };\n PinchZoom.prototype.componentWillUnmount = function () {\n this._stopAnimation();\n this._unSubscribe();\n };\n PinchZoom.prototype.render = function () {\n var _a = this.props, children = _a.children, containerProps = _a.containerProps, nonce = _a.nonce;\n var child = Children.only(children);\n var props = containerProps || {};\n return (React.createElement(React.Fragment, null,\n React.createElement(\"style\", { nonce: nonce }, styles),\n React.createElement(\"div\", __assign({}, props, { ref: this._containerRef, className: classnames(styleRoot, props.className) }), cloneElement(child, {\n className: classnames(styleChild, child.props.className),\n }))));\n };\n PinchZoom.defaultProps = {\n animationDuration: 250,\n draggableUnZoomed: true,\n enforceBoundsDuringZoom: false,\n centerContained: false,\n enabled: true,\n inertia: true,\n inertiaFriction: 0.96,\n horizontalPadding: 0,\n isTouch: isTouch,\n lockDragAxis: false,\n maxZoom: 5,\n minZoom: 0.5,\n onDoubleTap: noup,\n onDragEnd: noup,\n onDragStart: noup,\n onDragUpdate: noup,\n onZoomEnd: noup,\n onZoomStart: noup,\n onZoomUpdate: noup,\n setOffsetsOnce: false,\n shouldInterceptWheel: shouldInterceptWheel,\n shouldCancelHandledTouchEndEvents: false,\n tapZoomFactor: 1,\n verticalPadding: 0,\n wheelScaleFactor: 1500,\n zoomOutFactor: 1.3,\n doubleTapZoomOutOnMaxScale: false,\n doubleTapToggleZoom: false,\n // @ts-expect-error\n _document: isSsr ? null : window.document,\n };\n return PinchZoom;\n}(Component));\nif (process.env.NODE_ENV !== 'production') {\n var _a = require('prop-types'), any = _a.any, element = _a.element, object = _a.object, number = _a.number, func = _a.func, bool = _a.bool, string = _a.string;\n // @ts-ignore\n PinchZoom.propTypes = {\n children: element,\n containerProps: object,\n wheelScaleFactor: number,\n animationDuration: number,\n draggableUnZoomed: bool,\n enforceBoundsDuringZoom: bool,\n centerContained: bool,\n enabled: bool,\n horizontalPadding: number,\n lockDragAxis: bool,\n nonce: string,\n onUpdate: func.isRequired,\n maxZoom: number,\n minZoom: number,\n onDoubleTap: func,\n onDragEnd: func,\n onDragStart: func,\n onDragUpdate: func,\n onZoomEnd: func,\n onZoomStart: func,\n onZoomUpdate: func,\n setOffsetsOnce: bool,\n tapZoomFactor: number,\n verticalPadding: number,\n zoomOutFactor: number,\n doubleTapZoomOutOnMaxScale: bool,\n doubleTapToggleZoom: bool,\n isTouch: func,\n _document: any,\n };\n}\nexport default PinchZoom;\n","export default function formatDuration(time) {\n if (!time) return;\n let hours = Math.floor(time / 3600);\n let minutes = Math.floor((time % 3600) / 60);\n let seconds = Math.round(time % 60);\n\n if (hours === 0) {\n return `${minutes}:${seconds.toString().padStart(2, '0')}`;\n } else {\n return `${hours}:${minutes.toString().padStart(2, '0')}:${seconds\n .toString()\n .padStart(2, '0')}`;\n }\n}\n","import { Trans, useLingui } from '@lingui/react/macro';\nimport { getBlurHashAverageColor } from 'fast-blurhash';\nimport { Fragment } from 'preact';\nimport { memo } from 'preact/compat';\nimport {\n useCallback,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'preact/hooks';\nimport QuickPinchZoom, { make3dTransformValue } from 'react-quick-pinch-zoom';\n\nimport formatDuration from '../utils/format-duration';\nimport mem from '../utils/mem';\nimport states from '../utils/states';\n\nimport Icon from './icon';\nimport Link from './link';\n\nconst isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent); // https://stackoverflow.com/a/23522755\n\n/*\nMedia type\n===\nunknown = unsupported or unrecognized file type\nimage = Static image\ngifv = Looping, soundless animation\nvideo = Video clip\naudio = Audio track\n*/\n\nconst dataAltLabel = 'ALT';\nconst AltBadge = (props) => {\n const { t } = useLingui();\n const { alt, lang, index, ...rest } = props;\n if (!alt || !alt.trim()) return null;\n return (\n <button\n type=\"button\"\n class=\"alt-badge clickable\"\n {...rest}\n onClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n states.showMediaAlt = {\n alt,\n lang,\n };\n }}\n title={t`Media description`}\n >\n {dataAltLabel}\n {!!index && <sup>{index}</sup>}\n </button>\n );\n};\n\nconst MEDIA_CAPTION_LIMIT = 140;\nconst MEDIA_CAPTION_LIMIT_LONGER = 280;\nexport const isMediaCaptionLong = mem((caption) =>\n caption?.length\n ? caption.length > MEDIA_CAPTION_LIMIT ||\n /[\\n\\r].*[\\n\\r]/.test(caption.trim())\n : false,\n);\n\nfunction Media({\n class: className = '',\n media,\n to,\n lang,\n showOriginal,\n autoAnimate,\n showCaption,\n allowLongerCaption,\n altIndex,\n checkAspectRatio = true,\n onClick,\n}) {\n let {\n id,\n blurhash,\n description,\n meta,\n previewRemoteUrl,\n previewUrl,\n remoteUrl,\n url,\n type,\n } = media;\n if (/no\\-preview\\./i.test(previewUrl)) {\n previewUrl = null;\n }\n const mediaVTN = getSafeViewTransitionName(id || blurhash || url);\n const { original = {}, small, focus } = meta || {};\n\n const width = showOriginal\n ? original?.width\n : small?.width || original?.width;\n const height = showOriginal\n ? original?.height\n : small?.height || original?.height;\n const mediaURL = showOriginal ? url : previewUrl || url;\n const remoteMediaURL = showOriginal\n ? remoteUrl\n : previewRemoteUrl || remoteUrl;\n const hasPreviewDimensions = small?.width && small?.height;\n const hasDimensions = width && height;\n const orientation = hasDimensions\n ? width > height\n ? 'landscape'\n : 'portrait'\n : null;\n\n const rgbAverageColor = blurhash ? getBlurHashAverageColor(blurhash) : null;\n\n const videoRef = useRef();\n\n let focalPosition;\n if (focus) {\n // Convert focal point to CSS background position\n // Formula from jquery-focuspoint\n // x = -1, y = 1 => 0% 0%\n // x = 0, y = 0 => 50% 50%\n // x = 1, y = -1 => 100% 100%\n const x = ((focus.x + 1) / 2) * 100;\n const y = ((1 - focus.y) / 2) * 100;\n focalPosition = `${x.toFixed(0)}% ${y.toFixed(0)}%`;\n }\n\n const mediaRef = useRef();\n const onUpdate = useCallback(({ x, y, scale }) => {\n const { current: media } = mediaRef;\n\n if (media) {\n const value = make3dTransformValue({ x, y, scale });\n\n if (scale === 1) {\n media.style.removeProperty('transform');\n } else {\n media.style.setProperty('transform', value);\n }\n\n media.closest('.media-zoom').style.touchAction =\n scale <= 1.01 ? 'pan-x' : '';\n }\n }, []);\n\n const [pinchZoomEnabled, setPinchZoomEnabled] = useState(false);\n const quickPinchZoomProps = {\n enabled: pinchZoomEnabled,\n draggableUnZoomed: false,\n inertiaFriction: 0.9,\n tapZoomFactor: 2,\n doubleTapToggleZoom: true,\n containerProps: {\n className: 'media-zoom',\n style: {\n overflow: 'visible',\n // width: 'inherit',\n // height: 'inherit',\n // justifyContent: 'inherit',\n // alignItems: 'inherit',\n // display: 'inherit',\n },\n },\n onUpdate,\n };\n\n const [mediaLoadError, setMediaLoadError] = useState(false);\n\n const Parent = useMemo(\n () =>\n to && !mediaLoadError ? (props) => <Link to={to} {...props} /> : 'div',\n [to, mediaLoadError],\n );\n\n const remoteMediaURLObj = remoteMediaURL ? getURLObj(remoteMediaURL) : null;\n const isVideoMaybe =\n type === 'unknown' &&\n remoteMediaURLObj &&\n /\\.(mp4|m4r|m4v|mov|webm)$/i.test(remoteMediaURLObj.pathname);\n const isAudioMaybe =\n type === 'unknown' &&\n remoteMediaURLObj &&\n /\\.(mp3|ogg|wav|m4a|m4p|m4b)$/i.test(remoteMediaURLObj.pathname);\n const isImage =\n type === 'image' ||\n (type === 'unknown' && previewUrl && !isVideoMaybe && !isAudioMaybe);\n const isPreviewVideoMaybe =\n previewUrl &&\n /\\.(mp4|m4r|m4v|mov|webm)$/i.test(getURLObj(previewUrl).pathname);\n\n const parentRef = useRef();\n const [imageSmallerThanParent, setImageSmallerThanParent] = useState(false);\n useLayoutEffect(() => {\n if (!isImage) return;\n if (!showOriginal) return;\n if (!parentRef.current) return;\n const { offsetWidth, offsetHeight } = parentRef.current;\n const smaller = width < offsetWidth && height < offsetHeight;\n if (smaller) setImageSmallerThanParent(smaller);\n }, [width, height]);\n\n const maxAspectHeight =\n window.innerHeight * (orientation === 'portrait' ? 0.45 : 0.33);\n const maxHeight = orientation === 'portrait' ? 0 : 160;\n const averageColorStyle = {\n '--average-color': rgbAverageColor && `rgb(${rgbAverageColor.join(',')})`,\n };\n const mediaStyles =\n width && height\n ? {\n '--width': `${width}px`,\n '--height': `${height}px`,\n // Calculate '--aspectWidth' based on aspect ratio calculated from '--width' and '--height', max height has to be 160px\n '--aspectWidth': `${\n (width / height) * Math.max(maxHeight, maxAspectHeight)\n }px`,\n aspectRatio: `${width} / ${height}`,\n ...averageColorStyle,\n }\n : {\n ...averageColorStyle,\n };\n\n const longDesc = isMediaCaptionLong(description);\n let showInlineDesc =\n !!showCaption && !showOriginal && !!description && !longDesc;\n if (\n allowLongerCaption &&\n !showInlineDesc &&\n description?.length <= MEDIA_CAPTION_LIMIT_LONGER\n ) {\n showInlineDesc = true;\n }\n const Figure = !showInlineDesc\n ? Fragment\n : (props) => {\n const { children, ...restProps } = props;\n return (\n <figure {...restProps}>\n {children}\n <figcaption\n class=\"media-caption\"\n lang={lang}\n dir=\"auto\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n states.showMediaAlt = {\n alt: description,\n lang,\n };\n }}\n >\n {description}\n </figcaption>\n </figure>\n );\n };\n\n const postViewState = () =>\n window.matchMedia('(min-width: calc(40em + 350px))').matches\n ? 'large'\n : 'small';\n const interceptOnClick = useCallback(\n (e) => {\n const isOnPostPage = e.target.closest('.status-deck');\n if (\n showOriginal ||\n (postViewState() === 'large' && isOnPostPage) ||\n !document.startViewTransition\n ) {\n onClick?.(e);\n return;\n }\n const el =\n e.target.closest('[data-view-transition-name]') ||\n e.target.querySelector('[data-view-transition-name]');\n if (el) {\n // BUG: both link and onClick is triggered at the same time\n // Temporarily disable view transition if has onClick\n // Detecting preventDefault for an onClick has to happen before view transition but it's only possible after click, and this mean the link is already clicked even before we know it's default prevented.\n if (onClick) {\n onClick(e);\n } else {\n e.preventDefault();\n if (el.dataset.viewTransitioned) {\n el.style.viewTransitionName = mediaVTN;\n try {\n document.startViewTransition(() => {\n el.style.viewTransitionName = '';\n location.hash = `#${to}`;\n });\n } catch (e) {\n console.error(e);\n el.style.viewTransitionName = '';\n location.hash = `#${to}`;\n }\n } else {\n location.hash = `#${to}`;\n }\n }\n } else {\n onClick?.(e);\n }\n },\n [mediaVTN, showOriginal, onClick],\n );\n\n if (isImage) {\n // Note: type: unknown might not have width/height\n quickPinchZoomProps.containerProps.style.display = 'inherit';\n\n useLayoutEffect(() => {\n if (!isSafari) return;\n if (!showOriginal) return;\n (async () => {\n try {\n await fetch(mediaURL, { mode: 'no-cors' });\n mediaRef.current.src = mediaURL;\n } catch (e) {\n // Ignore\n }\n })();\n }, [mediaURL]);\n\n return (\n <Figure>\n <Parent\n ref={parentRef}\n class={`media media-image ${className}`}\n onClick={interceptOnClick}\n data-orientation={orientation}\n data-has-alt={!showInlineDesc || undefined}\n style={\n showOriginal\n ? {\n backgroundImage: `url(${previewUrl})`,\n '--bg-image': `url(${previewUrl})`,\n backgroundSize: imageSmallerThanParent\n ? `${width}px ${height}px`\n : undefined,\n ...averageColorStyle,\n }\n : mediaStyles\n }\n >\n {showOriginal ? (\n <QuickPinchZoom {...quickPinchZoomProps}>\n <img\n ref={mediaRef}\n src={mediaURL}\n alt={description}\n width={width}\n height={height}\n data-orientation={orientation}\n loading=\"eager\"\n decoding=\"sync\"\n style={{\n 'view-transition-name': mediaVTN,\n }}\n onLoad={(e) => {\n const el = e.target;\n const mediaImage = el.closest('.media-image');\n if (mediaImage) {\n mediaImage.style.backgroundImage = `url(${el.src})`;\n mediaImage.style.removeProperty('--bg-image');\n }\n el.closest('.media-zoom').style.display = '';\n setPinchZoomEnabled(true);\n }}\n onError={(e) => {\n const { src } = e.target;\n if (\n src === mediaURL &&\n remoteMediaURL &&\n mediaURL !== remoteMediaURL\n ) {\n e.target.src = remoteMediaURL;\n }\n }}\n />\n </QuickPinchZoom>\n ) : (\n <>\n <img\n src={mediaURL}\n alt={showInlineDesc ? '' : description}\n width={width}\n height={height}\n data-orientation={orientation}\n loading=\"lazy\"\n data-view-transition-name={mediaVTN}\n style={{\n // backgroundColor:\n // rgbAverageColor && `rgb(${rgbAverageColor.join(',')})`,\n // backgroundPosition: focalBackgroundPosition || 'center',\n // Duration based on width or height in pixels\n objectPosition: focalPosition || 'center',\n // 100px per second (rough estimate)\n // Clamp between 5s and 120s\n '--anim-duration': `${Math.min(\n Math.max(Math.max(width, height) / 100, 5),\n 120,\n )}s`,\n }}\n onLoad={(e) => {\n // e.target.closest('.media-image').style.backgroundImage = '';\n e.target.dataset.loaded = true;\n const $media = e.target.closest('.media');\n if (!hasPreviewDimensions && $media) {\n const { naturalWidth, naturalHeight } = e.target;\n $media.dataset.orientation =\n naturalWidth > naturalHeight ? 'landscape' : 'portrait';\n $media.style.setProperty('--width', `${naturalWidth}px`);\n $media.style.setProperty('--height', `${naturalHeight}px`);\n $media.style.aspectRatio = `${naturalWidth}/${naturalHeight}`;\n }\n\n // Check natural aspect ratio vs display aspect ratio\n if (checkAspectRatio && $media) {\n const { target } = e;\n setTimeout(() => {\n const {\n clientWidth,\n clientHeight,\n naturalWidth,\n naturalHeight,\n } = target;\n if (\n clientWidth &&\n clientHeight &&\n naturalWidth &&\n naturalHeight\n ) {\n const minDimension = 88;\n if (\n naturalWidth < minDimension ||\n naturalHeight < minDimension\n ) {\n $media.dataset.hasSmallDimension = true;\n } else {\n const displayNaturalHeight =\n (naturalHeight * clientWidth) / naturalWidth;\n const almostSimilarHeight =\n Math.abs(displayNaturalHeight - clientHeight) < 5;\n\n if (almostSimilarHeight) {\n const $mediaParent = $media.closest('.media');\n if ($mediaParent) {\n $mediaParent.dataset.hasNaturalAspectRatio = true;\n }\n }\n }\n }\n }, 300);\n }\n }}\n onError={(e) => {\n const { src } = e.target;\n if (\n src === mediaURL &&\n remoteMediaURL &&\n mediaURL !== remoteMediaURL\n ) {\n e.target.src = remoteMediaURL;\n } else {\n setMediaLoadError(true);\n }\n }}\n />\n {!showInlineDesc && (\n <AltBadge alt={description} lang={lang} index={altIndex} />\n )}\n </>\n )}\n </Parent>\n {mediaLoadError && (\n <div>\n <a href={remoteUrl} class=\"button plain6 small\" target=\"_blank\">\n <Icon icon=\"external\" />{' '}\n <span>\n <Trans>Open file</Trans>\n </span>\n </a>\n </div>\n )}\n </Figure>\n );\n } else if (type === 'gifv' || type === 'video' || isVideoMaybe) {\n const hasDuration = original.duration > 0;\n const shortDuration = original.duration < 31;\n const isGIF = type === 'gifv' && shortDuration;\n // If GIF is too long, treat it as a video\n const loopable = original.duration < 61;\n const formattedDuration = formatDuration(original.duration);\n const hoverAnimate = !showOriginal && !autoAnimate && isGIF;\n const autoGIFAnimate = !showOriginal && autoAnimate && isGIF;\n const showProgress = original.duration > 5;\n\n // This string is only for autoplay + muted to work on Mobile Safari\n const gifHTML = `\n <video\n src=\"${url}\"\n poster=\"${previewUrl}\"\n width=\"${width}\"\n height=\"${height}\"\n data-orientation=\"${orientation}\"\n style=\"view-transition-name: ${mediaVTN}\"\n preload=\"auto\"\n autoplay\n muted\n playsinline\n ${loopable ? 'loop' : ''}\n ondblclick=\"this.paused ? this.play() : this.pause()\"\n ${\n showProgress\n ? \"ontimeupdate=\\\"this.closest('.media-gif') && this.closest('.media-gif').style.setProperty('--progress', `${~~((this.currentTime / this.duration) * 100)}%`)\\\"\"\n : ''\n }\n ></video>\n `;\n\n const videoHTML = `\n <video\n src=\"${url}\"\n poster=\"${previewUrl}\"\n width=\"${width}\"\n height=\"${height}\"\n data-orientation=\"${orientation}\"\n style=\"view-transition-name: ${mediaVTN}\"\n preload=\"auto\"\n autoplay\n playsinline\n ${loopable ? 'loop' : ''}\n controls\n ></video>\n `;\n\n return (\n <Figure>\n <Parent\n ref={parentRef}\n class={`media ${className} media-${isGIF ? 'gif' : 'video'} ${\n autoGIFAnimate ? 'media-contain' : ''\n } ${hoverAnimate ? 'media-hover-animate' : ''}`}\n data-orientation={orientation}\n data-formatted-duration={\n !showOriginal ? formattedDuration : undefined\n }\n data-label={\n isGIF && !showOriginal && !autoGIFAnimate ? 'GIF' : undefined\n }\n data-has-alt={!showInlineDesc || undefined}\n // style={{\n // backgroundColor:\n // rgbAverageColor && `rgb(${rgbAverageColor.join(',')})`,\n // }}\n style={!showOriginal && mediaStyles}\n onClick={(e) => {\n if (hoverAnimate) {\n try {\n videoRef.current.pause();\n } catch (e) {}\n }\n interceptOnClick(e);\n }}\n onMouseEnter={() => {\n if (hoverAnimate) {\n try {\n videoRef.current.play();\n } catch (e) {}\n }\n }}\n onMouseLeave={() => {\n if (hoverAnimate) {\n try {\n videoRef.current.pause();\n } catch (e) {}\n }\n }}\n onFocus={() => {\n if (hoverAnimate) {\n try {\n videoRef.current.play();\n } catch (e) {}\n }\n }}\n onBlur={() => {\n if (hoverAnimate) {\n try {\n videoRef.current.pause();\n } catch (e) {}\n }\n }}\n >\n {showOriginal || autoGIFAnimate ? (\n isGIF && showOriginal ? (\n <QuickPinchZoom {...quickPinchZoomProps} enabled>\n <div\n ref={mediaRef}\n dangerouslySetInnerHTML={{\n __html: gifHTML,\n }}\n />\n </QuickPinchZoom>\n ) : isGIF ? (\n <div\n class=\"video-container\"\n dangerouslySetInnerHTML={{\n __html: gifHTML,\n }}\n />\n ) : (\n <div\n class=\"video-container\"\n dangerouslySetInnerHTML={{ __html: videoHTML }}\n />\n )\n ) : isGIF ? (\n <video\n ref={videoRef}\n src={url}\n poster={previewUrl}\n width={width}\n height={height}\n data-orientation={orientation}\n data-view-transition-name={mediaVTN}\n preload=\"auto\"\n // controls\n playsinline\n loop\n muted\n onTimeUpdate={\n showProgress\n ? (e) => {\n const { target } = e;\n const container = target?.closest('.media-gif');\n if (container) {\n const percentage =\n (target.currentTime / target.duration) * 100;\n container.style.setProperty(\n '--progress',\n `${percentage}%`,\n );\n }\n }\n : undefined\n }\n />\n ) : (\n <>\n {previewUrl && !isPreviewVideoMaybe ? (\n <img\n src={previewUrl}\n alt={showInlineDesc ? '' : description}\n width={width}\n height={height}\n data-orientation={orientation}\n loading=\"lazy\"\n decoding=\"async\"\n data-view-transition-name={mediaVTN}\n onLoad={(e) => {\n if (!hasPreviewDimensions) {\n const $media = e.target.closest('.media');\n if ($media) {\n const { naturalHeight, naturalWidth } = e.target;\n $media.dataset.orientation =\n naturalWidth > naturalHeight\n ? 'landscape'\n : 'portrait';\n $media.style.setProperty(\n '--width',\n `${naturalWidth}px`,\n );\n $media.style.setProperty(\n '--height',\n `${naturalHeight}px`,\n );\n $media.style.aspectRatio = `${naturalWidth}/${naturalHeight}`;\n }\n }\n }}\n />\n ) : (\n <video\n src={url + '#t=0.1'} // Make Safari show 1st-frame preview\n width={width}\n height={height}\n data-orientation={orientation}\n data-view-transition-name={mediaVTN}\n preload=\"metadata\"\n muted\n disablePictureInPicture\n onLoadedMetadata={(e) => {\n if (!hasDuration) {\n const { duration } = e.target;\n if (duration) {\n const formattedDuration = formatDuration(duration);\n const container = e.target.closest('.media-video');\n if (container) {\n container.dataset.formattedDuration =\n formattedDuration;\n }\n }\n }\n }}\n />\n )}\n <div class=\"media-play\">\n <Icon icon=\"play\" size=\"xl\" alt=\"▶\" />\n </div>\n </>\n )}\n {!showOriginal && !showInlineDesc && (\n <AltBadge alt={description} lang={lang} index={altIndex} />\n )}\n </Parent>\n </Figure>\n );\n } else if (type === 'audio' || isAudioMaybe) {\n const formattedDuration = formatDuration(original.duration);\n return (\n <Figure>\n <Parent\n class={`media media-audio ${className}`}\n data-formatted-duration={\n !showOriginal ? formattedDuration : undefined\n }\n data-has-alt={!showInlineDesc || undefined}\n onClick={onClick}\n style={!showOriginal && mediaStyles}\n >\n {showOriginal ? (\n previewUrl ? (\n <video\n src={(remoteUrl || url) + '#t=0.1'}\n width={width}\n height={height}\n data-orientation={orientation}\n poster={previewUrl}\n style={{\n background: `url(${previewUrl}) center/cover`,\n aspectRatio: `${width}/${height}`,\n }}\n preload=\"metadata\"\n controls\n controlsList=\"nofullscreen\"\n autoPlay\n playsInline\n />\n ) : (\n <audio src={remoteUrl || url} preload=\"none\" controls autoPlay />\n )\n ) : previewUrl ? (\n <img\n src={previewUrl}\n alt={showInlineDesc ? '' : description}\n width={width}\n height={height}\n data-orientation={orientation}\n loading=\"lazy\"\n onError={(e) => {\n try {\n // Remove self if broken\n e.target?.remove?.();\n } catch (e) {}\n }}\n />\n ) : null}\n {!showOriginal && (\n <>\n <div class=\"media-play\">\n <Icon icon=\"play\" size=\"xl\" alt=\"▶\" />\n </div>\n {!showInlineDesc && (\n <AltBadge alt={description} lang={lang} index={altIndex} />\n )}\n </>\n )}\n </Parent>\n </Figure>\n );\n }\n}\n\nfunction getURLObj(url) {\n // Fake base URL if url doesn't have https:// prefix\n return URL.parse(url, location.origin);\n}\n\nexport function getSafeViewTransitionName(inputString) {\n // Replace any character that is not a letter, number, hyphen, or underscore with a hyphen.\n let safeName = inputString.replace(/[^a-zA-Z0-9_-]/g, '-');\n\n // Ensure it starts with a letter, underscore, or two hyphens (to prevent starting with a number or single hyphen).\n // This covers edge cases where the original string might start with an invalid character after replacement.\n if (safeName.match(/^[0-9-]/)) {\n safeName = 'vt-' + safeName;\n }\n\n return safeName;\n}\n\nexport default memo(Media, (oldProps, newProps) => {\n const oldMedia = oldProps.media || {};\n const newMedia = newProps.media || {};\n\n return (\n oldMedia?.id === newMedia?.id &&\n oldMedia.url === newMedia.url &&\n oldProps.to === newProps.to &&\n oldProps.class === newProps.class\n );\n});\n","import { useEffect, useRef, useState } from 'preact/hooks';\n\nimport isRTL from '../utils/is-rtl';\n\nimport Icon from './icon';\nimport Media from './media';\n\nfunction MediaFirstContainer(props) {\n const { mediaAttachments, language, postID, instance } = props;\n const moreThanOne = mediaAttachments.length > 1;\n\n const carouselRef = useRef();\n const [currentIndex, setCurrentIndex] = useState(0);\n\n useEffect(() => {\n let handleScroll = () => {\n const { clientWidth, scrollLeft } = carouselRef.current;\n const index = Math.round(Math.abs(scrollLeft) / clientWidth);\n setCurrentIndex(index);\n };\n if (carouselRef.current) {\n carouselRef.current.addEventListener('scroll', handleScroll, {\n passive: true,\n });\n }\n return () => {\n if (carouselRef.current) {\n carouselRef.current.removeEventListener('scroll', handleScroll);\n }\n };\n }, []);\n\n return (\n <>\n <div class=\"media-first-container\">\n <div class=\"media-first-carousel\" ref={carouselRef}>\n {mediaAttachments.map((media, i) => (\n <div class=\"media-first-item\" key={media.id}>\n <Media\n media={media}\n lang={language}\n to={`/${instance}/s/${postID}?media=${i + 1}`}\n />\n </div>\n ))}\n </div>\n {moreThanOne && (\n <div class=\"media-carousel-controls\">\n <div class=\"carousel-indexer\">\n {currentIndex + 1}/{mediaAttachments.length}\n </div>\n <label class=\"media-carousel-button\">\n <button\n type=\"button\"\n class=\"carousel-button\"\n hidden={currentIndex === 0}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n carouselRef.current.focus();\n carouselRef.current.scrollTo({\n left:\n carouselRef.current.clientWidth *\n (currentIndex - 1) *\n (isRTL() ? -1 : 1),\n behavior: 'smooth',\n });\n }}\n >\n <Icon icon=\"arrow-left\" />\n </button>\n </label>\n <label class=\"media-carousel-button\">\n <button\n type=\"button\"\n class=\"carousel-button\"\n hidden={currentIndex === mediaAttachments.length - 1}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n carouselRef.current.focus();\n carouselRef.current.scrollTo({\n left:\n carouselRef.current.clientWidth *\n (currentIndex + 1) *\n (isRTL() ? -1 : 1),\n behavior: 'smooth',\n });\n }}\n >\n <Icon icon=\"arrow-right\" />\n </button>\n </label>\n </div>\n )}\n </div>\n {moreThanOne && (\n <div\n class=\"media-carousel-dots\"\n style={{\n '--dots-count': mediaAttachments.length,\n }}\n >\n {mediaAttachments.map((media, i) => (\n <span\n key={media.id}\n class={`carousel-dot ${i === currentIndex ? 'active' : ''}`}\n />\n ))}\n </div>\n )}\n </>\n );\n}\n\nexport default MediaFirstContainer;\n","function MultipleMediaFigure(props) {\n const { enabled, children, lang, captionChildren } = props;\n if (!enabled || !captionChildren) return children;\n return (\n <figure class=\"media-figure-multiple\">\n {children}\n <figcaption lang={lang} dir=\"auto\">\n {captionChildren}\n </figcaption>\n </figure>\n );\n}\n\nexport default MultipleMediaFigure;\n","import { i18n } from '@lingui/core';\nimport { plural } from '@lingui/core/macro';\nimport { Plural, Trans, useLingui } from '@lingui/react/macro';\nimport { useEffect, useRef, useState } from 'preact/hooks';\n\nimport shortenNumber from '../utils/shorten-number';\nimport showToast from '../utils/show-toast';\nimport useTruncated from '../utils/useTruncated';\n\nimport EmojiText from './emoji-text';\nimport Icon from './icon';\nimport RelativeTime from './relative-time';\n\nconst POLL_OPTIONS_BATCH_SIZE = 40;\n\nexport default function Poll({\n poll,\n lang,\n readOnly,\n refresh = () => {},\n votePoll = () => {},\n}) {\n const { t } = useLingui();\n const [uiState, setUIState] = useState('default');\n const [visibleOptionsCount, setVisibleOptionsCount] = useState(\n POLL_OPTIONS_BATCH_SIZE,\n );\n const loadMoreRef = useRef(null);\n const {\n expired,\n expiresAt,\n id,\n multiple,\n options,\n ownVotes,\n voted,\n votersCount,\n votesCount = 0,\n emojis,\n } = poll;\n const expiresAtDate = !!expiresAt && new Date(expiresAt); // Update poll at point of expiry\n // NOTE: Disable this because setTimeout runs immediately if delay is too large\n // https://stackoverflow.com/a/56718027/20838\n // useEffect(() => {\n // let timeout;\n // if (!expired && expiresAtDate) {\n // const ms = expiresAtDate.getTime() - Date.now() + 1; // +1 to give it a little buffer\n // if (ms > 0) {\n // timeout = setTimeout(() => {\n // setUIState('loading');\n // (async () => {\n // // await refresh();\n // setUIState('default');\n // })();\n // }, ms);\n // }\n // }\n // return () => {\n // clearTimeout(timeout);\n // };\n // }, [expired, expiresAtDate]);\n\n const pollVotesCount = multiple ? votersCount || votesCount : votesCount;\n let roundPrecision = 0;\n\n if (pollVotesCount <= 1000) {\n roundPrecision = 0;\n } else if (pollVotesCount <= 10000) {\n roundPrecision = 1;\n } else if (pollVotesCount <= 100000) {\n roundPrecision = 2;\n }\n\n const [showResults, setShowResults] = useState(false);\n const optionsHaveVoteCounts = options.every((o) => o.votesCount !== null);\n\n const resultsView =\n (showResults && optionsHaveVoteCounts) || voted || expired;\n const [selectedOptions, setSelectedOptions] = useState(multiple ? [] : null);\n\n useEffect(() => {\n if (!loadMoreRef.current) return;\n if (visibleOptionsCount >= options.length) return;\n\n const observer = new IntersectionObserver(\n (entries) => {\n if (entries[0].isIntersecting) {\n setVisibleOptionsCount((prev) =>\n Math.min(prev + POLL_OPTIONS_BATCH_SIZE, options.length),\n );\n }\n },\n { threshold: 0.1 },\n );\n\n observer.observe(loadMoreRef.current);\n\n return () => observer.disconnect();\n }, [visibleOptionsCount, options.length]);\n\n useEffect(() => {\n setVisibleOptionsCount(POLL_OPTIONS_BATCH_SIZE);\n }, [resultsView, options.length]);\n\n const voteOptionsSelectionCount = multiple\n ? selectedOptions.length\n : selectedOptions !== null\n ? 1\n : 0;\n const [showPollInfo, setShowPollInfo] = useState(false);\n const ref = useTruncated({\n onTruncated: setShowPollInfo,\n });\n\n return (\n <div\n lang={lang}\n dir=\"auto\"\n class={`poll ${readOnly ? 'read-only' : ''} ${\n uiState === 'loading' ? 'loading' : ''\n }`}\n >\n {resultsView ? (\n <>\n <div class=\"poll-options\" ref={ref}>\n {options.slice(0, visibleOptionsCount).map((option, i) => {\n const { title, votesCount: optionVotesCount } = option;\n const ratio = pollVotesCount\n ? optionVotesCount / pollVotesCount\n : 0;\n const percentage = ratio\n ? ratio.toLocaleString(i18n.locale || undefined, {\n style: 'percent',\n maximumFractionDigits: roundPrecision,\n })\n : '0%';\n\n const isLeading =\n optionVotesCount > 0 &&\n optionVotesCount ===\n Math.max(...options.map((o) => o.votesCount));\n return (\n <div\n key={`${i}-${title}`}\n class={`poll-option poll-result ${\n isLeading ? 'poll-option-leading' : ''\n }`}\n style={{\n '--percentage': `${ratio * 100}%`,\n }}\n >\n <div class=\"poll-option-title\">\n <span>\n <EmojiText text={title} emojis={emojis} />\n </span>\n </div>\n <div\n class=\"poll-option-votes\"\n title={plural(optionVotesCount, {\n one: `# vote`,\n other: `# votes`,\n })}\n >\n {voted && ownVotes.includes(i) && (\n <>\n <Icon icon=\"check-circle\" alt={t`Voted`} />{' '}\n </>\n )}\n <span class=\"poll-option-votes-percentage\">\n {percentage}\n </span>\n </div>\n </div>\n );\n })}\n {visibleOptionsCount < options.length && (\n <div ref={loadMoreRef} style={{ minHeight: '1em' }} />\n )}\n </div>\n {!expired && !voted && (\n <div class=\"poll-actions\">\n <button\n class=\"poll-hide-results-button plain2\"\n disabled={uiState === 'loading'}\n onClick={(e) => {\n e.preventDefault();\n setShowResults(false);\n }}\n >\n <Icon icon=\"arrow-left\" size=\"s\" /> <Trans>Hide results</Trans>\n </button>{' '}\n <div class=\"poll-info\">\n {showPollInfo && (\n <small class=\"insignificant\">\n <Plural\n value={options.length}\n one={`# choice`}\n other={`# choices`}\n />\n </small>\n )}\n </div>\n </div>\n )}\n </>\n ) : (\n <form\n onSubmit={async (e) => {\n e.preventDefault();\n const choices = multiple\n ? selectedOptions\n : selectedOptions !== null\n ? [selectedOptions]\n : [];\n if (!choices.length) return;\n setUIState('loading');\n try {\n await votePoll(choices);\n } catch (e) {\n console.error(e);\n showToast(t`Unable to vote in poll`);\n } finally {\n setUIState('default');\n }\n }}\n >\n <div class=\"poll-options\" ref={ref}>\n {options.slice(0, visibleOptionsCount).map((option, i) => {\n const { title } = option;\n const isSelected = multiple\n ? selectedOptions.includes(i)\n : selectedOptions === i;\n return (\n <div class=\"poll-option\" key={`${i}-${title}`}>\n <label class=\"poll-label\">\n <input\n type={multiple ? 'checkbox' : 'radio'}\n name=\"poll\"\n value={i}\n disabled={uiState === 'loading'}\n readOnly={readOnly}\n checked={isSelected}\n onChange={(e) => {\n const value = i;\n if (multiple) {\n setSelectedOptions((prev) =>\n e.target.checked\n ? [...prev, value]\n : prev.filter((v) => v !== value),\n );\n } else {\n setSelectedOptions(value);\n }\n }}\n />\n <span class=\"poll-option-title\">\n <EmojiText text={title} emojis={emojis} />\n </span>\n </label>\n </div>\n );\n })}\n {visibleOptionsCount < options.length && (\n <div ref={loadMoreRef} style={{ minHeight: '1em' }} />\n )}\n </div>\n <div class=\"poll-actions\">\n <button\n class=\"poll-vote-button\"\n type=\"submit\"\n disabled={\n readOnly ||\n uiState === 'loading' ||\n voteOptionsSelectionCount === 0\n }\n >\n <Trans>Vote</Trans>\n </button>{' '}\n <div class=\"poll-info\">\n {showPollInfo &&\n (multiple && voteOptionsSelectionCount > 0 ? (\n <small>\n {voteOptionsSelectionCount}{' '}\n <span class=\"insignificant\">/ {options.length}</span>\n </small>\n ) : (\n <small class=\"insignificant\">\n <Plural\n value={options.length}\n one={`# choice`}\n other={`# choices`}\n />\n </small>\n ))}\n </div>\n </div>\n </form>\n )}\n <p class=\"poll-meta\">\n <span class=\"spacer\">\n {(expired || voted) && showPollInfo && (\n <>\n <span class=\"ib\">\n <Plural\n value={options.length}\n one={`# choice`}\n other={`# choices`}\n />\n </span>{' '}\n &bull;{' '}\n </>\n )}\n <span class=\"ib\">\n <Plural\n value={votesCount}\n one={\n <Trans>\n <span title={votesCount}>{shortenNumber(votesCount)}</span>{' '}\n vote\n </Trans>\n }\n other={\n <Trans>\n <span title={votesCount}>{shortenNumber(votesCount)}</span>{' '}\n votes\n </Trans>\n }\n />\n </span>\n {!!votersCount && votersCount !== votesCount && (\n <>\n {' '}\n &bull;{' '}\n <span class=\"ib\">\n <Plural\n value={votersCount}\n one={\n <Trans>\n <span title={votersCount}>\n {shortenNumber(votersCount)}\n </span>{' '}\n voter\n </Trans>\n }\n other={\n <Trans>\n <span title={votersCount}>\n {shortenNumber(votersCount)}\n </span>{' '}\n voters\n </Trans>\n }\n />\n </span>\n </>\n )}{' '}\n &bull;{' '}\n {expired ? (\n !!expiresAtDate ? (\n <span class=\"ib\">\n <Trans>\n Ended <RelativeTime datetime={expiresAtDate} />\n </Trans>\n </span>\n ) : (\n t`Ended`\n )\n ) : !!expiresAtDate ? (\n <span class=\"ib\">\n <Trans>\n Ending <RelativeTime datetime={expiresAtDate} />\n </Trans>\n </span>\n ) : (\n t`Ending`\n )}\n </span>\n {!voted && !expired && !readOnly && optionsHaveVoteCounts && (\n <button\n type=\"button\"\n class=\"plain small poll-results-button\"\n disabled={uiState === 'loading'}\n onClick={(e) => {\n e.preventDefault();\n setShowResults(!showResults);\n }}\n title={showResults ? t`Hide results` : t`Show results`}\n >\n <Icon\n icon={showResults ? 'eye-open' : 'eye-close'}\n alt={showResults ? t`Hide results` : t`Show results`}\n />{' '}\n </button>\n )}\n {!expired && !readOnly && (\n <button\n type=\"button\"\n class=\"plain small\"\n disabled={uiState === 'loading'}\n onClick={(e) => {\n e.preventDefault();\n setUIState('loading');\n\n (async () => {\n await refresh();\n setUIState('default');\n })();\n }}\n title={t`Refresh`}\n >\n <Icon icon=\"refresh\" alt={t`Refresh`} />\n </button>\n )}\n </p>\n </div>\n );\n}\n","import { useEffect, useLayoutEffect, useRef } from 'preact/hooks';\nimport { useSnapshot } from 'valtio';\n\nimport enhanceContent from '../utils/enhance-content';\nimport handleContentLinks from '../utils/handle-content-links';\nimport states, { statusKey } from '../utils/states';\n\nconst HTTP_REGEX = /^http/i;\n\nconst PostContent =\n /*memo(*/\n ({ post, instance, previewMode }) => {\n const { content, emojis, language, mentions, url } = post;\n const snapStates = useSnapshot(states);\n const sKey = statusKey(post.id, instance);\n const quotes = snapStates.statusQuotes[sKey];\n\n const divRef = useRef();\n useLayoutEffect(() => {\n if (!divRef.current) return;\n const dom = enhanceContent(content, {\n emojis,\n returnDOM: true,\n });\n // Remove target=\"_blank\" from links\n for (const a of dom.querySelectorAll('a.u-url[target=\"_blank\"]')) {\n if (!HTTP_REGEX.test(a.innerText.trim())) {\n a.removeAttribute('target');\n }\n }\n divRef.current.replaceChildren(dom.cloneNode(true));\n }, [content, emojis?.length]);\n\n useEffect(() => {\n // Find all links that's in states.statusQuotes and add 'is-quote' class\n if (quotes?.length) {\n for (const a of divRef.current.querySelectorAll('a')) {\n if (quotes.some((quote) => quote?.originalURL === a.href)) {\n a.classList.add('is-quote');\n }\n }\n }\n }, [quotes?.length]);\n\n return (\n <div\n ref={divRef}\n lang={language}\n dir=\"auto\"\n class=\"inner-content\"\n onClick={handleContentLinks({\n mentions,\n instance,\n previewMode,\n statusURL: url,\n })}\n // dangerouslySetInnerHTML={{\n // __html: enhanceContent(content, {\n // emojis,\n // postEnhanceDOM: (dom) => {\n // // Remove target=\"_blank\" from links\n // dom.querySelectorAll('a.u-url[target=\"_blank\"]').forEach((a) => {\n // if (!/http/i.test(a.innerText.trim())) {\n // a.removeAttribute('target');\n // }\n // });\n // },\n // }),\n // }}\n />\n );\n }; /*,\n (oldProps, newProps) => {\n const { post: oldPost } = oldProps;\n const { post: newPost } = newProps;\n return oldPost.content === newPost.content;\n },\n);*/\n\nexport default PostContent;\n","/**\n * @param {string[]} splittedHtml\n * @param {{ char?: string; count?: number}} options\n * @returns {string}\n */\nconst addIndentation = (splittedHtml, options = {}) => {\n const char = options.char || ' '\n const count = options.count || 2\n\n let level = 0\n const opened = []\n\n return splittedHtml.reverse().reduce((indented, elTag) => {\n if (opened.length\n && level\n && opened[level]\n /* if current element tag is the same as previously opened one */\n && opened[level] === elTag.substring(1, opened[level].length + 1)\n ) {\n opened.splice(level, 1)\n level--\n }\n\n const indentation = char.repeat(level ? level * count : 0)\n\n const newIndented = [\n `${indentation}${elTag}`,\n ...indented,\n ]\n\n // if current element tag is closing tag\n // add it to opened elements\n if (elTag.substring(0, 2) === '</') {\n level++\n opened[level] = elTag.substring(2, elTag.length - 1)\n }\n\n return newIndented\n }, []).join('\\n')\n}\n\nmodule.exports = addIndentation\n","/**\n * @param {string} nonFormattedString Any non formatted string\n * @returns {string[]} Array of strings separated on new lines\n */\nconst removeEmptyLines = (nonFormattedString) => (\n // Replace\n // - 1 or more spaces or tabs at the start of line\n // - 1 or more spaces or tabs at the end of line\n // - empty lines\n // with empty string\n nonFormattedString.trim().replace(/(^(\\s|\\t)+|(( |\\t)+)$)/gm, '')\n)\n\n/**\n * @param {string} markup\n * @returns {string[]} Array of strings splitted on new lines without empty lines\n */\nconst mergeAttributesWithElements = (markup) => {\n const splittedMarkup = removeEmptyLines(markup).split('\\n')\n\n const mergedLines = []\n let currentElement = ''\n for (let i = 0; i < splittedMarkup.length; i += 1) {\n const line = splittedMarkup[i]\n\n // If line is closing element/tag separate closing tag from rest of the line with space\n if (line.endsWith('/>')) {\n mergedLines.push(`${currentElement}${line.slice(0, -2)} />`)\n currentElement = ''\n // eslint-disable-next-line no-continue\n continue\n }\n\n if (line.endsWith('>')) {\n mergedLines.push(`${currentElement}${\n line.startsWith('>') || line.startsWith('<') ? '' : ' '\n }${line}`)\n currentElement = ''\n // eslint-disable-next-line no-continue\n continue\n }\n\n currentElement += currentElement.length ? ` ${line}` : line\n }\n\n return mergedLines\n}\n\nmodule.exports = {\n mergeAttributesWithElements,\n removeEmptyLines,\n}\n","const addIndentation = require('./utils/addIndentation')\nconst { mergeAttributesWithElements } = require('./utils/toLines')\n\n/**\n * @param {string} markup\n * @param {{ char?: string; count?: number }} options\n * @returns {string}\n */\nconst prettify = (markup, options = {}) => {\n const splitted = mergeAttributesWithElements(markup)\n\n return addIndentation(splitted, options)\n}\n\nmodule.exports = prettify\n","import { Trans, useLingui } from '@lingui/react/macro';\nimport prettify from 'html-prettify';\n\nimport emojifyText from '../utils/emojify-text';\nimport showToast from '../utils/show-toast';\nimport states, { statusKey } from '../utils/states';\n\nimport Icon from './icon';\n\nfunction generateHTMLCode(post, instance, level = 0) {\n const {\n account: {\n url: accountURL,\n displayName,\n acct,\n username,\n emojis: accountEmojis,\n bot,\n group,\n },\n id,\n poll,\n spoilerText,\n language,\n editedAt,\n createdAt,\n content,\n mediaAttachments,\n url,\n emojis,\n } = post;\n\n const sKey = statusKey(id, instance);\n const quotes = states.statusQuotes[sKey] || [];\n const uniqueQuotes = quotes.filter(\n (q, i, arr) => arr.findIndex((q2) => q2.url === q.url) === i,\n );\n const quoteStatusesHTML =\n uniqueQuotes.length && level <= 2\n ? uniqueQuotes\n .map((quote) => {\n const { id, instance } = quote;\n const sKey = statusKey(id, instance);\n const s = states.statuses[sKey];\n if (s) {\n return generateHTMLCode(s, instance, ++level);\n }\n })\n .join('')\n : '';\n\n const createdAtDate = new Date(createdAt);\n // const editedAtDate = editedAt && new Date(editedAt);\n\n const contentHTML =\n emojifyText(content, emojis) +\n '\\n' +\n quoteStatusesHTML +\n '\\n' +\n (poll?.options?.length\n ? `\n <p>📊:</p>\n <ul>\n ${poll.options\n .map(\n (option) => `\n <li>\n ${option.title}\n ${option.votesCount >= 0 ? ` (${option.votesCount})` : ''}\n </li>\n `,\n )\n .join('')}\n </ul>`\n : '') +\n (mediaAttachments.length > 0\n ? '\\n' +\n mediaAttachments\n .map((media) => {\n const {\n description,\n meta,\n previewRemoteUrl,\n previewUrl,\n remoteUrl,\n url,\n type,\n } = media;\n const { original = {}, small } = meta || {};\n const width = small?.width || original?.width;\n const height = small?.height || original?.height;\n\n // Prefer remote over original\n const sourceMediaURL = remoteUrl || url;\n const previewMediaURL = previewRemoteUrl || previewUrl;\n const mediaURL = previewMediaURL || sourceMediaURL;\n\n const sourceMediaURLObj = sourceMediaURL\n ? URL.parse(sourceMediaURL)\n : null;\n const isVideoMaybe =\n type === 'unknown' &&\n sourceMediaURLObj &&\n /\\.(mp4|m4r|m4v|mov|webm)$/i.test(sourceMediaURLObj.pathname);\n const isAudioMaybe =\n type === 'unknown' &&\n sourceMediaURLObj &&\n /\\.(mp3|ogg|wav|m4a|m4p|m4b)$/i.test(sourceMediaURLObj.pathname);\n const isImage =\n type === 'image' ||\n (type === 'unknown' &&\n previewMediaURL &&\n !isVideoMaybe &&\n !isAudioMaybe);\n const isVideo = type === 'gifv' || type === 'video' || isVideoMaybe;\n const isAudio = type === 'audio' || isAudioMaybe;\n\n let mediaHTML = '';\n if (isImage) {\n mediaHTML = `<img src=\"${mediaURL}\" width=\"${width}\" height=\"${height}\" alt=\"${description}\" loading=\"lazy\" />`;\n } else if (isVideo) {\n mediaHTML = `\n <video src=\"${sourceMediaURL}\" width=\"${width}\" height=\"${height}\" controls preload=\"auto\" poster=\"${previewMediaURL}\" loading=\"lazy\"></video>\n ${description ? `<figcaption>${description}</figcaption>` : ''}\n `;\n } else if (isAudio) {\n mediaHTML = `\n <audio src=\"${sourceMediaURL}\" controls preload=\"auto\"></audio>\n ${description ? `<figcaption>${description}</figcaption>` : ''}\n `;\n } else {\n mediaHTML = `\n <a href=\"${sourceMediaURL}\">📄 ${\n description || sourceMediaURL\n }</a>\n `;\n }\n\n return `<figure>${mediaHTML}</figure>`;\n })\n .join('\\n')\n : '');\n\n const htmlCode = `\n <blockquote lang=\"${language}\" cite=\"${url}\" data-source=\"fediverse\">\n ${\n spoilerText\n ? `\n <details>\n <summary>${spoilerText}</summary>\n ${contentHTML}\n </details>\n `\n : contentHTML\n }\n <footer>\n — ${emojifyText(\n displayName,\n accountEmojis,\n )} (@${acct}) ${!!createdAt ? `<a href=\"${url}\"><time datetime=\"${createdAtDate.toISOString()}\">${createdAtDate.toLocaleString()}</time></a>` : ''}\n </footer>\n </blockquote>\n `;\n\n return prettify(htmlCode);\n}\n\nfunction PostEmbedModal({ post, instance, onClose }) {\n const { t } = useLingui();\n const {\n account: {\n url: accountURL,\n displayName,\n username,\n emojis: accountEmojis,\n bot,\n group,\n },\n id,\n poll,\n spoilerText,\n language,\n editedAt,\n createdAt,\n content,\n mediaAttachments,\n url,\n emojis,\n } = post;\n\n const htmlCode = generateHTMLCode(post, instance);\n return (\n <div id=\"embed-post\" class=\"sheet\">\n {!!onClose && (\n <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n <Icon icon=\"x\" alt={t`Close`} />\n </button>\n )}\n <header>\n <h2>\n <Trans>Embed post</Trans>\n </h2>\n </header>\n <main tabIndex=\"-1\">\n <h3>\n <Trans>HTML Code</Trans>\n </h3>\n <textarea\n class=\"embed-code\"\n readonly\n onClick={(e) => {\n e.target.select();\n }}\n dir=\"auto\"\n >\n {htmlCode}\n </textarea>\n <button\n type=\"button\"\n onClick={() => {\n try {\n navigator.clipboard.writeText(htmlCode);\n showToast(t`HTML code copied`);\n } catch (e) {\n console.error(e);\n showToast(t`Unable to copy HTML code`);\n }\n }}\n >\n <Icon icon=\"clipboard\" />{' '}\n <span>\n <Trans>Copy</Trans>\n </span>\n </button>\n {!!mediaAttachments?.length && (\n <section>\n <p>\n <Trans>Media attachments:</Trans>\n </p>\n <ol class=\"links-list\">\n {mediaAttachments.map((media) => {\n return (\n <li key={media.id}>\n <a\n href={media.remoteUrl || media.url}\n target=\"_blank\"\n download\n >\n {media.remoteUrl || media.url}\n </a>\n </li>\n );\n })}\n </ol>\n </section>\n )}\n {!!accountEmojis?.length && (\n <section>\n <p>\n <Trans>Account Emojis:</Trans>\n </p>\n <ul>\n {accountEmojis.map((emoji) => {\n return (\n <li key={emoji.shortcode}>\n <picture>\n <source\n srcset={emoji.staticUrl}\n media=\"(prefers-reduced-motion: reduce)\"\n ></source>\n <img\n class=\"shortcode-emoji emoji\"\n src={emoji.url}\n alt={`:${emoji.shortcode}:`}\n width=\"16\"\n height=\"16\"\n loading=\"lazy\"\n decoding=\"async\"\n />\n </picture>{' '}\n <code>:{emoji.shortcode}:</code> (\n <a href={emoji.url} target=\"_blank\" download>\n URL\n </a>\n )\n {emoji.staticUrl ? (\n <>\n {' '}\n (\n <a href={emoji.staticUrl} target=\"_blank\" download>\n <Trans>static URL</Trans>\n </a>\n )\n </>\n ) : null}\n </li>\n );\n })}\n </ul>\n </section>\n )}\n {!!emojis?.length && (\n <section>\n <p>\n <Trans>Emojis:</Trans>\n </p>\n <ul>\n {emojis.map((emoji) => {\n return (\n <li key={emoji.shortcode}>\n <picture>\n <source\n srcset={emoji.staticUrl}\n media=\"(prefers-reduced-motion: reduce)\"\n ></source>\n <img\n class=\"shortcode-emoji emoji\"\n src={emoji.url}\n alt={`:${emoji.shortcode}:`}\n width=\"16\"\n height=\"16\"\n loading=\"lazy\"\n decoding=\"async\"\n />\n </picture>{' '}\n <code>:{emoji.shortcode}:</code> (\n <a href={emoji.url} target=\"_blank\" download>\n URL\n </a>\n )\n {emoji.staticUrl ? (\n <>\n {' '}\n (\n <a href={emoji.staticUrl} target=\"_blank\" download>\n <Trans>static URL</Trans>\n </a>\n )\n </>\n ) : null}\n </li>\n );\n })}\n </ul>\n </section>\n )}\n <section>\n <small>\n <p>\n <Trans>Notes:</Trans>\n </p>\n <ul>\n <li>\n <Trans>\n This is static, unstyled and scriptless. You may need to apply\n your own styles and edit as needed.\n </Trans>\n </li>\n <li>\n <Trans>\n Polls are not interactive, becomes a list with vote counts.\n </Trans>\n </li>\n <li>\n <Trans>\n Media attachments can be images, videos, audios or any file\n types.\n </Trans>\n </li>\n <li>\n <Trans>Post could be edited or deleted later.</Trans>\n </li>\n </ul>\n </small>\n </section>\n <h3>\n <Trans>Preview</Trans>\n </h3>\n <output\n class=\"embed-preview\"\n dangerouslySetInnerHTML={{ __html: htmlCode }}\n dir=\"auto\"\n />\n <p>\n <small>\n <Trans>Note: This preview is lightly styled.</Trans>\n </small>\n </p>\n </main>\n </div>\n );\n}\n\nexport default PostEmbedModal;\n","import './quote-chain-modal.css';\n\nimport { Trans, useLingui } from '@lingui/react/macro';\nimport { useEffect, useRef, useState } from 'preact/hooks';\n\nimport { api } from '../utils/api';\nimport { getStatus } from '../utils/states';\nimport useTruncated from '../utils/useTruncated';\n\nimport Icon from './icon';\nimport Link from './link';\nimport Loader from './loader';\nimport Status from './status';\n\nfunction TruncatedLink(props) {\n const { t } = useLingui();\n const ref = useTruncated();\n return <Link {...props} data-read-more={t`Read more →`} ref={ref} />;\n}\n\nconst FETCH_DELAY = 500; // Delay between fetches to avoid rate limiting\nconst BATCH_LIMIT = 30; // The chain might get very long, so fetch in batches\n\nexport default function QuoteChainModal({\n statusId,\n instance,\n onClose = () => {},\n}) {\n const { t } = useLingui();\n const { masto } = api();\n\n const [posts, setPosts] = useState([]);\n const [uiState, setUIState] = useState('default');\n const [nextPostID, setNextPostID] = useState(null);\n\n const abortControllerRef = useRef(null);\n\n const fetchQuoteChain = async (postID) => {\n abortControllerRef.current = new AbortController();\n const signal = abortControllerRef.current.signal;\n\n setUIState('loading');\n let fetchCount = 0;\n let currentPostID = postID;\n\n while (currentPostID && !signal.aborted && fetchCount < BATCH_LIMIT) {\n console.log('🔗 WHILE', { currentPostID, fetchCount });\n // Break circular reference if it somehow happens\n // Note that origin post could be edited to add a quote that might reference to any post in the chain ♻️\n if (posts.some((p) => p.id === currentPostID)) {\n break;\n }\n\n let fullStatus = getStatus(currentPostID, instance);\n const cached = !!fullStatus;\n\n if (!cached) {\n try {\n fullStatus = await masto.v1.statuses.$select(currentPostID).fetch();\n fetchCount++;\n } catch (e) {\n console.error('Error fetching quote:', e);\n setUIState('error');\n break;\n }\n }\n\n console.log('🔗 PUSH', fullStatus);\n setPosts((prev) => [...prev, fullStatus]);\n\n currentPostID =\n fullStatus.quote?.quotedStatusId || fullStatus.quote?.quotedStatus?.id;\n\n // Add delay before next fetch to avoid rate limiting\n if (\n !cached &&\n currentPostID &&\n !signal.aborted &&\n fetchCount < BATCH_LIMIT\n ) {\n await new Promise((resolve) => setTimeout(resolve, FETCH_DELAY));\n }\n }\n\n if (!signal.aborted) {\n setNextPostID(currentPostID || null);\n setUIState('default');\n }\n };\n\n useEffect(() => {\n fetchQuoteChain(statusId);\n return () => {\n abortControllerRef.current?.abort();\n };\n }, [statusId]);\n\n return (\n <div id=\"quote-chain-modal\" class=\"sheet\" tabindex=\"-1\">\n {onClose && (\n <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n <Icon icon=\"x\" alt={t`Close`} />\n </button>\n )}\n <header>\n <b>\n <Trans>Quote chain</Trans>\n </b>{' '}\n {posts.length > 0 && (\n <small class=\"tag insignificant collapsed\">\n {posts.length}\n {(!!nextPostID || uiState === 'loading') && '+'}\n </small>\n )}\n </header>\n <main>\n <ul class=\"quoted-posts-list\">\n {posts.map((post) => (\n <li key={post.id} class=\"quoted-post-item\">\n <TruncatedLink\n to={instance ? `/${instance}/s/${post.id}` : `/s/${post.id}`}\n class=\"status-link\"\n onContextMenu={(e) => {\n const postEl = e.target.querySelector('.status');\n if (postEl) {\n if (e.metaKey) return;\n e.preventDefault();\n postEl.dispatchEvent(\n new MouseEvent('contextmenu', {\n clientX: e.clientX,\n clientY: e.clientY,\n }),\n );\n }\n }}\n >\n <Status\n status={post}\n instance={instance}\n size=\"s\"\n readOnly\n showCommentCount\n showQuoteCount={(c) => c > 1}\n />\n </TruncatedLink>\n </li>\n ))}\n </ul>\n {uiState === 'error' ? (\n <p class=\"ui-state\">\n <Trans>Failed to unwrap quote chain</Trans>\n </p>\n ) : uiState === 'loading' ? (\n <p class=\"ui-state\">\n <Loader abrupt />\n </p>\n ) : nextPostID ? (\n <button\n type=\"button\"\n class=\"light block\"\n onClick={() => {\n fetchQuoteChain(nextPostID);\n }}\n >\n <Icon icon=\"arrow-down\" /> <Trans>Continue unwrapping…</Trans>\n </button>\n ) : (\n <p class=\"ui-state insignificant\">\n <Trans>The end.</Trans>\n </p>\n )}\n </main>\n </div>\n );\n}\n","import './quote-settings-sheet.css';\n\nimport { Trans, useLingui } from '@lingui/react/macro';\nimport { useState } from 'preact/hooks';\n\nimport { api } from '../utils/api';\nimport showToast from '../utils/show-toast';\nimport { saveStatus } from '../utils/states';\n\nimport Icon from './icon';\nimport Status from './status';\n\nfunction QuoteSettingsSheet({ onClose, post, currentPolicy }) {\n const { t } = useLingui();\n const { masto } = api();\n const [uiState, setUIState] = useState('default');\n\n const [selectedPolicy, setSelectedPolicy] = useState(\n currentPolicy || 'public',\n );\n\n const handleFormSubmit = async (e) => {\n e.preventDefault();\n const formData = new FormData(e.target);\n const quoteApprovalPolicy = formData.get('quoteApprovalPolicy');\n\n setSelectedPolicy(quoteApprovalPolicy);\n setUIState('loading');\n\n try {\n const newStatus = await masto.v1.statuses\n .$select(post.id)\n .interactionPolicy.update({\n quote_approval_policy: quoteApprovalPolicy,\n });\n onClose(true);\n showToast(t`Quote settings updated`);\n setUIState('default');\n\n // Update the status with new quote policy\n saveStatus(newStatus, post.instance, {\n skipThreading: true,\n skipUnfurling: true,\n });\n } catch (e) {\n console.error(e);\n showToast(t`Failed to update quote settings`);\n setUIState('error');\n }\n };\n\n return (\n <div class=\"sheet\" id=\"quote-settings-container\">\n {!!onClose && (\n <button\n type=\"button\"\n class=\"sheet-close\"\n onClick={onClose}\n disabled={uiState === 'loading'}\n >\n <Icon icon=\"x\" alt={t`Close`} />\n </button>\n )}\n <header>\n <h2>\n <Trans>Quote settings for this post</Trans>\n </h2>\n </header>\n <main>\n {!!post && (\n <div class=\"post-preview\">\n <Status status={post} size=\"s\" readOnly />\n </div>\n )}\n <form onSubmit={handleFormSubmit}>\n <select\n value={selectedPolicy}\n name=\"quoteApprovalPolicy\"\n disabled={uiState === 'loading'}\n >\n <option value=\"public\">\n <Trans>Anyone can quote</Trans>\n </option>\n <option value=\"followers\">\n <Trans>Your followers can quote</Trans>\n </option>\n <option value=\"nobody\">\n <Trans>Only you can quote</Trans>\n </option>\n </select>{' '}\n <button disabled={uiState === 'loading'}>\n <Trans>Save</Trans>\n </button>\n </form>\n </main>\n </div>\n );\n}\n\nexport default QuoteSettingsSheet;\n","import './quotes-modal.css';\n\nimport { Trans, useLingui } from '@lingui/react/macro';\nimport { useEffect, useRef, useState } from 'preact/hooks';\n\nimport { api } from '../utils/api';\n\nimport Icon from './icon';\nimport Link from './link';\nimport Loader from './loader';\nimport Status from './status';\n\nconst LIMIT = 20;\n\nexport default function QuotesModal({\n statusId,\n instance,\n onClose = () => {},\n}) {\n const { t } = useLingui();\n const { masto } = api();\n\n const [posts, setPosts] = useState([]);\n const [uiState, setUIState] = useState('default');\n const [showMore, setShowMore] = useState(false);\n\n const quotesIterator = useRef();\n const firstLoad = useRef(true);\n\n const loadQuotes = (isFirstLoad = false) => {\n if (isFirstLoad || !quotesIterator.current) {\n quotesIterator.current = masto.v1.statuses\n .$select(statusId)\n .quotes.list({\n limit: LIMIT,\n })\n .values();\n }\n\n setUIState('loading');\n\n (async () => {\n try {\n let { done, value } = await quotesIterator.current.next();\n\n if (Array.isArray(value)) {\n if (isFirstLoad) {\n setPosts(value);\n } else {\n setPosts((prev) => [...prev, ...value]);\n }\n if (value.length < LIMIT) {\n done = true;\n }\n setShowMore(!done);\n } else {\n setShowMore(false);\n }\n setUIState('default');\n } catch (e) {\n console.error('Error loading quotes:', e);\n setUIState('error');\n }\n })();\n };\n\n useEffect(() => {\n loadQuotes(true);\n firstLoad.current = false;\n }, [statusId]);\n\n return (\n <div id=\"quotes-modal\" class=\"sheet\" tabindex=\"-1\">\n {onClose && (\n <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n <Icon icon=\"x\" alt={t`Close`} />\n </button>\n )}\n <header>\n <h2>\n <Trans>Quotes</Trans>\n </h2>\n </header>\n <main>\n {posts.length > 0 ? (\n <>\n <ul class=\"quoted-posts-list\">\n {posts.map((post) => (\n <li key={post.id} class=\"quoted-post-item\">\n <Link\n to={\n instance ? `/${instance}/s/${post.id}` : `/s/${post.id}`\n }\n class=\"status-link\"\n onContextMenu={(e) => {\n const post = e.target.querySelector('.status');\n if (post) {\n // Fire a custom event to open the context menu\n if (e.metaKey) return;\n e.preventDefault();\n post.dispatchEvent(\n new MouseEvent('contextmenu', {\n clientX: e.clientX,\n clientY: e.clientY,\n }),\n );\n }\n }}\n >\n <Status\n status={post}\n instance={instance}\n size=\"s\"\n readOnly\n showCommentCount\n showQuoteCount\n />\n </Link>\n </li>\n ))}\n </ul>\n {uiState === 'default' ? (\n showMore ? (\n <button\n type=\"button\"\n class=\"plain block\"\n onClick={() => loadQuotes()}\n >\n <Trans>Show more…</Trans>\n </button>\n ) : (\n <p class=\"ui-state insignificant\">\n <Trans>The end.</Trans>\n </p>\n )\n ) : (\n uiState === 'loading' && (\n <p class=\"ui-state\">\n <Loader abrupt />\n </p>\n )\n )}\n </>\n ) : uiState === 'loading' ? (\n <p class=\"ui-state\">\n <Loader abrupt />\n </p>\n ) : uiState === 'error' ? (\n <p class=\"ui-state\">\n <Trans>Error loading quotes</Trans>\n </p>\n ) : (\n <p class=\"ui-state insignificant\">\n <Trans>No quotes yet</Trans>\n </p>\n )}\n </main>\n </div>\n );\n}\n","import { forwardRef } from 'preact/compat';\nimport { useEffect, useState } from 'preact/hooks';\n\nimport shortenNumber from '../utils/shorten-number';\n\nimport Icon from './icon';\n\nconst StatusButton = forwardRef((props, ref) => {\n let {\n checked,\n count,\n extraCount,\n class: className,\n title,\n alt,\n size,\n icon,\n iconSize = 'l',\n onClick,\n ...otherProps\n } = props;\n if (typeof title === 'string') {\n title = [title, title];\n }\n if (typeof alt === 'string') {\n alt = [alt, alt];\n }\n\n const [buttonTitle, setButtonTitle] = useState(title[0] || '');\n const [iconAlt, setIconAlt] = useState(alt[0] || '');\n\n useEffect(() => {\n if (checked) {\n setButtonTitle(title[1] || '');\n setIconAlt(alt[1] || '');\n } else {\n setButtonTitle(title[0] || '');\n setIconAlt(alt[0] || '');\n }\n }, [checked, title, alt]);\n\n return (\n <button\n ref={ref}\n type=\"button\"\n title={buttonTitle}\n class={`plain ${size ? 'small' : ''} ${className} ${\n checked ? 'checked' : ''\n }`}\n onClick={(e) => {\n if (!onClick) return;\n e.preventDefault();\n e.stopPropagation();\n onClick(e);\n }}\n {...otherProps}\n >\n <Icon icon={icon} size={iconSize} alt={iconAlt} />\n {(!!count || !!extraCount) && (\n <>\n {' '}\n {!!count && <small title={count}>{shortenNumber(count)}</small>}\n {!!count && !!extraCount && <small>+</small>}\n {!!extraCount && (\n <small title={extraCount}>{shortenNumber(extraCount)}</small>\n )}\n </>\n )}\n </button>\n );\n});\n\nexport default StatusButton;\n","export class LiteYTEmbed extends HTMLElement {\n constructor() {\n super();\n this.isIframeLoaded = false;\n this.isPlaylistThumbnailLoaded = false;\n this.setupDom();\n }\n static get observedAttributes() {\n return ['videoid', 'playlistid', 'videoplay', 'videotitle'];\n }\n connectedCallback() {\n this.addEventListener('pointerover', () => LiteYTEmbed.warmConnections(this), {\n once: true,\n });\n this.addEventListener('click', () => this.addIframe());\n }\n get videoId() {\n return encodeURIComponent(this.getAttribute('videoid') || '');\n }\n set videoId(id) {\n this.setAttribute('videoid', id);\n }\n get playlistId() {\n return encodeURIComponent(this.getAttribute('playlistid') || '');\n }\n set playlistId(id) {\n this.setAttribute('playlistid', id);\n }\n get videoTitle() {\n return this.getAttribute('videotitle') || 'Video';\n }\n set videoTitle(title) {\n this.setAttribute('videotitle', title);\n }\n get videoPlay() {\n return this.getAttribute('videoplay') || 'Play';\n }\n set videoPlay(name) {\n this.setAttribute('videoplay', name);\n }\n get videoStartAt() {\n return this.getAttribute('videoStartAt') || '0';\n }\n get autoLoad() {\n return this.hasAttribute('autoload');\n }\n get autoPause() {\n return this.hasAttribute('autopause');\n }\n get noCookie() {\n return this.hasAttribute('nocookie');\n }\n get posterQuality() {\n return this.getAttribute('posterquality') || 'hqdefault';\n }\n get posterLoading() {\n return (this.getAttribute('posterloading') ||\n 'lazy');\n }\n get params() {\n return `start=${this.videoStartAt}&${this.getAttribute('params')}`;\n }\n set params(opts) {\n this.setAttribute('params', opts);\n }\n set posterQuality(opts) {\n this.setAttribute('posterquality', opts);\n }\n get disableNoscript() {\n return this.hasAttribute('disablenoscript');\n }\n setupDom() {\n const shadowDom = this.attachShadow({ mode: 'open' });\n let nonce = '';\n if (window.liteYouTubeNonce) {\n nonce = `nonce=\"${window.liteYouTubeNonce}\"`;\n }\n shadowDom.innerHTML = `\n <style ${nonce}>\n :host {\n --aspect-ratio: var(--lite-youtube-aspect-ratio, 16 / 9);\n --aspect-ratio-short: var(--lite-youtube-aspect-ratio-short, 9 / 16);\n --frame-shadow-visible: var(--lite-youtube-frame-shadow-visible, yes);\n contain: content;\n display: block;\n position: relative;\n width: 100%;\n aspect-ratio: var(--aspect-ratio);\n }\n\n @media (max-width: 40em) {\n :host([short]) {\n aspect-ratio: var(--aspect-ratio-short);\n }\n }\n\n #frame, #fallbackPlaceholder, iframe {\n position: absolute;\n width: 100%;\n height: 100%;\n left: 0;\n top: 0;\n }\n\n #frame {\n cursor: pointer;\n }\n\n #fallbackPlaceholder, slot[name=image]::slotted(*) {\n object-fit: cover;\n width: 100%;\n height: 100%;\n }\n\n @container style(--frame-shadow-visible: yes) {\n #frame::before {\n content: '';\n display: block;\n position: absolute;\n top: 0;\n background-image: linear-gradient(180deg, #111 -20%, transparent 90%);\n height: 60px;\n width: 100%;\n z-index: 1;\n }\n }\n\n #playButton {\n width: 68px;\n height: 48px;\n background-color: transparent;\n background-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 68 48\"><path d=\"M66.52 7.74c-.78-2.93-2.49-5.41-5.42-6.19C55.79.13 34 0 34 0S12.21.13 6.9 1.55c-2.93.78-4.63 3.26-5.42 6.19C.06 13.05 0 24 0 24s.06 10.95 1.48 16.26c.78 2.93 2.49 5.41 5.42 6.19C12.21 47.87 34 48 34 48s21.79-.13 27.1-1.55c2.93-.78 4.64-3.26 5.42-6.19C67.94 34.95 68 24 68 24s-.06-10.95-1.48-16.26z\" fill=\"red\"/><path d=\"M45 24 27 14v20\" fill=\"white\"/></svg>');\n z-index: 1;\n border: 0;\n border-radius: inherit;\n }\n\n #playButton:before {\n content: '';\n border-style: solid;\n border-width: 11px 0 11px 19px;\n border-color: transparent transparent transparent #fff;\n }\n\n #playButton,\n #playButton:before {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate3d(-50%, -50%, 0);\n cursor: inherit;\n }\n\n /* Post-click styles */\n .activated {\n cursor: unset;\n }\n\n #frame.activated::before,\n #frame.activated > #playButton {\n display: none;\n }\n </style>\n <div id=\"frame\">\n <picture>\n <slot name=\"image\">\n <source id=\"webpPlaceholder\" type=\"image/webp\">\n <source id=\"jpegPlaceholder\" type=\"image/jpeg\">\n <img id=\"fallbackPlaceholder\" referrerpolicy=\"origin\" loading=\"lazy\">\n </slot>\n </picture>\n <button id=\"playButton\" part=\"playButton\"></button>\n </div>\n `;\n this.domRefFrame = shadowDom.querySelector('#frame');\n this.domRefImg = {\n fallback: shadowDom.querySelector('#fallbackPlaceholder'),\n webp: shadowDom.querySelector('#webpPlaceholder'),\n jpeg: shadowDom.querySelector('#jpegPlaceholder'),\n };\n this.domRefPlayButton = shadowDom.querySelector('#playButton');\n }\n setupComponent() {\n const hasImgSlot = this.shadowRoot.querySelector('slot[name=image]');\n if (hasImgSlot.assignedNodes().length === 0) {\n this.initImagePlaceholder();\n }\n this.domRefPlayButton.setAttribute('aria-label', `${this.videoPlay}: ${this.videoTitle}`);\n this.setAttribute('title', `${this.videoPlay}: ${this.videoTitle}`);\n if (this.autoLoad || this.isYouTubeShort() || this.autoPause) {\n this.initIntersectionObserver();\n }\n if (!this.disableNoscript) {\n this.injectSearchNoScript();\n }\n }\n attributeChangedCallback(name, oldVal, newVal) {\n if (oldVal !== newVal) {\n if (name === 'playlistid' && oldVal !== null && oldVal !== newVal) {\n this.isPlaylistThumbnailLoaded = false;\n }\n this.setupComponent();\n if (this.domRefFrame.classList.contains('activated')) {\n this.domRefFrame.classList.remove('activated');\n this.shadowRoot.querySelector('iframe').remove();\n this.isIframeLoaded = false;\n }\n }\n }\n injectSearchNoScript() {\n const eleNoScript = document.createElement('noscript');\n this.prepend(eleNoScript);\n eleNoScript.innerHTML = this.generateIframe();\n }\n generateIframe(isIntersectionObserver = false) {\n let autoplay = isIntersectionObserver ? 0 : 1;\n let autoPause = this.autoPause ? '&enablejsapi=1' : '';\n const wantsNoCookie = this.noCookie ? '-nocookie' : '';\n let embedTarget;\n if (this.playlistId) {\n embedTarget = `?listType=playlist&list=${this.playlistId}&`;\n }\n else {\n embedTarget = `${this.videoId}?`;\n }\n if (this.isYouTubeShort()) {\n this.params = `loop=1&mute=1&modestbranding=1&playsinline=1&rel=0&enablejsapi=1&playlist=${this.videoId}`;\n autoplay = 1;\n }\n return `\n<iframe credentialless frameborder=\"0\" title=\"${this.videoTitle}\"\n referrerpolicy=\"strict-origin-when-cross-origin\"\n allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen\n src=\"https://www.youtube${wantsNoCookie}.com/embed/${embedTarget}autoplay=${autoplay}${autoPause}&${this.params}\"\n></iframe>`;\n }\n addIframe(isIntersectionObserver = false) {\n if (!this.isIframeLoaded) {\n const iframeHTML = this.generateIframe(isIntersectionObserver);\n this.domRefFrame.insertAdjacentHTML('beforeend', iframeHTML);\n this.domRefFrame.classList.add('activated');\n this.isIframeLoaded = true;\n this.attemptShortAutoPlay();\n this.dispatchEvent(new CustomEvent('liteYoutubeIframeLoaded', {\n detail: {\n videoId: this.videoId,\n },\n bubbles: true,\n cancelable: true,\n }));\n }\n }\n initImagePlaceholder() {\n if (this.playlistId && !this.videoId) {\n this.loadPlaylistThumbnail();\n }\n else {\n this.testPosterImage();\n }\n this.domRefImg.fallback.setAttribute('aria-label', `${this.videoPlay}: ${this.videoTitle}`);\n this.domRefImg?.fallback?.setAttribute('alt', `${this.videoPlay}: ${this.videoTitle}`);\n }\n async loadPlaylistThumbnail() {\n if (this.isPlaylistThumbnailLoaded) {\n return;\n }\n this.isPlaylistThumbnailLoaded = true;\n try {\n const oEmbedUrl = `https://www.youtube.com/oembed?url=https://www.youtube.com/playlist?list=${this.playlistId}&format=json`;\n const response = await fetch(oEmbedUrl);\n if (!response.ok) {\n throw new Error(`Failed to fetch playlist thumbnail: ${response.status}`);\n }\n const data = await response.json();\n if (data.thumbnail_url) {\n const thumbnailUrl = data.thumbnail_url;\n const videoIdMatch = thumbnailUrl.match(/\\/vi\\/([^\\/]+)\\//);\n if (videoIdMatch) {\n const extractedVideoId = videoIdMatch[1];\n this.loadThumbnailImages(extractedVideoId);\n }\n else {\n this.domRefImg.fallback.src = thumbnailUrl;\n this.domRefImg.fallback.loading = this.posterLoading;\n }\n }\n }\n catch (error) {\n console.warn('Failed to load playlist thumbnail:', error);\n }\n }\n loadThumbnailImages(videoId) {\n const posterUrlWebp = `https://i.ytimg.com/vi_webp/${videoId}/${this.posterQuality}.webp`;\n this.domRefImg.webp.srcset = posterUrlWebp;\n const posterUrlJpeg = `https://i.ytimg.com/vi/${videoId}/${this.posterQuality}.jpg`;\n this.domRefImg.jpeg.srcset = posterUrlJpeg;\n this.domRefImg.fallback.src = posterUrlJpeg;\n this.domRefImg.fallback.loading = this.posterLoading;\n }\n async testPosterImage() {\n setTimeout(() => {\n const webpUrl = `https://i.ytimg.com/vi_webp/${this.videoId}/${this.posterQuality}.webp`;\n const img = new Image();\n img.fetchPriority = 'low';\n img.referrerPolicy = 'origin';\n img.src = webpUrl;\n img.onload = async (e) => {\n const target = e.target;\n const noPoster = target?.naturalHeight == 90 && target?.naturalWidth == 120;\n if (noPoster) {\n this.posterQuality = 'hqdefault';\n }\n this.loadThumbnailImages(this.videoId);\n };\n }, 100);\n }\n initIntersectionObserver() {\n const options = {\n root: null,\n rootMargin: '0px',\n threshold: 0,\n };\n const observer = new IntersectionObserver((entries, observer) => {\n entries.forEach(entry => {\n if (entry.isIntersecting && !this.isIframeLoaded) {\n LiteYTEmbed.warmConnections(this);\n this.addIframe(true);\n observer.unobserve(this);\n }\n });\n }, options);\n observer.observe(this);\n if (this.autoPause) {\n const windowPause = new IntersectionObserver((e, o) => {\n e.forEach(entry => {\n if (entry.intersectionRatio !== 1) {\n this.shadowRoot\n .querySelector('iframe')\n ?.contentWindow?.postMessage('{\"event\":\"command\",\"func\":\"pauseVideo\",\"args\":\"\"}', '*');\n }\n });\n }, { threshold: 1 });\n windowPause.observe(this);\n }\n }\n attemptShortAutoPlay() {\n if (this.isYouTubeShort()) {\n setTimeout(() => {\n this.shadowRoot\n .querySelector('iframe')\n ?.contentWindow?.postMessage('{\"event\":\"command\",\"func\":\"' + 'playVideo' + '\",\"args\":\"\"}', '*');\n }, 2000);\n }\n }\n isYouTubeShort() {\n return (this.getAttribute('short') === '' &&\n window.matchMedia('(max-width: 40em)').matches);\n }\n static addPrefetch(kind, url) {\n const linkElem = document.createElement('link');\n linkElem.rel = kind;\n linkElem.href = url;\n linkElem.crossOrigin = 'true';\n document.head.append(linkElem);\n }\n static warmConnections(context) {\n if (LiteYTEmbed.isPreconnected || window.liteYouTubeIsPreconnected)\n return;\n LiteYTEmbed.addPrefetch('preconnect', 'https://i.ytimg.com/');\n LiteYTEmbed.addPrefetch('preconnect', 'https://s.ytimg.com');\n if (!context.noCookie) {\n LiteYTEmbed.addPrefetch('preconnect', 'https://www.youtube.com');\n LiteYTEmbed.addPrefetch('preconnect', 'https://www.google.com');\n LiteYTEmbed.addPrefetch('preconnect', 'https://googleads.g.doubleclick.net');\n LiteYTEmbed.addPrefetch('preconnect', 'https://static.doubleclick.net');\n }\n else {\n LiteYTEmbed.addPrefetch('preconnect', 'https://www.youtube-nocookie.com');\n }\n LiteYTEmbed.isPreconnected = true;\n window.liteYouTubeIsPreconnected = true;\n }\n}\nLiteYTEmbed.isPreconnected = false;\ncustomElements.define('lite-youtube', LiteYTEmbed);\n//# sourceMappingURL=lite-youtube.js.map","import { Trans } from '@lingui/react/macro';\n\nimport Icon from './icon';\nimport NameText from './name-text';\n\nfunction Byline({ authors, hidden, children }) {\n if (hidden) return children;\n if (!authors?.[0]?.account?.id) return children;\n const author = authors[0].account;\n\n return (\n <div class=\"card-byline\">\n {children}\n <div class=\"card-byline-author\">\n <Icon icon=\"link\" size=\"s\" />{' '}\n <small>\n <Trans comment=\"More from [Author]\">\n More from <NameText account={author} showAvatar />\n </Trans>\n </small>\n </div>\n </div>\n );\n}\n\nexport default Byline;\n","import '@justinribeiro/lite-youtube';\n\nimport { decodeBlurHash, getBlurHashAverageColor } from 'fast-blurhash';\nimport { useCallback, useEffect, useState } from 'preact/hooks';\nimport { useSnapshot } from 'valtio';\n\nimport getDomain from '../utils/get-domain';\nimport isMastodonLinkMaybe from '../utils/isMastodonLinkMaybe';\nimport states from '../utils/states';\nimport unfurlMastodonLink from '../utils/unfurl-link';\n\nimport Byline from './byline';\nimport Icon from './icon';\nimport RelativeTime from './relative-time';\n\n// \"Post\": Quote post + card link preview combo\n// Assume all links from these domains are \"posts\"\n// Mastodon links are \"posts\" too but they are converted to real quote posts and there's too many domains to check\n// This is just \"Progressive Enhancement\"\nfunction isCardPost(domain) {\n return [\n 'x.com',\n 'twitter.com',\n 'threads.net',\n 'bsky.app',\n 'bsky.brid.gy',\n 'fed.brid.gy',\n ].includes(domain);\n}\n\nfunction StatusCard({ card, selfReferential, selfAuthor, instance }) {\n const snapStates = useSnapshot(states);\n const {\n blurhash,\n title,\n description,\n html,\n providerName,\n providerUrl,\n authorName,\n authorUrl,\n width,\n height,\n image,\n imageDescription,\n url,\n type,\n embedUrl,\n language,\n publishedAt,\n authors,\n } = card;\n\n /* type\n link = Link OEmbed\n photo = Photo OEmbed\n video = Video OEmbed\n rich = iframe OEmbed. Not currently accepted, so won't show up in practice.\n */\n\n const hasText = title || providerName || authorName;\n const isLandscape = width / height >= 1.2;\n const size = isLandscape ? 'large' : '';\n\n const [cardStatusURL, setCardStatusURL] = useState(null);\n // const [cardStatusID, setCardStatusID] = useState(null);\n useEffect(() => {\n if (!hasText || !image || selfReferential || !isMastodonLinkMaybe(url)) {\n return;\n }\n\n const abortController = new AbortController();\n unfurlMastodonLink(instance, url, abortController.signal).then((result) => {\n if (!result) return;\n const { id, url } = result;\n setCardStatusURL('#' + url);\n\n // NOTE: This is for quote post\n // (async () => {\n // const { masto } = api({ instance });\n // const status = await masto.v1.statuses.$select(id).fetch();\n // saveStatus(status, instance);\n // setCardStatusID(id);\n // })();\n });\n\n return () => {\n abortController.abort();\n };\n }, [hasText, image, selfReferential]);\n\n // if (cardStatusID) {\n // return (\n // <Status statusID={cardStatusID} instance={instance} size=\"s\" readOnly />\n // );\n // }\n\n if (snapStates.unfurledLinks[url]) return null;\n\n const hasIframeHTML = /<iframe/i.test(html);\n const handleClick = useCallback(\n (e) => {\n if (hasIframeHTML) {\n e.preventDefault();\n states.showEmbedModal = {\n html,\n url: url || embedUrl,\n width,\n height,\n };\n }\n },\n [hasIframeHTML],\n );\n\n const [blurhashImage, setBlurhashImage] = useState(null);\n if (hasText && (image || (type === 'photo' && blurhash))) {\n const domain = getDomain(url);\n const rgbAverageColor =\n image && blurhash ? getBlurHashAverageColor(blurhash) : null;\n if (!image) {\n const w = 44;\n const h = 44;\n const blurhashPixels = decodeBlurHash(blurhash, w, h);\n const canvas = window.OffscreenCanvas\n ? new OffscreenCanvas(1, 1)\n : document.createElement('canvas');\n canvas.width = w;\n canvas.height = h;\n const ctx = canvas.getContext('2d');\n ctx.imageSmoothingEnabled = false;\n const imageData = ctx.createImageData(w, h);\n imageData.data.set(blurhashPixels);\n ctx.putImageData(imageData, 0, 0);\n try {\n if (window.OffscreenCanvas) {\n canvas.convertToBlob().then((blob) => {\n setBlurhashImage(URL.createObjectURL(blob));\n });\n } else {\n setBlurhashImage(canvas.toDataURL());\n }\n } catch (e) {\n // Silently fail\n console.error(e);\n }\n }\n\n const isPost = isCardPost(domain);\n\n return (\n <Byline hidden={!!selfAuthor} authors={authors}>\n <a\n href={cardStatusURL || url}\n target={cardStatusURL ? null : '_blank'}\n rel=\"nofollow noopener\"\n class={`card link ${isPost ? 'card-post' : ''} ${\n blurhashImage ? '' : size\n } ${hasIframeHTML ? 'can-show-embed' : ''}`}\n style={{\n '--average-color':\n rgbAverageColor && `rgb(${rgbAverageColor.join(',')})`,\n }}\n onClick={handleClick}\n >\n <div class=\"card-image\">\n <img\n src={image || blurhashImage}\n width={width}\n height={height}\n loading=\"lazy\"\n decoding=\"async\"\n fetchPriority=\"low\"\n alt={imageDescription || ''}\n onError={(e) => {\n try {\n e.target.style.display = 'none';\n } catch (e) {}\n }}\n style={{\n '--anim-duration':\n width &&\n height &&\n `${Math.min(\n Math.max(Math.max(width, height) / 100, 5),\n 120,\n )}s`,\n }}\n />\n </div>\n <div class=\"meta-container\" lang={language}>\n <p class=\"meta domain\">\n <span class=\"domain\">{domain}</span>{' '}\n {!!publishedAt && <>&middot; </>}\n {!!publishedAt && (\n <>\n <RelativeTime datetime={publishedAt} format=\"micro\" />\n </>\n )}\n </p>\n <p class=\"title\" dir=\"auto\" title={title}>\n {title}\n </p>\n <p class=\"meta\" dir=\"auto\" title={description}>\n {description ||\n (!!publishedAt && (\n <RelativeTime datetime={publishedAt} format=\"micro\" />\n ))}\n </p>\n </div>\n </a>\n </Byline>\n );\n } else if (type === 'photo') {\n return (\n <a\n href={url}\n target=\"_blank\"\n rel=\"nofollow noopener\"\n class=\"card photo\"\n onClick={handleClick}\n >\n <img\n src={embedUrl}\n width={width}\n height={height}\n alt={title || description}\n loading=\"lazy\"\n style={{\n height: 'auto',\n aspectRatio: `${width}/${height}`,\n }}\n />\n </a>\n );\n } else {\n if (type === 'video') {\n if (/youtube/i.test(providerName)) {\n // Get ID from e.g. https://www.youtube.com/watch?v=[VIDEO_ID]\n const videoID = url.match(/watch\\?v=([^&]+)/)?.[1];\n if (videoID) {\n return (\n <a class=\"card video\" onClick={handleClick}>\n <lite-youtube videoid={videoID} nocookie autoPause></lite-youtube>\n </a>\n );\n }\n }\n // return (\n // <div\n // class=\"card video\"\n // style={{\n // aspectRatio: `${width}/${height}`,\n // }}\n // dangerouslySetInnerHTML={{ __html: html }}\n // />\n // );\n }\n if (hasText && !image) {\n const domain = getDomain(url);\n const isPost = isCardPost(domain);\n return (\n <a\n href={cardStatusURL || url}\n target={cardStatusURL ? null : '_blank'}\n rel=\"nofollow noopener\"\n class={`card link ${isPost ? 'card-post' : ''} no-image`}\n lang={language}\n dir=\"auto\"\n onClick={handleClick}\n >\n <div class=\"meta-container\">\n <p class=\"meta domain\">\n <span class=\"domain\">\n <Icon icon=\"link\" size=\"s\" /> <span>{domain}</span>\n </span>{' '}\n {!!publishedAt && <>&middot; </>}\n {!!publishedAt && (\n <>\n <RelativeTime datetime={publishedAt} format=\"micro\" />\n </>\n )}\n </p>\n <p class=\"title\" title={title}>\n {title}\n </p>\n <p class=\"meta\" title={description || providerName || authorName}>\n {description || providerName || authorName}\n </p>\n </div>\n </a>\n );\n }\n }\n}\n\nexport default StatusCard;\n","import { Trans } from '@lingui/react/macro';\nimport { useContext } from 'preact/hooks';\nimport { useSnapshot } from 'valtio';\n\nimport FilterContext from '../utils/filter-context';\nimport { isFiltered } from '../utils/filters';\nimport states, { getStatus, statusKey } from '../utils/states';\nimport statusPeek from '../utils/status-peek';\nimport { getCurrentAccID } from '../utils/store-utils';\n\nimport Avatar from './avatar';\n\nfunction StatusCompact({ sKey }) {\n const snapStates = useSnapshot(states);\n const statusReply = snapStates.statusReply[sKey];\n if (!statusReply) return null;\n\n const { id, instance } = statusReply;\n const status = getStatus(id, instance);\n if (!status) return null;\n\n const {\n account: { id: accountId },\n sensitive,\n spoilerText,\n account: { avatar, avatarStatic, bot } = {},\n visibility,\n content,\n language,\n filtered,\n } = status;\n if (sensitive || spoilerText) return null;\n if (!content) return null;\n\n const srKey = statusKey(id, instance);\n const statusPeekText = statusPeek(status);\n\n const currentAccount = getCurrentAccID();\n const isSelf = currentAccount && currentAccount === accountId;\n\n const filterContext = useContext(FilterContext);\n let filterInfo = !isSelf && isFiltered(filtered, filterContext);\n\n // This is fine. Images are converted to emojis so they are\n // in a way, already \"obscured\"\n if (filterInfo?.action === 'blur') filterInfo = null;\n\n if (filterInfo?.action === 'hide') return null;\n\n const filterTitleStr = filterInfo?.titlesStr || '';\n\n return (\n <article\n class={`status compact-reply shazam ${\n visibility === 'direct' ? 'visibility-direct' : ''\n }`}\n tabindex=\"-1\"\n data-state-post-id={srKey}\n >\n <Avatar url={avatarStatic || avatar} squircle={bot} />\n <div\n class=\"content-compact\"\n title={statusPeekText}\n lang={language}\n dir=\"auto\"\n >\n {filterInfo ? (\n <b class=\"status-filtered-badge badge-meta\" title={filterTitleStr}>\n <span>\n <Trans>Filtered</Trans>\n </span>\n <span>{filterTitleStr}</span>\n </b>\n ) : (\n <span>{statusPeekText}</span>\n )}\n </div>\n </article>\n );\n}\n\nexport default StatusCompact;\n","import { api } from '../utils/api';\n\nimport Link from './link';\n\nconst fauxDiv = document.createElement('div');\nconst extractTagsFromStatus = (content) => {\n if (!content) return [];\n if (content.indexOf('#') === -1) return [];\n fauxDiv.innerHTML = content;\n const hashtagLinks = fauxDiv.getElementsByClassName('hashtag');\n if (!hashtagLinks.length) return [];\n const tags = [];\n for (let i = 0; i < hashtagLinks.length; i++) {\n const a = hashtagLinks[i];\n if (a.tagName === 'A') {\n tags.push(\n a.innerText\n .trim()\n .replace(/^[^#]*#+/, '')\n .toLowerCase(),\n );\n }\n }\n return tags;\n};\n\nexport default function StatusTags({ tags, content }) {\n if (!tags?.length) return null;\n\n const hashtagsInContent = extractTagsFromStatus(content);\n const tagsToShow = tags.filter(\n (tag) => !hashtagsInContent.includes(tag.name.toLowerCase()),\n );\n\n if (!tagsToShow.length) return null;\n\n const { instance } = api();\n\n return (\n <ul class=\"status-tags\">\n {tagsToShow.map((tag) => (\n <li>\n <Link\n to={\n instance\n ? `/${instance}/t/${encodeURIComponent(tag.name)}`\n : `/t/${encodeURIComponent(tag.name)}`\n }\n key={tag.name}\n >\n <span class=\"more-insignificant\">#</span>\n {tag.name}\n </Link>\n </li>\n ))}\n </ul>\n );\n}\n","import { createContext } from 'preact';\n\nexport const ThreadCountContext = createContext(0);\n","import { Trans, useLingui } from '@lingui/react/macro';\nimport { useContext } from 'preact/hooks';\n\nimport { ThreadCountContext } from '../utils/thread-count-context';\n\nimport Icon from './icon';\n\nfunction ThreadIcon({ alt }) {\n return <Icon icon=\"thread\" size=\"s\" alt={alt} />;\n}\n\nfunction ThreadBadge({ index, showIcon, showText }) {\n const { t } = useLingui();\n const total = useContext(ThreadCountContext);\n const hasIndex = index > 0;\n const hasTotal = total > 0;\n\n return (\n <div class=\"status-thread-badge\">\n {showIcon && (\n <>\n <ThreadIcon alt={showText ? '' : t`Thread`} />{' '}\n </>\n )}\n {showText ? (\n hasIndex ? (\n hasTotal ? (\n <Trans>\n Thread {index}/{total}\n </Trans>\n ) : (\n <Trans comment=\"X is the unspecified total number of posts in a thread\">\n Thread {index}/X\n </Trans>\n )\n ) : (\n t`Thread`\n )\n ) : hasIndex ? (\n hasTotal ? (\n t({\n message: `${index}/${total}`,\n comment: 'index/total posts in a thread',\n })\n ) : (\n t({\n message: `${index}/X`,\n comment: 'X is the unspecified total number of posts in a thread',\n })\n )\n ) : (\n !showIcon && <ThreadIcon alt={t`Thread`} />\n )}\n </div>\n );\n}\n\nexport default ThreadBadge;\n","import './status.css';\n\nimport { msg, plural } from '@lingui/core/macro';\nimport { Plural, Trans, useLingui } from '@lingui/react/macro';\nimport { ControlledMenu, MenuDivider, MenuItem } from '@szhsin/react-menu';\nimport { shallowEqual } from 'fast-equals';\nimport PQueue from 'p-queue';\nimport { Fragment } from 'preact';\nimport { memo } from 'preact/compat';\nimport {\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useReducer,\n useRef,\n useState,\n} from 'preact/hooks';\nimport punycode from 'punycode/';\nimport { useHotkeys } from 'react-hotkeys-hook';\nimport { useLongPress } from 'use-long-press';\nimport { useSnapshot } from 'valtio';\n\nimport { api, getPreferences } from '../utils/api';\nimport { langDetector } from '../utils/browser-translator';\nimport { useEditHistory } from '../utils/edit-history-context';\nimport FilterContext from '../utils/filter-context';\nimport { isFiltered } from '../utils/filters';\nimport getTranslateTargetLanguage from '../utils/get-translate-target-language';\nimport getHTMLText from '../utils/getHTMLText';\nimport htmlContentLength from '../utils/html-content-length';\nimport localeMatch from '../utils/locale-match';\nimport mem from '../utils/mem';\nimport niceDateTime from '../utils/nice-date-time';\nimport openCompose from '../utils/open-compose';\nimport pmem from '../utils/pmem';\nimport {\n getPostQuoteApprovalPolicy,\n supportsNativeQuote,\n} from '../utils/quote-utils';\nimport RTF from '../utils/relative-time-format';\nimport safeBoundingBoxPadding from '../utils/safe-bounding-box-padding';\nimport shortenNumber from '../utils/shorten-number';\nimport showCompose from '../utils/show-compose';\nimport showToast from '../utils/show-toast';\nimport { speak, supportsTTS } from '../utils/speech';\nimport states, { getStatus, saveStatus, statusKey } from '../utils/states';\nimport statusPeek from '../utils/status-peek';\nimport { getAPIVersions, getCurrentAccID } from '../utils/store-utils';\nimport supports from '../utils/supports';\nimport useTruncated from '../utils/useTruncated';\nimport visibilityIconsMap from '../utils/visibility-icons-map';\nimport visibilityText from '../utils/visibility-text';\n\nimport Avatar from './avatar';\nimport CustomEmoji from './custom-emoji';\nimport EmojiText from './emoji-text';\nimport Icon from './icon';\nimport LazyShazam from './lazy-shazam';\nimport Link from './link';\nimport Loader from './loader';\nimport MathBlock from './math-block';\nimport Media, { isMediaCaptionLong } from './media';\nimport MediaFirstContainer from './media-first-container';\nimport MenuConfirm from './menu-confirm';\nimport MenuLink from './menu-link';\nimport Menu2 from './menu2';\nimport Modal from './modal';\nimport MultipleMediaFigure from './multiple-media-figure';\nimport NameText from './name-text';\nimport Poll from './poll';\nimport PostContent from './post-content';\nimport PostEmbedModal from './post-embed-modal';\nimport QuoteChainModal from './quote-chain-modal';\nimport QuoteSettingsSheet from './quote-settings-sheet';\nimport QuotesModal from './quotes-modal';\nimport RelativeTime from './relative-time';\nimport StatusButton from './status-button';\nimport StatusCard from './status-card';\nimport StatusCompact from './status-compact';\nimport StatusTags from './status-tags';\nimport SubMenu2 from './submenu2';\nimport ThreadBadge from './thread-badge';\nimport TranslationBlock from './translation-block';\n\nconst SHOW_COMMENT_COUNT_LIMIT = 280;\nconst INLINE_TRANSLATE_LIMIT = 140;\n\nconst accountQueue = new PQueue({\n concurrency: 1,\n interval: 1000,\n intervalCap: 1,\n});\nfunction fetchAccount(id, masto, signal) {\n return accountQueue.add(() => masto.v1.accounts.$select(id).fetch(), {\n signal,\n });\n}\nconst memFetchAccount = pmem(fetchAccount);\n\nconst isIOS =\n window.ontouchstart !== undefined &&\n /iPad|iPhone|iPod/.test(navigator.userAgent);\n\nconst REACTIONS_LIMIT = 80;\n\nfunction getPollText(poll) {\n if (!poll?.options?.length) return '';\n return `📊:\\n${poll.options.map((option) => `- ${option.title}`).join('\\n')}`;\n}\n\nfunction getPostText(status, opts) {\n const {\n maskCustomEmojis,\n maskURLs,\n hideInlineQuote,\n htmlTextOpts = {},\n } = opts || {};\n const { spoilerText, poll, emojis } = status;\n let { content } = status;\n if (maskCustomEmojis && emojis?.length) {\n const emojisRegex = new RegExp(\n `:(${emojis.map((e) => e.shortcode).join('|')}):`,\n 'g',\n );\n content = content.replace(emojisRegex, '⬚');\n }\n const fullText = [\n spoilerText || '',\n getHTMLText(content, {\n ...htmlTextOpts,\n preProcess:\n (maskURLs || hideInlineQuote) &&\n ((dom) => {\n // Remove links that contains text that starts with https?://\n if (maskURLs) {\n for (const a of dom.querySelectorAll('a')) {\n const text = a.innerText.trim();\n if (/^https?:\\/\\//i.test(text)) {\n a.replaceWith('«🔗»');\n }\n }\n }\n // Hide inline quote\n if (hideInlineQuote) {\n const reContainer = dom.querySelector('.quote-inline');\n if (reContainer) {\n reContainer.remove();\n }\n }\n }),\n }),\n getPollText(poll),\n ]\n .join('\\n\\n')\n .trim();\n return fullText;\n}\n\nfunction forgivingQSA(selectors = [], dom = document) {\n // Run QSA for list of selectors\n // If a selector return invalid selector error, try the next one\n for (const selector of selectors) {\n try {\n return dom.querySelectorAll(selector);\n } catch (e) {}\n }\n return [];\n}\n\nconst getHTMLTextForDetectLang = mem((content, emojis) => {\n if (!content) return '';\n if (emojis?.length) {\n const emojisRegex = new RegExp(\n `:(${emojis.map((e) => e.shortcode).join('|')}):`,\n 'g',\n );\n content = content.replace(emojisRegex, '');\n }\n content = content.trim();\n if (!content) return '';\n return getHTMLText(content, {\n preProcess: (dom) => {\n // Remove anything that can skew the language detection\n\n // Remove .mention, .hashtag, pre, code, a:has(.invisible)\n for (const a of forgivingQSA(\n [\n '.mention, .hashtag, pre, code, a:has(.invisible)',\n '.mention, .hashtag, pre, code',\n ],\n dom,\n )) {\n a.remove();\n }\n\n // Remove links that contains text that starts with https?://\n for (const a of dom.querySelectorAll('a')) {\n const text = a.innerText.trim();\n if (text.startsWith('https://') || text.startsWith('http://')) {\n a.remove();\n }\n }\n },\n });\n});\n\nfunction isTranslateble(content, emojis) {\n return !!getHTMLTextForDetectLang(content, emojis);\n}\n\nconst SIZE_CLASS = {\n s: 'small',\n m: 'medium',\n l: 'large',\n};\n\nconst detectLang = pmem(async (text) => {\n text = text?.trim();\n\n // Ref: https://github.com/komodojp/tinyld/blob/develop/docs/benchmark.md\n // 500 should be enough for now, also the default max chars for Mastodon\n if (text?.length > 500) {\n return null;\n }\n\n if (langDetector) {\n const langs = await langDetector.detect(text);\n console.groupCollapsed(\n '💬 DETECTLANG BROWSER',\n langs.slice(0, 3).map((l) => l.detectedLanguage),\n );\n console.log(text, langs.slice(0, 3));\n console.groupEnd();\n const lang = langs[0];\n if (lang?.detectedLanguage && lang?.confidence > 0.5) {\n return lang.detectedLanguage;\n }\n }\n\n const { detectAll } = await import('tinyld/light');\n const langs = detectAll(text);\n console.groupCollapsed(\n '💬 DETECTLANG TINYLD',\n langs.slice(0, 3).map((l) => l.lang),\n );\n console.log(text, langs.slice(0, 3));\n console.groupEnd();\n const lang = langs[0];\n if (lang?.lang && lang?.accuracy > 0.5) {\n // If > 50% accurate, use it\n // It can be accurate if < 50% but better be safe\n // Though > 50% also can be inaccurate 🤷‍♂️\n return lang.lang;\n }\n return null;\n});\n\nconst readMoreText = msg`Read more →`;\n\n// All this work just to make sure this only lazy-run once\n// Because first run is slow due to intl-localematcher\nconst DIFFERENT_LANG_CHECK = {};\nconst diffLangCheckCacheKey = (l, hls) => `${l}:${hls.join('|')}`;\nconst checkDifferentLanguage = (\n language,\n contentTranslationHideLanguages = [],\n) => {\n if (!language) return false;\n const cacheKey = diffLangCheckCacheKey(\n language,\n contentTranslationHideLanguages,\n );\n const targetLanguage = getTranslateTargetLanguage(true);\n const different =\n language !== targetLanguage &&\n !localeMatch([language], [targetLanguage]) &&\n !contentTranslationHideLanguages.find(\n (l) => language === l || localeMatch([language], [l]),\n );\n if (different) {\n DIFFERENT_LANG_CHECK[cacheKey] = true;\n }\n return different;\n};\n\nconst quoteMessages = {\n quotePrivate: msg`Private posts cannot be quoted`,\n requestQuote: msg`Request to quote`,\n quoteManualReview: msg`Author will manually review`,\n quoteFollowersOnly: msg`Only followers can quote this post`,\n quoteCannot: msg`You are not allowed to quote this post`,\n};\n\nconst quoteApprovalPolicyMessages = {\n public: msg`Anyone can quote`,\n followers: msg`Your followers can quote`,\n nobody: msg`Only you can quote`,\n};\n\nconst QUESTION_REGEX = /[???︖❓❔⁇⁈⁉¿‽؟]/;\n\nconst { DEV } = import.meta.env;\n\nfunction Status({\n statusID,\n status,\n instance: propInstance,\n size = 'm',\n contentTextWeight,\n readOnly,\n enableCommentHint,\n withinContext,\n skeleton,\n enableTranslate,\n forceTranslate: _forceTranslate,\n previewMode,\n allowFilters,\n onMediaClick,\n quoted,\n quoteDomain,\n onStatusLinkClick = () => {},\n showFollowedTags,\n allowContextMenu,\n showActionsBar,\n showReplyParent,\n mediaFirst,\n showCommentCount: forceShowCommentCount,\n showQuoteCount: forceShowQuoteCount,\n ghost,\n}) {\n const { _, t, i18n } = useLingui();\n const rtf = RTF(i18n.locale);\n\n if (ghost) {\n const { inReplyToAccountId } = ghost;\n const ghostAccount = inReplyToAccountId\n ? states.accounts[inReplyToAccountId]\n : null;\n return (\n <article\n class={`status ghost ${mediaFirst ? 'status-media-first small' : ''}`}\n >\n {!mediaFirst && (\n <Avatar\n size=\"xxl\"\n url={ghostAccount?.avatarStatic || ghostAccount?.avatar}\n squircle={ghostAccount?.bot}\n />\n )}\n <div class=\"container\">\n <div class=\"meta\">\n {(size === 's' || mediaFirst) && (\n <Avatar\n size=\"m\"\n url={ghostAccount?.avatarStatic || ghostAccount?.avatar}\n squircle={ghostAccount?.bot}\n />\n )}\n {ghostAccount && (\n <NameText account={ghostAccount} showAvatar={false} />\n )}\n </div>\n <div class=\"content-container\">\n {mediaFirst && <div class=\"media-first-container\" />}\n <div class={`content ${mediaFirst ? 'media-first-content' : ''}`}>\n <p class=\"insignificant\">\n <Trans>Post unavailable</Trans>\n </p>\n </div>\n </div>\n </div>\n </article>\n );\n }\n\n if (skeleton) {\n return (\n <div\n class={`status skeleton ${\n mediaFirst ? 'status-media-first small' : ''\n }`}\n >\n {!mediaFirst && <Avatar size=\"xxl\" />}\n <div class=\"container\">\n <div class=\"meta\">\n {(size === 's' || mediaFirst) && <Avatar size=\"m\" />} ███ ████████\n </div>\n <div class=\"content-container\">\n {mediaFirst && <div class=\"media-first-container\" />}\n <div class={`content ${mediaFirst ? 'media-first-content' : ''}`}>\n <p>████ ████████</p>\n </div>\n </div>\n </div>\n </div>\n );\n }\n const { masto, instance, authenticated } = api({ instance: propInstance });\n const { instance: currentInstance } = api();\n const sameInstance = instance === currentInstance;\n\n let sKey = statusKey(statusID || status?.id, instance);\n const snapStates = useSnapshot(states);\n if (!status) {\n status = snapStates.statuses[sKey] || snapStates.statuses[statusID];\n sKey = statusKey(status?.id, instance);\n }\n if (!status) {\n return null;\n }\n\n // const originalStatus = useRef(status);\n const { editHistoryRef, editHistoryMode, editedAtIndex } = useEditHistory();\n if (editHistoryMode && status?.editedAt && editHistoryRef.current.length) {\n const eStatus = editHistoryRef.current[editedAtIndex];\n if (eStatus) {\n status = {\n ...status,\n ...eStatus,\n };\n }\n } else {\n // Revert back to original status\n // Don't need to do anything, re-render will use the original status above\n }\n\n const {\n account: {\n acct,\n avatar,\n avatarStatic,\n id: accountId,\n url: accountURL,\n displayName,\n username,\n emojis: accountEmojis,\n bot,\n group,\n } = {},\n id,\n repliesCount,\n reblogged,\n reblogsCount,\n favourited,\n favouritesCount,\n quotesCount,\n bookmarked,\n poll,\n muted,\n sensitive,\n spoilerText,\n visibility, // public, unlisted, private, direct\n language: _language,\n editedAt,\n filtered,\n card,\n createdAt,\n inReplyToId,\n inReplyToAccountId,\n content,\n mentions,\n mediaAttachments = [],\n reblog,\n quote,\n uri,\n url,\n emojis,\n tags,\n pinned,\n quoteApproval,\n // Non-API props\n _deleted,\n _pinned,\n // _filtered,\n // Non-Mastodon\n emojiReactions,\n } = status;\n\n const [languageAutoDetected, setLanguageAutoDetected] = useState(null);\n useEffect(() => {\n if (!content) return;\n if (_language) return;\n if (languageAutoDetected) return;\n let timer;\n timer = setTimeout(async () => {\n let detected = await detectLang(\n getHTMLTextForDetectLang(content, emojis),\n );\n setLanguageAutoDetected(detected);\n }, 1000);\n return () => clearTimeout(timer);\n }, [content, _language]);\n const language = _language || languageAutoDetected;\n\n // if (!mediaAttachments?.length) mediaFirst = false;\n const hasMediaAttachments = !!mediaAttachments?.length;\n if (mediaFirst && hasMediaAttachments) size = 's';\n\n const currentAccount = getCurrentAccID();\n const isSelf = currentAccount && currentAccount == accountId;\n\n const filterContext = useContext(FilterContext);\n const filterInfo =\n !isSelf &&\n ((!readOnly && !previewMode) || allowFilters) &&\n isFiltered(filtered, filterContext);\n\n if (filterInfo?.action === 'hide') {\n return null;\n }\n\n console.debug('RENDER Status', id, status?.account?.displayName, quoted);\n\n const debugHover = (e) => {\n if (e.shiftKey) {\n console.log({\n ...status,\n });\n }\n };\n\n if (\n (allowFilters || size !== 'l') &&\n filterInfo &&\n filterInfo.action !== 'blur'\n ) {\n return (\n <FilteredStatus\n status={status}\n filterInfo={filterInfo}\n instance={instance}\n containerProps={{\n onMouseEnter: debugHover,\n }}\n showFollowedTags\n quoted={quoted}\n />\n );\n }\n\n const createdAtDate = new Date(createdAt);\n const editedAtDate = new Date(editedAt);\n\n let inReplyToAccountRef = mentions?.find(\n (mention) => mention.id === inReplyToAccountId,\n );\n if (!inReplyToAccountRef && inReplyToAccountId === id) {\n inReplyToAccountRef = { url: accountURL, username, displayName };\n }\n const [inReplyToAccount, setInReplyToAccount] = useState(inReplyToAccountRef);\n useEffect(() => {\n if (!withinContext && !inReplyToAccount && inReplyToAccountId) {\n const account = states.accounts[inReplyToAccountId];\n if (account) {\n setInReplyToAccount(account);\n return;\n }\n\n const abortController = new AbortController();\n memFetchAccount(inReplyToAccountId, masto, abortController.signal)\n .then((account) => {\n setInReplyToAccount(account);\n states.accounts[account.id] = account;\n })\n .catch((e) => {});\n\n return () => {\n abortController.abort();\n };\n }\n }, [withinContext, inReplyToAccount, inReplyToAccountId]);\n const mentionSelf =\n (inReplyToAccountId && inReplyToAccountId === currentAccount) ||\n mentions?.find((mention) => mention.id === currentAccount);\n\n const prefs = getPreferences();\n const readingExpandSpoilers = !!prefs['reading:expand:spoilers'];\n\n // default | show_all | hide_all\n const readingExpandMedia =\n prefs['reading:expand:media']?.toLowerCase() || 'default';\n\n // FOR TESTING:\n // const readingExpandSpoilers = true;\n // const readingExpandMedia = 'show_all';\n const showSpoiler =\n previewMode || readingExpandSpoilers || !!snapStates.spoilers[id];\n const showSpoilerMedia =\n previewMode ||\n (readingExpandMedia === 'show_all' && filterInfo?.action !== 'blur') ||\n !!snapStates.spoilersMedia[id];\n\n if (reblog) {\n // If has statusID, means useItemID (cached in states)\n\n if (group) {\n return (\n <div\n data-state-post-id={sKey}\n class=\"status-group\"\n onMouseEnter={debugHover}\n >\n <div class=\"status-pre-meta\">\n <Icon icon=\"group\" size=\"l\" alt={t`Group`} />{' '}\n <NameText account={status.account} instance={instance} showAvatar />\n </div>\n <Status\n status={statusID ? null : reblog}\n statusID={statusID ? reblog.id : null}\n instance={instance}\n size={size}\n contentTextWeight={contentTextWeight}\n readOnly={readOnly}\n mediaFirst={mediaFirst}\n />\n </div>\n );\n }\n\n return (\n <div\n data-state-post-id={sKey}\n class=\"status-reblog\"\n onMouseEnter={debugHover}\n >\n <div class=\"status-pre-meta\">\n <Icon icon=\"rocket\" size=\"l\" />{' '}\n <Trans>\n <NameText account={status.account} instance={instance} showAvatar />{' '}\n <span>boosted</span>\n </Trans>\n </div>\n <Status\n status={statusID ? null : reblog}\n statusID={statusID ? reblog.id : null}\n instance={instance}\n size={size}\n contentTextWeight={contentTextWeight}\n readOnly={readOnly}\n enableCommentHint\n mediaFirst={mediaFirst}\n />\n </div>\n );\n }\n\n // Check followedTags\n const FollowedTagsParent = useCallback(\n ({ children }) => (\n <div\n data-state-post-id={sKey}\n class=\"status-followed-tags\"\n onMouseEnter={debugHover}\n >\n <div class=\"status-pre-meta\">\n <Icon icon=\"hashtag\" size=\"l\" />{' '}\n {snapStates.statusFollowedTags[sKey].slice(0, 3).map((tag) => (\n <Link\n key={tag}\n to={instance ? `/${instance}/t/${tag}` : `/t/${tag}`}\n class=\"status-followed-tag-item\"\n >\n {tag}\n </Link>\n ))}\n </div>\n {children}\n </div>\n ),\n [sKey, instance, snapStates.statusFollowedTags[sKey]],\n );\n const StatusParent =\n showFollowedTags && !!snapStates.statusFollowedTags[sKey]?.length\n ? FollowedTagsParent\n : Fragment;\n\n const isSizeLarge = size === 'l';\n\n const contentLength = useMemo(() => htmlContentLength(content), [content]);\n\n const [forceTranslate, setForceTranslate] = useState(_forceTranslate);\n // const targetLanguage = getTranslateTargetLanguage(true);\n // const contentTranslationHideLanguages =\n // snapStates.settings.contentTranslationHideLanguages || [];\n const { contentTranslation, contentTranslationAutoInline } =\n snapStates.settings;\n if (!contentTranslation) enableTranslate = false;\n const inlineTranslate = useMemo(() => {\n if (\n !contentTranslation ||\n !contentTranslationAutoInline ||\n readOnly ||\n (withinContext && !isSizeLarge) ||\n previewMode ||\n spoilerText ||\n sensitive ||\n poll ||\n card /*||\n mediaAttachments?.length*/\n ) {\n return false;\n }\n return contentLength > 0 && contentLength <= INLINE_TRANSLATE_LIMIT;\n }, [\n contentTranslation,\n contentTranslationAutoInline,\n readOnly,\n withinContext,\n isSizeLarge,\n previewMode,\n spoilerText,\n sensitive,\n poll,\n card,\n mediaAttachments,\n contentLength,\n ]);\n\n const [showEdited, setShowEdited] = useState(false);\n const [showEmbed, setShowEmbed] = useState(false);\n const [showQuoteSettings, setShowQuoteSettings] = useState(false);\n const [showQuotes, setShowQuotes] = useState(false);\n const [showQuoteChain, setShowQuoteChain] = useState(false);\n\n const spoilerContentRef = useTruncated();\n const contentRef = useTruncated();\n const mediaContainerRef = useTruncated();\n\n const statusRef = useRef(null);\n const [reloadPostContentCount, reloadPostContent] = useReducer(\n (c) => c + 1,\n 0,\n );\n\n const unauthInteractionErrorMessage = t`Sorry, your current logged-in server can't interact with this post from another server.`;\n\n const textWeight = useCallback(\n () =>\n Math.max(\n Math.round(((spoilerText?.length || 0) + contentLength) / 140) || 1,\n 1,\n ),\n [spoilerText, contentLength],\n );\n\n const createdDateText = createdAt && niceDateTime(createdAtDate);\n const editedDateText = editedAt && niceDateTime(editedAtDate);\n\n // Can boost if:\n // - authenticated AND\n // - visibility != direct OR\n // - visibility = private AND isSelf\n const isPublic = ['public', 'unlisted'].includes(visibility);\n let canBoost = authenticated && isPublic;\n if (visibility === 'private' && isSelf) {\n canBoost = true;\n }\n\n // Quote logic blatantly copied from https://github.com/mastodon/mastodon/blob/854aaec6fe69df02e6d850cb90eef37032b4d72f/app/javascript/mastodon/components/status/boost_button_utils.ts#L131-L163\n let quoteDisabled = false;\n let quoteText = t`Quote`;\n let quoteMetaText;\n\n if (supportsNativeQuote()) {\n const isMine = isSelf;\n const isMineAndPrivate = isMine && visibility === 'private';\n const isQuoteAutomaticallyAccepted =\n quoteApproval?.currentUser === 'automatic' &&\n (isPublic || isMineAndPrivate);\n const isQuoteManuallyAccepted =\n quoteApproval?.currentUser === 'manual' && (isPublic || isMineAndPrivate);\n const isQuoteFollowersOnly =\n quoteApproval?.automatic?.[0] === 'followers' ||\n quoteApproval?.manual?.[0] === 'followers';\n if (!isPublic && !isMine) {\n quoteDisabled = true;\n quoteMetaText = _(quoteMessages.quotePrivate);\n } else if (isQuoteAutomaticallyAccepted) {\n // No need to do anything\n } else if (isQuoteManuallyAccepted) {\n quoteText = _(quoteMessages.requestQuote);\n quoteMetaText = _(quoteMessages.quoteManualReview);\n } else {\n quoteDisabled = true;\n quoteMetaText = isQuoteFollowersOnly\n ? _(quoteMessages.quoteFollowersOnly)\n : _(quoteMessages.quoteCannot);\n }\n }\n const canQuote = supportsNativeQuote() && !quoteDisabled;\n\n const postQuoteApprovalPolicy = getPostQuoteApprovalPolicy(quoteApproval);\n\n const replyStatus = (e, replyMode = 'all') => {\n if (!sameInstance || !authenticated) {\n return alert(unauthInteractionErrorMessage);\n }\n // syntheticEvent comes from MenuItem\n if (e?.shiftKey || e?.syntheticEvent?.shiftKey) {\n const newWin = openCompose({\n replyToStatus: status,\n replyMode,\n });\n if (newWin) return;\n }\n showCompose({\n replyToStatus: status,\n replyMode,\n });\n };\n\n // Check if media has no descriptions\n const mediaNoDesc = useMemo(() => {\n return mediaAttachments.some(\n (attachment) => !attachment.description?.trim?.(),\n );\n }, [mediaAttachments]);\n\n const statusMonthsAgo = useMemo(() => {\n return Math.floor(\n (new Date() - createdAtDate) / (1000 * 60 * 60 * 24 * 30),\n );\n }, [createdAtDate]);\n\n // const boostStatus = async () => {\n // if (!sameInstance || !authenticated) {\n // alert(unauthInteractionErrorMessage);\n // return false;\n // }\n // try {\n // if (!reblogged) {\n // let confirmText = 'Boost this post?';\n // if (mediaNoDesc) {\n // confirmText += '\\n\\n⚠ Some media have no descriptions.';\n // }\n // const yes = confirm(confirmText);\n // if (!yes) {\n // return false;\n // }\n // }\n // // Optimistic\n // states.statuses[sKey] = {\n // ...status,\n // reblogged: !reblogged,\n // reblogsCount: reblogsCount + (reblogged ? -1 : 1),\n // };\n // if (reblogged) {\n // const newStatus = await masto.v1.statuses.$select(id).unreblog();\n // saveStatus(newStatus, instance);\n // return true;\n // } else {\n // const newStatus = await masto.v1.statuses.$select(id).reblog();\n // saveStatus(newStatus, instance);\n // return true;\n // }\n // } catch (e) {\n // console.error(e);\n // // Revert optimistism\n // states.statuses[sKey] = status;\n // return false;\n // }\n // };\n const confirmBoostStatus = async () => {\n if (!sameInstance || !authenticated) {\n alert(unauthInteractionErrorMessage);\n return false;\n }\n try {\n // Optimistic\n states.statuses[sKey] = {\n ...status,\n reblogged: !reblogged,\n reblogsCount: reblogsCount + (reblogged ? -1 : 1),\n };\n if (reblogged) {\n const newStatus = await masto.v1.statuses.$select(id).unreblog();\n saveStatus(newStatus, instance);\n } else {\n const newStatus = await masto.v1.statuses.$select(id).reblog();\n saveStatus(newStatus, instance);\n }\n return true;\n } catch (e) {\n console.error(e);\n // Revert optimistism\n states.statuses[sKey] = status;\n return false;\n }\n };\n\n const favouriteStatus = async () => {\n if (!sameInstance || !authenticated) {\n alert(unauthInteractionErrorMessage);\n return false;\n }\n try {\n // Optimistic\n states.statuses[sKey] = {\n ...status,\n favourited: !favourited,\n favouritesCount: favouritesCount + (favourited ? -1 : 1),\n };\n if (favourited) {\n const newStatus = await masto.v1.statuses.$select(id).unfavourite();\n saveStatus(newStatus, instance);\n } else {\n const newStatus = await masto.v1.statuses.$select(id).favourite();\n saveStatus(newStatus, instance);\n }\n return true;\n } catch (e) {\n console.error(e);\n // Revert optimistism\n states.statuses[sKey] = status;\n return false;\n }\n };\n const favouriteStatusNotify = async () => {\n try {\n const done = await favouriteStatus();\n if (!isSizeLarge && done) {\n showToast(\n favourited\n ? t`Unliked @${username || acct}'s post`\n : t`Liked @${username || acct}'s post`,\n );\n }\n } catch (e) {}\n };\n\n const bookmarkStatus = async () => {\n if (!supports('@mastodon/post-bookmark')) return;\n if (!sameInstance || !authenticated) {\n alert(unauthInteractionErrorMessage);\n return false;\n }\n try {\n // Optimistic\n states.statuses[sKey] = {\n ...status,\n bookmarked: !bookmarked,\n };\n if (bookmarked) {\n const newStatus = await masto.v1.statuses.$select(id).unbookmark();\n saveStatus(newStatus, instance);\n } else {\n const newStatus = await masto.v1.statuses.$select(id).bookmark();\n saveStatus(newStatus, instance);\n }\n return true;\n } catch (e) {\n console.error(e);\n // Revert optimistism\n states.statuses[sKey] = status;\n return false;\n }\n };\n const bookmarkStatusNotify = async () => {\n try {\n const done = await bookmarkStatus();\n if (!isSizeLarge && done) {\n showToast(\n bookmarked\n ? t`Unbookmarked @${username || acct}'s post`\n : t`Bookmarked @${username || acct}'s post`,\n );\n }\n } catch (e) {}\n };\n\n // const differentLanguage =\n // !!language &&\n // language !== targetLanguage &&\n // !localeMatch([language], [targetLanguage]) &&\n // !contentTranslationHideLanguages.find(\n // (l) => language === l || localeMatch([language], [l]),\n // );\n const contentTranslationHideLanguages =\n snapStates.settings.contentTranslationHideLanguages || [];\n const [differentLanguage, setDifferentLanguage] = useState(\n DIFFERENT_LANG_CHECK[\n diffLangCheckCacheKey(language, contentTranslationHideLanguages)\n ],\n );\n useEffect(() => {\n if (!language || differentLanguage) {\n return;\n }\n if (\n !differentLanguage &&\n DIFFERENT_LANG_CHECK[\n diffLangCheckCacheKey(language, contentTranslationHideLanguages)\n ]\n ) {\n setDifferentLanguage(true);\n return;\n }\n let timeout = setTimeout(() => {\n const different = checkDifferentLanguage(\n language,\n contentTranslationHideLanguages,\n );\n if (different) setDifferentLanguage(different);\n }, 100);\n return () => clearTimeout(timeout);\n }, [language, differentLanguage]);\n\n const reblogIterator = useRef();\n const favouriteIterator = useRef();\n async function fetchBoostedLikedByAccounts(firstLoad) {\n if (firstLoad) {\n reblogIterator.current = masto.v1.statuses\n .$select(statusID)\n .rebloggedBy.list({\n limit: REACTIONS_LIMIT,\n })\n .values();\n favouriteIterator.current = masto.v1.statuses\n .$select(statusID)\n .favouritedBy.list({\n limit: REACTIONS_LIMIT,\n })\n .values();\n }\n const [{ value: reblogResults }, { value: favouriteResults }] =\n await Promise.allSettled([\n reblogIterator.current.next(),\n favouriteIterator.current.next(),\n ]);\n if (reblogResults.value?.length || favouriteResults.value?.length) {\n const accounts = [];\n if (reblogResults.value?.length) {\n accounts.push(\n ...reblogResults.value.map((a) => {\n a._types = ['reblog'];\n return a;\n }),\n );\n }\n if (favouriteResults.value?.length) {\n accounts.push(\n ...favouriteResults.value.map((a) => {\n a._types = ['favourite'];\n return a;\n }),\n );\n }\n return {\n value: accounts,\n done: reblogResults.done && favouriteResults.done,\n };\n }\n return {\n value: [],\n done: true,\n };\n }\n\n const isQuotingMyPost =\n quote?.state === 'accepted' &&\n quote?.quotedStatus?.account?.id === currentAccount;\n\n const actionsRef = useRef();\n const isPinnable = ['public', 'unlisted', 'private'].includes(visibility);\n const menuFooter =\n mediaNoDesc && !reblogged ? (\n <div class=\"footer\">\n <Icon icon=\"alert\" />\n <Trans>Some media have no descriptions.</Trans>\n </div>\n ) : (\n statusMonthsAgo >= 3 && (\n <div class=\"footer\">\n <Icon icon=\"info\" />\n <span>\n <Trans>\n Old post (<strong>{rtf.format(-statusMonthsAgo, 'month')}</strong>\n )\n </Trans>\n </span>\n </div>\n )\n );\n const mentionsCount = useMemo(() => {\n if (!mentions?.length) return false;\n const allMentions = new Set([accountId, ...mentions.map((m) => m.id)]);\n return [...allMentions].filter((m) => m !== currentAccount).length;\n }, [accountId, mentions?.length, currentAccount]);\n const tooManyMentions = mentionsCount > 3;\n const ReplyMenuContent = () => (\n <>\n <Icon icon=\"comment\" />\n <span>\n {repliesCount > 0\n ? shortenNumber(repliesCount)\n : tooManyMentions\n ? t`Reply…`\n : t`Reply`}\n </span>\n </>\n );\n const replyModeMenuItems = (\n <>\n <MenuItem onClick={(e) => replyStatus(e, 'all')}>\n <small>\n <Trans>Reply all</Trans>\n <br />\n <span class=\"more-insignificant\">\n <Plural value={mentionsCount} other=\"# mentions\" />\n </span>\n </small>\n </MenuItem>\n <MenuItem onClick={(e) => replyStatus(e, 'author-first')}>\n <small>\n <Trans>Reply all</Trans>\n <br />\n <span class=\"more-insignificant\">\n <Plural\n value={mentionsCount - 1}\n other={\n <Trans comment=\"Author mention appears first, other mentions appear below with newlines in between\">\n <span class=\"bidi-isolate\">@{username || acct}</span> first, #\n others below\n </Trans>\n }\n />\n </span>\n </small>\n </MenuItem>\n <MenuItem onClick={(e) => replyStatus(e, 'author-only')}>\n <small>\n <Trans>Reply</Trans>\n <br />\n <span class=\"more-insignificant\">\n <Trans>\n Only <span class=\"bidi-isolate\">@{username || acct}</span>\n </Trans>\n </span>\n </small>\n </MenuItem>\n </>\n );\n const StatusMenuItems = (\n <>\n {!isSizeLarge && sameInstance && (\n <>\n <div class=\"menu-control-group-horizontal status-menu\">\n {tooManyMentions ? (\n <SubMenu2\n openTrigger=\"clickOnly\"\n direction=\"bottom\"\n overflow=\"auto\"\n gap={-8}\n shift={8}\n menuClassName=\"menu-emphasized\"\n label={<ReplyMenuContent />}\n >\n {replyModeMenuItems}\n </SubMenu2>\n ) : (\n <MenuItem onClick={replyStatus}>{<ReplyMenuContent />}</MenuItem>\n )}\n <MenuConfirm\n subMenu\n confirmLabel={\n <>\n <Icon icon=\"rocket\" />\n <span>{reblogged ? t`Unboost` : t`Boost`}</span>\n </>\n }\n className={`menu-reblog ${reblogged ? 'checked' : ''}`}\n menuExtras={\n <>\n {supportsNativeQuote() && (\n <MenuItem\n disabled={quoteDisabled}\n onClick={() => {\n showCompose({\n quoteStatus: status,\n });\n }}\n >\n <Icon icon=\"quote\" />\n {quoteMetaText ? (\n <small>\n {quoteText}\n <br />\n {quoteMetaText}\n </small>\n ) : (\n <span>{quoteText}</span>\n )}\n </MenuItem>\n )}\n {(DEV || !supportsNativeQuote()) && (\n <MenuItem\n onClick={() => {\n showCompose({\n draftStatus: {\n status: `\\n${url}`,\n },\n });\n }}\n >\n <Icon icon=\"quote\" />\n <span>\n <Trans>Quote with link</Trans>\n </span>\n {supportsNativeQuote() && DEV && (\n <small class=\"tag collapsed\">DEV</small>\n )}\n </MenuItem>\n )}\n </>\n }\n menuFooter={menuFooter}\n disabled={!canBoost}\n onClick={async () => {\n try {\n const done = await confirmBoostStatus();\n if (!isSizeLarge && done) {\n showToast(\n reblogged\n ? t`Unboosted @${username || acct}'s post`\n : t`Boosted @${username || acct}'s post`,\n );\n }\n } catch (e) {}\n }}\n >\n {canQuote ? (\n <span class=\"icon\">\n <Icon icon=\"rocket\" />\n <Icon icon=\"quote\" />\n </span>\n ) : (\n <Icon icon=\"rocket\" />\n )}\n <span>\n {reblogsCount > 0 || quotesCount > 0\n ? `${reblogsCount > 0 ? shortenNumber(reblogsCount) : ''}${\n reblogsCount > 0 && quotesCount > 0 ? '+' : ''\n }${quotesCount > 0 ? shortenNumber(quotesCount) : ''}`\n : reblogged\n ? t`Unboost`\n : canQuote\n ? t`Boost/Quote…`\n : t`Boost…`}\n </span>\n </MenuConfirm>\n <MenuItem\n onClick={favouriteStatusNotify}\n className={`menu-favourite ${favourited ? 'checked' : ''}`}\n >\n <Icon icon=\"heart\" />\n <span>\n {favouritesCount > 0\n ? shortenNumber(favouritesCount)\n : favourited\n ? t`Unlike`\n : t`Like`}\n </span>\n </MenuItem>\n {supports('@mastodon/post-bookmark') && (\n <MenuItem\n onClick={bookmarkStatusNotify}\n className={`menu-bookmark ${bookmarked ? 'checked' : ''}`}\n >\n <Icon icon=\"bookmark\" />\n <span>{bookmarked ? t`Unbookmark` : t`Bookmark`}</span>\n </MenuItem>\n )}\n </div>\n </>\n )}\n {!isSizeLarge && sameInstance && (isSizeLarge || showActionsBar) && (\n <MenuDivider />\n )}\n {(isSizeLarge || showActionsBar) && (\n <>\n <MenuItem\n onClick={() => {\n states.showGenericAccounts = {\n heading: t`Boosted/Liked by…`,\n fetchAccounts: fetchBoostedLikedByAccounts,\n instance,\n showReactions: true,\n postID: sKey,\n };\n }}\n >\n <Icon icon=\"react\" />\n <span>\n <Trans>Boosted/Liked by…</Trans>\n </span>\n </MenuItem>\n {supportsNativeQuote() && (\n <MenuItem\n onClick={() => {\n setShowQuotes(true);\n }}\n >\n <Icon icon=\"quote\" />\n <span>\n <Trans>View Quotes</Trans>\n </span>\n </MenuItem>\n )}\n {quote?.quotedStatus?.quote && (\n <MenuItem\n onClick={() => {\n setShowQuoteChain(true);\n }}\n >\n <Icon icon=\"quote\" />\n <span>\n <Trans>Unwrap quote chain</Trans>\n </span>\n </MenuItem>\n )}\n </>\n )}\n {(isSizeLarge ||\n (!mediaFirst &&\n (enableTranslate || !language || differentLanguage))) && (\n <MenuDivider />\n )}\n {!mediaFirst && (enableTranslate || !language || differentLanguage) && (\n <div class={supportsTTS ? 'menu-horizontal' : ''}>\n {enableTranslate ? (\n <MenuItem\n disabled={forceTranslate}\n onClick={() => setForceTranslate(true)}\n >\n <Icon icon=\"translate\" />\n <span>\n <Trans>Translate</Trans>\n </span>\n </MenuItem>\n ) : (\n <MenuLink\n to={`${instance ? `/${instance}` : ''}/s/${id}?translate=1`}\n >\n <Icon icon=\"translate\" />\n <span>\n <Trans>Translate</Trans>\n </span>\n </MenuLink>\n )}\n {supportsTTS && (\n <MenuItem\n onClick={() => {\n try {\n const postText = getPostText(status, {\n hideInlineQuote: supportsNativeQuote(),\n });\n if (postText) {\n speak(postText, language);\n }\n } catch (error) {\n console.error('Failed to speak text:', error);\n }\n }}\n >\n <Icon icon=\"speak\" />\n <span>\n <Trans>Speak</Trans>\n </span>\n </MenuItem>\n )}\n </div>\n )}\n {isSizeLarge && (\n <MenuItem\n onClick={() => {\n try {\n const postText = getPostText(status, {\n hideInlineQuote: supportsNativeQuote(),\n htmlTextOpts: {\n truncateLinks: false,\n },\n });\n navigator.clipboard.writeText(postText);\n showToast(t`Post text copied`);\n } catch (e) {\n console.error(e);\n showToast(t`Unable to copy post text`);\n }\n }}\n >\n <Icon icon=\"clipboard\" />\n <span>\n <Trans>Copy post text</Trans>\n </span>\n </MenuItem>\n )}\n {((!isSizeLarge && sameInstance) ||\n enableTranslate ||\n !language ||\n differentLanguage) && <MenuDivider />}\n {!isSizeLarge && (\n <>\n <MenuLink\n to={instance ? `/${instance}/s/${id}` : `/s/${id}`}\n onClick={(e) => {\n onStatusLinkClick(e, status);\n }}\n >\n <Icon icon=\"arrows-right\" />\n <small>\n <Trans>\n View post by{' '}\n <span class=\"bidi-isolate\">@{username || acct}</span>\n </Trans>\n <br />\n <span class=\"more-insignificant\">\n {_(visibilityText[visibility])} • {createdDateText}\n </span>\n </small>\n </MenuLink>\n </>\n )}\n {!!editedAt && (\n <>\n <MenuItem\n onClick={() => {\n setShowEdited(id);\n }}\n >\n <Icon icon=\"history\" />\n <small>\n <Trans>Show Edit History</Trans>\n <br />\n <span class=\"more-insignificant\">\n <Trans>Edited: {editedDateText}</Trans>\n </span>\n </small>\n </MenuItem>\n </>\n )}\n <MenuItem href={url} target=\"_blank\">\n <Icon icon=\"external\" />\n <small\n class=\"menu-double-lines should-cloak\"\n style={{\n maxWidth: '16em',\n }}\n >\n {nicePostURL(url)}\n </small>\n </MenuItem>\n <div class=\"menu-horizontal\">\n <MenuItem\n onClick={() => {\n // Copy url to clipboard\n try {\n navigator.clipboard.writeText(url);\n showToast(t`Link copied`);\n } catch (e) {\n console.error(e);\n showToast(t`Unable to copy link`);\n }\n }}\n >\n <Icon icon=\"link\" />\n <span>\n <Trans>Copy</Trans>\n </span>\n </MenuItem>\n {isPublic &&\n navigator?.share &&\n navigator?.canShare?.({\n url,\n }) && (\n <MenuItem\n onClick={() => {\n try {\n navigator.share({\n url,\n });\n } catch (e) {\n console.error(e);\n alert(t`Sharing doesn't seem to work.`);\n }\n }}\n >\n <Icon icon=\"share\" />\n <span>\n <Trans>Share…</Trans>\n </span>\n </MenuItem>\n )}\n </div>\n {isPublic && isSizeLarge && (\n <MenuItem\n onClick={() => {\n setShowEmbed(true);\n }}\n >\n <Icon icon=\"code\" />\n <span>\n <Trans>Embed post</Trans>\n </span>\n </MenuItem>\n )}\n {authenticated && (\n <>\n {(isSelf || mentionSelf) && <MenuDivider />}\n {(isSelf || mentionSelf) && (\n <MenuItem\n onClick={async () => {\n try {\n const newStatus = await masto.v1.statuses\n .$select(id)\n [muted ? 'unmute' : 'mute']();\n saveStatus(newStatus, instance);\n showToast(\n muted ? t`Conversation unmuted` : t`Conversation muted`,\n );\n } catch (e) {\n console.error(e);\n showToast(\n muted\n ? t`Unable to unmute conversation`\n : t`Unable to mute conversation`,\n );\n }\n }}\n >\n {muted ? (\n <>\n <Icon icon=\"unmute\" />\n <span>\n <Trans>Unmute conversation</Trans>\n </span>\n </>\n ) : (\n <>\n <Icon icon=\"mute\" />\n <span>\n <Trans>Mute conversation</Trans>\n </span>\n </>\n )}\n </MenuItem>\n )}\n {isSelf && isPinnable && (\n <MenuItem\n onClick={async () => {\n try {\n const newStatus = await masto.v1.statuses\n .$select(id)\n [pinned ? 'unpin' : 'pin']();\n saveStatus(newStatus, instance);\n showToast(\n pinned\n ? t`Post unpinned from profile`\n : t`Post pinned to profile`,\n );\n } catch (e) {\n console.error(e);\n showToast(\n pinned ? t`Unable to unpin post` : t`Unable to pin post`,\n );\n }\n }}\n >\n {pinned ? (\n <>\n <Icon icon=\"unpin\" />\n <span>\n <Trans>Unpin from profile</Trans>\n </span>\n </>\n ) : (\n <>\n <Icon icon=\"pin\" />\n <span>\n <Trans>Pin to profile</Trans>\n </span>\n </>\n )}\n </MenuItem>\n )}\n {isSelf && (\n <>\n {supportsNativeQuote() &&\n !['private', 'direct'].includes(visibility) && (\n <MenuItem onClick={() => setShowQuoteSettings(true)}>\n <Icon icon=\"quote2\" />\n <small>\n <Trans>Quote settings</Trans>\n <br />\n <span class=\"more-insignificant\">\n {_(\n quoteApprovalPolicyMessages[postQuoteApprovalPolicy],\n )}\n </span>\n </small>\n </MenuItem>\n )}\n <div class=\"menu-horizontal\">\n {supports('@mastodon/post-edit') && (\n <MenuItem\n onClick={() => {\n showCompose({\n editStatus: status,\n quoteStatus: status.quote?.quotedStatus,\n });\n }}\n >\n <Icon icon=\"pencil\" />\n <span>\n <Trans>Edit</Trans>\n </span>\n </MenuItem>\n )}\n {isSizeLarge && (\n <MenuConfirm\n subMenu\n confirmLabel={\n <>\n <Icon icon=\"trash\" />\n <span>\n <Trans>Delete this post?</Trans>\n </span>\n </>\n }\n itemProps={{\n className: 'danger',\n }}\n menuItemClassName=\"danger\"\n onClick={() => {\n // const yes = confirm('Delete this post?');\n // if (yes) {\n (async () => {\n try {\n await masto.v1.statuses.$select(id).remove();\n const cachedStatus = getStatus(id, instance);\n cachedStatus._deleted = true;\n showToast(t`Post deleted`);\n } catch (e) {\n console.error(e);\n showToast(t`Unable to delete post`);\n }\n })();\n // }\n }}\n >\n <Icon icon=\"trash\" />\n <span>\n <Trans>Delete…</Trans>\n </span>\n </MenuConfirm>\n )}\n </div>\n </>\n )}\n {!isSelf && isSizeLarge && (\n <>\n <MenuDivider />\n {isQuotingMyPost && (\n <MenuConfirm\n subMenu\n confirmLabel={\n <>\n <Icon icon=\"quote\" />\n <span>\n <Trans>\n Remove my post from{' '}\n <span class=\"bidi-isolate\">@{username || acct}</span>\n 's post?\n </Trans>\n </span>\n </>\n }\n itemProps={{\n className: 'danger',\n }}\n menuItemClassName=\"danger\"\n onClick={() => {\n (async () => {\n try {\n // POST /api/v1/statuses/:id/quotes/:quoting_status_id/revoke\n const quotedStatusID = quote.quotedStatus.id;\n await masto.v1.statuses\n .$select(quotedStatusID)\n .quotes.$select(id)\n .revoke.create();\n showToast(t`Quote removed`);\n states.reloadStatusPage++;\n } catch (e) {\n console.error(e);\n showToast(t`Unable to remove quote`);\n }\n })();\n }}\n >\n <Icon icon=\"quote\" />\n <Trans>Remove quote…</Trans>\n </MenuConfirm>\n )}\n <MenuItem\n className=\"danger\"\n onClick={() => {\n states.showReportModal = {\n account: status.account,\n post: status,\n };\n }}\n >\n <Icon icon=\"flag\" />\n <span>\n <Trans>Report post…</Trans>\n </span>\n </MenuItem>\n </>\n )}\n </>\n )}\n </>\n );\n\n const contextMenuRef = useRef();\n const [isContextMenuOpen, setIsContextMenuOpen] = useState(false);\n const [contextMenuProps, setContextMenuProps] = useState({});\n\n const showContextMenu =\n allowContextMenu || (!isSizeLarge && !previewMode && !_deleted && !quoted);\n\n // Only iOS/iPadOS browsers don't support contextmenu\n // Some comments report iPadOS might support contextmenu if a mouse is connected\n const bindLongPressContext = useLongPress(\n isIOS && showContextMenu\n ? (e) => {\n if (e.pointerType === 'mouse') return;\n // There's 'pen' too, but not sure if contextmenu event would trigger from a pen\n\n const { clientX, clientY } = e.touches?.[0] || e;\n // link detection copied from onContextMenu because here it works\n const link = e.target.closest('a');\n if (\n link &&\n statusRef.current.contains(link) &&\n !link.getAttribute('href').startsWith('#')\n )\n return;\n e.preventDefault();\n setContextMenuProps({\n anchorPoint: {\n x: clientX,\n y: clientY,\n },\n direction: 'right',\n });\n setIsContextMenuOpen(true);\n }\n : null,\n {\n threshold: 600,\n captureEvent: true,\n detect: 'touch',\n cancelOnMovement: 2, // true allows movement of up to 25 pixels\n },\n );\n\n const hotkeysEnabled = !readOnly && !previewMode && !quoted;\n const rRef = useHotkeys(\n 'r, shift+r',\n (e, handler) => {\n // Fix bug: shift+r is fired even when r is pressed due to useKey: true\n if (e.shiftKey !== handler.shift) return;\n replyStatus(e);\n },\n {\n enabled: hotkeysEnabled,\n useKey: true,\n ignoreEventWhen: (e) => e.metaKey || e.ctrlKey || e.altKey,\n },\n );\n const fRef = useHotkeys('f, l', favouriteStatusNotify, {\n enabled: hotkeysEnabled,\n ignoreEventWhen: (e) => e.metaKey || e.ctrlKey || e.altKey || e.shiftKey,\n useKey: true,\n });\n const dRef = useHotkeys('d', bookmarkStatusNotify, {\n enabled: hotkeysEnabled,\n useKey: true,\n ignoreEventWhen: (e) => e.metaKey || e.ctrlKey || e.altKey || e.shiftKey,\n });\n const bRef = useHotkeys(\n 'shift+b',\n (e) => {\n // Need shiftKey check due to useKey: true\n if (!e.shiftKey) return;\n\n (async () => {\n try {\n const done = await confirmBoostStatus();\n if (!isSizeLarge && done) {\n showToast(\n reblogged\n ? t`Unboosted @${username || acct}'s post`\n : t`Boosted @${username || acct}'s post`,\n );\n }\n } catch (e) {}\n })();\n },\n {\n enabled: hotkeysEnabled && canBoost,\n useKey: true,\n ignoreEventWhen: (e) => e.metaKey || e.ctrlKey || e.altKey,\n },\n );\n const xRef = useHotkeys(\n 'x',\n (e) => {\n const activeStatus = document.activeElement.closest(\n '.status-link, .status-focus',\n );\n if (activeStatus) {\n const spoilerButton = activeStatus.querySelector(\n '.spoiler-button:not(.spoiling)',\n );\n if (spoilerButton) {\n e.stopPropagation();\n spoilerButton.click();\n } else {\n const spoilerMediaButton = activeStatus.querySelector(\n '.spoiler-media-button:not(.spoiling)',\n );\n if (spoilerMediaButton) {\n e.stopPropagation();\n spoilerMediaButton.click();\n }\n }\n }\n },\n {\n useKey: true,\n ignoreEventWhen: (e) => e.metaKey || e.ctrlKey || e.altKey || e.shiftKey,\n },\n );\n const qRef = useHotkeys(\n 'q',\n (e) => {\n if (!sameInstance || !authenticated) {\n return alert(unauthInteractionErrorMessage);\n }\n\n if (supportsNativeQuote()) {\n if (quoteDisabled) {\n showToast(quoteMetaText);\n } else {\n showCompose({\n quoteStatus: status,\n });\n }\n // Don't fallback to non-native if quoteDisabled\n } else {\n showCompose({\n draftStatus: {\n status: `\\n${url}`,\n },\n });\n }\n },\n {\n enabled: hotkeysEnabled,\n useKey: true,\n ignoreEventWhen: (e) => e.metaKey || e.ctrlKey || e.altKey || e.shiftKey,\n },\n );\n\n const displayedMediaAttachments = mediaAttachments.slice(\n 0,\n isSizeLarge ? undefined : 4,\n );\n const showMultipleMediaCaptions =\n mediaAttachments.length > 1 &&\n displayedMediaAttachments.some(\n (media) => !!media.description && !isMediaCaptionLong(media.description),\n );\n const captionChildren = useMemo(() => {\n if (!showMultipleMediaCaptions) return null;\n const attachments = [];\n displayedMediaAttachments.forEach((media, i) => {\n if (!media.description) return;\n const index = attachments.findIndex(\n (attachment) => attachment.media.description === media.description,\n );\n if (index === -1) {\n attachments.push({\n media,\n indices: [i],\n });\n } else {\n attachments[index].indices.push(i);\n }\n });\n return attachments.map(({ media, indices }) => (\n <div\n key={media.id}\n data-caption-index={indices.map((i) => i + 1).join(' ')}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n states.showMediaAlt = {\n alt: media.description,\n lang: language,\n };\n }}\n title={media.description}\n >\n <sup>{indices.map((i) => i + 1).join(' ')}</sup> {media.description}\n </div>\n ));\n\n // return displayedMediaAttachments.map(\n // (media, i) =>\n // !!media.description && (\n // <div\n // key={media.id}\n // data-caption-index={i + 1}\n // onClick={(e) => {\n // e.preventDefault();\n // e.stopPropagation();\n // states.showMediaAlt = {\n // alt: media.description,\n // lang: language,\n // };\n // }}\n // title={media.description}\n // >\n // <sup>{i + 1}</sup> {media.description}\n // </div>\n // ),\n // );\n }, [showMultipleMediaCaptions, displayedMediaAttachments, language]);\n\n const isThread = useMemo(() => {\n return (\n (!!inReplyToId && inReplyToAccountId === status.account?.id) ||\n !!snapStates.statusThreadNumber[sKey]\n );\n }, [\n inReplyToId,\n inReplyToAccountId,\n status.account?.id,\n snapStates.statusThreadNumber[sKey],\n ]);\n\n const showCommentHint = useMemo(() => {\n return (\n enableCommentHint &&\n !isThread &&\n !withinContext &&\n !inReplyToId &&\n visibility === 'public' &&\n repliesCount > 0\n );\n }, [\n enableCommentHint,\n isThread,\n withinContext,\n inReplyToId,\n repliesCount,\n visibility,\n ]);\n const showCommentCount = useMemo(() => {\n if (forceShowCommentCount && repliesCount > 0) return true;\n if (\n card ||\n poll ||\n sensitive ||\n spoilerText ||\n mediaAttachments?.length ||\n isThread ||\n withinContext ||\n inReplyToId ||\n repliesCount <= 0\n ) {\n return false;\n }\n const containsQuestion = QUESTION_REGEX.test(content);\n if (!containsQuestion) return false;\n if (contentLength > 0 && contentLength <= SHOW_COMMENT_COUNT_LIMIT) {\n return true;\n }\n }, [\n forceShowCommentCount,\n card,\n poll,\n sensitive,\n spoilerText,\n mediaAttachments,\n reblog,\n isThread,\n withinContext,\n inReplyToId,\n repliesCount,\n content,\n contentLength,\n ]);\n\n // Keep this simple for now, unlike showCommentCount\n const showQuoteCount =\n typeof forceShowQuoteCount === 'function'\n ? forceShowQuoteCount(quotesCount)\n : forceShowQuoteCount && quotesCount > 0;\n\n return (\n <StatusParent>\n {showReplyParent && !!(inReplyToId && inReplyToAccountId) && (\n <StatusCompact sKey={sKey} />\n )}\n <article\n data-state-post-id={sKey}\n ref={(node) => {\n statusRef.current = node;\n // Use parent node if it's in focus\n // Use case: <a><status /></a>\n // When navigating (j/k), the <a> is focused instead of <status />\n // Hotkey binding doesn't bubble up thus this hack\n const nodeRef =\n node?.closest?.(\n '.timeline-item, .timeline-item-alt, .status-link, .status-focus',\n ) || node;\n rRef.current = nodeRef;\n fRef.current = nodeRef;\n dRef.current = nodeRef;\n bRef.current = nodeRef;\n xRef.current = nodeRef;\n qRef.current = nodeRef;\n }}\n tabindex=\"-1\"\n class={`status ${\n !withinContext && inReplyToId && inReplyToAccount\n ? 'status-reply-to'\n : ''\n } visibility-${visibility} ${_pinned ? 'status-pinned' : ''} ${\n SIZE_CLASS[size]\n } ${_deleted ? 'status-deleted' : ''} ${quoted ? 'status-card' : ''} ${\n isContextMenuOpen ? 'status-menu-open' : ''\n } ${mediaFirst && hasMediaAttachments ? 'status-media-first' : ''}`}\n onMouseEnter={debugHover}\n onContextMenu={(e) => {\n if (!showContextMenu) return;\n if (e.metaKey) return;\n // console.log('context menu', e);\n const link = e.target.closest('a');\n if (\n link &&\n statusRef.current.contains(link) &&\n !link.getAttribute('href').startsWith('#')\n )\n return;\n\n // If there's selected text, don't show custom context menu\n const selection = window.getSelection?.();\n if (selection.toString().length > 0) {\n const { anchorNode } = selection;\n if (statusRef.current?.contains(anchorNode)) {\n return;\n }\n }\n e.preventDefault();\n setContextMenuProps({\n anchorPoint: {\n x: e.clientX,\n y: e.clientY,\n },\n direction: 'right',\n });\n setIsContextMenuOpen(true);\n }}\n {...(showContextMenu ? bindLongPressContext() : {})}\n >\n {showContextMenu && (\n <ControlledMenu\n ref={contextMenuRef}\n state={isContextMenuOpen ? 'open' : undefined}\n {...contextMenuProps}\n onClose={(e) => {\n setIsContextMenuOpen(false);\n // statusRef.current?.focus?.();\n if (e?.reason === 'click') {\n statusRef.current?.closest('[tabindex]')?.focus?.();\n }\n }}\n portal={{\n target: document.body,\n }}\n containerProps={{\n style: {\n // Higher than the backdrop\n zIndex: 1001,\n },\n onClick: () => {\n contextMenuRef.current?.closeMenu?.();\n },\n }}\n overflow=\"auto\"\n boundingBoxPadding={safeBoundingBoxPadding()}\n unmountOnClose\n >\n {StatusMenuItems}\n </ControlledMenu>\n )}\n {showActionsBar &&\n size !== 'l' &&\n !previewMode &&\n !readOnly &&\n !_deleted &&\n !quoted && (\n <div\n class={`status-actions ${\n isContextMenuOpen === 'actions-bar' ? 'open' : ''\n }`}\n ref={actionsRef}\n >\n <StatusButton\n size=\"s\"\n title={t`Reply`}\n alt={t`Reply`}\n class=\"reply-button\"\n icon=\"comment\"\n iconSize=\"m\"\n // Menu doesn't work here\n // Temporary solution: reply author-first if too many mentions\n onClick={(e) =>\n replyStatus(e, tooManyMentions ? 'author-first' : 'all')\n }\n />\n <StatusButton\n size=\"s\"\n checked={favourited}\n title={[t`Like`, t`Unlike`]}\n alt={[t`Like`, t`Liked`]}\n class=\"favourite-button\"\n icon=\"heart\"\n iconSize=\"m\"\n count={favouritesCount}\n onClick={favouriteStatusNotify}\n />\n <button\n type=\"button\"\n title={t`More`}\n class=\"plain more-button\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n setContextMenuProps({\n anchorRef: {\n current: e.currentTarget,\n },\n align: 'start',\n direction: 'left',\n gap: 0,\n shift: -8,\n });\n setIsContextMenuOpen('actions-bar');\n }}\n >\n <Icon icon=\"more2\" size=\"m\" alt={t`More`} />\n </button>\n </div>\n )}\n {size !== 'l' && (\n <div class=\"status-badge\">\n {reblogged && (\n <Icon class=\"reblog\" icon=\"rocket\" size=\"s\" alt={t`Boosted`} />\n )}\n {favourited && (\n <Icon class=\"favourite\" icon=\"heart\" size=\"s\" alt={t`Liked`} />\n )}\n {bookmarked && (\n <Icon\n class=\"bookmark\"\n icon=\"bookmark\"\n size=\"s\"\n alt={t`Bookmarked`}\n />\n )}\n {_pinned && (\n <Icon class=\"pin\" icon=\"pin\" size=\"s\" alt={t`Pinned`} />\n )}\n </div>\n )}\n {size !== 's' && (\n <a\n href={accountURL}\n tabindex=\"-1\"\n // target=\"_blank\"\n title={`@${acct}`}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n states.showAccount = {\n account: status.account,\n instance,\n };\n }}\n >\n <Avatar url={avatarStatic || avatar} size=\"xxl\" squircle={bot} />\n </a>\n )}\n <div class=\"container\">\n {!!quoteDomain && (\n <div class=\"status-quote-meta\">\n <span class=\"domain\">{quoteDomain}</span>\n </div>\n )}\n {!!(status.account || createdAt) && (\n <div class=\"meta\">\n <span class=\"meta-name\">\n <NameText\n account={status.account}\n instance={instance}\n showAvatar={size === 's'}\n showAcct={isSizeLarge}\n />\n </span>\n {withinContext && isThread && (\n <ThreadBadge\n showIcon={isSizeLarge}\n index={snapStates.statusThreadNumber[sKey]}\n />\n )}\n {/* {inReplyToAccount && !withinContext && size !== 's' && (\n <>\n {' '}\n <span class=\"ib\">\n <Icon icon=\"arrow-right\" class=\"arrow\" />{' '}\n <NameText account={inReplyToAccount} instance={instance} short />\n </span>\n </>\n )} */}\n {/* </span> */}{' '}\n {size !== 'l' &&\n (_deleted ? (\n <span class=\"status-deleted-tag\">\n <Trans>Deleted</Trans>\n </span>\n ) : url && !previewMode && !readOnly && !quoted ? (\n <Link\n to={instance ? `/${instance}/s/${id}` : `/s/${id}`}\n onClick={(e) => {\n if (\n e.metaKey ||\n e.ctrlKey ||\n e.shiftKey ||\n e.altKey ||\n e.which === 2\n ) {\n return;\n }\n e.preventDefault();\n e.stopPropagation();\n onStatusLinkClick?.(e, status);\n setContextMenuProps({\n anchorRef: {\n current: e.currentTarget,\n },\n align: 'end',\n direction: 'bottom',\n gap: 4,\n });\n setIsContextMenuOpen(true);\n }}\n class={`time ${\n isContextMenuOpen && contextMenuProps?.anchorRef\n ? 'is-open'\n : ''\n }`}\n >\n {showCommentHint && !showCommentCount ? (\n <Icon\n icon=\"comment2\"\n size=\"s\"\n alt={plural(repliesCount, {\n one: '# reply',\n other: '# replies',\n })}\n />\n ) : visibility !== 'public' && visibility !== 'direct' ? (\n <Icon\n icon={visibilityIconsMap[visibility]}\n alt={_(visibilityText[visibility])}\n size=\"s\"\n />\n ) : editedAt && size === 's' ? (\n <Icon icon=\"pencil\" size=\"s\" alt={t`Edited`} />\n ) : null}{' '}\n <RelativeTime datetime={createdAtDate} format=\"micro\" />\n {!previewMode && !readOnly && (\n <Icon icon=\"more2\" class=\"more\" alt={t`More`} />\n )}\n </Link>\n ) : (\n // <Menu\n // instanceRef={menuInstanceRef}\n // portal={{\n // target: document.body,\n // }}\n // containerProps={{\n // style: {\n // // Higher than the backdrop\n // zIndex: 1001,\n // },\n // onClick: (e) => {\n // if (e.target === e.currentTarget)\n // menuInstanceRef.current?.closeMenu?.();\n // },\n // }}\n // align=\"end\"\n // gap={4}\n // overflow=\"auto\"\n // viewScroll=\"close\"\n // boundingBoxPadding=\"8 8 8 8\"\n // unmountOnClose\n // menuButton={({ open }) => (\n // <Link\n // to={instance ? `/${instance}/s/${id}` : `/s/${id}`}\n // onClick={(e) => {\n // e.preventDefault();\n // e.stopPropagation();\n // onStatusLinkClick?.(e, status);\n // }}\n // class={`time ${open ? 'is-open' : ''}`}\n // >\n // <Icon\n // icon={visibilityIconsMap[visibility]}\n // alt={visibilityText[visibility]}\n // size=\"s\"\n // />{' '}\n // <RelativeTime datetime={createdAtDate} format=\"micro\" />\n // </Link>\n // )}\n // >\n // {StatusMenuItems}\n // </Menu>\n <span class=\"time\">\n {showCommentHint && !showCommentCount ? (\n <Icon\n icon=\"comment2\"\n size=\"s\"\n alt={plural(repliesCount, {\n one: '# reply',\n other: '# replies',\n })}\n />\n ) : visibility !== 'public' && visibility !== 'direct' ? (\n <Icon\n icon={visibilityIconsMap[visibility]}\n alt={_(visibilityText[visibility])}\n size=\"s\"\n />\n ) : editedAt && size === 's' ? (\n <Icon icon=\"pencil\" size=\"s\" alt={t`Edited`} />\n ) : null}{' '}\n <RelativeTime datetime={createdAtDate} format=\"micro\" />\n </span>\n ))}\n </div>\n )}\n {visibility === 'direct' && (\n <>\n <div class=\"status-direct-badge\">\n <Trans>Private mention</Trans>\n </div>{' '}\n </>\n )}\n {!withinContext && (\n <>\n {isThread ? (\n <ThreadBadge\n showIcon\n showText\n index={snapStates.statusThreadNumber[sKey]}\n />\n ) : (\n !!inReplyToId &&\n !!inReplyToAccount &&\n (!!spoilerText ||\n !mentions.find((mention) => {\n return mention.id === inReplyToAccountId;\n })) && (\n <div class=\"status-reply-badge\">\n <Icon icon=\"reply\" />{' '}\n <NameText\n account={inReplyToAccount}\n instance={instance}\n short\n />\n </div>\n )\n )}\n </>\n )}\n <div\n class={`content-container ${\n spoilerText ||\n sensitive ||\n filterInfo?.action === 'blur' ||\n readingExpandMedia === 'hide_all'\n ? 'has-spoiler'\n : ''\n } ${showSpoiler ? 'show-spoiler' : ''} ${\n showSpoilerMedia ? 'show-media' : ''\n }`}\n data-content-text-weight={contentTextWeight ? textWeight() : null}\n style={\n (isSizeLarge || contentTextWeight) && {\n '--content-text-weight': textWeight(),\n }\n }\n >\n {mediaFirst && hasMediaAttachments ? (\n <>\n {(!!spoilerText || !!sensitive) && !readingExpandSpoilers && (\n <>\n {!!spoilerText && (\n <span\n class=\"spoiler-content media-first-spoiler-content\"\n lang={language}\n dir=\"auto\"\n ref={spoilerContentRef}\n data-read-more={_(readMoreText)}\n >\n <EmojiText text={spoilerText} emojis={emojis} />{' '}\n </span>\n )}\n <button\n class={`light spoiler-button media-first-spoiler-button ${\n showSpoiler ? 'spoiling' : ''\n }`}\n type=\"button\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n if (showSpoiler) {\n delete states.spoilers[id];\n if (!readingExpandSpoilers) {\n delete states.spoilersMedia[id];\n }\n } else {\n states.spoilers[id] = true;\n if (!readingExpandSpoilers) {\n states.spoilersMedia[id] = true;\n }\n }\n }}\n >\n <Icon icon={showSpoiler ? 'eye-open' : 'eye-close'} />{' '}\n {showSpoiler ? t`Show less` : t`Show content`}\n </button>\n </>\n )}\n <MediaFirstContainer\n mediaAttachments={mediaAttachments}\n language={language}\n postID={id}\n instance={instance}\n />\n {!!content && (\n <div class=\"media-first-content content\" ref={contentRef}>\n <PostContent\n post={status}\n instance={instance}\n previewMode={previewMode}\n />\n </div>\n )}\n </>\n ) : (\n <>\n {!!spoilerText && (\n <>\n <div\n class=\"content spoiler-content\"\n lang={language}\n dir=\"auto\"\n ref={spoilerContentRef}\n data-read-more={_(readMoreText)}\n >\n <p>\n <EmojiText text={spoilerText} emojis={emojis} />\n </p>\n </div>\n {readingExpandSpoilers || previewMode ? (\n <div class=\"spoiler-divider\">\n <Icon icon=\"eye-open\" /> <Trans>Content warning</Trans>\n </div>\n ) : (\n <button\n class={`light spoiler-button ${\n showSpoiler ? 'spoiling' : ''\n }`}\n type=\"button\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n if (showSpoiler) {\n delete states.spoilers[id];\n if (!readingExpandSpoilers) {\n delete states.spoilersMedia[id];\n }\n } else {\n states.spoilers[id] = true;\n if (!readingExpandSpoilers) {\n states.spoilersMedia[id] = true;\n }\n }\n }}\n >\n <Icon icon={showSpoiler ? 'eye-open' : 'eye-close'} />{' '}\n {showSpoiler ? t`Show less` : t`Show content`}\n </button>\n )}\n </>\n )}\n {!!content && (\n <div\n class=\"content\"\n ref={contentRef}\n data-read-more={_(readMoreText)}\n inert={!!spoilerText && !showSpoiler ? true : undefined}\n >\n <PostContent\n key={reloadPostContentCount}\n post={status}\n instance={instance}\n previewMode={previewMode}\n />\n </div>\n )}\n {!!content && (\n <MathBlock\n content={content}\n contentRef={contentRef}\n onRevert={reloadPostContent}\n />\n )}\n {!!poll && (\n <Poll\n lang={language}\n poll={poll}\n readOnly={readOnly || !sameInstance || !authenticated}\n onUpdate={(newPoll) => {\n states.statuses[sKey].poll = newPoll;\n }}\n refresh={() => {\n return masto.v1.polls\n .$select(poll.id)\n .fetch()\n .then((pollResponse) => {\n states.statuses[sKey].poll = pollResponse;\n })\n .catch((e) => {}); // Silently fail\n }}\n votePoll={(choices) => {\n return masto.v1.polls\n .$select(poll.id)\n .votes.create({\n choices,\n })\n .then((pollResponse) => {\n states.statuses[sKey].poll = pollResponse;\n });\n }}\n />\n )}\n {(((enableTranslate || inlineTranslate) &&\n isTranslateble(content, emojis) &&\n differentLanguage) ||\n forceTranslate) && (\n <TranslationBlock\n forceTranslate={forceTranslate || inlineTranslate}\n mini={!isSizeLarge && !withinContext}\n sourceLanguage={language}\n autoDetected={languageAutoDetected}\n text={getPostText(status, {\n maskCustomEmojis: true,\n maskURLs: true,\n // Hide regardless of native quote support\n // They are not useful in translation context\n hideInlineQuote: true,\n })}\n />\n )}\n {!previewMode &&\n (sensitive ||\n filterInfo?.action === 'blur' ||\n readingExpandMedia === 'hide_all') &&\n !!mediaAttachments.length &&\n (readingExpandMedia !== 'show_all' ||\n filterInfo?.action === 'blur') && (\n <button\n class={`plain spoiler-media-button ${\n showSpoilerMedia ? 'spoiling' : ''\n }`}\n type=\"button\"\n hidden={!readingExpandSpoilers && !!spoilerText}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n if (showSpoilerMedia) {\n delete states.spoilersMedia[id];\n } else {\n states.spoilersMedia[id] = true;\n }\n }}\n >\n <Icon\n icon={showSpoilerMedia ? 'eye-open' : 'eye-close'}\n />{' '}\n <span>\n {filterInfo?.action === 'blur' && (\n <small>\n <Trans>Filtered: {filterInfo?.titlesStr}</Trans>\n <br />\n </small>\n )}\n {showSpoilerMedia ? t`Show less` : t`Show media`}\n </span>\n </button>\n )}\n {!!mediaAttachments.length &&\n (mediaAttachments.length > 1 &&\n (isSizeLarge || (withinContext && size === 'm')) ? (\n <div class=\"media-large-container\">\n {mediaAttachments.map((media, i) => (\n <div key={media.id} class={`media-container media-eq1`}>\n <Media\n media={media}\n autoAnimate\n showCaption\n allowLongerCaption={!content || isSizeLarge}\n lang={language}\n to={`/${instance}/s/${id}?${\n withinContext ? 'media' : 'media-only'\n }=${i + 1}`}\n onClick={\n onMediaClick\n ? (e) => onMediaClick(e, i, media, status)\n : undefined\n }\n />\n </div>\n ))}\n </div>\n ) : (\n <MultipleMediaFigure\n lang={language}\n enabled={showMultipleMediaCaptions}\n captionChildren={captionChildren}\n >\n <div\n ref={mediaContainerRef}\n class={`media-container media-eq${\n mediaAttachments.length\n } ${mediaAttachments.length > 2 ? 'media-gt2' : ''} ${\n mediaAttachments.length > 4 ? 'media-gt4' : ''\n }`}\n >\n {displayedMediaAttachments.map((media, i) => (\n <Media\n key={media.id}\n media={media}\n autoAnimate={isSizeLarge}\n showCaption={mediaAttachments.length === 1}\n allowLongerCaption={\n !content && mediaAttachments.length === 1\n }\n lang={language}\n altIndex={\n showMultipleMediaCaptions &&\n !!media.description &&\n i + 1\n }\n to={`/${instance}/s/${id}?${\n withinContext ? 'media' : 'media-only'\n }=${i + 1}`}\n onClick={\n onMediaClick\n ? (e) => {\n onMediaClick(e, i, media, status);\n }\n : undefined\n }\n checkAspectRatio={mediaAttachments.length === 1}\n />\n ))}\n </div>\n </MultipleMediaFigure>\n ))}\n <QuoteStatuses\n id={id}\n instance={instance}\n level={quoted}\n collapsed={!isSizeLarge && !withinContext}\n fallbackQuote={quote}\n />\n {!!card &&\n /^https/i.test(card?.url) &&\n !sensitive &&\n !spoilerText &&\n !poll &&\n !mediaAttachments.length &&\n !snapStates.statusQuotes[sKey] && (\n <StatusCard\n card={card}\n selfReferential={\n card?.url === status.url || card?.url === status.uri\n }\n selfAuthor={card?.authors?.some(\n (a) => a.account?.url === accountURL,\n )}\n instance={currentInstance}\n />\n )}\n {size !== 's' && <StatusTags tags={tags} content={content} />}\n </>\n )}\n </div>\n {!isSizeLarge && (showCommentCount || showQuoteCount) && (\n <div class=\"content-comment-hint insignificant\">\n {showCommentCount && (\n <>\n <Icon icon=\"comment2\" alt={t`Replies`} /> {repliesCount}\n </>\n )}{' '}\n {showQuoteCount && (\n <>\n <Icon icon=\"quote\" alt={t`Quotes`} /> {quotesCount}\n </>\n )}\n </div>\n )}\n {isSizeLarge && (\n <>\n <div class=\"extra-meta\">\n {_deleted ? (\n <span class=\"status-deleted-tag\">\n <Trans>Deleted</Trans>\n </span>\n ) : (\n <>\n <Icon icon={visibilityIconsMap[visibility]} alt=\"\" />{' '}\n <span>{_(visibilityText[visibility])}</span> &bull;{' '}\n <a href={url} target=\"_blank\" rel=\"noopener\">\n {\n // within a day\n Date.now() - createdAtDate.getTime() < 86400000 && (\n <>\n <RelativeTime\n datetime={createdAtDate}\n format=\"micro\"\n />{' '}\n {' '}\n </>\n )\n }\n {!!createdAt && (\n <time\n class=\"created\"\n datetime={createdAtDate.toISOString()}\n title={createdAtDate.toLocaleString()}\n >\n {createdDateText}\n </time>\n )}\n </a>\n {editedAt && (\n <span class=\"edited-container\">\n {' '}\n &bull; <Icon icon=\"pencil\" alt={t`Edited`} />{' '}\n <time\n tabIndex=\"0\"\n class=\"edited\"\n datetime={editedAtDate.toISOString()}\n onClick={() => {\n setShowEdited(id);\n }}\n >\n {editedDateText}\n </time>\n </span>\n )}\n </>\n )}\n </div>\n {!!emojiReactions?.length && (\n <div class=\"emoji-reactions\">\n {emojiReactions.map((emojiReaction) => {\n const { name, count, me, url, staticUrl } = emojiReaction;\n if (url) {\n // Some servers return url and staticUrl\n return (\n <span\n class={`emoji-reaction tag ${\n me ? '' : 'insignificant'\n }`}\n >\n <CustomEmoji\n alt={name}\n url={url}\n staticUrl={staticUrl}\n />{' '}\n {count}\n </span>\n );\n }\n const isShortCode = /^:.+?:$/.test(name);\n if (isShortCode) {\n const emoji = emojis.find(\n (e) =>\n e.shortcode ===\n name.replace(/^:/, '').replace(/:$/, ''),\n );\n if (emoji) {\n return (\n <span\n class={`emoji-reaction tag ${\n me ? '' : 'insignificant'\n }`}\n >\n <CustomEmoji\n alt={name}\n url={emoji.url}\n staticUrl={emoji.staticUrl}\n />{' '}\n {count}\n </span>\n );\n }\n }\n return (\n <span\n class={`emoji-reaction tag ${\n me ? '' : 'insignificant'\n }`}\n >\n {name} {count}\n </span>\n );\n })}\n </div>\n )}\n <div class={`actions ${_deleted ? 'disabled' : ''}`}>\n <div class=\"action has-count\">\n {tooManyMentions ? (\n <Menu2\n openTrigger=\"clickOnly\"\n direction=\"bottom\"\n overflow=\"auto\"\n gap={-8}\n shift={8}\n menuClassName=\"menu-emphasized\"\n menuButton={\n <StatusButton\n title={t`Reply`}\n alt={t`Comments`}\n class=\"reply-button\"\n icon=\"comment\"\n count={repliesCount}\n />\n }\n >\n {replyModeMenuItems}\n </Menu2>\n ) : (\n <StatusButton\n title={t`Reply`}\n alt={t`Comments`}\n class=\"reply-button\"\n icon=\"comment\"\n count={repliesCount}\n onClick={replyStatus}\n />\n )}\n </div>\n {/* <div class=\"action has-count\">\n <StatusButton\n checked={reblogged}\n title={['Boost', 'Unboost']}\n alt={['Boost', 'Boosted']}\n class=\"reblog-button\"\n icon=\"rocket\"\n count={reblogsCount}\n onClick={boostStatus}\n disabled={!canBoost}\n />\n </div> */}\n <div\n class={`action ${canQuote && reblogsCount > 0 && quotesCount > 0 ? 'has-counts' : 'has-count'}`}\n >\n <MenuConfirm\n disabled={!canBoost}\n onClick={confirmBoostStatus}\n confirmLabel={\n <>\n <Icon icon=\"rocket\" />\n <span class=\"menu-grow\">\n {reblogged ? t`Unboost` : t`Boost`}\n </span>\n {reblogsCount > 0 && (\n <small class=\"more-insignificant\">\n {shortenNumber(reblogsCount)}\n </small>\n )}\n </>\n }\n menuExtras={\n <>\n {supportsNativeQuote() && (\n <MenuItem\n disabled={quoteDisabled}\n onClick={() => {\n showCompose({\n quoteStatus: status,\n });\n }}\n >\n <Icon icon=\"quote\" />\n {quoteMetaText ? (\n <small>\n {quoteText}\n <br />\n {quoteMetaText}\n </small>\n ) : (\n <span class=\"menu-grow\">{quoteText}</span>\n )}\n {quotesCount > 0 && (\n <small class=\"more-insignificant\">\n {shortenNumber(quotesCount)}\n </small>\n )}\n </MenuItem>\n )}\n {(DEV || !supportsNativeQuote()) && (\n <MenuItem\n onClick={() => {\n showCompose({\n draftStatus: {\n status: `\\n${url}`,\n },\n });\n }}\n >\n <Icon icon=\"quote\" />\n <span>\n <Trans>Quote with link</Trans>\n </span>\n {supportsNativeQuote() && DEV && (\n <small class=\"tag collapsed\">DEV</small>\n )}\n </MenuItem>\n )}\n </>\n }\n menuFooter={menuFooter}\n >\n <StatusButton\n checked={reblogged}\n title={[\n canQuote ? t`Boost/Quote…` : t`Boost…`,\n t`Unboost`,\n ]}\n alt={[t`Boost`, t`Boosted`]}\n class=\"reblog-button\"\n icon={\n reblogsCount <= 0 && quotesCount > 0\n ? 'quote'\n : 'rocket'\n }\n count={reblogsCount}\n extraCount={quotesCount}\n // onClick={boostStatus}\n disabled={!canBoost}\n />\n </MenuConfirm>\n </div>\n <div class=\"action has-count\">\n <StatusButton\n checked={favourited}\n title={[t`Like`, t`Unlike`]}\n alt={[t`Like`, t`Liked`]}\n class=\"favourite-button\"\n icon=\"heart\"\n count={favouritesCount}\n onClick={favouriteStatus}\n />\n </div>\n {supports('@mastodon/post-bookmark') && (\n <div class=\"action\">\n <StatusButton\n checked={bookmarked}\n title={[t`Bookmark`, t`Unbookmark`]}\n alt={[t`Bookmark`, t`Bookmarked`]}\n class=\"bookmark-button\"\n icon=\"bookmark\"\n onClick={bookmarkStatus}\n />\n </div>\n )}\n <Menu2\n portal={{\n target:\n document.querySelector('.status-deck') || document.body,\n }}\n align=\"end\"\n gap={4}\n overflow=\"auto\"\n viewScroll=\"close\"\n menuButton={\n <div class=\"action\">\n <button\n type=\"button\"\n title={t`More`}\n class=\"plain more-button\"\n >\n <Icon icon=\"more2\" size=\"l\" alt={t`More`} />\n </button>\n </div>\n }\n >\n {StatusMenuItems}{' '}\n </Menu2>\n </div>\n </>\n )}\n </div>\n {!!showEdited && (\n <Modal\n onClick={(e) => {\n if (e.target === e.currentTarget) {\n setShowEdited(false);\n // statusRef.current?.focus();\n }\n }}\n >\n <EditedAtModal\n statusID={showEdited}\n instance={instance}\n fetchStatusHistory={() => {\n return masto.v1.statuses.$select(showEdited).history.list();\n }}\n onClose={() => {\n setShowEdited(false);\n statusRef.current?.focus();\n }}\n />\n </Modal>\n )}\n {!!showEmbed && (\n <Modal\n onClose={() => {\n setShowEmbed(false);\n }}\n >\n <PostEmbedModal\n post={status}\n instance={instance}\n onClose={() => {\n setShowEmbed(false);\n }}\n />\n </Modal>\n )}\n {!!showQuoteSettings && (\n <Modal\n onClose={() => {\n setShowQuoteSettings(false);\n states.reloadStatusPage++;\n }}\n >\n <QuoteSettingsSheet\n onClose={() => {\n setShowQuoteSettings(false);\n states.reloadStatusPage++;\n }}\n post={status}\n currentPolicy={postQuoteApprovalPolicy}\n />\n </Modal>\n )}\n {!!showQuotes && (\n <Modal\n onClose={() => {\n setShowQuotes(false);\n }}\n >\n <QuotesModal\n statusId={id}\n instance={instance}\n onClose={() => {\n setShowQuotes(false);\n }}\n />\n </Modal>\n )}\n {!!showQuoteChain && (\n <Modal\n onClose={() => {\n setShowQuoteChain(false);\n }}\n >\n <QuoteChainModal\n statusId={id}\n instance={instance}\n onClose={() => {\n setShowQuoteChain(false);\n }}\n />\n </Modal>\n )}\n </article>\n </StatusParent>\n );\n}\n\nfunction nicePostURL(url) {\n if (!url) return;\n const urlObj = URL.parse(url);\n if (!urlObj) return;\n const { host, pathname } = urlObj;\n const path = pathname.replace(/\\/$/, '');\n // split only first slash\n const [_, username, restPath] = path.match(/\\/(@[^\\/]+)\\/(.*)/) || [];\n return (\n <>\n {punycode.toUnicode(host)}\n {username ? (\n <>\n /{username}\n <wbr />\n <span class=\"more-insignificant\">/{restPath}</span>\n </>\n ) : (\n <span class=\"more-insignificant\">{path}</span>\n )}\n </>\n );\n}\n\nconst handledUnfulfilledStates = [\n 'deleted',\n 'unauthorized',\n 'pending',\n 'rejected',\n 'revoked',\n 'blocked_account',\n 'blocked_domain',\n 'muted_account',\n];\nconst revealableUnfulfilledStates = [\n 'blocked_account',\n 'blocked_domain',\n 'muted_account',\n];\nconst unfulfilledText = {\n filterHidden: msg`Post hidden by your filters`,\n pending: msg`Post pending`,\n deleted: msg`Post unavailable`,\n unauthorized: msg`Post unavailable`,\n rejected: msg`Post unavailable`,\n revoked: msg`Post removed by author`,\n blocked_account: (name) => msg`Post hidden because you've blocked @${name}.`,\n blocked_domain: (domain) =>\n msg`Post hidden because you've blocked ${domain}.`,\n muted_account: (name) => msg`Post hidden because you've muted @${name}.`,\n};\n\nconst QuoteStatus = memo(({ quote, level = 0 }) => {\n const { _ } = useLingui();\n const snapStates = useSnapshot(states);\n const filterContext = useContext(FilterContext);\n const currentAccount = getCurrentAccID();\n\n const q = quote;\n let unfulfilledState;\n\n // Static as in there's no live update (edited, liked, etc.)\n const isStaticQuote = !!q.quoteStatus;\n\n const quoteStatus =\n snapStates.statuses[statusKey(q.id, q.instance)] || q.quoteStatus;\n if (quoteStatus) {\n const isSelf = currentAccount && currentAccount === quoteStatus.account?.id;\n const filterInfo =\n !isSelf && isFiltered(quoteStatus.filtered, filterContext);\n\n if (filterInfo?.action === 'hide') {\n unfulfilledState = 'filterHidden';\n }\n }\n\n if (!unfulfilledState) {\n unfulfilledState = handledUnfulfilledStates.find(\n (state) => q.state === state,\n );\n }\n\n const isRevealable = revealableUnfulfilledStates.includes(unfulfilledState);\n const quoteKey = q.id ? statusKey(q.id, q.instance) : null;\n const isRevealed = quoteKey && snapStates.revealedQuotes[quoteKey];\n\n if (unfulfilledState && (!isRevealable || !isRevealed)) {\n // Get account info for revealable states\n const quotedAccount = quoteStatus?.account;\n const quotedAccountAcct = quotedAccount?.acct;\n const domain = quotedAccountAcct?.split('@')[1];\n\n let message;\n if (isRevealable) {\n if (unfulfilledState === 'blocked_account') {\n message = _(unfulfilledText.blocked_account(quotedAccountAcct));\n } else if (unfulfilledState === 'blocked_domain') {\n message = _(unfulfilledText.blocked_domain(domain));\n } else if (unfulfilledState === 'muted_account') {\n message = _(unfulfilledText.muted_account(quotedAccountAcct));\n }\n } else {\n message = _(unfulfilledText[unfulfilledState]);\n }\n\n return (\n <div\n key={quoteKey}\n class={`status-card-unfulfilled ${\n unfulfilledState === 'filterHidden' || isRevealable\n ? 'status-card-ghost'\n : ''\n } ${q.native ? 'quote-post-native' : ''}`}\n >\n <Icon icon=\"quote\" />\n <i>{message}</i>\n {isRevealable && quoteKey && (\n <button\n type=\"button\"\n class=\"textual\"\n onClick={() => {\n states.revealedQuotes[quoteKey] = true;\n }}\n >\n <Trans>Show anyway</Trans>\n </button>\n )}\n </div>\n );\n }\n\n const Parent = q.native ? Fragment : LazyShazam;\n return (\n <Parent id={q.instance + q.id} key={q.instance + q.id}>\n <Link\n key={q.instance + q.id}\n to={`${q.instance ? `/${q.instance}` : ''}/s/${q.id}`}\n class={`status-card-link ${q.native ? 'quote-post-native' : ''}`}\n data-read-more={_(readMoreText)}\n >\n <Status\n statusID={q.id}\n status={isStaticQuote ? quoteStatus : undefined}\n instance={q.instance}\n size=\"s\"\n quoted={level + 1}\n quoteDomain={q.originalDomain}\n enableCommentHint\n />\n </Link>\n </Parent>\n );\n});\n\nconst ShallowQuote = ({ quote } = {}) => {\n const { account, native, instance } = quote || {};\n if (!account) return null;\n return (\n <div class=\"status-card-container\">\n <div class={native ? 'quote-post-native' : ''}>\n <div class=\"status-card status-shallow-card\">\n <NameText account={account} instance={instance} showAvatar />{' '}\n <span class=\"insignificant\">…</span>\n </div>\n </div>\n </div>\n );\n};\n\nconst QuoteStatuses = memo(\n ({ id, instance, level = 0, collapsed = false, fallbackQuote }) => {\n if (!id || !instance) return;\n const { _ } = useLingui();\n const snapStates = useSnapshot(states);\n const sKey = statusKey(id, instance);\n const quotes = snapStates.statusQuotes[sKey];\n let uniqueQuotes = quotes?.filter(\n (q, i, arr) => q.native || arr.findIndex((q2) => q2.url === q.url) === i,\n );\n\n const containerRef = useTruncated();\n\n if (!uniqueQuotes?.length && fallbackQuote?.quotedStatus) {\n // Just render it\n return (\n <div\n class=\"status-card-container\"\n ref={containerRef}\n data-read-more={_(readMoreText)}\n data-quote-container-static={true}\n >\n <QuoteStatus\n quote={{\n // Same structure as the one in saveStatus (utils/states)\n id,\n instance,\n // url\n state: fallbackQuote.state,\n // account\n native: true,\n // Inject whole quoteStatus instead of reading from states\n quoteStatus: fallbackQuote.quotedStatus,\n }}\n />\n </div>\n );\n }\n\n if (!uniqueQuotes?.length) return;\n if (level > 2) {\n return <ShallowQuote quote={uniqueQuotes[0]} />;\n }\n\n if (collapsed) {\n // Only show the first quote if \"collapsed\"\n uniqueQuotes = [uniqueQuotes[0]];\n }\n\n return (\n <div\n class=\"status-card-container\"\n ref={containerRef}\n data-read-more={_(readMoreText)}\n >\n {uniqueQuotes.map((q) => {\n const quoteKey = q.id\n ? statusKey(q.id, q.instance)\n : `${q.instance || ''}-${q.state}`;\n return <QuoteStatus key={quoteKey} quote={q} level={level} />;\n })}\n </div>\n );\n },\n);\n\nfunction EditedAtModal({\n statusID,\n instance,\n fetchStatusHistory = () => {},\n onClose,\n}) {\n const { t } = useLingui();\n const [uiState, setUIState] = useState('default');\n const [editHistory, setEditHistory] = useState([]);\n\n useEffect(() => {\n setUIState('loading');\n (async () => {\n try {\n const editHistory = await fetchStatusHistory();\n console.log(editHistory);\n setEditHistory(editHistory);\n setUIState('default');\n } catch (e) {\n console.error(e);\n setUIState('error');\n }\n })();\n }, []);\n\n return (\n <div id=\"edit-history\" class=\"sheet\">\n {!!onClose && (\n <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n <Icon icon=\"x\" alt={t`Close`} />\n </button>\n )}\n <header>\n <h2>\n <Trans>Edit History</Trans>\n </h2>\n {uiState === 'error' && (\n <p>\n <Trans>Failed to load history</Trans>\n </p>\n )}\n {uiState === 'loading' && (\n <p>\n <Loader abrupt /> <Trans>Loading…</Trans>\n </p>\n )}\n </header>\n <main tabIndex=\"-1\">\n {editHistory.length > 0 && (\n <ol>\n {editHistory.map((status) => {\n const { createdAt } = status;\n const createdAtDate = new Date(createdAt);\n return (\n <li key={createdAt} class=\"history-item\">\n <h3>\n <time>\n {niceDateTime(createdAtDate, {\n formatOpts: {\n weekday: 'short',\n second: 'numeric',\n },\n })}\n </time>\n </h3>\n <Status\n status={status}\n instance={instance}\n size=\"s\"\n withinContext\n readOnly\n previewMode\n />\n </li>\n );\n })}\n </ol>\n )}\n </main>\n </div>\n );\n}\n\nfunction FilteredStatus({\n status,\n filterInfo,\n instance,\n containerProps = {},\n showFollowedTags,\n quoted,\n}) {\n const { _, t } = useLingui();\n const snapStates = useSnapshot(states);\n const {\n id: statusID,\n account: { avatar, avatarStatic, bot, group },\n createdAt,\n visibility,\n reblog,\n } = status;\n const isReblog = !!reblog;\n const filterTitleStr = filterInfo?.titlesStr || '';\n const createdAtDate = new Date(createdAt);\n const statusPeekText = statusPeek(status.reblog || status);\n\n const [showPeek, setShowPeek] = useState(false);\n const bindLongPressPeek = useLongPress(\n () => {\n setShowPeek(true);\n },\n {\n threshold: 600,\n captureEvent: true,\n detect: 'touch',\n cancelOnMovement: 2, // true allows movement of up to 25 pixels\n },\n );\n\n const statusPeekRef = useTruncated();\n const sKey = statusKey(status.id, instance);\n const ssKey =\n statusKey(status.id, instance) +\n ' ' +\n (statusKey(reblog?.id, instance) || '');\n\n const actualStatusID = reblog?.id || statusID;\n const url = instance\n ? `/${instance}/s/${actualStatusID}`\n : `/s/${actualStatusID}`;\n const isFollowedTags =\n showFollowedTags && !!snapStates.statusFollowedTags[sKey]?.length;\n\n return (\n <div\n class={`${\n quoted\n ? ''\n : isReblog\n ? group\n ? 'status-group'\n : 'status-reblog'\n : isFollowedTags\n ? 'status-followed-tags'\n : ''\n } visibility-${visibility}`}\n {...containerProps}\n // title={statusPeekText}\n onContextMenu={(e) => {\n e.preventDefault();\n setShowPeek(true);\n }}\n {...bindLongPressPeek()}\n >\n <article\n data-state-post-id={ssKey}\n class={`status filtered ${quoted ? 'status-card' : ''}`}\n tabindex=\"-1\"\n >\n <b\n class=\"status-filtered-badge clickable badge-meta\"\n title={filterTitleStr}\n onClick={(e) => {\n e.preventDefault();\n setShowPeek(true);\n }}\n >\n <span>\n <Trans>Filtered</Trans>\n </span>\n <span>{filterTitleStr}</span>\n </b>{' '}\n <Avatar url={avatarStatic || avatar} squircle={bot} />\n <span class=\"status-filtered-info\">\n <span class=\"status-filtered-info-1\">\n {isReblog ? (\n <Trans comment=\"[Name] [Visibility icon] boosted\">\n <NameText account={status.account} instance={instance} />{' '}\n <Icon\n icon={visibilityIconsMap[visibility]}\n alt={_(visibilityText[visibility])}\n size=\"s\"\n />{' '}\n boosted\n </Trans>\n ) : isFollowedTags ? (\n <>\n <NameText account={status.account} instance={instance} />{' '}\n <Icon\n icon={visibilityIconsMap[visibility]}\n alt={_(visibilityText[visibility])}\n size=\"s\"\n />{' '}\n <span>\n {snapStates.statusFollowedTags[sKey]\n .slice(0, 3)\n .map((tag) => (\n <span key={tag} class=\"status-followed-tag-item\">\n #{tag}\n </span>\n ))}\n </span>\n </>\n ) : (\n <>\n <NameText account={status.account} instance={instance} />{' '}\n <Icon\n icon={visibilityIconsMap[visibility]}\n alt={_(visibilityText[visibility])}\n size=\"s\"\n />{' '}\n <RelativeTime datetime={createdAtDate} format=\"micro\" />\n </>\n )}\n </span>\n <span class=\"status-filtered-info-2\">\n {isReblog && (\n <>\n <Avatar\n url={reblog.account.avatarStatic || reblog.account.avatar}\n squircle={bot}\n />{' '}\n </>\n )}\n {statusPeekText}\n </span>\n </span>\n </article>\n {!!showPeek && (\n <Modal\n onClick={(e) => {\n if (e.target === e.currentTarget) {\n setShowPeek(false);\n }\n }}\n >\n <div id=\"filtered-status-peek\" class=\"sheet\">\n <button\n type=\"button\"\n class=\"sheet-close\"\n onClick={() => setShowPeek(false)}\n >\n <Icon icon=\"x\" alt={t`Close`} />\n </button>\n <header>\n <b class=\"status-filtered-badge\">\n <Trans>Filtered</Trans>\n </b>{' '}\n {filterTitleStr}\n </header>\n <main tabIndex=\"-1\">\n <Link\n ref={statusPeekRef}\n class=\"status-link\"\n to={url}\n onClick={() => {\n setShowPeek(false);\n }}\n data-read-more={_(readMoreText)}\n >\n <Status status={status} instance={instance} size=\"s\" readOnly />\n </Link>\n </main>\n </div>\n </Modal>\n )}\n </div>\n );\n}\n\nexport default memo(Status, (oldProps, newProps) => {\n // Shallow equal all props except 'status'\n // This will be pure static until status ID changes\n const { status, ...restOldProps } = oldProps;\n const { status: newStatus, ...restNewProps } = newProps;\n return (\n status?.id === newStatus?.id && shallowEqual(restOldProps, restNewProps)\n );\n});\n","var IDX=36, HEX='';\nwhile (IDX--) HEX += IDX.toString(36);\n\nexport function uid(len) {\n\tvar str='', num = len || 11;\n\twhile (num--) str += HEX[Math.random() * 36 | 0];\n\treturn str;\n}\n","/**\n * Fuse.js v7.1.0 - Lightweight fuzzy-search (http://fusejs.io)\n *\n * Copyright (c) 2025 Kiro Risk (http://kiro.me)\n * All Rights Reserved. Apache Software License 2.0\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nfunction isArray(value) {\n return !Array.isArray\n ? getTag(value) === '[object Array]'\n : Array.isArray(value)\n}\n\n// Adapted from: https://github.com/lodash/lodash/blob/master/.internal/baseToString.js\nconst INFINITY = 1 / 0;\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value\n }\n let result = value + '';\n return result == '0' && 1 / value == -INFINITY ? '-0' : result\n}\n\nfunction toString(value) {\n return value == null ? '' : baseToString(value)\n}\n\nfunction isString(value) {\n return typeof value === 'string'\n}\n\nfunction isNumber(value) {\n return typeof value === 'number'\n}\n\n// Adapted from: https://github.com/lodash/lodash/blob/master/isBoolean.js\nfunction isBoolean(value) {\n return (\n value === true ||\n value === false ||\n (isObjectLike(value) && getTag(value) == '[object Boolean]')\n )\n}\n\nfunction isObject(value) {\n return typeof value === 'object'\n}\n\n// Checks if `value` is object-like.\nfunction isObjectLike(value) {\n return isObject(value) && value !== null\n}\n\nfunction isDefined(value) {\n return value !== undefined && value !== null\n}\n\nfunction isBlank(value) {\n return !value.trim().length\n}\n\n// Gets the `toStringTag` of `value`.\n// Adapted from: https://github.com/lodash/lodash/blob/master/.internal/getTag.js\nfunction getTag(value) {\n return value == null\n ? value === undefined\n ? '[object Undefined]'\n : '[object Null]'\n : Object.prototype.toString.call(value)\n}\n\nconst EXTENDED_SEARCH_UNAVAILABLE = 'Extended search is not available';\n\nconst INCORRECT_INDEX_TYPE = \"Incorrect 'index' type\";\n\nconst LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY = (key) =>\n `Invalid value for key ${key}`;\n\nconst PATTERN_LENGTH_TOO_LARGE = (max) =>\n `Pattern length exceeds max of ${max}.`;\n\nconst MISSING_KEY_PROPERTY = (name) => `Missing ${name} property in key`;\n\nconst INVALID_KEY_WEIGHT_VALUE = (key) =>\n `Property 'weight' in key '${key}' must be a positive integer`;\n\nconst hasOwn = Object.prototype.hasOwnProperty;\n\nclass KeyStore {\n constructor(keys) {\n this._keys = [];\n this._keyMap = {};\n\n let totalWeight = 0;\n\n keys.forEach((key) => {\n let obj = createKey(key);\n\n this._keys.push(obj);\n this._keyMap[obj.id] = obj;\n\n totalWeight += obj.weight;\n });\n\n // Normalize weights so that their sum is equal to 1\n this._keys.forEach((key) => {\n key.weight /= totalWeight;\n });\n }\n get(keyId) {\n return this._keyMap[keyId]\n }\n keys() {\n return this._keys\n }\n toJSON() {\n return JSON.stringify(this._keys)\n }\n}\n\nfunction createKey(key) {\n let path = null;\n let id = null;\n let src = null;\n let weight = 1;\n let getFn = null;\n\n if (isString(key) || isArray(key)) {\n src = key;\n path = createKeyPath(key);\n id = createKeyId(key);\n } else {\n if (!hasOwn.call(key, 'name')) {\n throw new Error(MISSING_KEY_PROPERTY('name'))\n }\n\n const name = key.name;\n src = name;\n\n if (hasOwn.call(key, 'weight')) {\n weight = key.weight;\n\n if (weight <= 0) {\n throw new Error(INVALID_KEY_WEIGHT_VALUE(name))\n }\n }\n\n path = createKeyPath(name);\n id = createKeyId(name);\n getFn = key.getFn;\n }\n\n return { path, id, weight, src, getFn }\n}\n\nfunction createKeyPath(key) {\n return isArray(key) ? key : key.split('.')\n}\n\nfunction createKeyId(key) {\n return isArray(key) ? key.join('.') : key\n}\n\nfunction get(obj, path) {\n let list = [];\n let arr = false;\n\n const deepGet = (obj, path, index) => {\n if (!isDefined(obj)) {\n return\n }\n if (!path[index]) {\n // If there's no path left, we've arrived at the object we care about.\n list.push(obj);\n } else {\n let key = path[index];\n\n const value = obj[key];\n\n if (!isDefined(value)) {\n return\n }\n\n // If we're at the last value in the path, and if it's a string/number/bool,\n // add it to the list\n if (\n index === path.length - 1 &&\n (isString(value) || isNumber(value) || isBoolean(value))\n ) {\n list.push(toString(value));\n } else if (isArray(value)) {\n arr = true;\n // Search each item in the array.\n for (let i = 0, len = value.length; i < len; i += 1) {\n deepGet(value[i], path, index + 1);\n }\n } else if (path.length) {\n // An object. Recurse further.\n deepGet(value, path, index + 1);\n }\n }\n };\n\n // Backwards compatibility (since path used to be a string)\n deepGet(obj, isString(path) ? path.split('.') : path, 0);\n\n return arr ? list : list[0]\n}\n\nconst MatchOptions = {\n // Whether the matches should be included in the result set. When `true`, each record in the result\n // set will include the indices of the matched characters.\n // These can consequently be used for highlighting purposes.\n includeMatches: false,\n // When `true`, the matching function will continue to the end of a search pattern even if\n // a perfect match has already been located in the string.\n findAllMatches: false,\n // Minimum number of characters that must be matched before a result is considered a match\n minMatchCharLength: 1\n};\n\nconst BasicOptions = {\n // When `true`, the algorithm continues searching to the end of the input even if a perfect\n // match is found before the end of the same input.\n isCaseSensitive: false,\n // When `true`, the algorithm will ignore diacritics (accents) in comparisons\n ignoreDiacritics: false,\n // When true, the matching function will continue to the end of a search pattern even if\n includeScore: false,\n // List of properties that will be searched. This also supports nested properties.\n keys: [],\n // Whether to sort the result list, by score\n shouldSort: true,\n // Default sort function: sort by ascending score, ascending index\n sortFn: (a, b) =>\n a.score === b.score ? (a.idx < b.idx ? -1 : 1) : a.score < b.score ? -1 : 1\n};\n\nconst FuzzyOptions = {\n // Approximately where in the text is the pattern expected to be found?\n location: 0,\n // At what point does the match algorithm give up. A threshold of '0.0' requires a perfect match\n // (of both letters and location), a threshold of '1.0' would match anything.\n threshold: 0.6,\n // Determines how close the match must be to the fuzzy location (specified above).\n // An exact letter match which is 'distance' characters away from the fuzzy location\n // would score as a complete mismatch. A distance of '0' requires the match be at\n // the exact location specified, a threshold of '1000' would require a perfect match\n // to be within 800 characters of the fuzzy location to be found using a 0.8 threshold.\n distance: 100\n};\n\nconst AdvancedOptions = {\n // When `true`, it enables the use of unix-like search commands\n useExtendedSearch: false,\n // The get function to use when fetching an object's properties.\n // The default will search nested paths *ie foo.bar.baz*\n getFn: get,\n // When `true`, search will ignore `location` and `distance`, so it won't matter\n // where in the string the pattern appears.\n // More info: https://fusejs.io/concepts/scoring-theory.html#fuzziness-score\n ignoreLocation: false,\n // When `true`, the calculation for the relevance score (used for sorting) will\n // ignore the field-length norm.\n // More info: https://fusejs.io/concepts/scoring-theory.html#field-length-norm\n ignoreFieldNorm: false,\n // The weight to determine how much field length norm effects scoring.\n fieldNormWeight: 1\n};\n\nvar Config = {\n ...BasicOptions,\n ...MatchOptions,\n ...FuzzyOptions,\n ...AdvancedOptions\n};\n\nconst SPACE = /[^ ]+/g;\n\n// Field-length norm: the shorter the field, the higher the weight.\n// Set to 3 decimals to reduce index size.\nfunction norm(weight = 1, mantissa = 3) {\n const cache = new Map();\n const m = Math.pow(10, mantissa);\n\n return {\n get(value) {\n const numTokens = value.match(SPACE).length;\n\n if (cache.has(numTokens)) {\n return cache.get(numTokens)\n }\n\n // Default function is 1/sqrt(x), weight makes that variable\n const norm = 1 / Math.pow(numTokens, 0.5 * weight);\n\n // In place of `toFixed(mantissa)`, for faster computation\n const n = parseFloat(Math.round(norm * m) / m);\n\n cache.set(numTokens, n);\n\n return n\n },\n clear() {\n cache.clear();\n }\n }\n}\n\nclass FuseIndex {\n constructor({\n getFn = Config.getFn,\n fieldNormWeight = Config.fieldNormWeight\n } = {}) {\n this.norm = norm(fieldNormWeight, 3);\n this.getFn = getFn;\n this.isCreated = false;\n\n this.setIndexRecords();\n }\n setSources(docs = []) {\n this.docs = docs;\n }\n setIndexRecords(records = []) {\n this.records = records;\n }\n setKeys(keys = []) {\n this.keys = keys;\n this._keysMap = {};\n keys.forEach((key, idx) => {\n this._keysMap[key.id] = idx;\n });\n }\n create() {\n if (this.isCreated || !this.docs.length) {\n return\n }\n\n this.isCreated = true;\n\n // List is Array<String>\n if (isString(this.docs[0])) {\n this.docs.forEach((doc, docIndex) => {\n this._addString(doc, docIndex);\n });\n } else {\n // List is Array<Object>\n this.docs.forEach((doc, docIndex) => {\n this._addObject(doc, docIndex);\n });\n }\n\n this.norm.clear();\n }\n // Adds a doc to the end of the index\n add(doc) {\n const idx = this.size();\n\n if (isString(doc)) {\n this._addString(doc, idx);\n } else {\n this._addObject(doc, idx);\n }\n }\n // Removes the doc at the specified index of the index\n removeAt(idx) {\n this.records.splice(idx, 1);\n\n // Change ref index of every subsquent doc\n for (let i = idx, len = this.size(); i < len; i += 1) {\n this.records[i].i -= 1;\n }\n }\n getValueForItemAtKeyId(item, keyId) {\n return item[this._keysMap[keyId]]\n }\n size() {\n return this.records.length\n }\n _addString(doc, docIndex) {\n if (!isDefined(doc) || isBlank(doc)) {\n return\n }\n\n let record = {\n v: doc,\n i: docIndex,\n n: this.norm.get(doc)\n };\n\n this.records.push(record);\n }\n _addObject(doc, docIndex) {\n let record = { i: docIndex, $: {} };\n\n // Iterate over every key (i.e, path), and fetch the value at that key\n this.keys.forEach((key, keyIndex) => {\n let value = key.getFn ? key.getFn(doc) : this.getFn(doc, key.path);\n\n if (!isDefined(value)) {\n return\n }\n\n if (isArray(value)) {\n let subRecords = [];\n const stack = [{ nestedArrIndex: -1, value }];\n\n while (stack.length) {\n const { nestedArrIndex, value } = stack.pop();\n\n if (!isDefined(value)) {\n continue\n }\n\n if (isString(value) && !isBlank(value)) {\n let subRecord = {\n v: value,\n i: nestedArrIndex,\n n: this.norm.get(value)\n };\n\n subRecords.push(subRecord);\n } else if (isArray(value)) {\n value.forEach((item, k) => {\n stack.push({\n nestedArrIndex: k,\n value: item\n });\n });\n } else ;\n }\n record.$[keyIndex] = subRecords;\n } else if (isString(value) && !isBlank(value)) {\n let subRecord = {\n v: value,\n n: this.norm.get(value)\n };\n\n record.$[keyIndex] = subRecord;\n }\n });\n\n this.records.push(record);\n }\n toJSON() {\n return {\n keys: this.keys,\n records: this.records\n }\n }\n}\n\nfunction createIndex(\n keys,\n docs,\n { getFn = Config.getFn, fieldNormWeight = Config.fieldNormWeight } = {}\n) {\n const myIndex = new FuseIndex({ getFn, fieldNormWeight });\n myIndex.setKeys(keys.map(createKey));\n myIndex.setSources(docs);\n myIndex.create();\n return myIndex\n}\n\nfunction parseIndex(\n data,\n { getFn = Config.getFn, fieldNormWeight = Config.fieldNormWeight } = {}\n) {\n const { keys, records } = data;\n const myIndex = new FuseIndex({ getFn, fieldNormWeight });\n myIndex.setKeys(keys);\n myIndex.setIndexRecords(records);\n return myIndex\n}\n\nfunction computeScore$1(\n pattern,\n {\n errors = 0,\n currentLocation = 0,\n expectedLocation = 0,\n distance = Config.distance,\n ignoreLocation = Config.ignoreLocation\n } = {}\n) {\n const accuracy = errors / pattern.length;\n\n if (ignoreLocation) {\n return accuracy\n }\n\n const proximity = Math.abs(expectedLocation - currentLocation);\n\n if (!distance) {\n // Dodge divide by zero error.\n return proximity ? 1.0 : accuracy\n }\n\n return accuracy + proximity / distance\n}\n\nfunction convertMaskToIndices(\n matchmask = [],\n minMatchCharLength = Config.minMatchCharLength\n) {\n let indices = [];\n let start = -1;\n let end = -1;\n let i = 0;\n\n for (let len = matchmask.length; i < len; i += 1) {\n let match = matchmask[i];\n if (match && start === -1) {\n start = i;\n } else if (!match && start !== -1) {\n end = i - 1;\n if (end - start + 1 >= minMatchCharLength) {\n indices.push([start, end]);\n }\n start = -1;\n }\n }\n\n // (i-1 - start) + 1 => i - start\n if (matchmask[i - 1] && i - start >= minMatchCharLength) {\n indices.push([start, i - 1]);\n }\n\n return indices\n}\n\n// Machine word size\nconst MAX_BITS = 32;\n\nfunction search(\n text,\n pattern,\n patternAlphabet,\n {\n location = Config.location,\n distance = Config.distance,\n threshold = Config.threshold,\n findAllMatches = Config.findAllMatches,\n minMatchCharLength = Config.minMatchCharLength,\n includeMatches = Config.includeMatches,\n ignoreLocation = Config.ignoreLocation\n } = {}\n) {\n if (pattern.length > MAX_BITS) {\n throw new Error(PATTERN_LENGTH_TOO_LARGE(MAX_BITS))\n }\n\n const patternLen = pattern.length;\n // Set starting location at beginning text and initialize the alphabet.\n const textLen = text.length;\n // Handle the case when location > text.length\n const expectedLocation = Math.max(0, Math.min(location, textLen));\n // Highest score beyond which we give up.\n let currentThreshold = threshold;\n // Is there a nearby exact match? (speedup)\n let bestLocation = expectedLocation;\n\n // Performance: only computer matches when the minMatchCharLength > 1\n // OR if `includeMatches` is true.\n const computeMatches = minMatchCharLength > 1 || includeMatches;\n // A mask of the matches, used for building the indices\n const matchMask = computeMatches ? Array(textLen) : [];\n\n let index;\n\n // Get all exact matches, here for speed up\n while ((index = text.indexOf(pattern, bestLocation)) > -1) {\n let score = computeScore$1(pattern, {\n currentLocation: index,\n expectedLocation,\n distance,\n ignoreLocation\n });\n\n currentThreshold = Math.min(score, currentThreshold);\n bestLocation = index + patternLen;\n\n if (computeMatches) {\n let i = 0;\n while (i < patternLen) {\n matchMask[index + i] = 1;\n i += 1;\n }\n }\n }\n\n // Reset the best location\n bestLocation = -1;\n\n let lastBitArr = [];\n let finalScore = 1;\n let binMax = patternLen + textLen;\n\n const mask = 1 << (patternLen - 1);\n\n for (let i = 0; i < patternLen; i += 1) {\n // Scan for the best match; each iteration allows for one more error.\n // Run a binary search to determine how far from the match location we can stray\n // at this error level.\n let binMin = 0;\n let binMid = binMax;\n\n while (binMin < binMid) {\n const score = computeScore$1(pattern, {\n errors: i,\n currentLocation: expectedLocation + binMid,\n expectedLocation,\n distance,\n ignoreLocation\n });\n\n if (score <= currentThreshold) {\n binMin = binMid;\n } else {\n binMax = binMid;\n }\n\n binMid = Math.floor((binMax - binMin) / 2 + binMin);\n }\n\n // Use the result from this iteration as the maximum for the next.\n binMax = binMid;\n\n let start = Math.max(1, expectedLocation - binMid + 1);\n let finish = findAllMatches\n ? textLen\n : Math.min(expectedLocation + binMid, textLen) + patternLen;\n\n // Initialize the bit array\n let bitArr = Array(finish + 2);\n\n bitArr[finish + 1] = (1 << i) - 1;\n\n for (let j = finish; j >= start; j -= 1) {\n let currentLocation = j - 1;\n let charMatch = patternAlphabet[text.charAt(currentLocation)];\n\n if (computeMatches) {\n // Speed up: quick bool to int conversion (i.e, `charMatch ? 1 : 0`)\n matchMask[currentLocation] = +!!charMatch;\n }\n\n // First pass: exact match\n bitArr[j] = ((bitArr[j + 1] << 1) | 1) & charMatch;\n\n // Subsequent passes: fuzzy match\n if (i) {\n bitArr[j] |=\n ((lastBitArr[j + 1] | lastBitArr[j]) << 1) | 1 | lastBitArr[j + 1];\n }\n\n if (bitArr[j] & mask) {\n finalScore = computeScore$1(pattern, {\n errors: i,\n currentLocation,\n expectedLocation,\n distance,\n ignoreLocation\n });\n\n // This match will almost certainly be better than any existing match.\n // But check anyway.\n if (finalScore <= currentThreshold) {\n // Indeed it is\n currentThreshold = finalScore;\n bestLocation = currentLocation;\n\n // Already passed `loc`, downhill from here on in.\n if (bestLocation <= expectedLocation) {\n break\n }\n\n // When passing `bestLocation`, don't exceed our current distance from `expectedLocation`.\n start = Math.max(1, 2 * expectedLocation - bestLocation);\n }\n }\n }\n\n // No hope for a (better) match at greater error levels.\n const score = computeScore$1(pattern, {\n errors: i + 1,\n currentLocation: expectedLocation,\n expectedLocation,\n distance,\n ignoreLocation\n });\n\n if (score > currentThreshold) {\n break\n }\n\n lastBitArr = bitArr;\n }\n\n const result = {\n isMatch: bestLocation >= 0,\n // Count exact matches (those with a score of 0) to be \"almost\" exact\n score: Math.max(0.001, finalScore)\n };\n\n if (computeMatches) {\n const indices = convertMaskToIndices(matchMask, minMatchCharLength);\n if (!indices.length) {\n result.isMatch = false;\n } else if (includeMatches) {\n result.indices = indices;\n }\n }\n\n return result\n}\n\nfunction createPatternAlphabet(pattern) {\n let mask = {};\n\n for (let i = 0, len = pattern.length; i < len; i += 1) {\n const char = pattern.charAt(i);\n mask[char] = (mask[char] || 0) | (1 << (len - i - 1));\n }\n\n return mask\n}\n\nconst stripDiacritics = String.prototype.normalize\n ? ((str) => str.normalize('NFD').replace(/[\\u0300-\\u036F\\u0483-\\u0489\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u0610-\\u061A\\u064B-\\u065F\\u0670\\u06D6-\\u06DC\\u06DF-\\u06E4\\u06E7\\u06E8\\u06EA-\\u06ED\\u0711\\u0730-\\u074A\\u07A6-\\u07B0\\u07EB-\\u07F3\\u07FD\\u0816-\\u0819\\u081B-\\u0823\\u0825-\\u0827\\u0829-\\u082D\\u0859-\\u085B\\u08D3-\\u08E1\\u08E3-\\u0903\\u093A-\\u093C\\u093E-\\u094F\\u0951-\\u0957\\u0962\\u0963\\u0981-\\u0983\\u09BC\\u09BE-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CD\\u09D7\\u09E2\\u09E3\\u09FE\\u0A01-\\u0A03\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A70\\u0A71\\u0A75\\u0A81-\\u0A83\\u0ABC\\u0ABE-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0AE2\\u0AE3\\u0AFA-\\u0AFF\\u0B01-\\u0B03\\u0B3C\\u0B3E-\\u0B44\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B56\\u0B57\\u0B62\\u0B63\\u0B82\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD7\\u0C00-\\u0C04\\u0C3E-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C62\\u0C63\\u0C81-\\u0C83\\u0CBC\\u0CBE-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0CE2\\u0CE3\\u0D00-\\u0D03\\u0D3B\\u0D3C\\u0D3E-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4D\\u0D57\\u0D62\\u0D63\\u0D82\\u0D83\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DF2\\u0DF3\\u0E31\\u0E34-\\u0E3A\\u0E47-\\u0E4E\\u0EB1\\u0EB4-\\u0EB9\\u0EBB\\u0EBC\\u0EC8-\\u0ECD\\u0F18\\u0F19\\u0F35\\u0F37\\u0F39\\u0F3E\\u0F3F\\u0F71-\\u0F84\\u0F86\\u0F87\\u0F8D-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u102B-\\u103E\\u1056-\\u1059\\u105E-\\u1060\\u1062-\\u1064\\u1067-\\u106D\\u1071-\\u1074\\u1082-\\u108D\\u108F\\u109A-\\u109D\\u135D-\\u135F\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17B4-\\u17D3\\u17DD\\u180B-\\u180D\\u1885\\u1886\\u18A9\\u1920-\\u192B\\u1930-\\u193B\\u1A17-\\u1A1B\\u1A55-\\u1A5E\\u1A60-\\u1A7C\\u1A7F\\u1AB0-\\u1ABE\\u1B00-\\u1B04\\u1B34-\\u1B44\\u1B6B-\\u1B73\\u1B80-\\u1B82\\u1BA1-\\u1BAD\\u1BE6-\\u1BF3\\u1C24-\\u1C37\\u1CD0-\\u1CD2\\u1CD4-\\u1CE8\\u1CED\\u1CF2-\\u1CF4\\u1CF7-\\u1CF9\\u1DC0-\\u1DF9\\u1DFB-\\u1DFF\\u20D0-\\u20F0\\u2CEF-\\u2CF1\\u2D7F\\u2DE0-\\u2DFF\\u302A-\\u302F\\u3099\\u309A\\uA66F-\\uA672\\uA674-\\uA67D\\uA69E\\uA69F\\uA6F0\\uA6F1\\uA802\\uA806\\uA80B\\uA823-\\uA827\\uA880\\uA881\\uA8B4-\\uA8C5\\uA8E0-\\uA8F1\\uA8FF\\uA926-\\uA92D\\uA947-\\uA953\\uA980-\\uA983\\uA9B3-\\uA9C0\\uA9E5\\uAA29-\\uAA36\\uAA43\\uAA4C\\uAA4D\\uAA7B-\\uAA7D\\uAAB0\\uAAB2-\\uAAB4\\uAAB7\\uAAB8\\uAABE\\uAABF\\uAAC1\\uAAEB-\\uAAEF\\uAAF5\\uAAF6\\uABE3-\\uABEA\\uABEC\\uABED\\uFB1E\\uFE00-\\uFE0F\\uFE20-\\uFE2F]/g, ''))\n : ((str) => str);\n\nclass BitapSearch {\n constructor(\n pattern,\n {\n location = Config.location,\n threshold = Config.threshold,\n distance = Config.distance,\n includeMatches = Config.includeMatches,\n findAllMatches = Config.findAllMatches,\n minMatchCharLength = Config.minMatchCharLength,\n isCaseSensitive = Config.isCaseSensitive,\n ignoreDiacritics = Config.ignoreDiacritics,\n ignoreLocation = Config.ignoreLocation\n } = {}\n ) {\n this.options = {\n location,\n threshold,\n distance,\n includeMatches,\n findAllMatches,\n minMatchCharLength,\n isCaseSensitive,\n ignoreDiacritics,\n ignoreLocation\n };\n\n pattern = isCaseSensitive ? pattern : pattern.toLowerCase();\n pattern = ignoreDiacritics ? stripDiacritics(pattern) : pattern;\n this.pattern = pattern;\n\n this.chunks = [];\n\n if (!this.pattern.length) {\n return\n }\n\n const addChunk = (pattern, startIndex) => {\n this.chunks.push({\n pattern,\n alphabet: createPatternAlphabet(pattern),\n startIndex\n });\n };\n\n const len = this.pattern.length;\n\n if (len > MAX_BITS) {\n let i = 0;\n const remainder = len % MAX_BITS;\n const end = len - remainder;\n\n while (i < end) {\n addChunk(this.pattern.substr(i, MAX_BITS), i);\n i += MAX_BITS;\n }\n\n if (remainder) {\n const startIndex = len - MAX_BITS;\n addChunk(this.pattern.substr(startIndex), startIndex);\n }\n } else {\n addChunk(this.pattern, 0);\n }\n }\n\n searchIn(text) {\n const { isCaseSensitive, ignoreDiacritics, includeMatches } = this.options;\n\n text = isCaseSensitive ? text : text.toLowerCase();\n text = ignoreDiacritics ? stripDiacritics(text) : text;\n\n // Exact match\n if (this.pattern === text) {\n let result = {\n isMatch: true,\n score: 0\n };\n\n if (includeMatches) {\n result.indices = [[0, text.length - 1]];\n }\n\n return result\n }\n\n // Otherwise, use Bitap algorithm\n const {\n location,\n distance,\n threshold,\n findAllMatches,\n minMatchCharLength,\n ignoreLocation\n } = this.options;\n\n let allIndices = [];\n let totalScore = 0;\n let hasMatches = false;\n\n this.chunks.forEach(({ pattern, alphabet, startIndex }) => {\n const { isMatch, score, indices } = search(text, pattern, alphabet, {\n location: location + startIndex,\n distance,\n threshold,\n findAllMatches,\n minMatchCharLength,\n includeMatches,\n ignoreLocation\n });\n\n if (isMatch) {\n hasMatches = true;\n }\n\n totalScore += score;\n\n if (isMatch && indices) {\n allIndices = [...allIndices, ...indices];\n }\n });\n\n let result = {\n isMatch: hasMatches,\n score: hasMatches ? totalScore / this.chunks.length : 1\n };\n\n if (hasMatches && includeMatches) {\n result.indices = allIndices;\n }\n\n return result\n }\n}\n\nclass BaseMatch {\n constructor(pattern) {\n this.pattern = pattern;\n }\n static isMultiMatch(pattern) {\n return getMatch(pattern, this.multiRegex)\n }\n static isSingleMatch(pattern) {\n return getMatch(pattern, this.singleRegex)\n }\n search(/*text*/) {}\n}\n\nfunction getMatch(pattern, exp) {\n const matches = pattern.match(exp);\n return matches ? matches[1] : null\n}\n\n// Token: 'file\n\nclass ExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'exact'\n }\n static get multiRegex() {\n return /^=\"(.*)\"$/\n }\n static get singleRegex() {\n return /^=(.*)$/\n }\n search(text) {\n const isMatch = text === this.pattern;\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [0, this.pattern.length - 1]\n }\n }\n}\n\n// Token: !fire\n\nclass InverseExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'inverse-exact'\n }\n static get multiRegex() {\n return /^!\"(.*)\"$/\n }\n static get singleRegex() {\n return /^!(.*)$/\n }\n search(text) {\n const index = text.indexOf(this.pattern);\n const isMatch = index === -1;\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [0, text.length - 1]\n }\n }\n}\n\n// Token: ^file\n\nclass PrefixExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'prefix-exact'\n }\n static get multiRegex() {\n return /^\\^\"(.*)\"$/\n }\n static get singleRegex() {\n return /^\\^(.*)$/\n }\n search(text) {\n const isMatch = text.startsWith(this.pattern);\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [0, this.pattern.length - 1]\n }\n }\n}\n\n// Token: !^fire\n\nclass InversePrefixExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'inverse-prefix-exact'\n }\n static get multiRegex() {\n return /^!\\^\"(.*)\"$/\n }\n static get singleRegex() {\n return /^!\\^(.*)$/\n }\n search(text) {\n const isMatch = !text.startsWith(this.pattern);\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [0, text.length - 1]\n }\n }\n}\n\n// Token: .file$\n\nclass SuffixExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'suffix-exact'\n }\n static get multiRegex() {\n return /^\"(.*)\"\\$$/\n }\n static get singleRegex() {\n return /^(.*)\\$$/\n }\n search(text) {\n const isMatch = text.endsWith(this.pattern);\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [text.length - this.pattern.length, text.length - 1]\n }\n }\n}\n\n// Token: !.file$\n\nclass InverseSuffixExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'inverse-suffix-exact'\n }\n static get multiRegex() {\n return /^!\"(.*)\"\\$$/\n }\n static get singleRegex() {\n return /^!(.*)\\$$/\n }\n search(text) {\n const isMatch = !text.endsWith(this.pattern);\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [0, text.length - 1]\n }\n }\n}\n\nclass FuzzyMatch extends BaseMatch {\n constructor(\n pattern,\n {\n location = Config.location,\n threshold = Config.threshold,\n distance = Config.distance,\n includeMatches = Config.includeMatches,\n findAllMatches = Config.findAllMatches,\n minMatchCharLength = Config.minMatchCharLength,\n isCaseSensitive = Config.isCaseSensitive,\n ignoreDiacritics = Config.ignoreDiacritics,\n ignoreLocation = Config.ignoreLocation\n } = {}\n ) {\n super(pattern);\n this._bitapSearch = new BitapSearch(pattern, {\n location,\n threshold,\n distance,\n includeMatches,\n findAllMatches,\n minMatchCharLength,\n isCaseSensitive,\n ignoreDiacritics,\n ignoreLocation\n });\n }\n static get type() {\n return 'fuzzy'\n }\n static get multiRegex() {\n return /^\"(.*)\"$/\n }\n static get singleRegex() {\n return /^(.*)$/\n }\n search(text) {\n return this._bitapSearch.searchIn(text)\n }\n}\n\n// Token: 'file\n\nclass IncludeMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'include'\n }\n static get multiRegex() {\n return /^'\"(.*)\"$/\n }\n static get singleRegex() {\n return /^'(.*)$/\n }\n search(text) {\n let location = 0;\n let index;\n\n const indices = [];\n const patternLen = this.pattern.length;\n\n // Get all exact matches\n while ((index = text.indexOf(this.pattern, location)) > -1) {\n location = index + patternLen;\n indices.push([index, location - 1]);\n }\n\n const isMatch = !!indices.length;\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices\n }\n }\n}\n\n// ❗Order is important. DO NOT CHANGE.\nconst searchers = [\n ExactMatch,\n IncludeMatch,\n PrefixExactMatch,\n InversePrefixExactMatch,\n InverseSuffixExactMatch,\n SuffixExactMatch,\n InverseExactMatch,\n FuzzyMatch\n];\n\nconst searchersLen = searchers.length;\n\n// Regex to split by spaces, but keep anything in quotes together\nconst SPACE_RE = / +(?=(?:[^\\\"]*\\\"[^\\\"]*\\\")*[^\\\"]*$)/;\nconst OR_TOKEN = '|';\n\n// Return a 2D array representation of the query, for simpler parsing.\n// Example:\n// \"^core go$ | rb$ | py$ xy$\" => [[\"^core\", \"go$\"], [\"rb$\"], [\"py$\", \"xy$\"]]\nfunction parseQuery(pattern, options = {}) {\n return pattern.split(OR_TOKEN).map((item) => {\n let query = item\n .trim()\n .split(SPACE_RE)\n .filter((item) => item && !!item.trim());\n\n let results = [];\n for (let i = 0, len = query.length; i < len; i += 1) {\n const queryItem = query[i];\n\n // 1. Handle multiple query match (i.e, once that are quoted, like `\"hello world\"`)\n let found = false;\n let idx = -1;\n while (!found && ++idx < searchersLen) {\n const searcher = searchers[idx];\n let token = searcher.isMultiMatch(queryItem);\n if (token) {\n results.push(new searcher(token, options));\n found = true;\n }\n }\n\n if (found) {\n continue\n }\n\n // 2. Handle single query matches (i.e, once that are *not* quoted)\n idx = -1;\n while (++idx < searchersLen) {\n const searcher = searchers[idx];\n let token = searcher.isSingleMatch(queryItem);\n if (token) {\n results.push(new searcher(token, options));\n break\n }\n }\n }\n\n return results\n })\n}\n\n// These extended matchers can return an array of matches, as opposed\n// to a singl match\nconst MultiMatchSet = new Set([FuzzyMatch.type, IncludeMatch.type]);\n\n/**\n * Command-like searching\n * ======================\n *\n * Given multiple search terms delimited by spaces.e.g. `^jscript .python$ ruby !java`,\n * search in a given text.\n *\n * Search syntax:\n *\n * | Token | Match type | Description |\n * | ----------- | -------------------------- | -------------------------------------- |\n * | `jscript` | fuzzy-match | Items that fuzzy match `jscript` |\n * | `=scheme` | exact-match | Items that are `scheme` |\n * | `'python` | include-match | Items that include `python` |\n * | `!ruby` | inverse-exact-match | Items that do not include `ruby` |\n * | `^java` | prefix-exact-match | Items that start with `java` |\n * | `!^earlang` | inverse-prefix-exact-match | Items that do not start with `earlang` |\n * | `.js$` | suffix-exact-match | Items that end with `.js` |\n * | `!.go$` | inverse-suffix-exact-match | Items that do not end with `.go` |\n *\n * A single pipe character acts as an OR operator. For example, the following\n * query matches entries that start with `core` and end with either`go`, `rb`,\n * or`py`.\n *\n * ```\n * ^core go$ | rb$ | py$\n * ```\n */\nclass ExtendedSearch {\n constructor(\n pattern,\n {\n isCaseSensitive = Config.isCaseSensitive,\n ignoreDiacritics = Config.ignoreDiacritics,\n includeMatches = Config.includeMatches,\n minMatchCharLength = Config.minMatchCharLength,\n ignoreLocation = Config.ignoreLocation,\n findAllMatches = Config.findAllMatches,\n location = Config.location,\n threshold = Config.threshold,\n distance = Config.distance\n } = {}\n ) {\n this.query = null;\n this.options = {\n isCaseSensitive,\n ignoreDiacritics,\n includeMatches,\n minMatchCharLength,\n findAllMatches,\n ignoreLocation,\n location,\n threshold,\n distance\n };\n\n pattern = isCaseSensitive ? pattern : pattern.toLowerCase();\n pattern = ignoreDiacritics ? stripDiacritics(pattern) : pattern;\n this.pattern = pattern;\n this.query = parseQuery(this.pattern, this.options);\n }\n\n static condition(_, options) {\n return options.useExtendedSearch\n }\n\n searchIn(text) {\n const query = this.query;\n\n if (!query) {\n return {\n isMatch: false,\n score: 1\n }\n }\n\n const { includeMatches, isCaseSensitive, ignoreDiacritics } = this.options;\n\n text = isCaseSensitive ? text : text.toLowerCase();\n text = ignoreDiacritics ? stripDiacritics(text) : text;\n\n let numMatches = 0;\n let allIndices = [];\n let totalScore = 0;\n\n // ORs\n for (let i = 0, qLen = query.length; i < qLen; i += 1) {\n const searchers = query[i];\n\n // Reset indices\n allIndices.length = 0;\n numMatches = 0;\n\n // ANDs\n for (let j = 0, pLen = searchers.length; j < pLen; j += 1) {\n const searcher = searchers[j];\n const { isMatch, indices, score } = searcher.search(text);\n\n if (isMatch) {\n numMatches += 1;\n totalScore += score;\n if (includeMatches) {\n const type = searcher.constructor.type;\n if (MultiMatchSet.has(type)) {\n allIndices = [...allIndices, ...indices];\n } else {\n allIndices.push(indices);\n }\n }\n } else {\n totalScore = 0;\n numMatches = 0;\n allIndices.length = 0;\n break\n }\n }\n\n // OR condition, so if TRUE, return\n if (numMatches) {\n let result = {\n isMatch: true,\n score: totalScore / numMatches\n };\n\n if (includeMatches) {\n result.indices = allIndices;\n }\n\n return result\n }\n }\n\n // Nothing was matched\n return {\n isMatch: false,\n score: 1\n }\n }\n}\n\nconst registeredSearchers = [];\n\nfunction register(...args) {\n registeredSearchers.push(...args);\n}\n\nfunction createSearcher(pattern, options) {\n for (let i = 0, len = registeredSearchers.length; i < len; i += 1) {\n let searcherClass = registeredSearchers[i];\n if (searcherClass.condition(pattern, options)) {\n return new searcherClass(pattern, options)\n }\n }\n\n return new BitapSearch(pattern, options)\n}\n\nconst LogicalOperator = {\n AND: '$and',\n OR: '$or'\n};\n\nconst KeyType = {\n PATH: '$path',\n PATTERN: '$val'\n};\n\nconst isExpression = (query) =>\n !!(query[LogicalOperator.AND] || query[LogicalOperator.OR]);\n\nconst isPath = (query) => !!query[KeyType.PATH];\n\nconst isLeaf = (query) =>\n !isArray(query) && isObject(query) && !isExpression(query);\n\nconst convertToExplicit = (query) => ({\n [LogicalOperator.AND]: Object.keys(query).map((key) => ({\n [key]: query[key]\n }))\n});\n\n// When `auto` is `true`, the parse function will infer and initialize and add\n// the appropriate `Searcher` instance\nfunction parse(query, options, { auto = true } = {}) {\n const next = (query) => {\n let keys = Object.keys(query);\n\n const isQueryPath = isPath(query);\n\n if (!isQueryPath && keys.length > 1 && !isExpression(query)) {\n return next(convertToExplicit(query))\n }\n\n if (isLeaf(query)) {\n const key = isQueryPath ? query[KeyType.PATH] : keys[0];\n\n const pattern = isQueryPath ? query[KeyType.PATTERN] : query[key];\n\n if (!isString(pattern)) {\n throw new Error(LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY(key))\n }\n\n const obj = {\n keyId: createKeyId(key),\n pattern\n };\n\n if (auto) {\n obj.searcher = createSearcher(pattern, options);\n }\n\n return obj\n }\n\n let node = {\n children: [],\n operator: keys[0]\n };\n\n keys.forEach((key) => {\n const value = query[key];\n\n if (isArray(value)) {\n value.forEach((item) => {\n node.children.push(next(item));\n });\n }\n });\n\n return node\n };\n\n if (!isExpression(query)) {\n query = convertToExplicit(query);\n }\n\n return next(query)\n}\n\n// Practical scoring function\nfunction computeScore(\n results,\n { ignoreFieldNorm = Config.ignoreFieldNorm }\n) {\n results.forEach((result) => {\n let totalScore = 1;\n\n result.matches.forEach(({ key, norm, score }) => {\n const weight = key ? key.weight : null;\n\n totalScore *= Math.pow(\n score === 0 && weight ? Number.EPSILON : score,\n (weight || 1) * (ignoreFieldNorm ? 1 : norm)\n );\n });\n\n result.score = totalScore;\n });\n}\n\nfunction transformMatches(result, data) {\n const matches = result.matches;\n data.matches = [];\n\n if (!isDefined(matches)) {\n return\n }\n\n matches.forEach((match) => {\n if (!isDefined(match.indices) || !match.indices.length) {\n return\n }\n\n const { indices, value } = match;\n\n let obj = {\n indices,\n value\n };\n\n if (match.key) {\n obj.key = match.key.src;\n }\n\n if (match.idx > -1) {\n obj.refIndex = match.idx;\n }\n\n data.matches.push(obj);\n });\n}\n\nfunction transformScore(result, data) {\n data.score = result.score;\n}\n\nfunction format(\n results,\n docs,\n {\n includeMatches = Config.includeMatches,\n includeScore = Config.includeScore\n } = {}\n) {\n const transformers = [];\n\n if (includeMatches) transformers.push(transformMatches);\n if (includeScore) transformers.push(transformScore);\n\n return results.map((result) => {\n const { idx } = result;\n\n const data = {\n item: docs[idx],\n refIndex: idx\n };\n\n if (transformers.length) {\n transformers.forEach((transformer) => {\n transformer(result, data);\n });\n }\n\n return data\n })\n}\n\nclass Fuse {\n constructor(docs, options = {}, index) {\n this.options = { ...Config, ...options };\n\n if (\n this.options.useExtendedSearch &&\n !true\n ) {\n throw new Error(EXTENDED_SEARCH_UNAVAILABLE)\n }\n\n this._keyStore = new KeyStore(this.options.keys);\n\n this.setCollection(docs, index);\n }\n\n setCollection(docs, index) {\n this._docs = docs;\n\n if (index && !(index instanceof FuseIndex)) {\n throw new Error(INCORRECT_INDEX_TYPE)\n }\n\n this._myIndex =\n index ||\n createIndex(this.options.keys, this._docs, {\n getFn: this.options.getFn,\n fieldNormWeight: this.options.fieldNormWeight\n });\n }\n\n add(doc) {\n if (!isDefined(doc)) {\n return\n }\n\n this._docs.push(doc);\n this._myIndex.add(doc);\n }\n\n remove(predicate = (/* doc, idx */) => false) {\n const results = [];\n\n for (let i = 0, len = this._docs.length; i < len; i += 1) {\n const doc = this._docs[i];\n if (predicate(doc, i)) {\n this.removeAt(i);\n i -= 1;\n len -= 1;\n\n results.push(doc);\n }\n }\n\n return results\n }\n\n removeAt(idx) {\n this._docs.splice(idx, 1);\n this._myIndex.removeAt(idx);\n }\n\n getIndex() {\n return this._myIndex\n }\n\n search(query, { limit = -1 } = {}) {\n const {\n includeMatches,\n includeScore,\n shouldSort,\n sortFn,\n ignoreFieldNorm\n } = this.options;\n\n let results = isString(query)\n ? isString(this._docs[0])\n ? this._searchStringList(query)\n : this._searchObjectList(query)\n : this._searchLogical(query);\n\n computeScore(results, { ignoreFieldNorm });\n\n if (shouldSort) {\n results.sort(sortFn);\n }\n\n if (isNumber(limit) && limit > -1) {\n results = results.slice(0, limit);\n }\n\n return format(results, this._docs, {\n includeMatches,\n includeScore\n })\n }\n\n _searchStringList(query) {\n const searcher = createSearcher(query, this.options);\n const { records } = this._myIndex;\n const results = [];\n\n // Iterate over every string in the index\n records.forEach(({ v: text, i: idx, n: norm }) => {\n if (!isDefined(text)) {\n return\n }\n\n const { isMatch, score, indices } = searcher.searchIn(text);\n\n if (isMatch) {\n results.push({\n item: text,\n idx,\n matches: [{ score, value: text, norm, indices }]\n });\n }\n });\n\n return results\n }\n\n _searchLogical(query) {\n\n const expression = parse(query, this.options);\n\n const evaluate = (node, item, idx) => {\n if (!node.children) {\n const { keyId, searcher } = node;\n\n const matches = this._findMatches({\n key: this._keyStore.get(keyId),\n value: this._myIndex.getValueForItemAtKeyId(item, keyId),\n searcher\n });\n\n if (matches && matches.length) {\n return [\n {\n idx,\n item,\n matches\n }\n ]\n }\n\n return []\n }\n\n const res = [];\n for (let i = 0, len = node.children.length; i < len; i += 1) {\n const child = node.children[i];\n const result = evaluate(child, item, idx);\n if (result.length) {\n res.push(...result);\n } else if (node.operator === LogicalOperator.AND) {\n return []\n }\n }\n return res\n };\n\n const records = this._myIndex.records;\n const resultMap = {};\n const results = [];\n\n records.forEach(({ $: item, i: idx }) => {\n if (isDefined(item)) {\n let expResults = evaluate(expression, item, idx);\n\n if (expResults.length) {\n // Dedupe when adding\n if (!resultMap[idx]) {\n resultMap[idx] = { idx, item, matches: [] };\n results.push(resultMap[idx]);\n }\n expResults.forEach(({ matches }) => {\n resultMap[idx].matches.push(...matches);\n });\n }\n }\n });\n\n return results\n }\n\n _searchObjectList(query) {\n const searcher = createSearcher(query, this.options);\n const { keys, records } = this._myIndex;\n const results = [];\n\n // List is Array<Object>\n records.forEach(({ $: item, i: idx }) => {\n if (!isDefined(item)) {\n return\n }\n\n let matches = [];\n\n // Iterate over every key (i.e, path), and fetch the value at that key\n keys.forEach((key, keyIndex) => {\n matches.push(\n ...this._findMatches({\n key,\n value: item[keyIndex],\n searcher\n })\n );\n });\n\n if (matches.length) {\n results.push({\n idx,\n item,\n matches\n });\n }\n });\n\n return results\n }\n _findMatches({ key, value, searcher }) {\n if (!isDefined(value)) {\n return []\n }\n\n let matches = [];\n\n if (isArray(value)) {\n value.forEach(({ v: text, i: idx, n: norm }) => {\n if (!isDefined(text)) {\n return\n }\n\n const { isMatch, score, indices } = searcher.searchIn(text);\n\n if (isMatch) {\n matches.push({\n score,\n key,\n value: text,\n idx,\n norm,\n indices\n });\n }\n });\n } else {\n const { v: text, n: norm } = value;\n\n const { isMatch, score, indices } = searcher.searchIn(text);\n\n if (isMatch) {\n matches.push({ score, key, value: text, norm, indices });\n }\n }\n\n return matches\n }\n}\n\nFuse.version = '7.1.0';\nFuse.createIndex = createIndex;\nFuse.parseIndex = parseIndex;\nFuse.config = Config;\n\n{\n Fuse.parseQuery = parse;\n}\n\n{\n register(ExtendedSearch);\n}\n\nexport { Fuse as default };\n","import { useEffect, useState } from 'preact/hooks';\n\nexport const MIN_SCHEDULED_AT = 6 * 60 * 1000; // 6 mins\nconst MAX_SCHEDULED_AT = 90 * 24 * 60 * 60 * 1000; // 90 days\n\nexport default function ScheduledAtField({ scheduledAt, setScheduledAt }) {\n if (!scheduledAt || !scheduledAt?.getTime) {\n // Not using \"instanceof Date\" check due to \"cross-realm\" issues\n console.warn('scheduledAt is invalid', scheduledAt);\n return;\n }\n const [minStr, setMinStr] = useState();\n const [maxStr, setMaxStr] = useState();\n const timezoneOffset = scheduledAt.getTimezoneOffset();\n\n useEffect(() => {\n function updateMinStr() {\n const min = new Date(Date.now() + MIN_SCHEDULED_AT);\n const str = new Date(min.getTime() - timezoneOffset * 60000)\n .toISOString()\n .slice(0, 16);\n setMinStr(str);\n }\n updateMinStr();\n\n function updateMaxStr() {\n const max = new Date(Date.now() + MAX_SCHEDULED_AT);\n const str = new Date(max.getTime() - timezoneOffset * 60000)\n .toISOString()\n .slice(0, 16);\n setMaxStr(str);\n }\n updateMaxStr();\n\n // Update every 10s\n const intervalId = setInterval(() => {\n updateMinStr();\n updateMaxStr();\n }, 1000 * 10);\n return () => clearInterval(intervalId);\n }, []);\n\n const defaultValue = scheduledAt\n ? new Date(scheduledAt.getTime() - scheduledAt.getTimezoneOffset() * 60000)\n .toISOString()\n .slice(0, 16)\n : null;\n\n return (\n <input\n type=\"datetime-local\"\n name=\"scheduledAt\"\n defaultValue={defaultValue}\n min={minStr}\n max={maxStr}\n required\n onChange={(e) => {\n setScheduledAt(new Date(e.target.value));\n }}\n />\n );\n}\n\nexport function getLocalTimezoneName() {\n const date = new Date();\n const formatter = new Intl.DateTimeFormat(undefined, {\n timeZoneName: 'long',\n });\n const parts = formatter.formatToParts(date);\n const timezoneName = parts.find(\n (part) => part.type === 'timeZoneName',\n )?.value;\n return timezoneName;\n}\n"],"file":"ScheduledAtField-B9b7q7O5.js"}